summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-02-23 09:14:52 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2021-02-23 09:14:52 +0000
commit347bf09d6ecf4871da234c06ca8ee541e27b5105 (patch)
tree2ad6943e0c681c22acc8850d1debc6a983b0e006
parent0a51be0866d33273070f535257626a9eb2e10700 (diff)
downloadgitlab-ce-13.10.0-rc20210223090520.tar.gz
Add latest changes from gitlab-org/gitlab@13-10-stable-eev13.10.0-rc20210223090520
-rw-r--r--.gitlab/CODEOWNERS7
-rw-r--r--.gitlab/ci/frontend.gitlab-ci.yml20
-rw-r--r--.gitlab/ci/graphql.gitlab-ci.yml1
-rw-r--r--.gitlab/ci/rules.gitlab-ci.yml24
-rw-r--r--.gitlab/issue_templates/Query Performance Investigation.md8
-rw-r--r--.prettierignore2
-rw-r--r--.rubocop.yml18
-rw-r--r--.rubocop_manual_todo.yml50
-rw-r--r--.scss-lint.yml277
-rw-r--r--.stylelintrc54
-rw-r--r--GITALY_SERVER_VERSION2
-rw-r--r--GITLAB_WORKHORSE_VERSION2
-rw-r--r--Gemfile10
-rw-r--r--Gemfile.lock20
-rw-r--r--app/assets/javascripts/admin/users/tabs.js11
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/components/charts_config.js87
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/graphql/fragments/count.fragment.graphql4
-rw-r--r--app/assets/javascripts/analytics/instance_statistics/graphql/queries/instance_statistics_count.query.graphql34
-rw-r--r--app/assets/javascripts/analytics/usage_trends/components/app.vue (renamed from app/assets/javascripts/analytics/instance_statistics/components/app.vue)14
-rw-r--r--app/assets/javascripts/analytics/usage_trends/components/charts_config.js73
-rw-r--r--app/assets/javascripts/analytics/usage_trends/components/projects_and_groups_chart.vue (renamed from app/assets/javascripts/analytics/instance_statistics/components/projects_and_groups_chart.vue)16
-rw-r--r--app/assets/javascripts/analytics/usage_trends/components/usage_counts.vue (renamed from app/assets/javascripts/analytics/instance_statistics/components/instance_counts.vue)22
-rw-r--r--app/assets/javascripts/analytics/usage_trends/components/usage_trends_count_chart.vue (renamed from app/assets/javascripts/analytics/instance_statistics/components/instance_statistics_count_chart.vue)6
-rw-r--r--app/assets/javascripts/analytics/usage_trends/components/users_chart.vue (renamed from app/assets/javascripts/analytics/instance_statistics/components/users_chart.vue)2
-rw-r--r--app/assets/javascripts/analytics/usage_trends/constants.js (renamed from app/assets/javascripts/analytics/instance_statistics/constants.js)0
-rw-r--r--app/assets/javascripts/analytics/usage_trends/graphql/fragments/count.fragment.graphql4
-rw-r--r--app/assets/javascripts/analytics/usage_trends/graphql/queries/groups.query.graphql (renamed from app/assets/javascripts/analytics/instance_statistics/graphql/queries/groups.query.graphql)2
-rw-r--r--app/assets/javascripts/analytics/usage_trends/graphql/queries/projects.query.graphql (renamed from app/assets/javascripts/analytics/instance_statistics/graphql/queries/projects.query.graphql)2
-rw-r--r--app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_count.query.graphql (renamed from app/assets/javascripts/analytics/instance_statistics/graphql/queries/instance_count.query.graphql)2
-rw-r--r--app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_trends_count.query.graphql34
-rw-r--r--app/assets/javascripts/analytics/usage_trends/graphql/queries/users.query.graphql (renamed from app/assets/javascripts/analytics/instance_statistics/graphql/queries/users.query.graphql)2
-rw-r--r--app/assets/javascripts/analytics/usage_trends/index.js (renamed from app/assets/javascripts/analytics/instance_statistics/index.js)6
-rw-r--r--app/assets/javascripts/analytics/usage_trends/utils.js (renamed from app/assets/javascripts/analytics/instance_statistics/utils.js)6
-rw-r--r--app/assets/javascripts/api.js22
-rw-r--r--app/assets/javascripts/artifacts_settings/keep_latest_artifact_checkbox.vue18
-rw-r--r--app/assets/javascripts/blob/blob_file_dropzone.js4
-rw-r--r--app/assets/javascripts/blob_edit/blob_bundle.js2
-rw-r--r--app/assets/javascripts/boards/boards_util.js10
-rw-r--r--app/assets/javascripts/boards/components/board_card.vue81
-rw-r--r--app/assets/javascripts/boards/components/board_card_deprecated.vue61
-rw-r--r--app/assets/javascripts/boards/components/board_card_layout.vue98
-rw-r--r--app/assets/javascripts/boards/components/board_column.vue12
-rw-r--r--app/assets/javascripts/boards/components/board_content.vue9
-rw-r--r--app/assets/javascripts/boards/components/board_list.vue36
-rw-r--r--app/assets/javascripts/boards/components/board_list_deprecated.vue2
-rw-r--r--app/assets/javascripts/boards/components/boards_selector.vue29
-rw-r--r--app/assets/javascripts/boards/components/config_toggle.vue64
-rw-r--r--app/assets/javascripts/boards/config_toggle.js25
-rw-r--r--app/assets/javascripts/boards/index.js2
-rw-r--r--app/assets/javascripts/boards/mount_multiple_boards_switcher.js4
-rw-r--r--app/assets/javascripts/boards/stores/actions.js51
-rw-r--r--app/assets/javascripts/boards/stores/getters.js12
-rw-r--r--app/assets/javascripts/boards/stores/mutation_types.js7
-rw-r--r--app/assets/javascripts/boards/stores/mutations.js48
-rw-r--r--app/assets/javascripts/boards/stores/state.js5
-rw-r--r--app/assets/javascripts/clone_panel.js1
-rw-r--r--app/assets/javascripts/clusters_list/store/actions.js2
-rw-r--r--app/assets/javascripts/commit/pipelines/pipelines_bundle.js2
-rw-r--r--app/assets/javascripts/commit/pipelines/pipelines_table.vue9
-rw-r--r--app/assets/javascripts/create_cluster/eks_cluster/constants.js5
-rw-r--r--app/assets/javascripts/deprecated_jquery_dropdown/gl_dropdown.js43
-rw-r--r--app/assets/javascripts/design_management/components/design_notes/design_discussion.vue4
-rw-r--r--app/assets/javascripts/diffs/components/diff_discussion_reply.vue5
-rw-r--r--app/assets/javascripts/diffs/store/utils.js2
-rw-r--r--app/assets/javascripts/editor/constants.js3
-rw-r--r--app/assets/javascripts/editor/extensions/editor_lite_webide_ext.js164
-rw-r--r--app/assets/javascripts/experiment_tracking.js25
-rw-r--r--app/assets/javascripts/feature_flags/components/edit_feature_flag.vue2
-rw-r--r--app/assets/javascripts/flash.js2
-rw-r--r--app/assets/javascripts/groups/components/invite_members_banner.vue4
-rw-r--r--app/assets/javascripts/ide/components/branches/search_list.vue5
-rw-r--r--app/assets/javascripts/ide/components/file_templates/bar.vue4
-rw-r--r--app/assets/javascripts/ide/components/merge_requests/list.vue5
-rw-r--r--app/assets/javascripts/ide/components/nav_form.vue25
-rw-r--r--app/assets/javascripts/ide/components/pipelines/list.vue3
-rw-r--r--app/assets/javascripts/ide/components/repo_editor.vue81
-rw-r--r--app/assets/javascripts/ide/components/repo_tab.vue46
-rw-r--r--app/assets/javascripts/ide/components/repo_tabs.vue6
-rw-r--r--app/assets/javascripts/ide/index.js1
-rw-r--r--app/assets/javascripts/import_entities/import_groups/components/import_table.vue15
-rw-r--r--app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue26
-rw-r--r--app/assets/javascripts/import_entities/import_groups/index.js3
-rw-r--r--app/assets/javascripts/incidents_settings/constants.js2
-rw-r--r--app/assets/javascripts/integrations/edit/components/jira_trigger_fields.vue123
-rw-r--r--app/assets/javascripts/integrations/edit/index.js2
-rw-r--r--app/assets/javascripts/invite_members/components/group_select.vue103
-rw-r--r--app/assets/javascripts/invite_members/components/invite_group_trigger.vue34
-rw-r--r--app/assets/javascripts/invite_members/components/invite_members_modal.vue131
-rw-r--r--app/assets/javascripts/invite_members/components/invite_members_trigger.vue4
-rw-r--r--app/assets/javascripts/invite_members/components/members_token_select.vue4
-rw-r--r--app/assets/javascripts/invite_members/constants.js2
-rw-r--r--app/assets/javascripts/invite_members/init_invite_group_trigger.js20
-rw-r--r--app/assets/javascripts/issue_show/components/app.vue2
-rw-r--r--app/assets/javascripts/issue_show/components/fields/description_template.vue4
-rw-r--r--app/assets/javascripts/issue_show/components/form.vue6
-rw-r--r--app/assets/javascripts/issue_show/stores/index.js2
-rw-r--r--app/assets/javascripts/issue_show/utils/parse_data.js2
-rw-r--r--app/assets/javascripts/jira_connect/components/app.vue6
-rw-r--r--app/assets/javascripts/jira_connect/index.js1
-rw-r--r--app/assets/javascripts/merge_request_tabs.js2
-rw-r--r--app/assets/javascripts/monitoring/stores/actions.js2
-rw-r--r--app/assets/javascripts/notes/components/discussion_actions.vue4
-rw-r--r--app/assets/javascripts/notes/components/discussion_reply_placeholder.vue29
-rw-r--r--app/assets/javascripts/notes/components/note_form.vue2
-rw-r--r--app/assets/javascripts/notes/stores/utils.js4
-rw-r--r--app/assets/javascripts/notifications/constants.js4
-rw-r--r--app/assets/javascripts/packages/list/constants.js2
-rw-r--r--app/assets/javascripts/packages/shared/utils.js2
-rw-r--r--app/assets/javascripts/pages/admin/instance_statistics/index.js3
-rw-r--r--app/assets/javascripts/pages/admin/usage_trends/index.js3
-rw-r--r--app/assets/javascripts/pages/groups/edit/index.js3
-rw-r--r--app/assets/javascripts/pages/groups/group_members/index.js2
-rw-r--r--app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js3
-rw-r--r--app/assets/javascripts/pages/groups/settings/packages_and_registries/index.js3
-rw-r--r--app/assets/javascripts/pages/groups/settings/repository/show/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/feature_flags_user_lists/edit/index.js22
-rw-r--r--app/assets/javascripts/pages/projects/feature_flags_user_lists/new/index.js28
-rw-r--r--app/assets/javascripts/pages/projects/project_members/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/settings/operations/show/index.js5
-rw-r--r--app/assets/javascripts/pages/projects/settings/repository/show/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/show/index.js7
-rw-r--r--app/assets/javascripts/pages/projects/tags/new/index.js8
-rw-r--r--app/assets/javascripts/performance/constants.js21
-rw-r--r--app/assets/javascripts/performance_bar/components/performance_bar_app.vue7
-rw-r--r--app/assets/javascripts/performance_bar/index.js2
-rw-r--r--app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_header.vue42
-rw-r--r--app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue120
-rw-r--r--app/assets/javascripts/pipeline_editor/graphql/queries/client/pipeline.graphql17
-rw-r--r--app/assets/javascripts/pipeline_editor/graphql/resolvers.js23
-rw-r--r--app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/graph/graph_component.vue18
-rw-r--r--app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue16
-rw-r--r--app/assets/javascripts/pipelines/components/graph/utils.js2
-rw-r--r--app/assets/javascripts/pipelines/components/graph_shared/api.js8
-rw-r--r--app/assets/javascripts/pipelines/components/graph_shared/links_inner.vue72
-rw-r--r--app/assets/javascripts/pipelines/components/graph_shared/links_layer.vue5
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue12
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue80
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue10
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue5
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table_row.vue10
-rw-r--r--app/assets/javascripts/pipelines/pipeline_details_bundle.js9
-rw-r--r--app/assets/javascripts/pipelines/pipeline_details_graph.js3
-rw-r--r--app/assets/javascripts/pipelines/pipelines_index.js4
-rw-r--r--app/assets/javascripts/profile/profile.js1
-rw-r--r--app/assets/javascripts/projects/commits/store/actions.js2
-rw-r--r--app/assets/javascripts/projects/compare/components/app.vue8
-rw-r--r--app/assets/javascripts/projects/pipelines/charts/components/pipeline_charts.vue4
-rw-r--r--app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue2
-rw-r--r--app/assets/javascripts/projects/upload_file_experiment.js21
-rw-r--r--app/assets/javascripts/reports/components/grouped_test_reports_app.vue2
-rw-r--r--app/assets/javascripts/security_configuration/components/configuration_table.vue5
-rw-r--r--app/assets/javascripts/security_configuration/components/features_constants.js11
-rw-r--r--app/assets/javascripts/sentry/sentry_config.js2
-rw-r--r--app/assets/javascripts/sentry/wrapper.js26
-rw-r--r--app/assets/javascripts/sidebar/components/subscriptions/subscriptions.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/time_tracking/help_state.vue6
-rw-r--r--app/assets/javascripts/static_site_editor/constants.js2
-rw-r--r--app/assets/javascripts/tracking.js20
-rw-r--r--app/assets/javascripts/user_popovers.js26
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue2
-rw-r--r--app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue4
-rw-r--r--app/assets/javascripts/vue_shared/alert_details/components/alert_metrics.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/settings/settings_block.vue7
-rw-r--r--app/assets/javascripts/vue_shared/components/tabs/tab.vue47
-rw-r--r--app/assets/javascripts/vue_shared/components/tabs/tabs.js76
-rw-r--r--app/assets/javascripts/vue_shared/components/tooltip_on_truncate.vue7
-rw-r--r--app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue21
-rw-r--r--app/assets/javascripts/vue_shared/directives/tooltip.js35
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/constants.js1
-rw-r--r--app/assets/stylesheets/framework.scss1
-rw-r--r--app/assets/stylesheets/framework/buttons.scss1
-rw-r--r--app/assets/stylesheets/framework/diffs.scss1
-rw-r--r--app/assets/stylesheets/framework/editor-lite.scss5
-rw-r--r--app/assets/stylesheets/framework/filters.scss2
-rw-r--r--app/assets/stylesheets/framework/layout.scss3
-rw-r--r--app/assets/stylesheets/framework/lists.scss6
-rw-r--r--app/assets/stylesheets/framework/mixins.scss1
-rw-r--r--app/assets/stylesheets/framework/tooltips.scss6
-rw-r--r--app/assets/stylesheets/framework/typography.scss8
-rw-r--r--app/assets/stylesheets/framework/variables.scss2
-rw-r--r--app/assets/stylesheets/highlight/conflict_colors.scss2
-rw-r--r--app/assets/stylesheets/mailer_client_specific.scss1
-rw-r--r--app/assets/stylesheets/page_bundles/ide.scss3
-rw-r--r--app/assets/stylesheets/page_bundles/jira_connect.scss56
-rw-r--r--app/assets/stylesheets/page_bundles/signup.scss5
-rw-r--r--app/assets/stylesheets/pages/clusters.scss1
-rw-r--r--app/assets/stylesheets/pages/login.scss11
-rw-r--r--app/assets/stylesheets/pages/merge_requests.scss5
-rw-r--r--app/assets/stylesheets/pages/note_form.scss15
-rw-r--r--app/assets/stylesheets/startup/startup-signin.scss5
-rw-r--r--app/assets/stylesheets/themes/theme_helper.scss1
-rw-r--r--app/assets/stylesheets/vendors/atwho.scss5
-rw-r--r--app/controllers/admin/instance_statistics_controller.rb18
-rw-r--r--app/controllers/admin/usage_trends_controller.rb12
-rw-r--r--app/controllers/concerns/check_rate_limit.rb23
-rw-r--r--app/controllers/concerns/comment_and_close_flag.rb2
-rw-r--r--app/controllers/concerns/notes_actions.rb8
-rw-r--r--app/controllers/concerns/security_and_compliance_permissions.rb15
-rw-r--r--app/controllers/projects/blob_controller.rb10
-rw-r--r--app/controllers/projects/ci/pipeline_editor_controller.rb1
-rw-r--r--app/controllers/projects/notes_controller.rb17
-rw-r--r--app/controllers/projects/pipelines_controller.rb4
-rw-r--r--app/controllers/projects/security/configuration_controller.rb2
-rw-r--r--app/controllers/projects/templates_controller.rb2
-rw-r--r--app/controllers/projects_controller.rb9
-rw-r--r--app/controllers/root_controller.rb2
-rw-r--r--app/finders/packages/npm/package_finder.rb38
-rw-r--r--app/finders/template_finder.rb16
-rw-r--r--app/graphql/mutations/custom_emoji/create.rb1
-rw-r--r--app/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver.rb (renamed from app/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver.rb)8
-rw-r--r--app/graphql/resolvers/alert_management/http_integrations_resolver.rb23
-rw-r--r--app/graphql/resolvers/ci/config_resolver.rb2
-rw-r--r--app/graphql/resolvers/full_path_resolver.rb2
-rw-r--r--app/graphql/types/admin/analytics/usage_trends/measurement_identifier_enum.rb (renamed from app/graphql/types/admin/analytics/instance_statistics/measurement_identifier_enum.rb)2
-rw-r--r--app/graphql/types/admin/analytics/usage_trends/measurement_type.rb (renamed from app/graphql/types/admin/analytics/instance_statistics/measurement_type.rb)8
-rw-r--r--app/graphql/types/alert_management/http_integration_type.rb2
-rw-r--r--app/graphql/types/board_type.rb2
-rw-r--r--app/graphql/types/ci_configuration/sast/ui_component_size_enum.rb6
-rw-r--r--app/graphql/types/global_id_type.rb5
-rw-r--r--app/graphql/types/label_type.rb4
-rw-r--r--app/graphql/types/mutation_type.rb1
-rw-r--r--app/graphql/types/project_type.rb6
-rw-r--r--app/graphql/types/query_type.rb12
-rw-r--r--app/helpers/application_helper.rb2
-rw-r--r--app/helpers/auth_helper.rb19
-rw-r--r--app/helpers/commits_helper.rb4
-rw-r--r--app/helpers/invite_members_helper.rb8
-rw-r--r--app/helpers/issuables_description_templates_helper.rb17
-rw-r--r--app/helpers/projects_helper.rb15
-rw-r--r--app/helpers/services_helper.rb8
-rw-r--r--app/helpers/stat_anchors_helper.rb3
-rw-r--r--app/models/analytics/instance_statistics.rb9
-rw-r--r--app/models/analytics/usage_trends/measurement.rb (renamed from app/models/analytics/instance_statistics/measurement.rb)6
-rw-r--r--app/models/bulk_imports/entity.rb5
-rw-r--r--app/models/ci/build.rb5
-rw-r--r--app/models/clusters/agent_token.rb4
-rw-r--r--app/models/concerns/project_features_compatibility.rb8
-rw-r--r--app/models/custom_emoji.rb2
-rw-r--r--app/models/group.rb26
-rw-r--r--app/models/iteration.rb28
-rw-r--r--app/models/iterations/cadence.rb14
-rw-r--r--app/models/list.rb1
-rw-r--r--app/models/merge_request.rb17
-rw-r--r--app/models/namespace.rb8
-rw-r--r--app/models/notification_setting.rb3
-rw-r--r--app/models/packages/nuget.rb2
-rw-r--r--app/models/packages/package.rb14
-rw-r--r--app/models/packages/rubygems.rb10
-rw-r--r--app/models/packages/rubygems/metadatum.rb1
-rw-r--r--app/models/pages/lookup_path.rb2
-rw-r--r--app/models/project.rb7
-rw-r--r--app/models/project_feature.rb22
-rw-r--r--app/models/project_services/jira_service.rb74
-rw-r--r--app/models/project_services/mattermost_service.rb2
-rw-r--r--app/models/project_services/slack_mattermost/notifier.rb24
-rw-r--r--app/models/project_services/slack_service.rb25
-rw-r--r--app/models/repository.rb14
-rw-r--r--app/models/snippet.rb6
-rw-r--r--app/models/user.rb1
-rw-r--r--app/policies/analytics/usage_trends/measurement_policy.rb (renamed from app/policies/analytics/instance_statistics/measurement_policy.rb)2
-rw-r--r--app/policies/global_policy.rb2
-rw-r--r--app/policies/project_policy.rb5
-rw-r--r--app/presenters/packages/composer/packages_presenter.rb2
-rw-r--r--app/presenters/project_presenter.rb61
-rw-r--r--app/serializers/base_discussion_entity.rb2
-rw-r--r--app/serializers/current_board_entity.rb2
-rw-r--r--app/services/boards/lists/list_service.rb21
-rw-r--r--app/services/ci/create_pipeline_service.rb4
-rw-r--r--app/services/clusters/kubernetes.rb2
-rw-r--r--app/services/clusters/kubernetes/create_or_update_service_account_service.rb32
-rw-r--r--app/services/groups/destroy_service.rb4
-rw-r--r--app/services/groups/group_links/create_service.rb2
-rw-r--r--app/services/groups/group_links/destroy_service.rb2
-rw-r--r--app/services/groups/group_links/update_service.rb2
-rw-r--r--app/services/issuable/process_assignees.rb36
-rw-r--r--app/services/issues/export_csv_service.rb10
-rw-r--r--app/services/merge_requests/refresh_service.rb12
-rw-r--r--app/services/notification_service.rb7
-rw-r--r--app/services/packages/create_temporary_package_service.rb21
-rw-r--r--app/services/packages/nuget/create_package_service.rb23
-rw-r--r--app/services/packages/nuget/update_package_from_metadata_service.rb3
-rw-r--r--app/services/pages/legacy_storage_lease.rb9
-rw-r--r--app/services/projects/create_service.rb2
-rw-r--r--app/validators/json_schemas/vulnerability_finding_details.json266
-rw-r--r--app/views/admin/application_settings/_package_registry.html.haml2
-rw-r--r--app/views/admin/groups/_group.html.haml2
-rw-r--r--app/views/admin/projects/_projects.html.haml2
-rw-r--r--app/views/admin/usage_trends/index.html.haml (renamed from app/views/admin/instance_statistics/index.html.haml)2
-rw-r--r--app/views/admin/users/index.html.haml2
-rw-r--r--app/views/devise/confirmations/almost_there.haml16
-rw-r--r--app/views/devise/sessions/_new_base.html.haml2
-rw-r--r--app/views/devise/shared/_omniauth_box.html.haml2
-rw-r--r--app/views/groups/group_members/index.html.haml5
-rw-r--r--app/views/groups/settings/_general.html.haml2
-rw-r--r--app/views/groups/settings/ci_cd/show.html.haml2
-rw-r--r--app/views/groups/settings/packages_and_registries/index.html.haml2
-rw-r--r--app/views/groups/settings/repository/show.html.haml2
-rw-r--r--app/views/import/bulk_imports/status.html.haml1
-rw-r--r--app/views/jira_connect/subscriptions/index.html.haml83
-rw-r--r--app/views/layouts/_head.html.haml3
-rw-r--r--app/views/layouts/jira_connect.html.haml3
-rw-r--r--app/views/layouts/nav/sidebar/_admin.html.haml9
-rw-r--r--app/views/layouts/nav/sidebar/_profile.html.haml2
-rw-r--r--app/views/peek/_bar.html.haml1
-rw-r--r--app/views/profiles/show.html.haml6
-rw-r--r--app/views/projects/_merge_request_merge_method_settings.html.haml2
-rw-r--r--app/views/projects/blob/_template_selectors.html.haml2
-rw-r--r--app/views/projects/blob/_upload.html.haml2
-rw-r--r--app/views/projects/commit/_pipelines_list.haml2
-rw-r--r--app/views/projects/commits/_commit.html.haml2
-rw-r--r--app/views/projects/diffs/_diffs.html.haml2
-rw-r--r--app/views/projects/edit.html.haml10
-rw-r--r--app/views/projects/empty.html.haml5
-rw-r--r--app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml6
-rw-r--r--app/views/projects/pipelines/index.html.haml2
-rw-r--r--app/views/projects/pipelines/new.html.haml2
-rw-r--r--app/views/projects/pipelines/show.html.haml2
-rw-r--r--app/views/projects/project_members/index.html.haml5
-rw-r--r--app/views/projects/project_templates/_project_fields_form.html.haml2
-rw-r--r--app/views/projects/protected_branches/shared/_create_protected_branch.html.haml2
-rw-r--r--app/views/projects/protected_branches/shared/_index.html.haml2
-rw-r--r--app/views/projects/settings/_general.html.haml4
-rw-r--r--app/views/projects/settings/ci_cd/_badge.html.haml6
-rw-r--r--app/views/projects/settings/ci_cd/_form.html.haml2
-rw-r--r--app/views/projects/settings/ci_cd/show.html.haml23
-rw-r--r--app/views/projects/settings/operations/show.html.haml2
-rw-r--r--app/views/projects/settings/repository/show.html.haml2
-rw-r--r--app/views/shared/_new_commit_form.html.haml7
-rw-r--r--app/views/shared/issuable/_search_bar.html.haml2
-rw-r--r--app/views/shared/issuable/_sidebar_assignees.html.haml3
-rw-r--r--app/views/shared/projects/_project.html.haml9
-rw-r--r--app/views/users/show.html.haml14
-rw-r--r--app/workers/all_queues.yml32
-rw-r--r--app/workers/analytics/instance_statistics/count_job_trigger_worker.rb18
-rw-r--r--app/workers/analytics/instance_statistics/counter_job_worker.rb22
-rw-r--r--app/workers/analytics/usage_trends/count_job_trigger_worker.rb34
-rw-r--r--app/workers/analytics/usage_trends/counter_job_worker.rb35
-rw-r--r--app/workers/post_receive.rb1
-rw-r--r--app/workers/releases/create_evidence_worker.rb1
-rwxr-xr-xbin/actioncable2
-rwxr-xr-xbin/web_puma2
-rw-r--r--changelogs/unreleased/16119-jira-issue-transition-automatic.yml5
-rw-r--r--changelogs/unreleased/20917-do-not-show-button-to-resolve-discussion-opening-an-issue-when-issu.yml5
-rw-r--r--changelogs/unreleased/221296-skip_orphaned_pool_repositories_on_restore.yml5
-rw-r--r--changelogs/unreleased/231064-update-settings-buttons-to-pajamas.yml5
-rw-r--r--changelogs/unreleased/231126-yo-gitlab-ui.yml6
-rw-r--r--changelogs/unreleased/241058-mg-update-reply-placeholder.yml5
-rw-r--r--changelogs/unreleased/273292-fy21q4-foundations-kr2-audit-and-update-buttons-on-sessionscontrol.yml6
-rw-r--r--changelogs/unreleased/275169-remove-service-desk-issue-prefix.yml5
-rw-r--r--changelogs/unreleased/285438-rename-instance-statistics-to-usage-trends.yml6
-rw-r--r--changelogs/unreleased/292498-webid-extension.yml5
-rw-r--r--changelogs/unreleased/292602-remove-fetch_mirror_check_tags_changed-ff.yml5
-rw-r--r--changelogs/unreleased/293921-wrap-iterations.yml5
-rw-r--r--changelogs/unreleased/297240-enable-skip_dag_manual_and_delayed_jobs.yml5
-rw-r--r--changelogs/unreleased/299034-group-group-links-project-authorizations-refresh-can-be-limited-to.yml6
-rw-r--r--changelogs/unreleased/299895-experiment-cleanup-customize_homepage-banner.yml5
-rw-r--r--changelogs/unreleased/30010-graphql-doc.yml5
-rw-r--r--changelogs/unreleased/300417-agent-token-description.yml5
-rw-r--r--changelogs/unreleased/300435-add-label.yml5
-rw-r--r--changelogs/unreleased/300443-add-label.yml5
-rw-r--r--changelogs/unreleased/300458-send-gitlab_standard-context-with-requirements-events-from-the-fro.yml5
-rw-r--r--changelogs/unreleased/301032-license-creation-via-api.yml5
-rw-r--r--changelogs/unreleased/320949-ci-help-path-remove-prop.yml5
-rw-r--r--changelogs/unreleased/321027-enable-ci_trigger_payload_into_pipeline.yml5
-rw-r--r--changelogs/unreleased/321054-enable-quick-actions-usage-data.yml5
-rw-r--r--changelogs/unreleased/321283-update-kubernetes-version-supported.yml5
-rw-r--r--changelogs/unreleased/321297-load-only-metadata-for-markdown-video-include.yml5
-rw-r--r--changelogs/unreleased/321420-spell-npm-with-lowercase-letters-in-package-registry-ui.yml5
-rw-r--r--changelogs/unreleased/321488-mr-changes-view-render-version-dropdowns-above-navbar.yml5
-rw-r--r--changelogs/unreleased/321667-follow-first.yml5
-rw-r--r--changelogs/unreleased/321677-enable-pages-zip-file-protocol-by-default.yml5
-rw-r--r--changelogs/unreleased/321834-fj-remove-nil-values-from-snippet-blobs.yml5
-rw-r--r--changelogs/unreleased/321939-fix-error-when-rendering-project-pipeline.yml5
-rw-r--r--changelogs/unreleased/321958-fix-npm-instance-level-api-with-scoped-packages.yml5
-rw-r--r--changelogs/unreleased/322198-fix-metrics-tab.yml5
-rw-r--r--changelogs/unreleased/33685-lift-npm-package-naming-convention-for-project-level-api.yml5
-rw-r--r--changelogs/unreleased/33748-dont-close-auto-suggest-select-boxes-if-only-mouseup-outside-box.yml5
-rw-r--r--changelogs/unreleased/ab-index-rename.yml5
-rw-r--r--changelogs/unreleased/add-kas-api-url-config.yml5
-rw-r--r--changelogs/unreleased/add_role_and_rolebinding_for_cilium_network_policies.yml5
-rw-r--r--changelogs/unreleased/align-mr-conflict-center.yml5
-rw-r--r--changelogs/unreleased/btn-confirm-subs-banner.yml5
-rw-r--r--changelogs/unreleased/btn-default-admin-edit.yml5
-rw-r--r--changelogs/unreleased/btn-icon-commit-action.yml5
-rw-r--r--changelogs/unreleased/btn-icon-schedules.yml5
-rw-r--r--changelogs/unreleased/bvl-fix-create-release-worker-is-not-cron.yml5
-rw-r--r--changelogs/unreleased/cngo-convert-tab-to-gl-tab.yml5
-rw-r--r--changelogs/unreleased/default-enabled-api_always_use_application_json.yml5
-rw-r--r--changelogs/unreleased/expose-failure-reasons-features.yml5
-rw-r--r--changelogs/unreleased/feature-230726-repo-tabs.yml5
-rw-r--r--changelogs/unreleased/fix-email-participants-migration-version-number.yml6
-rw-r--r--changelogs/unreleased/fix-keep-artifacts-project-setting.yml5
-rw-r--r--changelogs/unreleased/fix-overflowing-width-at-mention-selector.yml5
-rw-r--r--changelogs/unreleased/fix-project-import-visibility-error.yml5
-rw-r--r--changelogs/unreleased/gl-button-email-request.yml5
-rw-r--r--changelogs/unreleased/gl-button-time-tracking.yml5
-rw-r--r--changelogs/unreleased/jira-connect-app-style-cleanup.yml5
-rw-r--r--changelogs/unreleased/john_long-composer-package-relative-url.yml5
-rw-r--r--changelogs/unreleased/kassio-bulkimports-filter-group-labels.yml5
-rw-r--r--changelogs/unreleased/kassio-bulkimports-import-group-label-timestamps.yml5
-rw-r--r--changelogs/unreleased/kassio-graphql-expose-label-create-at-updated-at.yml5
-rw-r--r--changelogs/unreleased/ld-handle-gids-for-unknown-objects.yml5
-rw-r--r--changelogs/unreleased/lm-fix-authorization-lint.yml5
-rw-r--r--changelogs/unreleased/mg-fix-firefox-textarea-styling.yml5
-rw-r--r--changelogs/unreleased/mwps-settings.yml5
-rw-r--r--changelogs/unreleased/psi-board-scroll.yml5
-rw-r--r--changelogs/unreleased/puma_sigint.yml5
-rw-r--r--changelogs/unreleased/reenable-sentry-pipeline-graph-only.yml5
-rw-r--r--changelogs/unreleased/remove-ci_jwt_include_environment-feature-flag.yml5
-rw-r--r--changelogs/unreleased/remove-commit-paginate-ff.yml5
-rw-r--r--changelogs/unreleased/remove-margin-status.yml5
-rw-r--r--changelogs/unreleased/reset_template_cache_key.yml5
-rw-r--r--changelogs/unreleased/sh-azure-ad-v2-omniauth.yml5
-rw-r--r--changelogs/unreleased/sh-fix-export-csv-service-nplusone.yml5
-rw-r--r--changelogs/unreleased/sh-update-batchloader-2-0-0.yml5
-rw-r--r--changelogs/unreleased/sidebar-user-avatar.yml5
-rw-r--r--changelogs/unreleased/ssarka-master-patch-39936.yml5
-rw-r--r--changelogs/unreleased/tc-add-custom-emoji-creator.yml5
-rw-r--r--changelogs/unreleased/test_update_merge_request_worker_performance_3.yml5
-rw-r--r--changelogs/unreleased/tor-defect-missing-popovers-from-async-DOM.yml6
-rw-r--r--changelogs/unreleased/update_latex_template.yml5
-rw-r--r--changelogs/unreleased/vs-break-long-code-line-in-markdown.yml5
-rw-r--r--changelogs/unreleased/vs-enable-gitlab-stylelint-config.yml5
-rw-r--r--changelogs/unreleased/xanf-allow-top-level-bulk-imports.yml5
-rw-r--r--config/application.rb3
-rw-r--r--config/feature_flags/development/api_always_use_application_json.yml2
-rw-r--r--config/feature_flags/development/application_settings_tokens_optional_encryption.yml6
-rw-r--r--config/feature_flags/development/auto_devops_banner_disabled.yml2
-rw-r--r--config/feature_flags/development/chatops.yml6
-rw-r--r--config/feature_flags/development/ci_trigger_payload_into_pipeline.yml2
-rw-r--r--config/feature_flags/development/customize_homepage.yml (renamed from config/feature_flags/development/instance_statistics.yml)10
-rw-r--r--config/feature_flags/development/groups_tokens_optional_encryption.yml6
-rw-r--r--config/feature_flags/development/inherited_issuable_templates.yml (renamed from config/feature_flags/development/ci_jwt_include_environment.yml)8
-rw-r--r--config/feature_flags/development/json_wrapper_legacy_mode.yml6
-rw-r--r--config/feature_flags/development/notes_create_service_tracking.yml6
-rw-r--r--config/feature_flags/development/pages_serve_with_zip_file_protocol.yml2
-rw-r--r--config/feature_flags/development/pipeline_status_for_pipeline_editor.yml (renamed from config/feature_flags/development/pages_use_legacy_storage_lease.yml)12
-rw-r--r--config/feature_flags/development/pipelines_security_report_summary.yml2
-rw-r--r--config/feature_flags/development/project_statistics_sync.yml6
-rw-r--r--config/feature_flags/development/projects_tokens_optional_encryption.yml6
-rw-r--r--config/feature_flags/development/security_orchestration_policies_configuration.yml8
-rw-r--r--config/feature_flags/development/skip_dag_manual_and_delayed_jobs.yml2
-rw-r--r--config/feature_flags/development/usage_data_code_review_aggregation.yml8
-rw-r--r--config/feature_flags/development/usage_data_i_analytics_cohorts.yml8
-rw-r--r--config/feature_flags/development/usage_data_track_quickactions.yml4
-rw-r--r--config/feature_flags/experiment/ci_syntax_templates_b_experiment_percentage.yml (renamed from config/feature_flags/experiment/ci_syntax_templates_experiment_percentage.yml)8
-rw-r--r--config/feature_flags/experiment/customize_homepage_experiment_percentage.yml8
-rw-r--r--config/feature_flags/experiment/empty_repo_upload.yml (renamed from config/feature_flags/development/paginate_commit_view.yml)10
-rw-r--r--config/feature_flags/ops/marginalia.yml8
-rw-r--r--config/gitlab.yml.example7
-rw-r--r--config/initializers/0_marginalia.rb7
-rw-r--r--config/initializers/1_settings.rb9
-rw-r--r--config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174914_g_analytics_contribution_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174918_g_analytics_insights_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174921_g_analytics_issues_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174926_g_analytics_productivity_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174929_g_analytics_valuestream_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174937_p_analytics_code_reviews_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174945_p_analytics_insights_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174949_p_analytics_issues_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174953_p_analytics_repo_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175008_p_analytics_merge_request_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175055_merge_requests.yml16
-rw-r--r--config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml17
-rw-r--r--config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml17
-rw-r--r--config/metrics/counts_28d/20210216175101_merge_requests_users.yml16
-rw-r--r--config/metrics/counts_28d/20210216175109_suggestions.yml16
-rw-r--r--config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml17
-rw-r--r--config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml19
-rw-r--r--config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml19
-rw-r--r--config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml19
-rw-r--r--config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml19
-rw-r--r--config/metrics/counts_28d/20210216175413_clusters_management_project.yml19
-rw-r--r--config/metrics/counts_28d/20210216175415_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_28d/20210216175417_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml19
-rw-r--r--config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml19
-rw-r--r--config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml19
-rw-r--r--config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_28d/20210216175542_ci_builds.yml16
-rw-r--r--config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml16
-rw-r--r--config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml16
-rw-r--r--config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml16
-rw-r--r--config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml16
-rw-r--r--config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml16
-rw-r--r--config/metrics/counts_28d/20210216175554_ci_pipelines.yml17
-rw-r--r--config/metrics/counts_28d/20210216175556_ci_triggers.yml19
-rw-r--r--config/metrics/counts_28d/20210216175616_user_dast_jobs.yml16
-rw-r--r--config/metrics/counts_28d/20210216175618_dast_pipeline.yml16
-rw-r--r--config/metrics/counts_28d/20210216180308_personal_snippets.yml19
-rw-r--r--config/metrics/counts_28d/20210216180310_project_snippets.yml19
-rw-r--r--config/metrics/counts_28d/20210216180312_snippets.yml19
-rw-r--r--config/metrics/counts_28d/20210216180317_snippets.yml19
-rw-r--r--config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml16
-rw-r--r--config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml16
-rw-r--r--config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml16
-rw-r--r--config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml16
-rw-r--r--config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml16
-rw-r--r--config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180355_user_api_fuzzing_jobs.yml16
-rw-r--r--config/metrics/counts_28d/20210216180357_user_api_fuzzing_dnd_jobs.yml16
-rw-r--r--config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml18
-rw-r--r--config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml18
-rw-r--r--config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml16
-rw-r--r--config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml16
-rw-r--r--config/metrics/counts_28d/20210216180524_projects_with_incidents.yml16
-rw-r--r--config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml17
-rw-r--r--config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml17
-rw-r--r--config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml16
-rw-r--r--config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml16
-rw-r--r--config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml16
-rw-r--r--config/metrics/counts_28d/20210216180814_events.yml17
-rw-r--r--config/metrics/counts_28d/20210216180816_groups.yml16
-rw-r--r--config/metrics/counts_28d/20210216180818_users_created.yml17
-rw-r--r--config/metrics/counts_28d/20210216180820_ldap_keys.yml16
-rw-r--r--config/metrics/counts_28d/20210216180822_ldap_users.yml16
-rw-r--r--config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml16
-rw-r--r--config/metrics/counts_28d/20210216180956_clusters.yml16
-rw-r--r--config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml16
-rw-r--r--config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml16
-rw-r--r--config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml16
-rw-r--r--config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml16
-rw-r--r--config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml16
-rw-r--r--config/metrics/counts_28d/20210216181050_packages.yml16
-rw-r--r--config/metrics/counts_28d/20210216181057_projects_with_packages.yml16
-rw-r--r--config/metrics/counts_28d/20210216181139_issues.yml16
-rw-r--r--config/metrics/counts_28d/20210216181141_notes.yml16
-rw-r--r--config/metrics/counts_28d/20210216181143_projects.yml16
-rw-r--r--config/metrics/counts_28d/20210216181145_todos.yml16
-rw-r--r--config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml17
-rw-r--r--config/metrics/counts_28d/20210216181148_service_desk_issues.yml17
-rw-r--r--config/metrics/counts_28d/20210216181150_projects_jira_active.yml16
-rw-r--r--config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml16
-rw-r--r--config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml16
-rw-r--r--config/metrics/counts_28d/20210216181158_epics.yml16
-rw-r--r--config/metrics/counts_28d/20210216181200_label_lists.yml16
-rw-r--r--config/metrics/counts_28d/20210216181201_milestone_lists.yml16
-rw-r--r--config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181341_g_project_management_issue_iteration_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181345_g_project_management_issue_weight_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181414_g_project_management_issue_added_to_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181416_g_project_management_issue_removed_from_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181420_g_project_management_issue_changed_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181457_g_project_management_issue_health_status_changed_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181516_i_quickactions_assign_multiple_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181534_i_quickactions_child_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181538_i_quickactions_clear_weight_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181618_i_quickactions_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181626_i_quickactions_iteration_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181648_i_quickactions_parent_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181652_i_quickactions_promote_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181655_i_quickactions_publish_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181718_i_quickactions_remove_child_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181725_i_quickactions_remove_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181732_i_quickactions_remove_iteration_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181740_i_quickactions_remove_parent_epic_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181857_i_quickactions_weight_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216181923_successful_deployments.yml16
-rw-r--r--config/metrics/counts_28d/20210216181924_failed_deployments.yml16
-rw-r--r--config/metrics/counts_28d/20210216181935_deployments.yml16
-rw-r--r--config/metrics/counts_28d/20210216181937_failed_deployments.yml16
-rw-r--r--config/metrics/counts_28d/20210216181939_releases.yml16
-rw-r--r--config/metrics/counts_28d/20210216181941_successful_deployments.yml16
-rw-r--r--config/metrics/counts_28d/20210216181943_projects_mirrored_with_pipelines_enabled.yml16
-rw-r--r--config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml19
-rw-r--r--config/metrics/counts_28d/20210216181956_user_unique_users_all_secure_scanners.yml16
-rw-r--r--config/metrics/counts_28d/20210216182034_deploy_keys.yml16
-rw-r--r--config/metrics/counts_28d/20210216182036_keys.yml16
-rw-r--r--config/metrics/counts_28d/20210216182038_remote_mirrors.yml16
-rw-r--r--config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml16
-rw-r--r--config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml16
-rw-r--r--config/metrics/counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml16
-rw-r--r--config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml16
-rw-r--r--config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml16
-rw-r--r--config/metrics/counts_28d/20210216182051_protected_branches.yml16
-rw-r--r--config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216182106_design_action_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216182109_project_action_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216182125_user_sast_jobs.yml19
-rw-r--r--config/metrics/counts_28d/20210216182127_user_secret_detection_jobs.yml19
-rw-r--r--config/metrics/counts_28d/20210216182129_sast_pipeline.yml19
-rw-r--r--config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml19
-rw-r--r--config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210216182200_i_testing_metrics_report_artifact_uploaders_monthly.yml20
-rw-r--r--config/metrics/counts_28d/20210216182209_user_preferences_group_overview_security_dashboard.yml18
-rw-r--r--config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml16
-rw-r--r--config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml16
-rw-r--r--config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml16
-rw-r--r--config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml16
-rw-r--r--config/metrics/counts_28d/20210216183209_i_testing_paid_monthly_active_user_total.yml16
-rw-r--r--config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml16
-rw-r--r--config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml16
-rw-r--r--config/metrics/counts_28d/20210216183618_approval_project_rules_with_more_approvers_than_required.yml16
-rw-r--r--config/metrics/counts_28d/20210216183620_approval_project_rules_with_less_approvers_than_required.yml16
-rw-r--r--config/metrics/counts_28d/20210216183622_approval_project_rules_with_exact_required_approvers.yml16
-rw-r--r--config/metrics/counts_28d/20210216183627_omniauth_providers.yml16
-rw-r--r--config/metrics/counts_28d/20210216183629_two-factor.yml16
-rw-r--r--config/metrics/counts_28d/20210216183631_two-factor-via-u2f-device.yml16
-rw-r--r--config/metrics/counts_28d/20210216183633_two-factor-via-webauthn-device.yml16
-rw-r--r--config/metrics/counts_28d/20210216183634_standard.yml16
-rw-r--r--config/metrics/counts_28d/20210216183636_google_oauth2.yml16
-rw-r--r--config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml16
-rw-r--r--config/metrics/counts_28d/20210216183640_gitlab.yml16
-rw-r--r--config/metrics/counts_28d/20210216183642_gitlab_v1.yml16
-rw-r--r--config/metrics/counts_28d/20210216183644_gitlab_project.yml16
-rw-r--r--config/metrics/counts_28d/20210216183646_gitlab.yml16
-rw-r--r--config/metrics/counts_28d/20210216183648_github.yml16
-rw-r--r--config/metrics/counts_28d/20210216183650_bitbucket.yml16
-rw-r--r--config/metrics/counts_28d/20210216183652_bitbucket_server.yml16
-rw-r--r--config/metrics/counts_28d/20210216183653_gitea.yml16
-rw-r--r--config/metrics/counts_28d/20210216183655_git.yml16
-rw-r--r--config/metrics/counts_28d/20210216183657_manifest.yml16
-rw-r--r--config/metrics/counts_28d/20210216183659_gitlab_migration.yml16
-rw-r--r--config/metrics/counts_28d/20210216183701_jira.yml16
-rw-r--r--config/metrics/counts_28d/20210216183703_fogbugz.yml16
-rw-r--r--config/metrics/counts_28d/20210216183705_phabricator.yml16
-rw-r--r--config/metrics/counts_28d/20210216183707_csv.yml16
-rw-r--r--config/metrics/counts_28d/20210216183709_group_import.yml16
-rw-r--r--config/metrics/counts_28d/20210216183711_gitlab_migration.yml16
-rw-r--r--config/metrics/counts_28d/20210216183712_total.yml16
-rw-r--r--config/metrics/counts_28d/20210216183714_gitlab_project.yml16
-rw-r--r--config/metrics/counts_28d/20210216183716_gitlab.yml16
-rw-r--r--config/metrics/counts_28d/20210216183718_github.yml16
-rw-r--r--config/metrics/counts_28d/20210216183720_bitbucket.yml16
-rw-r--r--config/metrics/counts_28d/20210216183722_bitbucket_server.yml16
-rw-r--r--config/metrics/counts_28d/20210216183724_gitea.yml16
-rw-r--r--config/metrics/counts_28d/20210216183726_git.yml16
-rw-r--r--config/metrics/counts_28d/20210216183728_manifest.yml16
-rw-r--r--config/metrics/counts_28d/20210216183730_jira.yml16
-rw-r--r--config/metrics/counts_28d/20210216183731_fogbugz.yml16
-rw-r--r--config/metrics/counts_28d/20210216183733_phabricator.yml16
-rw-r--r--config/metrics/counts_28d/20210216183735_csv.yml16
-rw-r--r--config/metrics/counts_28d/20210216183737_groups_imported.yml16
-rw-r--r--config/metrics/counts_28d/20210216183753_projects_incident_sla_enabled.yml16
-rw-r--r--config/metrics/counts_28d/20210216183817_user_coverage_fuzzing_jobs.yml16
-rw-r--r--config/metrics/counts_28d/20210216183826_sast_scans.yml16
-rw-r--r--config/metrics/counts_28d/20210216183828_dependency_scanning_scans.yml16
-rw-r--r--config/metrics/counts_28d/20210216183830_container_scanning_scans.yml16
-rw-r--r--config/metrics/counts_28d/20210216183832_dast_scans.yml16
-rw-r--r--config/metrics/counts_28d/20210216183834_secret_detection_scans.yml16
-rw-r--r--config/metrics/counts_28d/20210216183836_coverage_fuzzing_scans.yml16
-rw-r--r--config/metrics/counts_28d/20210216183838_api_fuzzing_scans.yml16
-rw-r--r--config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184035_i_search_paid_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184251_i_ci_secrets_management_vault_build_created_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184949_i_ecosystem_jira_service_list_issues_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184953_i_ecosystem_jira_service_create_issue_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml4
-rw-r--r--config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml18
-rw-r--r--config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml18
-rw-r--r--config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210216182158_i_testing_metrics_report_artifact_uploaders_weekly.yml20
-rw-r--r--config/metrics/counts_all/20210204124930_servers.yml6
-rw-r--r--config/metrics/counts_all/20210204124932_clusters.yml6
-rw-r--r--config/metrics/counts_all/20210216174826_ldap_users.yml19
-rw-r--r--config/metrics/counts_all/20210216174829_smtp_server.yml19
-rw-r--r--config/metrics/counts_all/20210216174832_cycle_analytics_views.yml16
-rw-r--r--config/metrics/counts_all/20210216174834_productivity_analytics_views.yml16
-rw-r--r--config/metrics/counts_all/20210216174836_g_analytics_contribution.yml16
-rw-r--r--config/metrics/counts_all/20210216174838_g_analytics_insights.yml16
-rw-r--r--config/metrics/counts_all/20210216174840_g_analytics_issues.yml16
-rw-r--r--config/metrics/counts_all/20210216174842_g_analytics_productivity.yml16
-rw-r--r--config/metrics/counts_all/20210216174844_g_analytics_valuestream.yml16
-rw-r--r--config/metrics/counts_all/20210216174846_p_analytics_pipelines.yml16
-rw-r--r--config/metrics/counts_all/20210216174848_p_analytics_code_reviews.yml16
-rw-r--r--config/metrics/counts_all/20210216174850_p_analytics_valuestream.yml16
-rw-r--r--config/metrics/counts_all/20210216174852_p_analytics_insights.yml16
-rw-r--r--config/metrics/counts_all/20210216174854_p_analytics_issues.yml16
-rw-r--r--config/metrics/counts_all/20210216174856_p_analytics_repo.yml16
-rw-r--r--config/metrics/counts_all/20210216174858_i_analytics_cohorts.yml16
-rw-r--r--config/metrics/counts_all/20210216174900_i_analytics_dev_ops_score.yml16
-rw-r--r--config/metrics/counts_all/20210216174902_g_analytics_merge_request.yml16
-rw-r--r--config/metrics/counts_all/20210216174904_p_analytics_merge_request.yml16
-rw-r--r--config/metrics/counts_all/20210216174906_i_analytics_instance_statistics.yml16
-rw-r--r--config/metrics/counts_all/20210216174908_analytics_unique_visits_for_any_target.yml16
-rw-r--r--config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml16
-rw-r--r--config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml16
-rw-r--r--config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml17
-rw-r--r--config/metrics/counts_all/20210216175026_service_desk_issues.yml17
-rw-r--r--config/metrics/counts_all/20210216175028_requirements_created.yml16
-rw-r--r--config/metrics/counts_all/20210216175037_suggestions.yml16
-rw-r--r--config/metrics/counts_all/20210216175039_merge_requests.yml16
-rw-r--r--config/metrics/counts_all/20210216175041_merge_request_comment.yml16
-rw-r--r--config/metrics/counts_all/20210216175043_merge_request_create.yml16
-rw-r--r--config/metrics/counts_all/20210216175045_merge_requests.yml16
-rw-r--r--config/metrics/counts_all/20210216175053_suggestions.yml16
-rw-r--r--config/metrics/counts_all/20210216175206_merged_merge_requests_using_approval_rules.yml16
-rw-r--r--config/metrics/counts_all/20210216175229_auto_devops_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216175231_auto_devops_disabled.yml16
-rw-r--r--config/metrics/counts_all/20210216175232_clusters.yml19
-rw-r--r--config/metrics/counts_all/20210216175234_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175236_project_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175238_group_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175242_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175244_project_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175246_group_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml19
-rw-r--r--config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml19
-rw-r--r--config/metrics/counts_all/20210216175253_clusters_platforms_user.yml19
-rw-r--r--config/metrics/counts_all/20210216175255_clusters_applications_helm.yml19
-rw-r--r--config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml19
-rw-r--r--config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml19
-rw-r--r--config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml19
-rw-r--r--config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml19
-rw-r--r--config/metrics/counts_all/20210216175305_clusters_applications_runner.yml19
-rw-r--r--config/metrics/counts_all/20210216175307_clusters_applications_knative.yml19
-rw-r--r--config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml19
-rw-r--r--config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml19
-rw-r--r--config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml19
-rw-r--r--config/metrics/counts_all/20210216175314_clusters_management_project.yml19
-rw-r--r--config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml16
-rw-r--r--config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml16
-rw-r--r--config/metrics/counts_all/20210216175324_terraform_reports.yml16
-rw-r--r--config/metrics/counts_all/20210216175326_terraform_states.yml16
-rw-r--r--config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml19
-rw-r--r--config/metrics/counts_all/20210216175331_clusters_applications_helm.yml19
-rw-r--r--config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml19
-rw-r--r--config/metrics/counts_all/20210216175335_clusters_applications_knative.yml19
-rw-r--r--config/metrics/counts_all/20210216175337_clusters_management_project.yml19
-rw-r--r--config/metrics/counts_all/20210216175339_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175341_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml19
-rw-r--r--config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml19
-rw-r--r--config/metrics/counts_all/20210216175346_clusters_platforms_user.yml19
-rw-r--r--config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175352_group_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175354_group_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175356_project_clusters_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175358_project_clusters_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml19
-rw-r--r--config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml20
-rw-r--r--config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml20
-rw-r--r--config/metrics/counts_all/20210216175446_network_policy_forwards.yml20
-rw-r--r--config/metrics/counts_all/20210216175448_network_policy_drops.yml20
-rw-r--r--config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml19
-rw-r--r--config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml19
-rw-r--r--config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml19
-rw-r--r--config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml19
-rw-r--r--config/metrics/counts_all/20210216175510_ci_builds.yml16
-rw-r--r--config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml16
-rw-r--r--config/metrics/counts_all/20210216175514_ci_external_pipelines.yml16
-rw-r--r--config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml16
-rw-r--r--config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml16
-rw-r--r--config/metrics/counts_all/20210216175520_ci_runners.yml16
-rw-r--r--config/metrics/counts_all/20210216175521_ci_triggers.yml16
-rw-r--r--config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml16
-rw-r--r--config/metrics/counts_all/20210216175525_ci_builds.yml16
-rw-r--r--config/metrics/counts_all/20210216175527_ci_external_pipelines.yml16
-rw-r--r--config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml16
-rw-r--r--config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml16
-rw-r--r--config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml16
-rw-r--r--config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml16
-rw-r--r--config/metrics/counts_all/20210216175537_ci_pipelines.yml17
-rw-r--r--config/metrics/counts_all/20210216175539_ci_triggers.yml16
-rw-r--r--config/metrics/counts_all/20210216175612_dast_jobs.yml16
-rw-r--r--config/metrics/counts_all/20210216175614_user_dast_jobs.yml16
-rw-r--r--config/metrics/counts_all/20210216175621_web_hooks.yml16
-rw-r--r--config/metrics/counts_all/20210216175623_projects_asana_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175625_groups_asana_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175627_templates_asana_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175628_instances_asana_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175634_projects_assembla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175636_groups_assembla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175638_templates_assembla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175640_instances_assembla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175645_projects_bamboo_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175647_groups_bamboo_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175649_templates_bamboo_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175651_instances_bamboo_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175708_projects_buildkite_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175710_groups_buildkite_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175712_templates_buildkite_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175714_instances_buildkite_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175719_projects_campfire_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175721_groups_campfire_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175723_templates_campfire_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175725_instances_campfire_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175731_projects_confluence_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175733_groups_confluence_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175734_templates_confluence_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175736_instances_confluence_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175753_projects_discord_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175755_groups_discord_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175756_templates_discord_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175758_instances_discord_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175837_projects_flowdock_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175839_groups_flowdock_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175840_templates_flowdock_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175842_instances_flowdock_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175848_projects_github_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175850_groups_github_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175851_templates_github_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175853_instances_github_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175855_projects_inheriting_github_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175857_groups_inheriting_github_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175910_projects_hipchat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175912_groups_hipchat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175913_templates_hipchat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175915_instances_hipchat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175921_projects_irker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175923_groups_irker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175924_templates_irker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175926_instances_irker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175932_projects_jenkins_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175934_groups_jenkins_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175935_templates_jenkins_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175937_instances_jenkins_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175943_projects_jira_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175945_groups_jira_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175946_templates_jira_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175948_instances_jira_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175954_projects_mattermost_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175956_groups_mattermost_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175957_templates_mattermost_active.yml19
-rw-r--r--config/metrics/counts_all/20210216175959_instances_mattermost_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml20
-rw-r--r--config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml20
-rw-r--r--config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180027_projects_packagist_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180029_groups_packagist_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180030_templates_packagist_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180032_instances_packagist_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180100_projects_pushover_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180102_groups_pushover_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180104_templates_pushover_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180105_instances_pushover_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180111_projects_redmine_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180113_groups_redmine_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180115_templates_redmine_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180116_instances_redmine_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180122_projects_slack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180124_groups_slack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180126_templates_slack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180127_instances_slack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180144_projects_teamcity_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180146_groups_teamcity_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180148_templates_teamcity_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180149_instances_teamcity_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180217_projects_youtrack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180219_groups_youtrack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180221_templates_youtrack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180223_instances_youtrack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180228_projects_jira_server_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180239_personal_snippets.yml19
-rw-r--r--config/metrics/counts_all/20210216180241_project_snippets.yml19
-rw-r--r--config/metrics/counts_all/20210216180242_web_ide_commits.yml19
-rw-r--r--config/metrics/counts_all/20210216180244_web_ide_views.yml19
-rw-r--r--config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml19
-rw-r--r--config/metrics/counts_all/20210216180248_web_ide_previews.yml19
-rw-r--r--config/metrics/counts_all/20210216180250_web_ide_terminals.yml19
-rw-r--r--config/metrics/counts_all/20210216180252_web_ide_pipelines.yml19
-rw-r--r--config/metrics/counts_all/20210216180253_snippet_comment.yml19
-rw-r--r--config/metrics/counts_all/20210216180255_snippet_create.yml19
-rw-r--r--config/metrics/counts_all/20210216180257_snippet_update.yml19
-rw-r--r--config/metrics/counts_all/20210216180259_static_site_editor_views.yml19
-rw-r--r--config/metrics/counts_all/20210216180301_static_site_editor_commits.yml16
-rw-r--r--config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml16
-rw-r--r--config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216180306_snippets.yml19
-rw-r--r--config/metrics/counts_all/20210216180316_snippets.yml19
-rw-r--r--config/metrics/counts_all/20210216180344_api_fuzzing_jobs.yml16
-rw-r--r--config/metrics/counts_all/20210216180346_api_fuzzing_dnd_jobs.yml16
-rw-r--r--config/metrics/counts_all/20210216180348_user_api_fuzzing_jobs.yml16
-rw-r--r--config/metrics/counts_all/20210216180350_user_api_fuzzing_dnd_jobs.yml16
-rw-r--r--config/metrics/counts_all/20210216180410_pool_repositories.yml19
-rw-r--r--config/metrics/counts_all/20210216180413_all_searches.yml19
-rw-r--r--config/metrics/counts_all/20210216180414_navbar_searches.yml19
-rw-r--r--config/metrics/counts_all/20210216180416_i_search_total.yml18
-rw-r--r--config/metrics/counts_all/20210216180420_i_search_paid.yml18
-rw-r--r--config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml16
-rw-r--r--config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml19
-rw-r--r--config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml20
-rw-r--r--config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml19
-rw-r--r--config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml19
-rw-r--r--config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml19
-rw-r--r--config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml19
-rw-r--r--config/metrics/counts_all/20210216180447_incident_issues.yml19
-rw-r--r--config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml19
-rw-r--r--config/metrics/counts_all/20210216180451_incident_labeled_issues.yml19
-rw-r--r--config/metrics/counts_all/20210216180453_projects_creating_incidents.yml16
-rw-r--r--config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml16
-rw-r--r--config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml16
-rw-r--r--config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml16
-rw-r--r--config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml16
-rw-r--r--config/metrics/counts_all/20210216180506_status_page_projects.yml16
-rw-r--r--config/metrics/counts_all/20210216180507_status_page_issues.yml16
-rw-r--r--config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216180518_projects_with_incidents.yml16
-rw-r--r--config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml16
-rw-r--r--config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216180628_projects_imported_from_github.yml16
-rw-r--r--config/metrics/counts_all/20210216180630_projects_imported_from_github.yml16
-rw-r--r--config/metrics/counts_all/20210216180632_unique_users_all_imports.yml16
-rw-r--r--config/metrics/counts_all/20210216180634_gitlab.yml17
-rw-r--r--config/metrics/counts_all/20210216180636_gitlab_v1.yml16
-rw-r--r--config/metrics/counts_all/20210216180638_gitlab_project.yml16
-rw-r--r--config/metrics/counts_all/20210216180639_gitlab.yml16
-rw-r--r--config/metrics/counts_all/20210216180641_github.yml16
-rw-r--r--config/metrics/counts_all/20210216180643_bitbucket.yml16
-rw-r--r--config/metrics/counts_all/20210216180645_bitbucket_server.yml16
-rw-r--r--config/metrics/counts_all/20210216180647_gitea.yml16
-rw-r--r--config/metrics/counts_all/20210216180649_git.yml16
-rw-r--r--config/metrics/counts_all/20210216180650_manifest.yml16
-rw-r--r--config/metrics/counts_all/20210216180652_gitlab_migration.yml16
-rw-r--r--config/metrics/counts_all/20210216180654_jira.yml16
-rw-r--r--config/metrics/counts_all/20210216180656_fogbugz.yml16
-rw-r--r--config/metrics/counts_all/20210216180658_phabricator.yml16
-rw-r--r--config/metrics/counts_all/20210216180700_csv.yml16
-rw-r--r--config/metrics/counts_all/20210216180702_group_import.yml16
-rw-r--r--config/metrics/counts_all/20210216180703_gitlab_migration.yml16
-rw-r--r--config/metrics/counts_all/20210216180705_total.yml16
-rw-r--r--config/metrics/counts_all/20210216180707_gitlab_project.yml16
-rw-r--r--config/metrics/counts_all/20210216180709_gitlab.yml16
-rw-r--r--config/metrics/counts_all/20210216180711_github.yml16
-rw-r--r--config/metrics/counts_all/20210216180713_bitbucket.yml16
-rw-r--r--config/metrics/counts_all/20210216180715_bitbucket_server.yml16
-rw-r--r--config/metrics/counts_all/20210216180716_gitea.yml16
-rw-r--r--config/metrics/counts_all/20210216180718_git.yml16
-rw-r--r--config/metrics/counts_all/20210216180720_manifest.yml16
-rw-r--r--config/metrics/counts_all/20210216180722_jira.yml16
-rw-r--r--config/metrics/counts_all/20210216180724_fogbugz.yml16
-rw-r--r--config/metrics/counts_all/20210216180726_phabricator.yml16
-rw-r--r--config/metrics/counts_all/20210216180727_csv.yml17
-rw-r--r--config/metrics/counts_all/20210216180729_groups_imported.yml16
-rw-r--r--config/metrics/counts_all/20210216180734_wiki_pages_create.yml16
-rw-r--r--config/metrics/counts_all/20210216180736_wiki_pages_update.yml16
-rw-r--r--config/metrics/counts_all/20210216180738_wiki_pages_delete.yml16
-rw-r--r--config/metrics/counts_all/20210216180740_design_management_designs_create.yml16
-rw-r--r--config/metrics/counts_all/20210216180741_design_management_designs_update.yml16
-rw-r--r--config/metrics/counts_all/20210216180743_design_management_designs_delete.yml16
-rw-r--r--config/metrics/counts_all/20210216180750_groups.yml19
-rw-r--r--config/metrics/counts_all/20210216180752_keys.yml16
-rw-r--r--config/metrics/counts_all/20210216180754_events.yml17
-rw-r--r--config/metrics/counts_all/20210216180756_groups.yml16
-rw-r--r--config/metrics/counts_all/20210216180758_users_created.yml16
-rw-r--r--config/metrics/counts_all/20210216180800_ldap_keys.yml16
-rw-r--r--config/metrics/counts_all/20210216180801_ldap_users.yml16
-rw-r--r--config/metrics/counts_all/20210216180843_provider.yml19
-rw-r--r--config/metrics/counts_all/20210216180852_provider.yml19
-rw-r--r--config/metrics/counts_all/20210216180902_provider.yml19
-rw-r--r--config/metrics/counts_all/20210216180903_enabled.yml19
-rw-r--r--config/metrics/counts_all/20210216180911_provider.yml19
-rw-r--r--config/metrics/counts_all/20210216180920_provider.yml19
-rw-r--r--config/metrics/counts_all/20210216180922_duration_s.yml19
-rw-r--r--config/metrics/counts_all/20210216180924_failures.yml19
-rw-r--r--config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml16
-rw-r--r--config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216180931_projects_prometheus_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180933_groups_prometheus_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180934_templates_prometheus_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180936_instances_prometheus_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml19
-rw-r--r--config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml16
-rw-r--r--config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml16
-rw-r--r--config/metrics/counts_all/20210216180945_clusters.yml16
-rw-r--r--config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml16
-rw-r--r--config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml16
-rw-r--r--config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml16
-rw-r--r--config/metrics/counts_all/20210216181009_lfs_objects.yml16
-rw-r--r--config/metrics/counts_all/20210216181011_projects_with_packages.yml17
-rw-r--r--config/metrics/counts_all/20210216181012_packages.yml16
-rw-r--r--config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml16
-rw-r--r--config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml16
-rw-r--r--config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml16
-rw-r--r--config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml16
-rw-r--r--config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml16
-rw-r--r--config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml16
-rw-r--r--config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml16
-rw-r--r--config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml16
-rw-r--r--config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml16
-rw-r--r--config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml16
-rw-r--r--config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml16
-rw-r--r--config/metrics/counts_all/20210216181051_vendor.yml17
-rw-r--r--config/metrics/counts_all/20210216181055_projects_with_packages.yml16
-rw-r--r--config/metrics/counts_all/20210216181102_issues.yml19
-rw-r--r--config/metrics/counts_all/20210216181104_label_lists.yml16
-rw-r--r--config/metrics/counts_all/20210216181106_milestone_lists.yml16
-rw-r--r--config/metrics/counts_all/20210216181108_milestones.yml16
-rw-r--r--config/metrics/counts_all/20210216181109_uploads.yml19
-rw-r--r--config/metrics/counts_all/20210216181111_labels.yml19
-rw-r--r--config/metrics/counts_all/20210216181113_notes.yml19
-rw-r--r--config/metrics/counts_all/20210216181115_issues.yml16
-rw-r--r--config/metrics/counts_all/20210216181117_notes.yml16
-rw-r--r--config/metrics/counts_all/20210216181119_projects.yml16
-rw-r--r--config/metrics/counts_all/20210216181121_todos.yml16
-rw-r--r--config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml17
-rw-r--r--config/metrics/counts_all/20210216181124_service_desk_issues.yml17
-rw-r--r--config/metrics/counts_all/20210216181126_projects_jira_active.yml16
-rw-r--r--config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml16
-rw-r--r--config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml16
-rw-r--r--config/metrics/counts_all/20210216181134_epics.yml16
-rw-r--r--config/metrics/counts_all/20210216181135_label_lists.yml16
-rw-r--r--config/metrics/counts_all/20210216181137_milestone_lists.yml16
-rw-r--r--config/metrics/counts_all/20210216181205_confidential_epics.yml16
-rw-r--r--config/metrics/counts_all/20210216181206_epics.yml16
-rw-r--r--config/metrics/counts_all/20210216181210_issues_with_health_status.yml16
-rw-r--r--config/metrics/counts_all/20210216181249_feature_flags.yml16
-rw-r--r--config/metrics/counts_all/20210216181252_boards.yml16
-rw-r--r--config/metrics/counts_all/20210216181254_projects.yml16
-rw-r--r--config/metrics/counts_all/20210216181256_todos.yml19
-rw-r--r--config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml19
-rw-r--r--config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml19
-rw-r--r--config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml19
-rw-r--r--config/metrics/counts_all/20210216181908_deploy_keys.yml16
-rw-r--r--config/metrics/counts_all/20210216181911_successful_deployments.yml16
-rw-r--r--config/metrics/counts_all/20210216181912_failed_deployments.yml16
-rw-r--r--config/metrics/counts_all/20210216181914_environments.yml16
-rw-r--r--config/metrics/counts_all/20210216181916_in_review_folder.yml16
-rw-r--r--config/metrics/counts_all/20210216181918_releases.yml16
-rw-r--r--config/metrics/counts_all/20210216181920_projects_mirrored_with_pipelines_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216181926_deployments.yml16
-rw-r--r--config/metrics/counts_all/20210216181928_failed_deployments.yml16
-rw-r--r--config/metrics/counts_all/20210216181930_releases.yml16
-rw-r--r--config/metrics/counts_all/20210216181932_successful_deployments.yml16
-rw-r--r--config/metrics/counts_all/20210216181934_projects_mirrored_with_pipelines_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216181946_pages_domains.yml16
-rw-r--r--config/metrics/counts_all/20210216181949_clusters_applications_runner.yml19
-rw-r--r--config/metrics/counts_all/20210216181954_user_unique_users_all_secure_scanners.yml16
-rw-r--r--config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216182001_protected_branches.yml16
-rw-r--r--config/metrics/counts_all/20210216182002_remote_mirrors.yml16
-rw-r--r--config/metrics/counts_all/20210216182004_commit_comment.yml16
-rw-r--r--config/metrics/counts_all/20210216182006_source_code_pushes.yml16
-rw-r--r--config/metrics/counts_all/20210216182008_template_repositories.yml16
-rw-r--r--config/metrics/counts_all/20210216182010_deploy_keys.yml16
-rw-r--r--config/metrics/counts_all/20210216182012_keys.yml16
-rw-r--r--config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml17
-rw-r--r--config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml17
-rw-r--r--config/metrics/counts_all/20210216182017_remote_mirrors.yml16
-rw-r--r--config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml16
-rw-r--r--config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml16
-rw-r--r--config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216182025_protected_branches.yml16
-rw-r--r--config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml16
-rw-r--r--config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml16
-rw-r--r--config/metrics/counts_all/20210216182112_sast_jobs.yml19
-rw-r--r--config/metrics/counts_all/20210216182114_secret_detection_jobs.yml19
-rw-r--r--config/metrics/counts_all/20210216182116_user_sast_jobs.yml19
-rw-r--r--config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml19
-rw-r--r--config/metrics/counts_all/20210216182203_user_preferences_group_overview_details.yml18
-rw-r--r--config/metrics/counts_all/20210216182205_user_preferences_group_overview_security_dashboard.yml18
-rw-r--r--config/metrics/counts_all/20210216182207_user_preferences_group_overview_security_dashboard.yml17
-rw-r--r--config/metrics/counts_all/20210216182454_protected_branches_except_default.yml16
-rw-r--r--config/metrics/counts_all/20210216182547_projects_datadog_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182549_groups_datadog_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182551_templates_datadog_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182553_instances_datadog_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182614_projects_ewm_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182616_groups_ewm_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182618_templates_ewm_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182620_instances_ewm_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml16
-rw-r--r--config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml16
-rw-r--r--config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml16
-rw-r--r--config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml16
-rw-r--r--config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml16
-rw-r--r--config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml16
-rw-r--r--config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml16
-rw-r--r--config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml16
-rw-r--r--config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml16
-rw-r--r--config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml16
-rw-r--r--config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml16
-rw-r--r--config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml16
-rw-r--r--config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml16
-rw-r--r--config/metrics/counts_all/20210216183023_wiki_pages_view.yml16
-rw-r--r--config/metrics/counts_all/20210216183146_coverage_fuzzing_jobs.yml16
-rw-r--r--config/metrics/counts_all/20210216183149_dast_on_demand_pipelines.yml16
-rw-r--r--config/metrics/counts_all/20210216183241_filesystems.yml16
-rw-r--r--config/metrics/counts_all/20210216183248_pg_system_id.yml16
-rw-r--r--config/metrics/counts_all/20210216183339_merge_requests_with_overridden_project_rules.yml16
-rw-r--r--config/metrics/counts_all/20210216183344_users_using_path_locks.yml16
-rw-r--r--config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml16
-rw-r--r--config/metrics/counts_all/20210216183352_approval_project_rules_with_more_approvers_than_required.yml16
-rw-r--r--config/metrics/counts_all/20210216183354_approval_project_rules_with_less_approvers_than_required.yml16
-rw-r--r--config/metrics/counts_all/20210216183355_approval_project_rules_with_exact_required_approvers.yml16
-rw-r--r--config/metrics/counts_all/20210216183400_omniauth_providers.yml16
-rw-r--r--config/metrics/counts_all/20210216183402_two-factor.yml16
-rw-r--r--config/metrics/counts_all/20210216183404_two-factor-via-u2f-device.yml16
-rw-r--r--config/metrics/counts_all/20210216183406_two-factor-via-webauthn-device.yml16
-rw-r--r--config/metrics/counts_all/20210216183408_standard.yml16
-rw-r--r--config/metrics/counts_all/20210216183410_google_oauth2.yml16
-rw-r--r--config/metrics/counts_all/20210216183514_user_coverage_fuzzing_jobs.yml16
-rw-r--r--config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml16
-rw-r--r--config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml16
-rw-r--r--config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml16
-rw-r--r--config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml16
-rw-r--r--config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml16
-rw-r--r--config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml16
-rw-r--r--config/metrics/license/20210204124854_license_management_jobs.yml3
-rw-r--r--config/metrics/license/20210204124926_license_trial_ends_on.yml6
-rw-r--r--config/metrics/license/20210204124928_version.yml6
-rw-r--r--config/metrics/license/20210204124936_version.yml6
-rw-r--r--config/metrics/license/20210204124938_recording_ce_finished_at.yml3
-rw-r--r--config/metrics/license/20210216175601_version.yml19
-rw-r--r--config/metrics/license/20210216175602_installation_type.yml19
-rw-r--r--config/metrics/license/20210216175604_edition.yml19
-rw-r--r--config/metrics/license/20210216175609_version.yml16
-rw-r--r--config/metrics/license/20210216181053_version.yml16
-rw-r--r--config/metrics/license/20210216183237_version.yml16
-rw-r--r--config/metrics/schema.json2
-rw-r--r--config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124858_container_registry_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124900_dependency_proxy_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124904_gravatar_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124906_ldap_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124908_mattermost_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124910_omniauth_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124912_prometheus_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124916_reply_by_email_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124918_signup_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124922_grafana_link_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124924_elasticsearch_enabled.yml6
-rw-r--r--config/metrics/settings/20210204124934_enabled.yml6
-rw-r--r--config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml19
-rw-r--r--config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180314_gitpod_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180836_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180838_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180840_direct_upload.yml19
-rw-r--r--config/metrics/settings/20210216180841_background_upload.yml19
-rw-r--r--config/metrics/settings/20210216180845_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180847_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180849_direct_upload.yml19
-rw-r--r--config/metrics/settings/20210216180851_background_upload.yml20
-rw-r--r--config/metrics/settings/20210216180854_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180856_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180858_direct_upload.yml19
-rw-r--r--config/metrics/settings/20210216180900_background_upload.yml19
-rw-r--r--config/metrics/settings/20210216180905_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180907_direct_upload.yml19
-rw-r--r--config/metrics/settings/20210216180909_background_upload.yml19
-rw-r--r--config/metrics/settings/20210216180913_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180915_enabled.yml19
-rw-r--r--config/metrics/settings/20210216180916_direct_upload.yml19
-rw-r--r--config/metrics/settings/20210216180918_background_upload.yml19
-rw-r--r--config/routes/admin.rb3
-rw-r--r--config/sidekiq_queues.yml4
-rw-r--r--config/webpack.config.js2
-rw-r--r--danger/changes_size/Dangerfile4
-rw-r--r--danger/product_intelligence/Dangerfile17
-rw-r--r--db/fixtures/development/26_packages.rb6
-rw-r--r--db/fixtures/development/29_usage_trends.rb (renamed from db/fixtures/development/29_instance_statistics.rb)2
-rw-r--r--db/migrate/20201128210000_add_service_desk_reply_to_is_not_null_index_on_issues_fix.rb18
-rw-r--r--db/migrate/20201221225303_add_service_desk_reply_to_is_not_null_index_on_issues.rb15
-rw-r--r--db/migrate/20201228110136_create_iterations_cadence.rb29
-rw-r--r--db/migrate/20201228110238_add_iterations_cadence_to_sprints.rb22
-rw-r--r--db/migrate/20210106191305_rename_indexes_on_git_lab_com.rb57
-rw-r--r--db/migrate/20210205134213_add_creator_id_to_custom_emoji.rb23
-rw-r--r--db/migrate/20210212163231_add_merge_when_pipeline_succeeds_to_notification_settings.rb12
-rw-r--r--db/migrate/20210216193620_add_description_to_cluster_token.rb21
-rw-r--r--db/migrate/20210219100137_add_creator_foreign_key_to_custom_emoji.rb23
-rw-r--r--db/post_migrate/20201231133921_schedule_set_default_iteration_cadences.rb30
-rw-r--r--db/post_migrate/20210215144909_migrate_usage_trends_sidekiq_queue.rb19
-rw-r--r--db/post_migrate/20210217100728_move_create_release_evidence_queue_out_of_cronjob_namespace.rb16
-rw-r--r--db/schema_migrations/202011282100001
-rw-r--r--db/schema_migrations/202012281101361
-rw-r--r--db/schema_migrations/202012281102381
-rw-r--r--db/schema_migrations/202012311339211
-rw-r--r--db/schema_migrations/202101061913051
-rw-r--r--db/schema_migrations/202102051342131
-rw-r--r--db/schema_migrations/202102121632311
-rw-r--r--db/schema_migrations/202102151449091
-rw-r--r--db/schema_migrations/202102161936201
-rw-r--r--db/schema_migrations/202102171007281
-rw-r--r--db/schema_migrations/202102191001371
-rw-r--r--db/structure.sql51
-rw-r--r--doc/.vale/gitlab/spelling-exceptions.txt31
-rw-r--r--doc/README.md2
-rw-r--r--doc/administration/auth/ldap/index.md9
-rw-r--r--doc/administration/consul.md2
-rw-r--r--doc/administration/gitaly/index.md2
-rw-r--r--doc/administration/integration/plantuml.md297
-rw-r--r--doc/administration/integration/terminal.md2
-rw-r--r--doc/administration/invalidate_markdown_cache.md4
-rw-r--r--doc/administration/issue_closing_pattern.md2
-rw-r--r--doc/administration/monitoring/index.md22
-rw-r--r--doc/administration/monitoring/performance/performance_bar.md4
-rw-r--r--doc/administration/object_storage.md12
-rw-r--r--doc/administration/packages/dependency_proxy.md4
-rw-r--r--doc/administration/packages/index.md4
-rw-r--r--doc/administration/pages/index.md11
-rw-r--r--doc/administration/raketasks/github_import.md4
-rw-r--r--doc/administration/reference_architectures/10k_users.md81
-rw-r--r--doc/administration/reference_architectures/25k_users.md45
-rw-r--r--doc/administration/reference_architectures/2k_users.md29
-rw-r--r--doc/administration/reference_architectures/3k_users.md46
-rw-r--r--doc/administration/reference_architectures/50k_users.md45
-rw-r--r--doc/administration/reference_architectures/5k_users.md45
-rw-r--r--doc/administration/repository_checks.md2
-rw-r--r--doc/administration/repository_storage_paths.md29
-rw-r--r--doc/administration/static_objects_external_storage.md2
-rw-r--r--doc/api/README.md2
-rw-r--r--doc/api/graphql/index.md5
-rw-r--r--doc/api/graphql/reference/gitlab_schema.graphql29539
-rw-r--r--doc/api/graphql/reference/gitlab_schema.json85944
-rw-r--r--doc/api/graphql/reference/index.md280
-rw-r--r--doc/api/invitations.md2
-rw-r--r--doc/api/merge_request_context_commits.md2
-rw-r--r--doc/api/merge_requests.md2
-rw-r--r--doc/api/notification_settings.md3
-rw-r--r--doc/api/openapi/openapi_interactive.md2
-rw-r--r--doc/api/project_snippets.md2
-rw-r--r--doc/api/project_templates.md4
-rw-r--r--doc/api/projects.md2
-rw-r--r--doc/api/services.md4
-rw-r--r--doc/api/snippets.md4
-rw-r--r--doc/api/wikis.md2
-rw-r--r--doc/ci/README.md3
-rw-r--r--doc/ci/ci_cd_for_external_repos/github_integration.md2
-rw-r--r--doc/ci/cloud_deployment/ecs/img/container-name.pngbin0 -> 8813 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/container-port-mapping.pngbin0 -> 8994 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/ecs-launch-status.pngbin0 -> 35530 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/ecs-policy.pngbin0 -> 10342 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/ecs-task-definitions.pngbin0 -> 27730 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/initial-pipeline.pngbin0 -> 8114 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/rails-template.pngbin0 -> 13497 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/registry.pngbin0 -> 5647 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/service-parameter.pngbin0 -> 20121 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/service-running.pngbin0 -> 5207 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/view-running-app-2.pngbin0 -> 5082 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/img/view-running-app.pngbin0 -> 5181 bytes
-rw-r--r--doc/ci/cloud_deployment/ecs/quick_start_guide.md250
-rw-r--r--doc/ci/cloud_deployment/index.md7
-rw-r--r--doc/ci/docker/index.md19
-rw-r--r--doc/ci/docker/using_docker_build.md4
-rw-r--r--doc/ci/docker/using_docker_images.md2
-rw-r--r--doc/ci/docker/using_kaniko.md2
-rw-r--r--doc/ci/environments/index.md2
-rw-r--r--doc/ci/environments/protected_environments.md2
-rw-r--r--doc/ci/examples/authenticating-with-hashicorp-vault/index.md4
-rw-r--r--doc/ci/examples/end_to_end_testing_webdriverio/index.md3
-rw-r--r--doc/ci/examples/laravel_with_gitlab_and_envoy/index.md4
-rw-r--r--doc/ci/jobs/index.md2
-rw-r--r--doc/ci/pipelines/settings.md30
-rw-r--r--doc/ci/quick_start/index.md13
-rw-r--r--doc/ci/review_apps/index.md4
-rw-r--r--doc/ci/ssh_keys/index.md6
-rw-r--r--doc/ci/triggers/README.md22
-rw-r--r--doc/ci/unit_test_reports.md2
-rw-r--r--doc/ci/yaml/README.md12
-rw-r--r--doc/development/agent/user_stories.md2
-rw-r--r--doc/development/api_graphql_styleguide.md2
-rw-r--r--doc/development/architecture.md12
-rw-r--r--doc/development/auto_devops.md4
-rw-r--r--doc/development/cicd/templates.md2
-rw-r--r--doc/development/code_intelligence/index.md2
-rw-r--r--doc/development/code_review.md4
-rw-r--r--doc/development/contributing/issue_workflow.md2
-rw-r--r--doc/development/contributing/style_guides.md14
-rw-r--r--doc/development/database_query_comments.md17
-rw-r--r--doc/development/distributed_tracing.md2
-rw-r--r--doc/development/documentation/testing.md6
-rw-r--r--doc/development/elasticsearch.md46
-rw-r--r--doc/development/fe_guide/accessibility.md193
-rw-r--r--doc/development/fe_guide/dark_mode.md4
-rw-r--r--doc/development/fe_guide/editor_lite.md2
-rw-r--r--doc/development/fe_guide/graphql.md20
-rw-r--r--doc/development/fe_guide/index.md2
-rw-r--r--doc/development/fe_guide/style/html.md23
-rw-r--r--doc/development/fe_guide/style/index.md2
-rw-r--r--doc/development/fe_guide/style/javascript.md2
-rw-r--r--doc/development/fe_guide/style/scss.md10
-rw-r--r--doc/development/fe_guide/style/vue.md36
-rw-r--r--doc/development/fe_guide/tooling.md85
-rw-r--r--doc/development/feature_flags/controls.md12
-rw-r--r--doc/development/features_inside_dot_gitlab.md4
-rw-r--r--doc/development/go_guide/index.md14
-rw-r--r--doc/development/graphql_guide/index.md2
-rw-r--r--doc/development/image_scaling.md2
-rw-r--r--doc/development/integrations/jira_connect.md2
-rw-r--r--doc/development/integrations/secure.md10
-rw-r--r--doc/development/integrations/secure_partner_integration.md2
-rw-r--r--doc/development/internal_api.md2
-rw-r--r--doc/development/namespaces_storage_statistics.md6
-rw-r--r--doc/development/new_fe_guide/development/components.md2
-rw-r--r--doc/development/performance.md8
-rw-r--r--doc/development/pipelines.md16
-rw-r--r--doc/development/prometheus.md8
-rw-r--r--doc/development/query_performance.md2
-rw-r--r--doc/development/redis.md9
-rw-r--r--doc/development/secure_coding_guidelines.md2
-rw-r--r--doc/development/sidekiq_style_guide.md2
-rw-r--r--doc/development/snowplow.md5
-rw-r--r--doc/development/sql.md14
-rw-r--r--doc/development/testing_guide/best_practices.md13
-rw-r--r--doc/development/testing_guide/frontend_testing.md6
-rw-r--r--doc/development/usage_ping.md165
-rw-r--r--doc/development/usage_ping/dictionary.md26151
-rw-r--r--doc/development/usage_ping/metrics_dictionary.md7
-rw-r--r--doc/development/wikis.md2
-rw-r--r--doc/gitlab-basics/index.md2
-rw-r--r--doc/install/index.md6
-rw-r--r--doc/integration/README.md2
-rw-r--r--doc/integration/akismet.md2
-rw-r--r--doc/integration/auth0.md2
-rw-r--r--doc/integration/azure.md106
-rw-r--r--doc/integration/bitbucket.md2
-rw-r--r--doc/integration/cas.md2
-rw-r--r--doc/integration/elasticsearch.md9
-rw-r--r--doc/integration/external-issue-tracker.md2
-rw-r--r--doc/integration/facebook.md2
-rw-r--r--doc/integration/github.md4
-rw-r--r--doc/integration/gitlab.md2
-rw-r--r--doc/integration/gitpod.md7
-rw-r--r--doc/integration/gmail_action_buttons_for_gitlab.md2
-rw-r--r--doc/integration/google.md2
-rw-r--r--doc/integration/jenkins_deprecated.md4
-rw-r--r--doc/integration/oauth2_generic.md2
-rw-r--r--doc/integration/omniauth.md2
-rw-r--r--doc/integration/openid_connect_provider.md2
-rw-r--r--doc/integration/recaptcha.md2
-rw-r--r--doc/integration/salesforce.md2
-rw-r--r--doc/integration/saml.md20
-rw-r--r--doc/integration/shibboleth.md2
-rw-r--r--doc/integration/slash_commands.md2
-rw-r--r--doc/integration/trello_power_up.md2
-rw-r--r--doc/integration/twitter.md2
-rw-r--r--doc/intro/index.md2
-rw-r--r--doc/operations/feature_flags.md6
-rw-r--r--doc/operations/incident_management/incidents.md2
-rw-r--r--doc/ssh/README.md310
-rw-r--r--doc/subscriptions/bronze_starter.md2
-rw-r--r--doc/topics/autodevops/customize.md60
-rw-r--r--doc/topics/autodevops/img/alexj_autodevops_min_v13_8.pngbin20836 -> 0 bytes
-rw-r--r--doc/topics/autodevops/img/kai_autodevops_min_v13_8.pngbin39770 -> 0 bytes
-rw-r--r--doc/topics/autodevops/index.md297
-rw-r--r--doc/topics/autodevops/quick_start_guide.md6
-rw-r--r--doc/topics/autodevops/requirements.md8
-rw-r--r--doc/topics/autodevops/stages.md28
-rw-r--r--doc/topics/autodevops/troubleshooting.md247
-rw-r--r--doc/topics/autodevops/upgrading_auto_deploy_dependencies.md8
-rw-r--r--doc/topics/autodevops/upgrading_postgresql.md2
-rw-r--r--doc/topics/git/index.md4
-rw-r--r--doc/topics/git/numerous_undo_possibilities_in_git/index.md2
-rw-r--r--doc/topics/git/tags.md41
-rw-r--r--doc/topics/git/troubleshooting_git.md2
-rw-r--r--doc/university/index.md6
-rw-r--r--doc/university/training/index.md1
-rw-r--r--doc/university/training/topics/tags.md52
-rw-r--r--doc/update/index.md61
-rw-r--r--doc/user/admin_area/analytics/usage_trends.md19
-rw-r--r--doc/user/admin_area/approving_users.md49
-rw-r--r--doc/user/admin_area/credentials_inventory.md2
-rw-r--r--doc/user/admin_area/index.md20
-rw-r--r--doc/user/admin_area/settings/account_and_limit_settings.md16
-rw-r--r--doc/user/admin_area/settings/index.md2
-rw-r--r--doc/user/admin_area/settings/project_integration_management.md2
-rw-r--r--doc/user/admin_area/settings/sign_up_restrictions.md44
-rw-r--r--doc/user/analytics/img/mr_mean_time_to_merge_metric_v13_9.pngbin0 -> 12299 bytes
-rw-r--r--doc/user/analytics/merge_request_analytics.md9
-rw-r--r--doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_collection_edit_variable.pngbin0 -> 22389 bytes
-rw-r--r--doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_environment_edit_variable.pngbin0 -> 17801 bytes
-rw-r--r--doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_request_edit.pngbin0 -> 21915 bytes
-rw-r--r--doc/user/application_security/api_fuzzing/index.md191
-rw-r--r--doc/user/application_security/configuration/index.md49
-rw-r--r--doc/user/application_security/container_scanning/index.md2
-rw-r--r--doc/user/application_security/dast/index.md11
-rw-r--r--doc/user/application_security/dependency_scanning/index.md11
-rw-r--r--doc/user/application_security/sast/index.md5
-rw-r--r--doc/user/application_security/secret_detection/index.md2
-rw-r--r--doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v13_10.pngbin0 -> 167108 bytes
-rw-r--r--doc/user/application_security/security_dashboard/index.md4
-rw-r--r--doc/user/application_security/vulnerabilities/index.md10
-rw-r--r--doc/user/application_security/vulnerability_report/index.md46
-rw-r--r--doc/user/clusters/agent/index.md72
-rw-r--r--doc/user/clusters/applications.md18
-rw-r--r--doc/user/compliance/license_compliance/index.md11
-rw-r--r--doc/user/discussions/index.md2
-rw-r--r--doc/user/group/img/groups.pngbin61507 -> 0 bytes
-rw-r--r--doc/user/group/import/index.md20
-rw-r--r--doc/user/group/index.md112
-rw-r--r--doc/user/group/repositories_analytics/index.md3
-rw-r--r--doc/user/group/roadmap/index.md2
-rw-r--r--doc/user/group/saml_sso/index.md2
-rw-r--r--doc/user/group/saml_sso/scim_setup.md4
-rw-r--r--doc/user/index.md4
-rw-r--r--doc/user/infrastructure/index.md4
-rw-r--r--doc/user/infrastructure/terraform_state.md10
-rw-r--r--doc/user/markdown.md2
-rw-r--r--doc/user/packages/go_proxy/index.md2
-rw-r--r--doc/user/packages/index.md4
-rw-r--r--doc/user/packages/npm_registry/index.md11
-rw-r--r--doc/user/packages/workflows/monorepo.md9
-rw-r--r--doc/user/profile/img/busy_indicator_note_header_v13_9.pngbin0 -> 69887 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_notes_v13_9.pngbin0 -> 102516 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_profile_page_v13_6.pngbin0 -> 78509 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_settings_menu_v13_6.pngbin0 -> 87157 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_sidebar_collapsed_v13_9.pngbin0 -> 23305 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_sidebar_v13_9.pngbin0 -> 59898 bytes
-rw-r--r--doc/user/profile/img/busy_indicator_user_popovers_v13_6.pngbin0 -> 105329 bytes
-rw-r--r--doc/user/profile/index.md20
-rw-r--r--doc/user/profile/notifications.md2
-rw-r--r--doc/user/profile/personal_access_tokens.md2
-rw-r--r--doc/user/profile/preferences.md8
-rw-r--r--doc/user/project/clusters/add_eks_clusters.md2
-rw-r--r--doc/user/project/clusters/index.md1
-rw-r--r--doc/user/project/clusters/protect/container_host_security/quick_start_guide.md2
-rw-r--r--doc/user/project/clusters/protect/container_network_security/quick_start_guide.md2
-rw-r--r--doc/user/project/code_intelligence.md5
-rw-r--r--doc/user/project/deploy_boards.md4
-rw-r--r--doc/user/project/deploy_tokens/index.md9
-rw-r--r--doc/user/project/description_templates.md73
-rw-r--r--doc/user/project/import/github.md4
-rw-r--r--doc/user/project/integrations/bamboo.md2
-rw-r--r--doc/user/project/integrations/bugzilla.md2
-rw-r--r--doc/user/project/integrations/custom_issue_tracker.md2
-rw-r--r--doc/user/project/integrations/discord_notifications.md2
-rw-r--r--doc/user/project/integrations/emails_on_push.md2
-rw-r--r--doc/user/project/integrations/github.md2
-rw-r--r--doc/user/project/integrations/hangouts_chat.md2
-rw-r--r--doc/user/project/integrations/hipchat.md2
-rw-r--r--doc/user/project/integrations/index.md2
-rw-r--r--doc/user/project/integrations/irker.md2
-rw-r--r--doc/user/project/integrations/jira.md20
-rw-r--r--doc/user/project/integrations/jira_cloud_configuration.md2
-rw-r--r--doc/user/project/integrations/jira_integrations.md2
-rw-r--r--doc/user/project/integrations/jira_server_configuration.md2
-rw-r--r--doc/user/project/integrations/mattermost.md2
-rw-r--r--doc/user/project/integrations/mattermost_slash_commands.md2
-rw-r--r--doc/user/project/integrations/microsoft_teams.md2
-rw-r--r--doc/user/project/integrations/mock_ci.md2
-rw-r--r--doc/user/project/integrations/overview.md2
-rw-r--r--doc/user/project/integrations/redmine.md2
-rw-r--r--doc/user/project/integrations/servicenow.md2
-rw-r--r--doc/user/project/integrations/services_templates.md2
-rw-r--r--doc/user/project/integrations/slack.md2
-rw-r--r--doc/user/project/integrations/unify_circuit.md2
-rw-r--r--doc/user/project/integrations/webex_teams.md2
-rw-r--r--doc/user/project/integrations/webhooks.md2
-rw-r--r--doc/user/project/integrations/youtrack.md2
-rw-r--r--doc/user/project/issue_board.md84
-rw-r--r--doc/user/project/issues/index.md2
-rw-r--r--doc/user/project/merge_requests/allow_collaboration.md2
-rw-r--r--doc/user/project/merge_requests/authorization_for_merge_requests.md2
-rw-r--r--doc/user/project/merge_requests/browser_performance_testing.md3
-rw-r--r--doc/user/project/merge_requests/code_quality.md3
-rw-r--r--doc/user/project/merge_requests/creating_merge_requests.md2
-rw-r--r--doc/user/project/merge_requests/getting_started.md45
-rw-r--r--doc/user/project/merge_requests/index.md4
-rw-r--r--doc/user/project/merge_requests/merge_request_approvals.md4
-rw-r--r--doc/user/project/merge_requests/merge_request_dependencies.md2
-rw-r--r--doc/user/project/merge_requests/merge_when_pipeline_succeeds.md2
-rw-r--r--doc/user/project/merge_requests/resolve_conflicts.md2
-rw-r--r--doc/user/project/merge_requests/revert_changes.md2
-rw-r--r--doc/user/project/merge_requests/reviewing_and_managing_merge_requests.md2
-rw-r--r--doc/user/project/merge_requests/work_in_progress_merge_requests.md2
-rw-r--r--doc/user/project/milestones/burndown_charts.md8
-rw-r--r--doc/user/project/pages/getting_started/pages_from_scratch.md2
-rw-r--r--doc/user/project/pages/index.md2
-rw-r--r--doc/user/project/repository/file_finder.md2
-rw-r--r--doc/user/project/repository/repository_mirroring.md32
-rw-r--r--doc/user/project/repository/web_editor.md2
-rw-r--r--doc/user/project/service_desk.md4
-rw-r--r--doc/user/project/settings/import_export.md2
-rw-r--r--doc/user/project/static_site_editor/index.md2
-rw-r--r--doc/user/project/web_ide/img/solarized_dark_theme_v13_1.pngbin117131 -> 43014 bytes
-rw-r--r--doc/user/project/web_ide/img/solarized_light_theme_v13_0.pngbin99981 -> 0 bytes
-rw-r--r--doc/user/project/web_ide/index.md15
-rw-r--r--doc/user/project/working_with_projects.md2
-rw-r--r--doc/user/search/index.md15
-rw-r--r--doc/user/snippets.md2
-rw-r--r--lefthook.yml12
-rw-r--r--lib/api/api.rb2
-rw-r--r--lib/api/concerns/packages/npm_endpoints.rb14
-rw-r--r--lib/api/helpers/packages/npm.rb23
-rw-r--r--lib/api/lint.rb2
-rw-r--r--lib/api/nuget_project_packages.rb5
-rw-r--r--lib/api/rubygem_packages.rb39
-rw-r--r--lib/backup/repositories.rb7
-rw-r--r--lib/banzai/filter/video_link_filter.rb2
-rw-r--r--lib/bulk_imports/common/loaders/entity_loader.rb15
-rw-r--r--lib/bulk_imports/common/transformers/award_emoji_transformer.rb2
-rw-r--r--lib/bulk_imports/common/transformers/prohibited_attributes_transformer.rb4
-rw-r--r--lib/bulk_imports/groups/extractors/subgroups_extractor.rb2
-rw-r--r--lib/bulk_imports/groups/graphql/get_labels_query.rb4
-rw-r--r--lib/bulk_imports/groups/loaders/group_loader.rb4
-rw-r--r--lib/bulk_imports/groups/loaders/labels_loader.rb15
-rw-r--r--lib/bulk_imports/groups/loaders/members_loader.rb17
-rw-r--r--lib/bulk_imports/groups/pipelines/labels_pipeline.rb4
-rw-r--r--lib/bulk_imports/groups/pipelines/members_pipeline.rb6
-rw-r--r--lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline.rb5
-rw-r--r--lib/bulk_imports/groups/transformers/group_attributes_transformer.rb13
-rw-r--r--lib/bulk_imports/groups/transformers/member_attributes_transformer.rb2
-rw-r--r--lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb2
-rw-r--r--lib/bulk_imports/pipeline.rb74
-rw-r--r--lib/csv_builder.rb5
-rw-r--r--lib/gitlab/analytics/cycle_analytics/average.rb48
-rw-r--r--lib/gitlab/analytics/cycle_analytics/data_collector.rb6
-rw-r--r--lib/gitlab/analytics/usage_trends/workers_argument_builder.rb (renamed from lib/gitlab/analytics/instance_statistics/workers_argument_builder.rb)6
-rw-r--r--lib/gitlab/application_rate_limiter.rb2
-rw-r--r--lib/gitlab/auth/o_auth/provider.rb11
-rw-r--r--lib/gitlab/background_migration/set_default_iteration_cadences.rb57
-rw-r--r--lib/gitlab/ci/jwt.rb6
-rw-r--r--lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml17
-rw-r--r--lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml8
-rw-r--r--lib/gitlab/current_settings.rb4
-rw-r--r--lib/gitlab/database/migrations/observation.rb3
-rw-r--r--lib/gitlab/database/migrations/observers.rb3
-rw-r--r--lib/gitlab/database/migrations/observers/query_statistics.rb38
-rw-r--r--lib/gitlab/email/handler/service_desk_handler.rb8
-rw-r--r--lib/gitlab/experimentation.rb6
-rw-r--r--lib/gitlab/gitaly_client.rb4
-rw-r--r--lib/gitlab/gitaly_client/storage_settings.rb3
-rw-r--r--lib/gitlab/graphql/docs/helper.rb20
-rw-r--r--lib/gitlab/graphql/docs/templates/default.md.haml18
-rw-r--r--lib/gitlab/import_export/repo_restorer.rb2
-rw-r--r--lib/gitlab/marginalia.rb9
-rw-r--r--lib/gitlab/marginalia/active_record_instrumentation.rb12
-rw-r--r--lib/gitlab/metrics/samplers/ruby_sampler.rb2
-rw-r--r--lib/gitlab/metrics/subscribers/active_record.rb3
-rw-r--r--lib/gitlab/performance_bar/redis_adapter_when_peek_enabled.rb8
-rw-r--r--lib/gitlab/regex.rb4
-rw-r--r--lib/gitlab/template/base_template.rb6
-rw-r--r--lib/gitlab/template/issue_template.rb6
-rw-r--r--lib/gitlab/template/merge_request_template.rb6
-rw-r--r--lib/gitlab/tracking/standard_context.rb8
-rw-r--r--lib/gitlab/usage/docs/helper.rb4
-rw-r--r--lib/gitlab/usage/docs/value_formatter.rb4
-rw-r--r--lib/gitlab/usage_data_counters/aggregated_metrics/code_review.yml89
-rw-r--r--lib/gitlab/usage_data_counters/counter_events/package_events.yml3
-rw-r--r--lib/gitlab/usage_data_counters/known_events/package_events.yml10
-rw-r--r--lib/tasks/eslint.rake2
-rw-r--r--lib/tasks/gitlab/graphql.rake16
-rw-r--r--lib/tasks/lint.rake1
-rw-r--r--lib/tasks/scss-lint.rake12
-rw-r--r--locale/gitlab.pot514
-rw-r--r--locale/unfound_translations.rb1
-rw-r--r--package.json40
-rw-r--r--qa/qa.rb1
-rw-r--r--qa/qa/flow/project.rb10
-rw-r--r--qa/qa/page/component/invite_members_modal.rb80
-rw-r--r--qa/qa/page/component/issue_board/show.rb8
-rw-r--r--qa/qa/page/group/members.rb29
-rw-r--r--qa/qa/page/merge_request/show.rb12
-rw-r--r--qa/qa/page/project/members.rb35
-rw-r--r--qa/qa/page/project/settings/main.rb13
-rw-r--r--qa/qa/page/project/settings/merge_request.rb8
-rw-r--r--qa/qa/page/project/settings/services/jira.rb23
-rw-r--r--qa/qa/resource/members.rb13
-rw-r--r--qa/qa/resource/merge_request.rb2
-rw-r--r--qa/qa/resource/personal_access_token.rb2
-rw-r--r--qa/qa/resource/project.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb3
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb9
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb2
-rw-r--r--rubocop/cop/migration/add_columns_to_wide_tables.rb4
-rw-r--r--rubocop/cop/migration/with_lock_retries_disallowed_method.rb1
-rw-r--r--rubocop/rubocop-migrations.yml1
-rwxr-xr-xscripts/frontend/execute-on-staged-files.sh25
-rw-r--r--scripts/frontend/frontend_script_utils.js20
-rw-r--r--scripts/frontend/prettier.js121
-rwxr-xr-xscripts/static-analysis5
-rwxr-xr-xscripts/validate_migration_schema2
-rw-r--r--spec/controllers/admin/usage_trends_controller_spec.rb (renamed from spec/controllers/admin/instance_statistics_controller_spec.rb)2
-rw-r--r--spec/controllers/projects/blob_controller_spec.rb72
-rw-r--r--spec/controllers/projects/notes_controller_spec.rb50
-rw-r--r--spec/controllers/projects/snippets_controller_spec.rb6
-rw-r--r--spec/controllers/projects/templates_controller_spec.rb27
-rw-r--r--spec/controllers/projects/web_ide_schemas_controller_spec.rb4
-rw-r--r--spec/controllers/projects_controller_spec.rb25
-rw-r--r--spec/controllers/root_controller_spec.rb10
-rw-r--r--spec/controllers/snippets/notes_controller_spec.rb16
-rw-r--r--spec/factories/analytics/usage_trends/measurement.rb (renamed from spec/factories/analytics/instance_statistics/measurement.rb)2
-rw-r--r--spec/factories/custom_emoji.rb1
-rw-r--r--spec/factories/iteration_cadences.rb13
-rw-r--r--spec/factories_spec.rb61
-rw-r--r--spec/features/commit_spec.rb16
-rw-r--r--spec/features/groups/members/manage_members_spec.rb12
-rw-r--r--spec/features/groups/settings/user_searches_in_settings_spec.rb36
-rw-r--r--spec/features/issues/gfm_autocomplete_spec.rb2
-rw-r--r--spec/features/merge_request/batch_comments_spec.rb2
-rw-r--r--spec/features/merge_request/user_posts_diff_notes_spec.rb2
-rw-r--r--spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb10
-rw-r--r--spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb6
-rw-r--r--spec/features/merge_request/user_sees_discussions_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb2
-rw-r--r--spec/features/merge_request/user_suggests_changes_on_diff_spec.rb2
-rw-r--r--spec/features/projects/files/gitlab_ci_syntax_yml_dropdown_spec.rb54
-rw-r--r--spec/features/projects/pages/user_edits_settings_spec.rb4
-rw-r--r--spec/features/projects/services/user_activates_jira_spec.rb44
-rw-r--r--spec/features/projects/settings/service_desk_setting_spec.rb45
-rw-r--r--spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb8
-rw-r--r--spec/features/projects/settings/user_searches_in_settings_spec.rb42
-rw-r--r--spec/features/projects/show/user_uploads_files_spec.rb30
-rw-r--r--spec/features/sentry_js_spec.rb2
-rw-r--r--spec/features/uploads/user_uploads_avatar_to_profile_spec.rb3
-rw-r--r--spec/features/user_can_display_performance_bar_spec.rb24
-rw-r--r--spec/finders/packages/group_packages_finder_spec.rb2
-rw-r--r--spec/finders/packages/npm/package_finder_spec.rb130
-rw-r--r--spec/finders/packages/package_finder_spec.rb2
-rw-r--r--spec/finders/packages/packages_finder_spec.rb2
-rw-r--r--spec/frontend/__helpers__/vue_test_utils_helper.js13
-rw-r--r--spec/frontend/__helpers__/vue_test_utils_helper_spec.js17
-rw-r--r--spec/frontend/admin/users/tabs_spec.js37
-rw-r--r--spec/frontend/analytics/instance_statistics/components/app_spec.js45
-rw-r--r--spec/frontend/analytics/usage_trends/apollo_mock_data.js (renamed from spec/frontend/analytics/instance_statistics/apollo_mock_data.js)0
-rw-r--r--spec/frontend/analytics/usage_trends/components/__snapshots__/usage_trends_count_chart_spec.js.snap (renamed from spec/frontend/analytics/instance_statistics/components/__snapshots__/instance_statistics_count_chart_spec.js.snap)4
-rw-r--r--spec/frontend/analytics/usage_trends/components/app_spec.js45
-rw-r--r--spec/frontend/analytics/usage_trends/components/instance_counts_spec.js (renamed from spec/frontend/analytics/instance_statistics/components/instance_counts_spec.js)12
-rw-r--r--spec/frontend/analytics/usage_trends/components/projects_and_groups_chart_spec.js (renamed from spec/frontend/analytics/instance_statistics/components/projects_and_groups_chart_spec.js)6
-rw-r--r--spec/frontend/analytics/usage_trends/components/usage_trends_count_chart_spec.js (renamed from spec/frontend/analytics/instance_statistics/components/instance_statistics_count_chart_spec.js)10
-rw-r--r--spec/frontend/analytics/usage_trends/components/users_chart_spec.js (renamed from spec/frontend/analytics/instance_statistics/components/users_chart_spec.js)4
-rw-r--r--spec/frontend/analytics/usage_trends/mock_data.js (renamed from spec/frontend/analytics/instance_statistics/mock_data.js)2
-rw-r--r--spec/frontend/analytics/usage_trends/utils_spec.js (renamed from spec/frontend/analytics/instance_statistics/utils_spec.js)2
-rw-r--r--spec/frontend/api_spec.js48
-rw-r--r--spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap32
-rw-r--r--spec/frontend/artifacts_settings/components/keep_latest_artifact_checkbox_spec.js19
-rw-r--r--spec/frontend/blob/blob_file_dropzone_spec.js13
-rw-r--r--spec/frontend/boards/board_list_spec.js28
-rw-r--r--spec/frontend/boards/components/board_card_deprecated_spec.js219
-rw-r--r--spec/frontend/boards/components/board_card_layout_spec.js116
-rw-r--r--spec/frontend/boards/components/board_card_spec.js264
-rw-r--r--spec/frontend/boards/components/sidebar/board_sidebar_due_date_spec.js8
-rw-r--r--spec/frontend/boards/components/sidebar/board_sidebar_issue_title_spec.js6
-rw-r--r--spec/frontend/boards/components/sidebar/board_sidebar_labels_select_spec.js4
-rw-r--r--spec/frontend/boards/components/sidebar/board_sidebar_milestone_select_spec.js6
-rw-r--r--spec/frontend/boards/components/sidebar/board_sidebar_subscription_spec.js2
-rw-r--r--spec/frontend/boards/stores/actions_spec.js127
-rw-r--r--spec/frontend/boards/stores/getters_spec.js23
-rw-r--r--spec/frontend/boards/stores/mutations_spec.js96
-rw-r--r--spec/frontend/clusters_list/components/clusters_spec.js2
-rw-r--r--spec/frontend/clusters_list/store/actions_spec.js2
-rw-r--r--spec/frontend/commit/pipelines/pipelines_spec.js2
-rw-r--r--spec/frontend/design_management/components/design_notes/design_discussion_spec.js10
-rw-r--r--spec/frontend/design_management/components/list/item_spec.js2
-rw-r--r--spec/frontend/diffs/store/utils_spec.js6
-rw-r--r--spec/frontend/experiment_tracking_spec.js77
-rw-r--r--spec/frontend/feature_flags/components/edit_feature_flag_spec.js7
-rw-r--r--spec/frontend/fixtures/pipelines.rb32
-rw-r--r--spec/frontend/fixtures/test_report.rb29
-rw-r--r--spec/frontend/ide/components/pipelines/__snapshots__/list_spec.js.snap1
-rw-r--r--spec/frontend/ide/components/pipelines/list_spec.js1
-rw-r--r--spec/frontend/ide/components/repo_editor_spec.js1106
-rw-r--r--spec/frontend/ide/components/repo_tab_spec.js19
-rw-r--r--spec/frontend/import_entities/import_groups/components/import_table_row_spec.js27
-rw-r--r--spec/frontend/import_entities/import_groups/components/import_table_spec.js32
-rw-r--r--spec/frontend/incidents_settings/components/__snapshots__/alerts_form_spec.js.snap2
-rw-r--r--spec/frontend/integrations/edit/components/jira_trigger_fields_spec.js59
-rw-r--r--spec/frontend/invite_members/components/group_select_spec.js90
-rw-r--r--spec/frontend/invite_members/components/invite_group_trigger_spec.js50
-rw-r--r--spec/frontend/invite_members/components/invite_members_modal_spec.js133
-rw-r--r--spec/frontend/invite_members/components/invite_members_trigger_spec.js4
-rw-r--r--spec/frontend/invite_members/components/members_token_select_spec.js2
-rw-r--r--spec/frontend/issue_show/components/app_spec.js13
-rw-r--r--spec/frontend/issue_show/components/fields/description_template_spec.js39
-rw-r--r--spec/frontend/issue_show/components/form_spec.js12
-rw-r--r--spec/frontend/monitoring/components/dashboard_panel_builder_spec.js2
-rw-r--r--spec/frontend/monitoring/requests/index_spec.js6
-rw-r--r--spec/frontend/notes/components/discussion_actions_spec.js2
-rw-r--r--spec/frontend/notes/components/discussion_reply_placeholder_spec.js14
-rw-r--r--spec/frontend/notes/components/noteable_discussion_spec.js2
-rw-r--r--spec/frontend/notifications/components/custom_notifications_modal_spec.js4
-rw-r--r--spec/frontend/notifications/components/notifications_dropdown_spec.js2
-rw-r--r--spec/frontend/packages/details/store/getters_spec.js6
-rw-r--r--spec/frontend/packages/shared/utils_spec.js2
-rw-r--r--spec/frontend/performance_bar/components/performance_bar_app_spec.js1
-rw-r--r--spec/frontend/performance_bar/index_spec.js1
-rw-r--r--spec/frontend/pipeline_editor/components/header/pipeline_editor_header_spec.js32
-rw-r--r--spec/frontend/pipeline_editor/components/header/pipeline_status_spec.js150
-rw-r--r--spec/frontend/pipeline_editor/graphql/resolvers_spec.js18
-rw-r--r--spec/frontend/pipeline_editor/mock_data.js16
-rw-r--r--spec/frontend/pipelines/empty_state_spec.js3
-rw-r--r--spec/frontend/pipelines/graph_shared/links_inner_spec.js149
-rw-r--r--spec/frontend/pipelines/mock_data.js322
-rw-r--r--spec/frontend/pipelines/pipeline_url_spec.js29
-rw-r--r--spec/frontend/pipelines/pipelines_spec.js18
-rw-r--r--spec/frontend/pipelines/pipelines_table_row_spec.js8
-rw-r--r--spec/frontend/pipelines/pipelines_table_spec.js3
-rw-r--r--spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js2
-rw-r--r--spec/frontend/projects/upload_file_experiment_spec.js46
-rw-r--r--spec/frontend/security_configuration/configuration_table_spec.js40
-rw-r--r--spec/frontend/sentry/sentry_config_spec.js2
-rw-r--r--spec/frontend/sidebar/subscriptions_spec.js9
-rw-r--r--spec/frontend/tracking_spec.js6
-rw-r--r--spec/frontend/user_popovers_spec.js26
-rw-r--r--spec/frontend/vue_shared/alert_details/alert_details_spec.js7
-rw-r--r--spec/frontend/vue_shared/components/settings/__snapshots__/settings_block_spec.js.snap2
-rw-r--r--spec/frontend/vue_shared/components/settings/settings_block_spec.js21
-rw-r--r--spec/frontend/vue_shared/components/tabs/tab_spec.js32
-rw-r--r--spec/frontend/vue_shared/components/tabs/tabs_spec.js61
-rw-r--r--spec/frontend/vue_shared/components/tooltip_on_truncate_spec.js11
-rw-r--r--spec/frontend/vue_shared/components/upload_dropzone/__snapshots__/upload_dropzone_spec.js.snap67
-rw-r--r--spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js34
-rw-r--r--spec/frontend/vue_shared/directives/tooltip_spec.js157
-rw-r--r--spec/frontend_integration/ide/helpers/ide_helper.js3
-rw-r--r--spec/frontend_integration/ide/helpers/mock_data.js1
-rw-r--r--spec/frontend_integration/ide/helpers/start.js11
-rw-r--r--spec/frontend_integration/ide/ide_integration_spec.js27
-rw-r--r--spec/frontend_integration/ide/user_opens_mr_spec.js6
-rw-r--r--spec/frontend_integration/test_helpers/mock_server/graphql.js8
-rw-r--r--spec/graphql/mutations/boards/update_spec.rb57
-rw-r--r--spec/graphql/mutations/custom_emoji/create_spec.rb27
-rw-r--r--spec/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver_spec.rb (renamed from spec/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver_spec.rb)10
-rw-r--r--spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb51
-rw-r--r--spec/graphql/types/admin/analytics/usage_trends/measurement_identifier_enum_spec.rb (renamed from spec/graphql/types/admin/analytics/instance_statistics/measurement_identifier_enum_spec.rb)2
-rw-r--r--spec/graphql/types/admin/analytics/usage_trends/measurement_type_spec.rb (renamed from spec/graphql/types/admin/analytics/instance_statistics/measurement_type_spec.rb)12
-rw-r--r--spec/graphql/types/ci/pipeline_type_spec.rb2
-rw-r--r--spec/graphql/types/global_id_type_spec.rb23
-rw-r--r--spec/graphql/types/label_type_spec.rb11
-rw-r--r--spec/graphql/types/query_type_spec.rb10
-rw-r--r--spec/helpers/boards_helper_spec.rb71
-rw-r--r--spec/helpers/commits_helper_spec.rb10
-rw-r--r--spec/helpers/invite_members_helper_spec.rb15
-rw-r--r--spec/helpers/issuables_description_templates_helper_spec.rb104
-rw-r--r--spec/helpers/services_helper_spec.rb53
-rw-r--r--spec/helpers/stat_anchors_helper_spec.rb18
-rw-r--r--spec/lib/backup/repositories_spec.rb10
-rw-r--r--spec/lib/banzai/filter/video_link_filter_spec.rb1
-rw-r--r--spec/lib/bulk_imports/common/loaders/entity_loader_spec.rb30
-rw-r--r--spec/lib/bulk_imports/groups/graphql/get_labels_query_spec.rb21
-rw-r--r--spec/lib/bulk_imports/groups/loaders/labels_loader_spec.rb30
-rw-r--r--spec/lib/bulk_imports/groups/loaders/members_loader_spec.rb42
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb41
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/members_pipeline_spec.rb32
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb40
-rw-r--r--spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb4
-rw-r--r--spec/lib/bulk_imports/pipeline_spec.rb91
-rw-r--r--spec/lib/gitlab/analytics/cycle_analytics/average_spec.rb66
-rw-r--r--spec/lib/gitlab/analytics/usage_trends/workers_argument_builder_spec.rb (renamed from spec/lib/gitlab/analytics/instance_statistics/workers_argument_builder_spec.rb)12
-rw-r--r--spec/lib/gitlab/background_migration/set_default_iteration_cadences_spec.rb75
-rw-r--r--spec/lib/gitlab/ci/charts_spec.rb7
-rw-r--r--spec/lib/gitlab/ci/jwt_spec.rb11
-rw-r--r--spec/lib/gitlab/ci/trace_spec.rb2
-rw-r--r--spec/lib/gitlab/current_settings_spec.rb20
-rw-r--r--spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb68
-rw-r--r--spec/lib/gitlab/email/handler/service_desk_handler_spec.rb2
-rw-r--r--spec/lib/gitlab/experimentation_spec.rb1
-rw-r--r--spec/lib/gitlab/graphql/docs/renderer_spec.rb38
-rw-r--r--spec/lib/gitlab/import_export/repo_restorer_spec.rb2
-rw-r--r--spec/lib/gitlab/metrics/subscribers/active_record_spec.rb45
-rw-r--r--spec/lib/gitlab/regex_spec.rb29
-rw-r--r--spec/lib/gitlab/tracking/standard_context_spec.rb20
-rw-r--r--spec/lib/gitlab/usage/docs/renderer_spec.rb2
-rw-r--r--spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb2
-rw-r--r--spec/lib/gitlab/usage_data_counters/code_review_events_spec.rb23
-rw-r--r--spec/lib/gitlab/usage_data_counters/package_event_counter_spec.rb2
-rw-r--r--spec/lib/marginalia_spec.rb83
-rw-r--r--spec/migrations/schedule_set_default_iteration_cadences_spec.rb41
-rw-r--r--spec/models/analytics/usage_trends/measurement_spec.rb (renamed from spec/models/analytics/instance_statistics/measurement_spec.rb)16
-rw-r--r--spec/models/bulk_imports/entity_spec.rb11
-rw-r--r--spec/models/ci/pipeline_spec.rb12
-rw-r--r--spec/models/clusters/agent_token_spec.rb3
-rw-r--r--spec/models/concerns/project_features_compatibility_spec.rb2
-rw-r--r--spec/models/custom_emoji_spec.rb6
-rw-r--r--spec/models/group_spec.rb86
-rw-r--r--spec/models/iteration_spec.rb97
-rw-r--r--spec/models/iterations/cadence_spec.rb22
-rw-r--r--spec/models/list_spec.rb13
-rw-r--r--spec/models/merge_request_spec.rb91
-rw-r--r--spec/models/namespace_spec.rb31
-rw-r--r--spec/models/notification_recipient_spec.rb33
-rw-r--r--spec/models/notification_setting_spec.rb3
-rw-r--r--spec/models/packages/package_spec.rb26
-rw-r--r--spec/models/project_services/jira_service_spec.rb186
-rw-r--r--spec/models/project_spec.rb14
-rw-r--r--spec/models/repository_spec.rb4
-rw-r--r--spec/models/snippet_repository_spec.rb1
-rw-r--r--spec/models/snippet_spec.rb10
-rw-r--r--spec/models/user_spec.rb1
-rw-r--r--spec/policies/project_policy_spec.rb86
-rw-r--r--spec/presenters/packages/composer/packages_presenter_spec.rb6
-rw-r--r--spec/presenters/project_presenter_spec.rb38
-rw-r--r--spec/presenters/snippet_presenter_spec.rb2
-rw-r--r--spec/requests/api/ci/runner/jobs_request_post_spec.rb9
-rw-r--r--spec/requests/api/graphql/usage_trends_measurements_spec.rb (renamed from spec/requests/api/graphql/instance_statistics_measurements_spec.rb)12
-rw-r--r--spec/requests/api/lint_spec.rb19
-rw-r--r--spec/requests/api/npm_instance_packages_spec.rb5
-rw-r--r--spec/requests/api/npm_project_packages_spec.rb95
-rw-r--r--spec/requests/api/rubygem_packages_spec.rb172
-rw-r--r--spec/requests/projects/noteable_notes_spec.rb11
-rw-r--r--spec/rubocop/cop/avoid_return_from_blocks_spec.rb12
-rw-r--r--spec/rubocop/cop/avoid_route_redirect_leading_slash_spec.rb12
-rw-r--r--spec/rubocop/cop/ignored_columns_spec.rb10
-rw-r--r--spec/rubocop/cop/migration/add_column_with_default_spec.rb10
-rw-r--r--spec/rubocop/cop/migration/add_columns_to_wide_tables_spec.rb14
-rw-r--r--spec/rubocop/cop/migration/add_concurrent_foreign_key_spec.rb30
-rw-r--r--spec/rubocop/cop/migration/add_concurrent_index_spec.rb26
-rw-r--r--spec/rubocop/cop/migration/add_index_spec.rb2
-rw-r--r--spec/rubocop/cop/migration/add_limit_to_text_columns_spec.rb40
-rw-r--r--spec/rubocop/cop/migration/add_reference_spec.rb8
-rw-r--r--spec/rubocop/cop/migration/add_timestamps_spec.rb45
-rw-r--r--spec/rubocop/cop/migration/complex_indexes_require_name_spec.rb22
-rw-r--r--spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb4
-rw-r--r--spec/rubocop/cop/migration/datetime_spec.rb148
-rw-r--r--spec/rubocop/cop/migration/drop_table_spec.rb14
-rw-r--r--spec/rubocop/cop/migration/hash_index_spec.rb46
-rw-r--r--spec/rubocop/cop/migration/prevent_strings_spec.rb22
-rw-r--r--spec/rubocop/cop/migration/refer_to_index_by_name_spec.rb20
-rw-r--r--spec/rubocop/cop/migration/remove_column_spec.rb44
-rw-r--r--spec/rubocop/cop/migration/remove_concurrent_index_spec.rb22
-rw-r--r--spec/rubocop/cop/migration/remove_index_spec.rb22
-rw-r--r--spec/rubocop/cop/migration/safer_boolean_column_spec.rb29
-rw-r--r--spec/rubocop/cop/migration/schedule_async_spec.rb96
-rw-r--r--spec/rubocop/cop/migration/timestamps_spec.rb44
-rw-r--r--spec/rubocop/cop/migration/update_column_in_batches_spec.rb34
-rw-r--r--spec/rubocop/cop/migration/with_lock_retries_disallowed_method_spec.rb67
-rw-r--r--spec/rubocop/cop/migration/with_lock_retries_with_change_spec.rb34
-rw-r--r--spec/rubocop/cop/prefer_class_methods_over_module_spec.rb42
-rw-r--r--spec/rubocop/cop/put_group_routes_under_scope_spec.rb12
-rw-r--r--spec/rubocop/cop/sidekiq_options_queue_spec.rb19
-rw-r--r--spec/serializers/base_discussion_entity_spec.rb9
-rw-r--r--spec/services/boards/lists/list_service_spec.rb22
-rw-r--r--spec/services/ci/create_pipeline_service_spec.rb2
-rw-r--r--spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb2
-rw-r--r--spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb43
-rw-r--r--spec/services/groups/destroy_service_spec.rb6
-rw-r--r--spec/services/groups/group_links/create_service_spec.rb56
-rw-r--r--spec/services/groups/group_links/destroy_service_spec.rb4
-rw-r--r--spec/services/groups/group_links/update_service_spec.rb8
-rw-r--r--spec/services/issuable/process_assignees_spec.rb71
-rw-r--r--spec/services/issues/export_csv_service_spec.rb45
-rw-r--r--spec/services/merge_requests/merge_service_spec.rb14
-rw-r--r--spec/services/merge_requests/refresh_service_spec.rb15
-rw-r--r--spec/services/namespaces/in_product_marketing_emails_service_spec.rb2
-rw-r--r--spec/services/notification_service_spec.rb30
-rw-r--r--spec/services/packages/create_temporary_package_service_spec.rb44
-rw-r--r--spec/services/packages/npm/create_package_service_spec.rb51
-rw-r--r--spec/services/packages/nuget/create_package_service_spec.rb37
-rw-r--r--spec/services/packages/nuget/update_package_from_metadata_service_spec.rb5
-rw-r--r--spec/services/pages/legacy_storage_lease_spec.rb8
-rw-r--r--spec/services/projects/create_service_spec.rb43
-rw-r--r--spec/spec_helper.rb3
-rw-r--r--spec/support/shared_contexts/project_service_jira_context.rb5
-rw-r--r--spec/support/shared_contexts/project_service_shared_context.rb5
-rw-r--r--spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb9
-rw-r--r--spec/support/shared_contexts/security_and_compliance_permissions_shared_context.rb33
-rw-r--r--spec/support/shared_examples/controllers/create_notes_rate_limit_shared_examples.rb44
-rw-r--r--spec/support/shared_examples/features/project_upload_files_shared_examples.rb16
-rw-r--r--spec/support/shared_examples/helpers/issuable_description_templates_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/models/slack_mattermost_notifications_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb593
-rw-r--r--spec/support/shared_examples/requests/api/rubygems_packages_shared_examples.rb130
-rw-r--r--spec/support/shared_examples/service_desk_issue_templates_examples.rb12
-rw-r--r--spec/tooling/danger/helper_spec.rb2
-rw-r--r--spec/views/admin/application_settings/_package_registry.html.haml_spec.rb4
-rw-r--r--spec/workers/analytics/instance_statistics/count_job_trigger_worker_spec.rb4
-rw-r--r--spec/workers/analytics/instance_statistics/counter_job_worker_spec.rb14
-rw-r--r--spec/workers/analytics/usage_trends/count_job_trigger_worker_spec.rb17
-rw-r--r--spec/workers/analytics/usage_trends/counter_job_worker_spec.rb70
-rw-r--r--spec/workers/jira_connect/sync_project_worker_spec.rb2
-rw-r--r--spec/workers/post_receive_spec.rb25
-rw-r--r--tooling/danger/helper.rb1
-rw-r--r--tooling/overcommit/Gemfile1
-rw-r--r--tooling/overcommit/Gemfile.lock14
-rw-r--r--vendor/aws/cloudformation/eks_cluster.yaml7
-rw-r--r--[-rwxr-xr-x]vendor/gitignore/C++.gitignore0
-rw-r--r--[-rwxr-xr-x]vendor/gitignore/Java.gitignore0
-rw-r--r--vendor/project_templates/dotnetcore.tar.gzbin4924 -> 4923 bytes
-rw-r--r--vendor/project_templates/express.tar.gzbin17921 -> 17923 bytes
-rw-r--r--workhorse/CHANGELOG6
-rw-r--r--workhorse/VERSION2
-rw-r--r--workhorse/go.mod2
-rw-r--r--workhorse/go.sum2
-rw-r--r--workhorse/internal/errortracker/sentry.go60
-rw-r--r--workhorse/internal/helper/helpers.go43
-rw-r--r--workhorse/internal/helper/raven.go58
-rw-r--r--workhorse/internal/imageresizer/image_resizer.go10
-rw-r--r--workhorse/internal/log/logging.go6
-rw-r--r--workhorse/internal/upstream/upstream.go3
-rw-r--r--workhorse/main.go5
-rw-r--r--workhorse/raven.go40
-rw-r--r--yarn.lock1614
2254 files changed, 59634 insertions, 124470 deletions
diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS
index 0d34eeccf8c..a545196b597 100644
--- a/.gitlab/CODEOWNERS
+++ b/.gitlab/CODEOWNERS
@@ -101,6 +101,7 @@
/doc/api/repository_files.md @aqualls
/doc/api/repository_submodules.md @aqualls
/doc/api/search.md @aqualls
+/doc/api/services.md @aqualls
/doc/api/snippets.md @aqualls
/doc/api/suggestions.md @aqualls
/doc/api/tags.md @aqualls
@@ -110,6 +111,7 @@
/doc/topics/gitlab_flow.md @aqualls
/doc/user/admin_area/settings/account_and_limit_settings.md @aqualls
/doc/user/admin_area/settings/instance_template_repository.md @aqualls
+/doc/user/admin_area/settings/project_integration_management.md @aqualls
/doc/user/admin_area/settings/push_event_activities_limit.md @aqualls
/doc/user/admin_area/settings/visibility_and_access_controls.md @aqualls
/doc/user/asciidoc.md @aqualls
@@ -170,6 +172,11 @@ Dangerfile @gl-quality/eng-prod
/scripts/review_apps/seed-dast-test-data.sh @dappelt @ngeorge1 @gl-quality/eng-prod
.editorconfig @gl-quality/eng-prod
+[Backend Static Code Analysis]
+.rubocop*.yml @dstull @splattael @gl-quality/eng-prod
+/rubocop/ @dstull @splattael @gl-quality/eng-prod
+/spec/rubocop/ @dstull @splattael @gl-quality/eng-prod
+
[End-to-end]
/qa/ @gl-quality
diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml
index 1b4b8a12772..910a58bcd0e 100644
--- a/.gitlab/ci/frontend.gitlab-ci.yml
+++ b/.gitlab/ci/frontend.gitlab-ci.yml
@@ -131,6 +131,24 @@ rspec-ee frontend_fixture:
- .frontend:rules:default-frontend-jobs
parallel: 2
+graphql-schema-dump:
+ variables:
+ SETUP_DB: "false"
+ extends:
+ - .default-retry
+ - .rails-cache
+ - .default-before_script
+ - .frontend:rules:default-frontend-jobs
+ stage: fixtures
+ needs: []
+ script:
+ - bundle exec rake gitlab:graphql:schema:dump
+ artifacts:
+ name: graphql-schema
+ paths:
+ - tmp/tests/graphql/gitlab_schema.graphql
+ - tmp/tests/graphql/gitlab_schema.json
+
.frontend-test-base:
extends:
- .frontend-base
@@ -214,7 +232,7 @@ jest-integration:
- *yarn-install
- run_timed_command "yarn jest:integration --ci"
# Don't use `needs` since `rspec-ee frontend_fixture` doesn't exist in `gitlab-foss` pipelines.
- dependencies: ["rspec frontend_fixture", "rspec-ee frontend_fixture"]
+ dependencies: ["rspec frontend_fixture", "rspec-ee frontend_fixture", "graphql-schema-dump"]
jest-as-if-foss:
extends:
diff --git a/.gitlab/ci/graphql.gitlab-ci.yml b/.gitlab/ci/graphql.gitlab-ci.yml
index 4aff0ef6306..1a05f68b178 100644
--- a/.gitlab/ci/graphql.gitlab-ci.yml
+++ b/.gitlab/ci/graphql.gitlab-ci.yml
@@ -11,4 +11,3 @@ graphql-verify:
script:
- bundle exec rake gitlab:graphql:validate
- bundle exec rake gitlab:graphql:check_docs
- - bundle exec rake gitlab:graphql:check_schema
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml
index 1eafd024f5e..021d76da278 100644
--- a/.gitlab/ci/rules.gitlab-ci.yml
+++ b/.gitlab/ci/rules.gitlab-ci.yml
@@ -11,25 +11,25 @@
if: '$CI_PROJECT_NAME != "gitlab-foss" && $CI_PROJECT_NAME != "gitlab-ce" && $CI_PROJECT_NAME != "gitlabhq"'
.if-default-refs: &if-default-refs
- if: '$CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_REF_NAME =~ /^[\d-]+-stable(-ee)?$/ || $CI_COMMIT_REF_NAME =~ /^\d+-\d+-auto-deploy-\d+$/ || $CI_COMMIT_REF_NAME =~ /^security\// || $CI_MERGE_REQUEST_IID || $CI_COMMIT_TAG || $FORCE_GITLAB_CI'
+ if: '$CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_REF_NAME == "main" || $CI_COMMIT_REF_NAME =~ /^[\d-]+-stable(-ee)?$/ || $CI_COMMIT_REF_NAME =~ /^\d+-\d+-auto-deploy-\d+$/ || $CI_COMMIT_REF_NAME =~ /^security\// || $CI_MERGE_REQUEST_IID || $CI_COMMIT_TAG || $FORCE_GITLAB_CI'
.if-master-refs: &if-master-refs
- if: '$CI_COMMIT_REF_NAME == "master"'
+ if: '$CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_REF_NAME == "main"'
.if-master-push: &if-master-push
- if: '$CI_COMMIT_BRANCH == "master" && $CI_PIPELINE_SOURCE == "push"'
+ if: '($CI_COMMIT_BRANCH == "master" || $CI_COMMIT_REF_NAME == "main") && $CI_PIPELINE_SOURCE == "push"'
.if-master-schedule-2-hourly: &if-master-schedule-2-hourly
- if: '$CI_COMMIT_BRANCH == "master" && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "2-hourly"'
+ if: '($CI_COMMIT_BRANCH == "master" || $CI_COMMIT_REF_NAME == "main") && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "2-hourly"'
.if-master-schedule-nightly: &if-master-schedule-nightly
- if: '$CI_COMMIT_BRANCH == "master" && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "nightly"'
+ if: '($CI_COMMIT_BRANCH == "master" || $CI_COMMIT_REF_NAME == "main") && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "nightly"'
.if-auto-deploy-branches: &if-auto-deploy-branches
if: '$CI_COMMIT_BRANCH =~ /^\d+-\d+-auto-deploy-\d+$/'
.if-master-or-tag: &if-master-or-tag
- if: '$CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_TAG'
+ if: '$CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_REF_NAME == "main" || $CI_COMMIT_TAG'
.if-merge-request: &if-merge-request
if: '$CI_MERGE_REQUEST_IID'
@@ -53,7 +53,7 @@
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE == "gitlab-org" && $CI_PIPELINE_SOURCE == "schedule"'
.if-dot-com-gitlab-org-master: &if-dot-com-gitlab-org-master
- if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE == "gitlab-org" && $CI_COMMIT_REF_NAME == "master"'
+ if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE == "gitlab-org" && ($CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_REF_NAME == "main")'
.if-dot-com-gitlab-org-merge-request: &if-dot-com-gitlab-org-merge-request
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE == "gitlab-org" && $CI_MERGE_REQUEST_IID'
@@ -185,7 +185,7 @@
- "vendor/assets/**/*"
- ".gitlab/ci/**/*"
- ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,rubocop_manual_todo,scss-lint}.yml"
+ - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,rubocop_manual_todo}.yml"
- "*_VERSION"
- "Gemfile{,.lock}"
- "Rakefile"
@@ -207,7 +207,7 @@
- "vendor/assets/**/*"
- ".gitlab/ci/**/*"
- ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,rubocop_manual_todo,scss-lint}.yml"
+ - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,rubocop_manual_todo}.yml"
- "*_VERSION"
- "Gemfile{,.lock}"
- "Rakefile"
@@ -232,7 +232,7 @@
- "vendor/assets/**/*"
- ".gitlab/ci/**/*"
- ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,rubocop_manual_todo,scss-lint}.yml"
+ - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,rubocop_manual_todo}.yml"
- "*_VERSION"
- "Gemfile{,.lock}"
- "Rakefile"
@@ -253,7 +253,7 @@
- "vendor/assets/**/*"
- ".gitlab/ci/**/*"
- ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,rubocop_manual_todo,scss-lint}.yml"
+ - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,rubocop_manual_todo}.yml"
- "*_VERSION"
- "Gemfile{,.lock}"
- "Rakefile"
@@ -445,7 +445,7 @@
.frontend:rules:bundle-size-review:
rules:
- - if: '$DANGER_GITLAB_API_TOKEN && $CI_MERGE_REQUEST_IID && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
+ - if: '$DANGER_GITLAB_API_TOKEN && $CI_MERGE_REQUEST_IID && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main")'
changes: *frontend-patterns
allow_failure: true
diff --git a/.gitlab/issue_templates/Query Performance Investigation.md b/.gitlab/issue_templates/Query Performance Investigation.md
index 3f2a6361d64..ddd361e4f2f 100644
--- a/.gitlab/issue_templates/Query Performance Investigation.md
+++ b/.gitlab/issue_templates/Query Performance Investigation.md
@@ -1,6 +1,6 @@
## Description
-As the name implies, the purpose of the template is to detail underperforming queries for futher investigation.
+As the name implies, the purpose of the template is to detail underperforming queries for further investigation.
### Steps
@@ -14,8 +14,10 @@ As the name implies, the purpose of the template is to detail underperforming qu
Please provide as many of these fields as possible when submitting a query performance report.
-- TPS
-- Duration
+- Queries per second (on average or peak)
+- Number of calls per second and relative to total number of calls
+- Query timings (on average or peak)
+- Database time relative to total database time
- Source of calls (Sidekiq, WebAPI, etc)
- Query ID
- SQL Statement
diff --git a/.prettierignore b/.prettierignore
index ff8188bbda4..ea7e6268b93 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1,9 +1,9 @@
/app/assets/javascripts/locale/**/app.js
+/fixtures/lib/gitlab/graphql/
/node_modules/
/public/
/vendor/
/tmp/
-doc/api/graphql/reference/gitlab_schema.graphql
# ignore stylesheets for now as this clashes with our linter
*.css
diff --git a/.rubocop.yml b/.rubocop.yml
index 7a4b53b5aa5..b9f52ebc055 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -7,8 +7,10 @@ require:
- rubocop-rspec
inherit_from:
- - .rubocop_manual_todo.yml
- - .rubocop_todo.yml
+ <% unless ENV['REVEAL_RUBOCOP_TODO'] == '1' %>
+ - '.rubocop_manual_todo.yml'
+ - '.rubocop_todo.yml'
+ <% end %>
- ./rubocop/rubocop-migrations.yml
- ./rubocop/rubocop-usage-data.yml
- ./rubocop/rubocop-code_reuse.yml
@@ -16,6 +18,7 @@ inherit_from:
inherit_mode:
merge:
- Include
+ - Exclude
AllCops:
TargetRubyVersion: 2.7
@@ -595,3 +598,14 @@ FactoryBot/InlineAssociation:
Include:
- 'spec/factories/**/*.rb'
- 'ee/spec/factories/**/*.rb'
+
+# WIP: https://gitlab.com/gitlab-org/gitlab/-/issues/321982
+Gitlab/NamespacedClass:
+ Exclude:
+ - 'config/**/*.rb'
+ - 'db/**/*.rb'
+ - 'ee/bin/**/*'
+ - 'ee/db/**/*.rb'
+ - 'ee/elastic/**/*.rb'
+ - 'scripts/**/*'
+ - 'spec/migrations/**/*.rb'
diff --git a/.rubocop_manual_todo.yml b/.rubocop_manual_todo.yml
index 477d9adec40..6c1af1a5455 100644
--- a/.rubocop_manual_todo.yml
+++ b/.rubocop_manual_todo.yml
@@ -10,6 +10,7 @@
# - guidelines for use found in
# https://docs.gitlab.com/ee/development/contributing/style_guides.html#resolving-rubocop-exceptions.
+# WIP See https://gitlab.com/gitlab-org/gitlab/-/issues/267606
FactoryBot/InlineAssociation:
Exclude:
- 'ee/spec/factories/analytics/cycle_analytics/group_stages.rb'
@@ -28,39 +29,7 @@ FactoryBot/InlineAssociation:
- 'spec/factories/uploads.rb'
- 'spec/factories/wiki_pages.rb'
-InternalAffairs/DeprecateCopHelper: # issue to resolve: https://gitlab.com/gitlab-org/gitlab/-/issues/276734
- Exclude:
- - 'spec/rubocop/cop/migration/safer_boolean_column_spec.rb'
- - 'spec/rubocop/cop/migration/remove_index_spec.rb'
- - 'spec/rubocop/cop/migration/add_index_spec.rb'
- - 'spec/rubocop/cop/migration/drop_table_spec.rb'
- - 'spec/rubocop/cop/migration/hash_index_spec.rb'
- - 'spec/rubocop/cop/migration/datetime_spec.rb'
- - 'spec/rubocop/cop/migration/add_column_with_default_spec.rb'
- - 'spec/rubocop/cop/migration/prevent_strings_spec.rb'
- - 'spec/rubocop/cop/migration/add_timestamps_spec.rb'
- - 'spec/rubocop/cop/migration/add_concurrent_index_spec.rb'
- - 'spec/rubocop/cop/migration/update_column_in_batches_spec.rb'
- - 'spec/rubocop/cop/migration/complex_indexes_require_name_spec.rb'
- - 'spec/rubocop/cop/migration/refer_to_index_by_name_spec.rb'
- - 'spec/rubocop/cop/migration/schedule_async_spec.rb'
- - 'spec/rubocop/cop/migration/timestamps_spec.rb'
- - 'spec/rubocop/cop/migration/remove_concurrent_index_spec.rb'
- - 'spec/rubocop/cop/migration/add_columns_to_wide_tables_spec.rb'
- - 'spec/rubocop/cop/migration/with_lock_retries_disallowed_method_spec.rb'
- - 'spec/rubocop/cop/migration/add_reference_spec.rb'
- - 'spec/rubocop/cop/migration/remove_column_spec.rb'
- - 'spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb'
- - 'spec/rubocop/cop/migration/add_concurrent_foreign_key_spec.rb'
- - 'spec/rubocop/cop/migration/with_lock_retries_with_change_spec.rb'
- - 'spec/rubocop/cop/migration/add_limit_to_text_columns_spec.rb'
- - 'spec/rubocop/cop/avoid_return_from_blocks_spec.rb'
- - 'spec/rubocop/cop/avoid_route_redirect_leading_slash_spec.rb'
- - 'spec/rubocop/cop/put_group_routes_under_scope_spec.rb'
- - 'spec/rubocop/cop/sidekiq_options_queue_spec.rb'
- - 'spec/rubocop/cop/ignored_columns_spec.rb'
- - 'spec/rubocop/cop/prefer_class_methods_over_module_spec.rb'
-
+# WIP: See https://gitlab.com/gitlab-org/gitlab/-/issues/220040
Rails/SaveBang:
Exclude:
- 'ee/spec/controllers/projects/merge_requests_controller_spec.rb'
@@ -1207,22 +1176,9 @@ RSpec/AnyInstanceOf:
- 'spec/workers/wait_for_cluster_creation_worker_spec.rb'
- 'ee/spec/workers/security/auto_fix_worker_spec.rb'
+# WIP: https://gitlab.com/gitlab-org/gitlab/-/issues/321982
Gitlab/NamespacedClass:
Exclude:
- - 'config/**/*.rb'
- - 'db/**/*.rb'
- - 'ee/bin/**/*'
- - 'ee/db/**/*.rb'
- - 'ee/elastic/**/*.rb'
- - 'scripts/**/*'
- - 'spec/migrations/**/*.rb'
- # The list above represents the permanent exclusions for this rule
- # due to the fact these files are related to infrastructure code.
- # This list should eventually be moved to .rubocop.yml after all TODOs
- # are addressed.
- #
- # The list below represents the classes that require
- # a namespace as they make the domain related code.
- 'app/channels/issues_channel.rb'
- 'app/controllers/abuse_reports_controller.rb'
- 'app/controllers/acme_challenges_controller.rb'
diff --git a/.scss-lint.yml b/.scss-lint.yml
deleted file mode 100644
index ec193e2a3db..00000000000
--- a/.scss-lint.yml
+++ /dev/null
@@ -1,277 +0,0 @@
-# Linter Documentation:
-# https://github.com/brigade/scss-lint/blob/master/lib/scss_lint/linter/README.md
-
-scss_files:
- - 'app/assets/stylesheets/**/*.scss'
- - 'ee/app/assets/stylesheets/**/*.scss'
-
-exclude:
- - 'app/assets/stylesheets/pages/emojis.scss'
- - 'app/assets/stylesheets/startup/startup-*.scss'
- - 'app/assets/stylesheets/lazy_bundles/select2.scss'
-
-linters:
- # Reports when you use improper spacing around ! (the "bang") in !default,
- # !global, !important, and !optional flags.
- BangFormat:
- enabled: true
-
- # Whether or not to prefer `border: 0` over `border: none`.
- BorderZero:
- enabled: true
-
- # Reports when you define a rule set using a selector with chained classes
- # (a.k.a. adjoining classes).
- ChainedClasses:
- enabled: false
-
- # Prefer hexadecimal color codes over color keywords.
- # (e.g. `color: green` is a color keyword)
- ColorKeyword:
- enabled: false
-
- # Prefer color literals (keywords or hexadecimal codes) to be used only in
- # variable declarations. They should be referred to via variables everywhere
- # else.
- ColorVariable:
- enabled: true
-
- # Which form of comments to prefer in CSS.
- Comment:
- enabled: false
-
- # Reports @debug statements (which you probably left behind accidentally).
- DebugStatement:
- enabled: false
-
- # Rule sets should be ordered as follows:
- # - @extend declarations
- # - @include declarations without inner @content
- # - properties
- # - @include declarations with inner @content
- # - nested rule sets.
- # Disabled to minimize Bootstrap migration footprint
- DeclarationOrder:
- enabled: false
-
- # `scss-lint:disable` control comments should be preceded by a comment
- # explaining why these linters are being disabled for this file.
- # See https://github.com/brigade/scss-lint#disabling-linters-via-source for
- # more information.
- DisableLinterReason:
- enabled: true
-
- # Reports when you define the same property twice in a single rule set.
- DuplicateProperty:
- enabled: true
- ignore_consecutive:
- - cursor
-
- # Separate rule, function, and mixin declarations with empty lines.
- EmptyLineBetweenBlocks:
- enabled: true
-
- # Reports when you have an empty rule set.
- EmptyRule:
- enabled: true
-
- # Reports when you have an @extend directive.
- ExtendDirective:
- enabled: false
-
- # Files should always have a final newline. This results in better diffs
- # when adding lines to the file, since SCM systems such as git won't
- # think that you touched the last line.
- FinalNewline:
- enabled: true
-
- # HEX colors should use three-character values where possible.
- HexLength:
- enabled: false
-
- # HEX color values should use lower-case colors to differentiate between
- # letters and numbers, e.g. `#E3E3E3` vs. `#e3e3e3`.
- HexNotation:
- enabled: true
-
- # Avoid using ID selectors.
- IdSelector:
- enabled: false
-
- # The basenames of @imported SCSS partials should not begin with an
- # underscore and should not include the filename extension.
- ImportPath:
- enabled: true
-
- # Avoid using !important in properties. It is usually indicative of a
- # misunderstanding of CSS specificity and can lead to brittle code.
- ImportantRule:
- enabled: false
-
- # Indentation should always be done in increments of 2 spaces.
- Indentation:
- enabled: true
- width: 2
-
- # Don't write leading zeros for numeric values with a decimal point.
- LeadingZero:
- enabled: false
-
- # Reports when you define the same selector twice in a single sheet.
- MergeableSelector:
- enabled: true
-
- # Functions, mixins, variables, and placeholders should be declared
- # with all lowercase letters and hyphens instead of underscores.
- NameFormat:
- enabled: false
-
- # Avoid nesting selectors too deeply.
- NestingDepth:
- enabled: true
- max_depth: 6
-
- # Always use placeholder selectors in @extend.
- PlaceholderInExtend:
- enabled: false
-
- # Sort properties in a strict order.
- PropertySortOrder:
- enabled: false
-
- # Reports when you use an unknown or disabled CSS property
- # (ignoring vendor-prefixed properties).
- PropertySpelling:
- enabled: true
-
- # Configure which units are allowed for property values.
- PropertyUnits:
- enabled: false
-
- # Pseudo-elements, like ::before, and ::first-letter, should be declared
- # with two colons. Pseudo-classes, like :hover and :first-child, should
- # be declared with one colon.
- PseudoElement:
- enabled: true
-
- # Avoid qualifying elements in selectors (also known as "tag-qualifying").
- QualifyingElement:
- enabled: false
-
- # Don't write selectors with a depth of applicability greater than 3.
- SelectorDepth:
- enabled: false
-
- # Selectors should always use hyphenated-lowercase, rather than camelCase or
- # snake_case.
- SelectorFormat:
- enabled: false
- convention: hyphenated_lowercase
-
- # Prefer the shortest shorthand form possible for properties that support it.
- Shorthand:
- enabled: true
-
- # Each property should have its own line, except in the special case of
- # single line rulesets.
- SingleLinePerProperty:
- enabled: true
- allow_single_line_rule_sets: true
-
- # Split selectors onto separate lines after each comma, and have each
- # individual selector occupy a single line.
- SingleLinePerSelector:
- enabled: true
-
- # Commas in lists should be followed by a space.
- SpaceAfterComma:
- enabled: true
-
- # Comment literals should be followed by a space.
- SpaceAfterComment:
- enabled: false
-
- # Properties should be formatted with a single space separating the colon
- # from the property's value.
- SpaceAfterPropertyColon:
- enabled: true
-
- # Properties should be formatted with no space between the name and the
- # colon.
- SpaceAfterPropertyName:
- enabled: true
-
- # Variables should be formatted with a single space separating the colon
- # from the variable's value.
- SpaceAfterVariableColon:
- enabled: true
-
- # Variables should be formatted with no space between the name and the
- # colon.
- SpaceAfterVariableName:
- enabled: false
-
- # Operators should be formatted with a single space on both sides of an
- # infix operator.
- SpaceAroundOperator:
- enabled: true
-
- # Opening braces should be preceded by a single space.
- SpaceBeforeBrace:
- enabled: true
-
- # Parentheses should not be padded with spaces.
- SpaceBetweenParens:
- enabled: false
-
- # Enforces that string literals should be written with a consistent form
- # of quotes (single or double).
- StringQuotes:
- enabled: false
-
- # Property values, @extend, @include, and @import directives, and variable
- # declarations should always end with a semicolon.
- TrailingSemicolon:
- enabled: true
-
- # Reports lines containing trailing whitespace.
- TrailingWhitespace:
- enabled: true
-
- # Don't write trailing zeros for numeric values with a decimal point.
- TrailingZero:
- enabled: false
-
- # Don't use the `all` keyword to specify transition properties.
- TransitionAll:
- enabled: false
-
- # Numeric values should not contain unnecessary fractional portions.
- UnnecessaryMantissa:
- enabled: true
-
- # Do not use parent selector references (&) when they would otherwise
- # be unnecessary.
- UnnecessaryParentReference:
- enabled: true
-
- # URLs should be valid and not contain protocols or domain names.
- UrlFormat:
- enabled: true
-
- # URLs should always be enclosed within quotes.
- UrlQuotes:
- enabled: true
-
- # Properties, like color and font, are easier to read and maintain
- # when defined using variables rather than literals.
- VariableForProperty:
- enabled: false
-
- # Avoid vendor prefixes. Or rather: don't write them yourself.
- VendorPrefix:
- enabled: false
-
- # Omit length units on zero values, e.g. `0px` vs. `0`.
- ZeroUnit:
- enabled: true
diff --git a/.stylelintrc b/.stylelintrc
index b9174d1dca1..7a2d44a6413 100644
--- a/.stylelintrc
+++ b/.stylelintrc
@@ -1,36 +1,37 @@
{
+ "extends": ["@gitlab/stylelint-config"],
"ignoreFiles": [
"app/assets/stylesheets/pages/emojis.scss",
"app/assets/stylesheets/startup/startup-*.scss",
"app/assets/stylesheets/lazy_bundles/select2.scss",
- "app/assets/stylesheets/highlight/themes/*.scss"
+ "app/assets/stylesheets/highlight/themes/*.scss",
+ "app/assets/stylesheets/lazy_bundles/cropper.css"
],
"plugins":[
"./scripts/frontend/stylelint/stylelint-duplicate-selectors.js",
"./scripts/frontend/stylelint/stylelint-utility-classes.js",
- "stylelint-scss"
],
"rules":{
- "at-rule-blacklist":[
+ "at-rule-disallowed-list": [
"debug"
],
- "at-rule-no-unknown":null,
- "at-rule-no-vendor-prefix":true,
- "block-no-empty":true,
- "block-opening-brace-space-before":"always",
- "color-hex-case":"lower",
- "color-hex-length":"short",
- "color-named":"never",
- "color-no-invalid-hex":true,
- "declaration-bang-space-after":"never",
- "declaration-bang-space-before":"always",
- "declaration-block-semicolon-newline-after":"always",
- "declaration-block-semicolon-space-before":"never",
- "declaration-block-single-line-max-declarations":1,
- "declaration-block-trailing-semicolon":"always",
- "declaration-colon-space-after":"always-single-line",
- "declaration-colon-space-before":"never",
- "declaration-property-value-blacklist":{
+ "at-rule-no-unknown": null,
+ "at-rule-no-vendor-prefix": true,
+ "block-no-empty": true,
+ "block-opening-brace-space-before": "always",
+ "color-hex-case": "lower",
+ "color-hex-length": "short",
+ "color-named": "never",
+ "color-no-invalid-hex": true,
+ "declaration-bang-space-after": "never",
+ "declaration-bang-space-before": "always",
+ "declaration-block-semicolon-newline-after": "always",
+ "declaration-block-semicolon-space-before": "never",
+ "declaration-block-single-line-max-declarations": 1,
+ "declaration-block-trailing-semicolon": "always",
+ "declaration-colon-space-after": "always-single-line",
+ "declaration-colon-space-before": "never",
+ "declaration-property-value-disallowed-list": {
"border":[
"none"
],
@@ -47,12 +48,12 @@
"none"
]
},
- "function-comma-space-after":"always-single-line",
- "function-parentheses-space-inside":"never",
- "function-url-quotes":"always",
- "indentation":2,
- "length-zero-no-unit":true,
- "max-nesting-depth":[
+ "function-comma-space-after": "always-single-line",
+ "function-parentheses-space-inside": "never",
+ "function-url-quotes": "always",
+ "indentation": 2,
+ "length-zero-no-unit": true,
+ "max-nesting-depth": [
6,
{
"ignoreAtRules":[
@@ -111,7 +112,6 @@
"shorthand-property-no-redundant-values":true,
"string-quotes":"single",
"value-no-vendor-prefix": [true, { "ignoreValues": ["sticky"] }],
- "stylelint-gitlab/duplicate-selectors":[true,{ "severity": "warning" }],
"stylelint-gitlab/utility-classes":[true,{ "severity": "warning" }],
"declaration-block-no-duplicate-properties": [
true,
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index 5bbc0df26e1..42d44849316 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-13.9.0 \ No newline at end of file
+c45afa70f5bd9723f0836ff228a11bc896c45511
diff --git a/GITLAB_WORKHORSE_VERSION b/GITLAB_WORKHORSE_VERSION
index 661bb99fdf9..ca1596d1a61 100644
--- a/GITLAB_WORKHORSE_VERSION
+++ b/GITLAB_WORKHORSE_VERSION
@@ -1 +1 @@
-8.63.0
+8.64.0
diff --git a/Gemfile b/Gemfile
index 58eea956427..755a388b71b 100644
--- a/Gemfile
+++ b/Gemfile
@@ -31,7 +31,8 @@ gem 'doorkeeper', '~> 5.5.0.rc2'
gem 'doorkeeper-openid_connect', '~> 1.7.5'
gem 'omniauth', '~> 1.8'
gem 'omniauth-auth0', '~> 2.0.0'
-gem 'omniauth-azure-oauth2', '~> 0.0.9'
+gem 'omniauth-azure-activedirectory-v2', '~> 0.1'
+gem 'omniauth-azure-oauth2', '~> 0.0.9' # Deprecated v1 version
gem 'omniauth-cas3', '~> 1.1.4'
gem 'omniauth-facebook', '~> 4.0.0'
gem 'omniauth-github', '~> 1.4'
@@ -195,7 +196,7 @@ gem 'acts-as-taggable-on', '~> 7.0'
gem 'sidekiq', '~> 5.2.7'
gem 'sidekiq-cron', '~> 1.0'
gem 'redis-namespace', '~> 1.7.0'
-gem 'gitlab-sidekiq-fetcher', '0.5.2', require: 'sidekiq-reliable-fetch'
+gem 'gitlab-sidekiq-fetcher', '0.5.3', require: 'sidekiq-reliable-fetch'
# Cron Parser
gem 'fugit', '~> 1.2.1'
@@ -233,7 +234,7 @@ gem 'connection_pool', '~> 2.0'
gem 'redis-rails', '~> 5.0.2'
# Discord integration
-gem 'discordrb-webhooks-blackst0ne', '~> 3.3', require: false
+gem 'discordrb-webhooks', '~> 3.4', require: false
# HipChat integration
gem 'hipchat', '~> 1.5.0'
@@ -318,7 +319,7 @@ gem 'gettext_i18n_rails', '~> 1.8.0'
gem 'gettext_i18n_rails_js', '~> 1.3'
gem 'gettext', '~> 3.3', require: false, group: :development
-gem 'batch-loader', '~> 1.4.0'
+gem 'batch-loader', '~> 2.0.1'
# Perf bar
gem 'peek', '~> 1.1'
@@ -374,7 +375,6 @@ group :development, :test do
gem 'gitlab-styles', '~> 6.0.0', require: false
- gem 'scss_lint', '~> 0.59.0', require: false
gem 'haml_lint', '~> 0.36.0', require: false
gem 'bundler-audit', '~> 0.7.0.1', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index bea01cf000d..a8f9fea0a59 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -127,7 +127,7 @@ GEM
nokogiri (~> 1.11.0.rc2)
babosa (1.0.2)
base32 (0.3.2)
- batch-loader (1.4.0)
+ batch-loader (2.0.1)
bcrypt (3.1.12)
bcrypt_pbkdf (1.0.0)
benchmark-ips (2.3.0)
@@ -257,8 +257,8 @@ GEM
diff-lcs (1.4.4)
diff_match_patch (0.1.0)
diffy (3.3.0)
- discordrb-webhooks-blackst0ne (3.3.0)
- rest-client (~> 2.0)
+ discordrb-webhooks (3.4.2)
+ rest-client (>= 2.0.0)
docile (1.3.2)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
@@ -451,7 +451,7 @@ GEM
gitlab-pry-byebug (3.9.0)
byebug (~> 11.0)
pry (~> 0.13.0)
- gitlab-sidekiq-fetcher (0.5.2)
+ gitlab-sidekiq-fetcher (0.5.3)
sidekiq (~> 5)
gitlab-styles (6.0.0)
rubocop (~> 0.91.1)
@@ -776,6 +776,8 @@ GEM
omniauth-authentiq (0.3.3)
jwt (>= 1.5)
omniauth-oauth2 (>= 1.5)
+ omniauth-azure-activedirectory-v2 (0.1.1)
+ omniauth-oauth2
omniauth-azure-oauth2 (0.0.10)
jwt (>= 1.0, < 3.0)
omniauth (~> 1.0)
@@ -1105,8 +1107,6 @@ GEM
addressable (>= 2.3.5)
faraday (> 0.8, < 2.0)
scientist (1.5.0)
- scss_lint (0.59.0)
- sass (~> 3.5, >= 3.5.5)
securecompare (1.0.0)
seed-fu (2.3.7)
activerecord (>= 3.1)
@@ -1302,7 +1302,7 @@ DEPENDENCIES
aws-sdk-s3 (~> 1)
babosa (~> 1.0.2)
base32 (~> 0.3.0)
- batch-loader (~> 1.4.0)
+ batch-loader (~> 2.0.1)
bcrypt (= 3.1.12)
bcrypt_pbkdf (~> 1.0)
benchmark-ips (~> 2.3.0)
@@ -1335,7 +1335,7 @@ DEPENDENCIES
devise-two-factor (~> 3.1.0)
diff_match_patch (~> 0.1.0)
diffy (~> 3.3)
- discordrb-webhooks-blackst0ne (~> 3.3)
+ discordrb-webhooks (~> 3.4)
doorkeeper (~> 5.5.0.rc2)
doorkeeper-openid_connect (~> 1.7.5)
ed25519 (~> 1.2)
@@ -1379,7 +1379,7 @@ DEPENDENCIES
gitlab-markup (~> 1.7.1)
gitlab-net-dns (~> 0.9.1)
gitlab-pry-byebug
- gitlab-sidekiq-fetcher (= 0.5.2)
+ gitlab-sidekiq-fetcher (= 0.5.3)
gitlab-styles (~> 6.0.0)
gitlab_chronic_duration (~> 0.10.6.2)
gitlab_omniauth-ldap (~> 2.1.1)
@@ -1448,6 +1448,7 @@ DEPENDENCIES
omniauth-atlassian-oauth2 (~> 0.2.0)
omniauth-auth0 (~> 2.0.0)
omniauth-authentiq (~> 0.3.3)
+ omniauth-azure-activedirectory-v2 (~> 0.1)
omniauth-azure-oauth2 (~> 0.0.9)
omniauth-cas3 (~> 1.1.4)
omniauth-facebook (~> 4.0.0)
@@ -1512,7 +1513,6 @@ DEPENDENCIES
rugged (~> 1.0.1)
sanitize (~> 5.2.1)
sassc-rails (~> 2.1.0)
- scss_lint (~> 0.59.0)
seed-fu (~> 2.3.7)
selenium-webdriver (~> 3.142)
sentry-raven (~> 3.0)
diff --git a/app/assets/javascripts/admin/users/tabs.js b/app/assets/javascripts/admin/users/tabs.js
index 9ada77396c7..cbaab7df4e9 100644
--- a/app/assets/javascripts/admin/users/tabs.js
+++ b/app/assets/javascripts/admin/users/tabs.js
@@ -1,11 +1,20 @@
+import Api from '~/api';
import { historyPushState } from '~/lib/utils/common_utils';
import { mergeUrlParams } from '~/lib/utils/url_utility';
const COHORTS_PANE = 'cohorts';
+const COHORTS_PANE_TAB_CLICK_EVENT = 'i_analytics_cohorts';
const tabClickHandler = (e) => {
const { hash } = e.currentTarget;
- const tab = hash === `#${COHORTS_PANE}` ? COHORTS_PANE : null;
+
+ let tab = null;
+
+ if (hash === `#${COHORTS_PANE}`) {
+ tab = COHORTS_PANE;
+ Api.trackRedisHllUserEvent(COHORTS_PANE_TAB_CLICK_EVENT);
+ }
+
const newUrl = mergeUrlParams({ tab }, window.location.href);
historyPushState(newUrl);
};
diff --git a/app/assets/javascripts/analytics/instance_statistics/components/charts_config.js b/app/assets/javascripts/analytics/instance_statistics/components/charts_config.js
deleted file mode 100644
index 6fba3c56cfe..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/components/charts_config.js
+++ /dev/null
@@ -1,87 +0,0 @@
-import { s__, __, sprintf } from '~/locale';
-import query from '../graphql/queries/instance_count.query.graphql';
-
-const noDataMessage = s__('InstanceStatistics|No data available.');
-
-export default [
- {
- loadChartError: sprintf(
- s__(
- 'InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again.',
- ),
- ),
- noDataMessage,
- chartTitle: s__('InstanceStatistics|Pipelines'),
- yAxisTitle: s__('InstanceStatistics|Items'),
- xAxisTitle: s__('InstanceStatistics|Month'),
- queries: [
- {
- query,
- title: s__('InstanceStatistics|Pipelines total'),
- identifier: 'PIPELINES',
- loadError: sprintf(
- s__('InstanceStatistics|There was an error fetching the total pipelines'),
- ),
- },
- {
- query,
- title: s__('InstanceStatistics|Pipelines succeeded'),
- identifier: 'PIPELINES_SUCCEEDED',
- loadError: sprintf(
- s__('InstanceStatistics|There was an error fetching the successful pipelines'),
- ),
- },
- {
- query,
- title: s__('InstanceStatistics|Pipelines failed'),
- identifier: 'PIPELINES_FAILED',
- loadError: sprintf(
- s__('InstanceStatistics|There was an error fetching the failed pipelines'),
- ),
- },
- {
- query,
- title: s__('InstanceStatistics|Pipelines canceled'),
- identifier: 'PIPELINES_CANCELED',
- loadError: sprintf(
- s__('InstanceStatistics|There was an error fetching the cancelled pipelines'),
- ),
- },
- {
- query,
- title: s__('InstanceStatistics|Pipelines skipped'),
- identifier: 'PIPELINES_SKIPPED',
- loadError: sprintf(
- s__('InstanceStatistics|There was an error fetching the skipped pipelines'),
- ),
- },
- ],
- },
- {
- loadChartError: sprintf(
- s__(
- 'InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again.',
- ),
- ),
- noDataMessage,
- chartTitle: s__('InstanceStatistics|Issues & Merge Requests'),
- yAxisTitle: s__('InstanceStatistics|Items'),
- xAxisTitle: s__('InstanceStatistics|Month'),
- queries: [
- {
- query,
- title: __('Issues'),
- identifier: 'ISSUES',
- loadError: sprintf(s__('InstanceStatistics|There was an error fetching the issues')),
- },
- {
- query,
- title: __('Merge requests'),
- identifier: 'MERGE_REQUESTS',
- loadError: sprintf(
- s__('InstanceStatistics|There was an error fetching the merge requests'),
- ),
- },
- ],
- },
-];
diff --git a/app/assets/javascripts/analytics/instance_statistics/graphql/fragments/count.fragment.graphql b/app/assets/javascripts/analytics/instance_statistics/graphql/fragments/count.fragment.graphql
deleted file mode 100644
index 40cef95c2e7..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/graphql/fragments/count.fragment.graphql
+++ /dev/null
@@ -1,4 +0,0 @@
-fragment Count on InstanceStatisticsMeasurement {
- count
- recordedAt
-}
diff --git a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/instance_statistics_count.query.graphql b/app/assets/javascripts/analytics/instance_statistics/graphql/queries/instance_statistics_count.query.graphql
deleted file mode 100644
index f14c2658674..00000000000
--- a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/instance_statistics_count.query.graphql
+++ /dev/null
@@ -1,34 +0,0 @@
-#import "../fragments/count.fragment.graphql"
-
-query getInstanceCounts {
- projects: instanceStatisticsMeasurements(identifier: PROJECTS, first: 1) {
- nodes {
- ...Count
- }
- }
- groups: instanceStatisticsMeasurements(identifier: GROUPS, first: 1) {
- nodes {
- ...Count
- }
- }
- users: instanceStatisticsMeasurements(identifier: USERS, first: 1) {
- nodes {
- ...Count
- }
- }
- issues: instanceStatisticsMeasurements(identifier: ISSUES, first: 1) {
- nodes {
- ...Count
- }
- }
- mergeRequests: instanceStatisticsMeasurements(identifier: MERGE_REQUESTS, first: 1) {
- nodes {
- ...Count
- }
- }
- pipelines: instanceStatisticsMeasurements(identifier: PIPELINES, first: 1) {
- nodes {
- ...Count
- }
- }
-}
diff --git a/app/assets/javascripts/analytics/instance_statistics/components/app.vue b/app/assets/javascripts/analytics/usage_trends/components/app.vue
index 3bf41eaa008..c6436160ea2 100644
--- a/app/assets/javascripts/analytics/instance_statistics/components/app.vue
+++ b/app/assets/javascripts/analytics/usage_trends/components/app.vue
@@ -1,16 +1,16 @@
<script>
import { TODAY, TOTAL_DAYS_TO_SHOW, START_DATE } from '../constants';
import ChartsConfig from './charts_config';
-import InstanceCounts from './instance_counts.vue';
-import InstanceStatisticsCountChart from './instance_statistics_count_chart.vue';
import ProjectsAndGroupsChart from './projects_and_groups_chart.vue';
+import UsageCounts from './usage_counts.vue';
+import UsageTrendsCountChart from './usage_trends_count_chart.vue';
import UsersChart from './users_chart.vue';
export default {
- name: 'InstanceStatisticsApp',
+ name: 'UsageTrendsApp',
components: {
- InstanceCounts,
- InstanceStatisticsCountChart,
+ UsageCounts,
+ UsageTrendsCountChart,
UsersChart,
ProjectsAndGroupsChart,
},
@@ -23,7 +23,7 @@ export default {
<template>
<div>
- <instance-counts />
+ <usage-counts />
<users-chart
:start-date="$options.START_DATE"
:end-date="$options.TODAY"
@@ -34,7 +34,7 @@ export default {
:end-date="$options.TODAY"
:total-data-points="$options.TOTAL_DAYS_TO_SHOW"
/>
- <instance-statistics-count-chart
+ <usage-trends-count-chart
v-for="chartOptions in $options.configs"
:key="chartOptions.chartTitle"
:queries="chartOptions.queries"
diff --git a/app/assets/javascripts/analytics/usage_trends/components/charts_config.js b/app/assets/javascripts/analytics/usage_trends/components/charts_config.js
new file mode 100644
index 00000000000..b6b440b710f
--- /dev/null
+++ b/app/assets/javascripts/analytics/usage_trends/components/charts_config.js
@@ -0,0 +1,73 @@
+import { s__, __, sprintf } from '~/locale';
+import query from '../graphql/queries/usage_count.query.graphql';
+
+const noDataMessage = s__('UsageTrends|No data available.');
+
+export default [
+ {
+ loadChartError: sprintf(
+ s__('UsageTrends|Could not load the pipelines chart. Please refresh the page to try again.'),
+ ),
+ noDataMessage,
+ chartTitle: s__('UsageTrends|Pipelines'),
+ yAxisTitle: s__('UsageTrends|Items'),
+ xAxisTitle: s__('UsageTrends|Month'),
+ queries: [
+ {
+ query,
+ title: s__('UsageTrends|Pipelines total'),
+ identifier: 'PIPELINES',
+ loadError: sprintf(s__('UsageTrends|There was an error fetching the total pipelines')),
+ },
+ {
+ query,
+ title: s__('UsageTrends|Pipelines succeeded'),
+ identifier: 'PIPELINES_SUCCEEDED',
+ loadError: sprintf(s__('UsageTrends|There was an error fetching the successful pipelines')),
+ },
+ {
+ query,
+ title: s__('UsageTrends|Pipelines failed'),
+ identifier: 'PIPELINES_FAILED',
+ loadError: sprintf(s__('UsageTrends|There was an error fetching the failed pipelines')),
+ },
+ {
+ query,
+ title: s__('UsageTrends|Pipelines canceled'),
+ identifier: 'PIPELINES_CANCELED',
+ loadError: sprintf(s__('UsageTrends|There was an error fetching the cancelled pipelines')),
+ },
+ {
+ query,
+ title: s__('UsageTrends|Pipelines skipped'),
+ identifier: 'PIPELINES_SKIPPED',
+ loadError: sprintf(s__('UsageTrends|There was an error fetching the skipped pipelines')),
+ },
+ ],
+ },
+ {
+ loadChartError: sprintf(
+ s__(
+ 'UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again.',
+ ),
+ ),
+ noDataMessage,
+ chartTitle: s__('UsageTrends|Issues & Merge Requests'),
+ yAxisTitle: s__('UsageTrends|Items'),
+ xAxisTitle: s__('UsageTrends|Month'),
+ queries: [
+ {
+ query,
+ title: __('Issues'),
+ identifier: 'ISSUES',
+ loadError: sprintf(s__('UsageTrends|There was an error fetching the issues')),
+ },
+ {
+ query,
+ title: __('Merge requests'),
+ identifier: 'MERGE_REQUESTS',
+ loadError: sprintf(s__('UsageTrends|There was an error fetching the merge requests')),
+ },
+ ],
+ },
+];
diff --git a/app/assets/javascripts/analytics/instance_statistics/components/projects_and_groups_chart.vue b/app/assets/javascripts/analytics/usage_trends/components/projects_and_groups_chart.vue
index 3ffec90fb68..66aa939938e 100644
--- a/app/assets/javascripts/analytics/instance_statistics/components/projects_and_groups_chart.vue
+++ b/app/assets/javascripts/analytics/usage_trends/components/projects_and_groups_chart.vue
@@ -1,11 +1,11 @@
<script>
import { GlAlert } from '@gitlab/ui';
import { GlLineChart } from '@gitlab/ui/dist/charts';
+import * as Sentry from '@sentry/browser';
import produce from 'immer';
import { sortBy } from 'lodash';
import { formatDateAsMonth } from '~/lib/utils/datetime_utility';
import { s__, __ } from '~/locale';
-import * as Sentry from '~/sentry/wrapper';
import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleton_loader.vue';
import latestGroupsQuery from '../graphql/queries/groups.query.graphql';
import latestProjectsQuery from '../graphql/queries/projects.query.graphql';
@@ -113,14 +113,14 @@ export default {
},
},
i18n: {
- yAxisTitle: s__('InstanceStatistics|Total projects & groups'),
+ yAxisTitle: s__('UsageTrends|Total projects & groups'),
xAxisTitle: __('Month'),
loadChartError: s__(
- 'InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again.',
+ 'UsageTrends|Could not load the projects and groups chart. Please refresh the page to try again.',
),
- loadProjectsDataError: s__('InstanceStatistics|There was an error while loading the projects'),
- loadGroupsDataError: s__('InstanceStatistics|There was an error while loading the groups'),
- noDataMessage: s__('InstanceStatistics|No data available.'),
+ loadProjectsDataError: s__('UsageTrends|There was an error while loading the projects'),
+ loadGroupsDataError: s__('UsageTrends|There was an error while loading the groups'),
+ noDataMessage: s__('UsageTrends|No data available.'),
},
computed: {
isLoadingGroups() {
@@ -161,11 +161,11 @@ export default {
chartData() {
return [
{
- name: s__('InstanceStatistics|Total projects'),
+ name: s__('UsageTrends|Total projects'),
data: this.projectChartData,
},
{
- name: s__('InstanceStatistics|Total groups'),
+ name: s__('UsageTrends|Total groups'),
data: this.groupChartData,
},
];
diff --git a/app/assets/javascripts/analytics/instance_statistics/components/instance_counts.vue b/app/assets/javascripts/analytics/usage_trends/components/usage_counts.vue
index f3779ed62e9..9a0a4f61a74 100644
--- a/app/assets/javascripts/analytics/instance_statistics/components/instance_counts.vue
+++ b/app/assets/javascripts/analytics/usage_trends/components/usage_counts.vue
@@ -1,15 +1,15 @@
<script>
+import * as Sentry from '@sentry/browser';
import MetricCard from '~/analytics/shared/components/metric_card.vue';
import { deprecatedCreateFlash as createFlash } from '~/flash';
import { SUPPORTED_FORMATS, getFormatter } from '~/lib/utils/unit_format';
import { s__ } from '~/locale';
-import * as Sentry from '~/sentry/wrapper';
-import instanceStatisticsCountQuery from '../graphql/queries/instance_statistics_count.query.graphql';
+import usageTrendsCountQuery from '../graphql/queries/usage_trends_count.query.graphql';
const defaultPrecision = 0;
export default {
- name: 'InstanceCounts',
+ name: 'UsageCounts',
components: {
MetricCard,
},
@@ -20,7 +20,7 @@ export default {
},
apollo: {
counts: {
- query: instanceStatisticsCountQuery,
+ query: usageTrendsCountQuery,
update(data) {
return Object.entries(data).map(([key, obj]) => {
const label = this.$options.i18n.labels[key];
@@ -42,14 +42,14 @@ export default {
},
i18n: {
labels: {
- users: s__('InstanceStatistics|Users'),
- projects: s__('InstanceStatistics|Projects'),
- groups: s__('InstanceStatistics|Groups'),
- issues: s__('InstanceStatistics|Issues'),
- mergeRequests: s__('InstanceStatistics|Merge Requests'),
- pipelines: s__('InstanceStatistics|Pipelines'),
+ users: s__('UsageTrends|Users'),
+ projects: s__('UsageTrends|Projects'),
+ groups: s__('UsageTrends|Groups'),
+ issues: s__('UsageTrends|Issues'),
+ mergeRequests: s__('UsageTrends|Merge Requests'),
+ pipelines: s__('UsageTrends|Pipelines'),
},
- loadCountsError: s__('Could not load instance counts. Please refresh the page to try again.'),
+ loadCountsError: s__('Could not load usage counts. Please refresh the page to try again.'),
},
};
</script>
diff --git a/app/assets/javascripts/analytics/instance_statistics/components/instance_statistics_count_chart.vue b/app/assets/javascripts/analytics/usage_trends/components/usage_trends_count_chart.vue
index e2defe0572d..8d7761694d1 100644
--- a/app/assets/javascripts/analytics/instance_statistics/components/instance_statistics_count_chart.vue
+++ b/app/assets/javascripts/analytics/usage_trends/components/usage_trends_count_chart.vue
@@ -1,21 +1,21 @@
<script>
import { GlAlert } from '@gitlab/ui';
import { GlLineChart } from '@gitlab/ui/dist/charts';
+import * as Sentry from '@sentry/browser';
import { some, every } from 'lodash';
import {
differenceInMonths,
formatDateAsMonth,
getDayDifference,
} from '~/lib/utils/datetime_utility';
-import * as Sentry from '~/sentry/wrapper';
import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleton_loader.vue';
import { TODAY, START_DATE } from '../constants';
import { getAverageByMonth, getEarliestDate, generateDataKeys } from '../utils';
-const QUERY_DATA_KEY = 'instanceStatisticsMeasurements';
+const QUERY_DATA_KEY = 'usageTrendsMeasurements';
export default {
- name: 'InstanceStatisticsCountChart',
+ name: 'UsageTrendsCountChart',
components: {
GlLineChart,
GlAlert,
diff --git a/app/assets/javascripts/analytics/instance_statistics/components/users_chart.vue b/app/assets/javascripts/analytics/usage_trends/components/users_chart.vue
index 73940f028a1..09dfcddcb73 100644
--- a/app/assets/javascripts/analytics/instance_statistics/components/users_chart.vue
+++ b/app/assets/javascripts/analytics/usage_trends/components/users_chart.vue
@@ -1,11 +1,11 @@
<script>
import { GlAlert } from '@gitlab/ui';
import { GlAreaChart } from '@gitlab/ui/dist/charts';
+import * as Sentry from '@sentry/browser';
import produce from 'immer';
import { sortBy } from 'lodash';
import { formatDateAsMonth } from '~/lib/utils/datetime_utility';
import { __ } from '~/locale';
-import * as Sentry from '~/sentry/wrapper';
import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleton_loader.vue';
import usersQuery from '../graphql/queries/users.query.graphql';
import { getAverageByMonth } from '../utils';
diff --git a/app/assets/javascripts/analytics/instance_statistics/constants.js b/app/assets/javascripts/analytics/usage_trends/constants.js
index 846c0ef408b..846c0ef408b 100644
--- a/app/assets/javascripts/analytics/instance_statistics/constants.js
+++ b/app/assets/javascripts/analytics/usage_trends/constants.js
diff --git a/app/assets/javascripts/analytics/usage_trends/graphql/fragments/count.fragment.graphql b/app/assets/javascripts/analytics/usage_trends/graphql/fragments/count.fragment.graphql
new file mode 100644
index 00000000000..2bde5973600
--- /dev/null
+++ b/app/assets/javascripts/analytics/usage_trends/graphql/fragments/count.fragment.graphql
@@ -0,0 +1,4 @@
+fragment Count on UsageTrendsMeasurement {
+ count
+ recordedAt
+}
diff --git a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/groups.query.graphql b/app/assets/javascripts/analytics/usage_trends/graphql/queries/groups.query.graphql
index ec56d91ffaa..b1249cc9480 100644
--- a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/groups.query.graphql
+++ b/app/assets/javascripts/analytics/usage_trends/graphql/queries/groups.query.graphql
@@ -2,7 +2,7 @@
#import "../fragments/count.fragment.graphql"
query getGroupsCount($first: Int, $after: String) {
- groups: instanceStatisticsMeasurements(identifier: GROUPS, first: $first, after: $after) {
+ groups: usageTrendsMeasurements(identifier: GROUPS, first: $first, after: $after) {
nodes {
...Count
}
diff --git a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/projects.query.graphql b/app/assets/javascripts/analytics/usage_trends/graphql/queries/projects.query.graphql
index 0845b703435..2e10b6cce3e 100644
--- a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/projects.query.graphql
+++ b/app/assets/javascripts/analytics/usage_trends/graphql/queries/projects.query.graphql
@@ -2,7 +2,7 @@
#import "../fragments/count.fragment.graphql"
query getProjectsCount($first: Int, $after: String) {
- projects: instanceStatisticsMeasurements(identifier: PROJECTS, first: $first, after: $after) {
+ projects: usageTrendsMeasurements(identifier: PROJECTS, first: $first, after: $after) {
nodes {
...Count
}
diff --git a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/instance_count.query.graphql b/app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_count.query.graphql
index dd22a16cd51..2a5546efb68 100644
--- a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/instance_count.query.graphql
+++ b/app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_count.query.graphql
@@ -2,7 +2,7 @@
#import "../fragments/count.fragment.graphql"
query getCount($identifier: MeasurementIdentifier!, $first: Int, $after: String) {
- instanceStatisticsMeasurements(identifier: $identifier, first: $first, after: $after) {
+ usageTrendsMeasurements(identifier: $identifier, first: $first, after: $after) {
nodes {
...Count
}
diff --git a/app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_trends_count.query.graphql b/app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_trends_count.query.graphql
new file mode 100644
index 00000000000..8cadcfae380
--- /dev/null
+++ b/app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_trends_count.query.graphql
@@ -0,0 +1,34 @@
+#import "../fragments/count.fragment.graphql"
+
+query getInstanceCounts {
+ projects: usageTrendsMeasurements(identifier: PROJECTS, first: 1) {
+ nodes {
+ ...Count
+ }
+ }
+ groups: usageTrendsMeasurements(identifier: GROUPS, first: 1) {
+ nodes {
+ ...Count
+ }
+ }
+ users: usageTrendsMeasurements(identifier: USERS, first: 1) {
+ nodes {
+ ...Count
+ }
+ }
+ issues: usageTrendsMeasurements(identifier: ISSUES, first: 1) {
+ nodes {
+ ...Count
+ }
+ }
+ mergeRequests: usageTrendsMeasurements(identifier: MERGE_REQUESTS, first: 1) {
+ nodes {
+ ...Count
+ }
+ }
+ pipelines: usageTrendsMeasurements(identifier: PIPELINES, first: 1) {
+ nodes {
+ ...Count
+ }
+ }
+}
diff --git a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/users.query.graphql b/app/assets/javascripts/analytics/usage_trends/graphql/queries/users.query.graphql
index 6235e36eb89..7c02ac49a42 100644
--- a/app/assets/javascripts/analytics/instance_statistics/graphql/queries/users.query.graphql
+++ b/app/assets/javascripts/analytics/usage_trends/graphql/queries/users.query.graphql
@@ -2,7 +2,7 @@
#import "../fragments/count.fragment.graphql"
query getUsersCount($first: Int, $after: String) {
- users: instanceStatisticsMeasurements(identifier: USERS, first: $first, after: $after) {
+ users: usageTrendsMeasurements(identifier: USERS, first: $first, after: $after) {
nodes {
...Count
}
diff --git a/app/assets/javascripts/analytics/instance_statistics/index.js b/app/assets/javascripts/analytics/usage_trends/index.js
index 0d7dcf6ace8..d1880b09f15 100644
--- a/app/assets/javascripts/analytics/instance_statistics/index.js
+++ b/app/assets/javascripts/analytics/usage_trends/index.js
@@ -1,7 +1,7 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createDefaultClient from '~/lib/graphql';
-import InstanceStatisticsApp from './components/app.vue';
+import UsageTrendsApp from './components/app.vue';
Vue.use(VueApollo);
@@ -10,7 +10,7 @@ const apolloProvider = new VueApollo({
});
export default () => {
- const el = document.getElementById('js-instance-statistics-app');
+ const el = document.getElementById('js-usage-trends-app');
if (!el) return false;
@@ -18,7 +18,7 @@ export default () => {
el,
apolloProvider,
render(h) {
- return h(InstanceStatisticsApp);
+ return h(UsageTrendsApp);
},
});
};
diff --git a/app/assets/javascripts/analytics/instance_statistics/utils.js b/app/assets/javascripts/analytics/usage_trends/utils.js
index 396962ffad6..91907877ed6 100644
--- a/app/assets/javascripts/analytics/instance_statistics/utils.js
+++ b/app/assets/javascripts/analytics/usage_trends/utils.js
@@ -41,8 +41,8 @@ export function getAverageByMonth(items = [], options = {}) {
}
/**
- * Takes an array of instance counts and returns the last item in the list
- * @param {Array} arr array of instance counts in the form { count: Number, recordedAt: date String }
+ * Takes an array of usage counts and returns the last item in the list
+ * @param {Array} arr array of usage counts in the form { count: Number, recordedAt: date String }
* @return {String} the 'recordedAt' value of the earliest item
*/
export const getEarliestDate = (arr = []) => {
@@ -54,7 +54,7 @@ export const getEarliestDate = (arr = []) => {
* Takes an array of queries and produces an object with the query identifier as key
* and a supplied defaultValue as its value
* @param {Array} queries array of chart query configs,
- * see ./analytics/instance_statistics/components/charts_config.js
+ * see ./analytics/usage_trends/components/charts_config.js
* @param {any} defaultValue value to set each identifier to
* @return {Object} key value pair of the form { queryIdentifier: defaultValue }
*/
diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js
index c7e6b98a934..a9bb2909c39 100644
--- a/app/assets/javascripts/api.js
+++ b/app/assets/javascripts/api.js
@@ -24,6 +24,7 @@ const Api = {
projectPackagesPath: '/api/:version/projects/:id/packages',
projectPackagePath: '/api/:version/projects/:id/packages/:package_id',
groupProjectsPath: '/api/:version/groups/:id/projects.json',
+ groupSharePath: '/api/:version/groups/:id/share',
projectsPath: '/api/:version/projects.json',
projectPath: '/api/:version/projects/:id',
forkedProjectsPath: '/api/:version/projects/:id/forks',
@@ -39,6 +40,7 @@ const Api = {
projectRunnersPath: '/api/:version/projects/:id/runners',
projectProtectedBranchesPath: '/api/:version/projects/:id/protected_branches',
projectSearchPath: '/api/:version/projects/:id/search',
+ projectSharePath: '/api/:version/projects/:id/share',
projectMilestonesPath: '/api/:version/projects/:id/milestones',
projectIssuePath: '/api/:version/projects/:id/issues/:issue_iid',
mergeRequestsPath: '/api/:version/merge_requests',
@@ -365,6 +367,16 @@ const Api = {
});
},
+ projectShareWithGroup(id, options = {}) {
+ const url = Api.buildUrl(Api.projectSharePath).replace(':id', encodeURIComponent(id));
+
+ return axios.post(url, {
+ expires_at: options.expires_at,
+ group_access: options.group_access,
+ group_id: options.group_id,
+ });
+ },
+
projectMilestones(id, params = {}) {
const url = Api.buildUrl(Api.projectMilestonesPath).replace(':id', encodeURIComponent(id));
@@ -426,6 +438,16 @@ const Api = {
});
},
+ groupShareWithGroup(id, options = {}) {
+ const url = Api.buildUrl(Api.groupSharePath).replace(':id', encodeURIComponent(id));
+
+ return axios.post(url, {
+ expires_at: options.expires_at,
+ group_access: options.group_access,
+ group_id: options.group_id,
+ });
+ },
+
commit(id, sha, params = {}) {
const url = Api.buildUrl(this.commitPath)
.replace(':id', encodeURIComponent(id))
diff --git a/app/assets/javascripts/artifacts_settings/keep_latest_artifact_checkbox.vue b/app/assets/javascripts/artifacts_settings/keep_latest_artifact_checkbox.vue
index 92f1cc8117a..d797469dd53 100644
--- a/app/assets/javascripts/artifacts_settings/keep_latest_artifact_checkbox.vue
+++ b/app/assets/javascripts/artifacts_settings/keep_latest_artifact_checkbox.vue
@@ -2,7 +2,6 @@
import { GlAlert, GlFormCheckbox, GlLink } from '@gitlab/ui';
import { __ } from '~/locale';
import UpdateKeepLatestArtifactProjectSetting from './graphql/mutations/update_keep_latest_artifact_project_setting.mutation.graphql';
-import GetKeepLatestArtifactApplicationSetting from './graphql/queries/get_keep_latest_artifact_application_setting.query.graphql';
import GetKeepLatestArtifactProjectSetting from './graphql/queries/get_keep_latest_artifact_project_setting.query.graphql';
export default {
@@ -14,7 +13,6 @@ export default {
enabledHelpText: __(
'The latest artifacts created by jobs in the most recent successful pipeline will be stored.',
),
- disabledHelpText: __('This feature is disabled at the instance level.'),
helpLinkText: __('More information'),
checkboxText: __('Keep artifacts from most recent successful jobs'),
},
@@ -46,19 +44,12 @@ export default {
this.reportError(this.$options.errors.fetchError);
},
},
- projectSettingDisabled: {
- query: GetKeepLatestArtifactApplicationSetting,
- update(data) {
- return !data.ciApplicationSettings?.keepLatestArtifact;
- },
- },
},
data() {
return {
keepLatestArtifact: null,
errorMessage: '',
isAlertDismissed: false,
- projectSettingDisabled: true,
};
},
computed: {
@@ -66,9 +57,7 @@ export default {
return this.errorMessage && !this.isAlertDismissed;
},
helpText() {
- return this.projectSettingDisabled
- ? this.$options.i18n.disabledHelpText
- : this.$options.i18n.enabledHelpText;
+ return this.$options.i18n.enabledHelpText;
},
},
methods: {
@@ -106,10 +95,7 @@ export default {
@dismiss="isAlertDismissed = true"
>{{ errorMessage }}</gl-alert
>
- <gl-form-checkbox
- v-model="keepLatestArtifact"
- :disabled="projectSettingDisabled"
- @change="updateSetting"
+ <gl-form-checkbox v-model="keepLatestArtifact" @change="updateSetting"
><strong class="gl-mr-3">{{ $options.i18n.checkboxText }}</strong>
<gl-link :href="helpPagePath">{{ $options.i18n.helpLinkText }}</gl-link>
<template v-if="!$apollo.loading" #help>{{ helpText }}</template>
diff --git a/app/assets/javascripts/blob/blob_file_dropzone.js b/app/assets/javascripts/blob/blob_file_dropzone.js
index e72c5c90986..445602a8765 100644
--- a/app/assets/javascripts/blob/blob_file_dropzone.js
+++ b/app/assets/javascripts/blob/blob_file_dropzone.js
@@ -3,6 +3,7 @@
import Dropzone from 'dropzone';
import $ from 'jquery';
import { sprintf, __ } from '~/locale';
+import { trackUploadFileFormSubmitted } from '~/projects/upload_file_experiment';
import { HIDDEN_CLASS } from '../lib/utils/constants';
import csrf from '../lib/utils/csrf';
import { visitUrl } from '../lib/utils/url_utility';
@@ -83,6 +84,9 @@ export default class BlobFileDropzone {
submitButton.on('click', (e) => {
e.preventDefault();
e.stopPropagation();
+
+ trackUploadFileFormSubmitted();
+
if (dropzone[0].dropzone.getQueuedFiles().length === 0) {
// eslint-disable-next-line no-alert
alert(__('Please select a file'));
diff --git a/app/assets/javascripts/blob_edit/blob_bundle.js b/app/assets/javascripts/blob_edit/blob_bundle.js
index 173c82ef9b0..6d9b56b4bb8 100644
--- a/app/assets/javascripts/blob_edit/blob_bundle.js
+++ b/app/assets/javascripts/blob_edit/blob_bundle.js
@@ -4,6 +4,7 @@ import $ from 'jquery';
import initPopover from '~/blob/suggest_gitlab_ci_yml';
import { deprecatedCreateFlash as createFlash } from '~/flash';
import { disableButtonIfEmptyField, setCookie } from '~/lib/utils/common_utils';
+import { initUploadFileTrigger } from '~/projects/upload_file_experiment';
import Tracking from '~/tracking';
import BlobFileDropzone from '../blob/blob_file_dropzone';
import NewCommitForm from '../new_commit_form';
@@ -47,6 +48,7 @@ export const initUploadForm = () => {
new NewCommitForm(uploadBlobForm);
disableButtonIfEmptyField(uploadBlobForm.find('.js-commit-message'), '.btn-upload-file');
+ initUploadFileTrigger();
}
};
diff --git a/app/assets/javascripts/boards/boards_util.js b/app/assets/javascripts/boards/boards_util.js
index 13ad820477f..cf7e8cb94d1 100644
--- a/app/assets/javascripts/boards/boards_util.js
+++ b/app/assets/javascripts/boards/boards_util.js
@@ -36,11 +36,11 @@ export function formatIssue(issue) {
}
export function formatListIssues(listIssues) {
- const issues = {};
- let listIssuesCount;
+ const boardItems = {};
+ let listItemsCount;
const listData = listIssues.nodes.reduce((map, list) => {
- listIssuesCount = list.issues.count;
+ listItemsCount = list.issues.count;
let sortedIssues = list.issues.edges.map((issueNode) => ({
...issueNode.node,
}));
@@ -58,14 +58,14 @@ export function formatListIssues(listIssues) {
assignees: i.assignees?.nodes || [],
};
- issues[id] = listIssue;
+ boardItems[id] = listIssue;
return id;
}),
};
}, {});
- return { listData, issues, listIssuesCount };
+ return { listData, boardItems, listItemsCount };
}
export function formatListsPageInfo(lists) {
diff --git a/app/assets/javascripts/boards/components/board_card.vue b/app/assets/javascripts/boards/components/board_card.vue
index e6009343626..a0fee1b064b 100644
--- a/app/assets/javascripts/boards/components/board_card.vue
+++ b/app/assets/javascripts/boards/components/board_card.vue
@@ -1,14 +1,11 @@
<script>
-import sidebarEventHub from '~/sidebar/event_hub';
-import eventHub from '../eventhub';
-import boardsStore from '../stores/boards_store';
-import BoardCardLayout from './board_card_layout.vue';
-import BoardCardLayoutDeprecated from './board_card_layout_deprecated.vue';
+import { mapActions, mapGetters, mapState } from 'vuex';
+import IssueCardInner from './issue_card_inner.vue';
export default {
- name: 'BoardsIssueCard',
+ name: 'BoardCard',
components: {
- BoardCardLayout: gon.features?.graphqlBoardLists ? BoardCardLayout : BoardCardLayoutDeprecated,
+ IssueCardInner,
},
props: {
list: {
@@ -21,29 +18,41 @@ export default {
default: () => ({}),
required: false,
},
+ disabled: {
+ type: Boolean,
+ default: false,
+ required: false,
+ },
+ index: {
+ type: Number,
+ default: 0,
+ required: false,
+ },
},
- methods: {
- // These are methods instead of computed's, because boardsStore is not reactive.
+ computed: {
+ ...mapState(['selectedBoardItems', 'activeId']),
+ ...mapGetters(['isSwimlanesOn']),
isActive() {
- return this.getActiveId() === this.issue.id;
+ return this.issue.id === this.activeId;
},
- getActiveId() {
- return boardsStore.detail?.issue?.id;
+ multiSelectVisible() {
+ return (
+ !this.activeId &&
+ this.selectedBoardItems.findIndex((boardItem) => boardItem.id === this.issue.id) > -1
+ );
},
- showIssue({ isMultiSelect }) {
- // If no issues are opened, close all sidebars first
- if (!this.getActiveId()) {
- sidebarEventHub.$emit('sidebar.closeAll');
- }
- if (this.isActive()) {
- eventHub.$emit('clearDetailIssue', isMultiSelect);
+ },
+ methods: {
+ ...mapActions(['toggleBoardItemMultiSelection', 'toggleBoardItem']),
+ toggleIssue(e) {
+ // Don't do anything if this happened on a no trigger element
+ if (e.target.classList.contains('js-no-trigger')) return;
- if (isMultiSelect) {
- eventHub.$emit('newDetailIssue', this.issue, isMultiSelect);
- }
+ const isMultiSelect = e.ctrlKey || e.metaKey;
+ if (isMultiSelect) {
+ this.toggleBoardItemMultiSelection(this.issue);
} else {
- eventHub.$emit('newDetailIssue', this.issue, isMultiSelect);
- boardsStore.setListDetail(this.list);
+ this.toggleBoardItem({ boardItem: this.issue });
}
},
},
@@ -51,12 +60,22 @@ export default {
</script>
<template>
- <board-card-layout
+ <li
data-qa-selector="board_card"
- :issue="issue"
- :list="list"
- :is-active="isActive()"
- v-bind="$attrs"
- @show="showIssue"
- />
+ :class="{
+ 'multi-select': multiSelectVisible,
+ 'user-can-drag': !disabled && issue.id,
+ 'is-disabled': disabled || !issue.id,
+ 'is-active': isActive,
+ }"
+ :index="index"
+ :data-issue-id="issue.id"
+ :data-issue-iid="issue.iid"
+ :data-issue-path="issue.referencePath"
+ data-testid="board_card"
+ class="board-card gl-p-5 gl-rounded-base"
+ @mouseup="toggleIssue($event)"
+ >
+ <issue-card-inner :list="list" :issue="issue" :update-filters="true" />
+ </li>
</template>
diff --git a/app/assets/javascripts/boards/components/board_card_deprecated.vue b/app/assets/javascripts/boards/components/board_card_deprecated.vue
new file mode 100644
index 00000000000..e12a2836f67
--- /dev/null
+++ b/app/assets/javascripts/boards/components/board_card_deprecated.vue
@@ -0,0 +1,61 @@
+<script>
+// This component is being replaced in favor of './board_card.vue' for GraphQL boards
+import sidebarEventHub from '~/sidebar/event_hub';
+import eventHub from '../eventhub';
+import boardsStore from '../stores/boards_store';
+import BoardCardLayoutDeprecated from './board_card_layout_deprecated.vue';
+
+export default {
+ components: {
+ BoardCardLayout: BoardCardLayoutDeprecated,
+ },
+ props: {
+ list: {
+ type: Object,
+ default: () => ({}),
+ required: false,
+ },
+ issue: {
+ type: Object,
+ default: () => ({}),
+ required: false,
+ },
+ },
+ methods: {
+ // These are methods instead of computed's, because boardsStore is not reactive.
+ isActive() {
+ return this.getActiveId() === this.issue.id;
+ },
+ getActiveId() {
+ return boardsStore.detail?.issue?.id;
+ },
+ showIssue({ isMultiSelect }) {
+ // If no issues are opened, close all sidebars first
+ if (!this.getActiveId()) {
+ sidebarEventHub.$emit('sidebar.closeAll');
+ }
+ if (this.isActive()) {
+ eventHub.$emit('clearDetailIssue', isMultiSelect);
+
+ if (isMultiSelect) {
+ eventHub.$emit('newDetailIssue', this.issue, isMultiSelect);
+ }
+ } else {
+ eventHub.$emit('newDetailIssue', this.issue, isMultiSelect);
+ boardsStore.setListDetail(this.list);
+ }
+ },
+ },
+};
+</script>
+
+<template>
+ <board-card-layout
+ data-qa-selector="board_card"
+ :issue="issue"
+ :list="list"
+ :is-active="isActive()"
+ v-bind="$attrs"
+ @show="showIssue"
+ />
+</template>
diff --git a/app/assets/javascripts/boards/components/board_card_layout.vue b/app/assets/javascripts/boards/components/board_card_layout.vue
deleted file mode 100644
index 5e3c3702519..00000000000
--- a/app/assets/javascripts/boards/components/board_card_layout.vue
+++ /dev/null
@@ -1,98 +0,0 @@
-<script>
-import { mapActions, mapGetters, mapState } from 'vuex';
-import { ISSUABLE } from '~/boards/constants';
-import IssueCardInner from './issue_card_inner.vue';
-
-export default {
- name: 'BoardCardLayout',
- components: {
- IssueCardInner,
- },
- props: {
- list: {
- type: Object,
- default: () => ({}),
- required: false,
- },
- issue: {
- type: Object,
- default: () => ({}),
- required: false,
- },
- disabled: {
- type: Boolean,
- default: false,
- required: false,
- },
- index: {
- type: Number,
- default: 0,
- required: false,
- },
- isActive: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- showDetail: false,
- };
- },
- computed: {
- ...mapState(['selectedBoardItems']),
- ...mapGetters(['isSwimlanesOn']),
- multiSelectVisible() {
- return this.selectedBoardItems.findIndex((boardItem) => boardItem.id === this.issue.id) > -1;
- },
- },
- methods: {
- ...mapActions(['setActiveId', 'toggleBoardItemMultiSelection']),
- mouseDown() {
- this.showDetail = true;
- },
- mouseMove() {
- this.showDetail = false;
- },
- showIssue(e) {
- // Don't do anything if this happened on a no trigger element
- if (e.target.classList.contains('js-no-trigger')) return;
-
- const isMultiSelect = e.ctrlKey || e.metaKey;
-
- if (!isMultiSelect) {
- this.setActiveId({ id: this.issue.id, sidebarType: ISSUABLE });
- } else {
- this.toggleBoardItemMultiSelection(this.issue);
- }
-
- if (this.showDetail || isMultiSelect) {
- this.showDetail = false;
- }
- },
- },
-};
-</script>
-
-<template>
- <li
- :class="{
- 'multi-select': multiSelectVisible,
- 'user-can-drag': !disabled && issue.id,
- 'is-disabled': disabled || !issue.id,
- 'is-active': isActive,
- }"
- :index="index"
- :data-issue-id="issue.id"
- :data-issue-iid="issue.iid"
- :data-issue-path="issue.referencePath"
- data-testid="board_card"
- class="board-card gl-p-5 gl-rounded-base"
- @mousedown="mouseDown"
- @mousemove="mouseMove"
- @mouseup="showIssue($event)"
- >
- <issue-card-inner :list="list" :issue="issue" :update-filters="true" />
- </li>
-</template>
diff --git a/app/assets/javascripts/boards/components/board_column.vue b/app/assets/javascripts/boards/components/board_column.vue
index 41b9ee795eb..95a90d7ab11 100644
--- a/app/assets/javascripts/boards/components/board_column.vue
+++ b/app/assets/javascripts/boards/components/board_column.vue
@@ -32,12 +32,12 @@ export default {
},
computed: {
...mapState(['filterParams', 'highlightedLists']),
- ...mapGetters(['getIssuesByList']),
+ ...mapGetters(['getBoardItemsByList']),
highlighted() {
return this.highlightedLists.includes(this.list.id);
},
- listIssues() {
- return this.getIssuesByList(this.list.id);
+ listItems() {
+ return this.getBoardItemsByList(this.list.id);
},
isListDraggable() {
return isListDraggable(this.list);
@@ -46,7 +46,7 @@ export default {
watch: {
filterParams: {
handler() {
- this.fetchIssuesForList({ listId: this.list.id });
+ this.fetchItemsForList({ listId: this.list.id });
},
deep: true,
immediate: true,
@@ -63,7 +63,7 @@ export default {
},
},
methods: {
- ...mapActions(['fetchIssuesForList']),
+ ...mapActions(['fetchItemsForList']),
},
};
</script>
@@ -87,7 +87,7 @@ export default {
<board-list
ref="board-list"
:disabled="disabled"
- :issues="listIssues"
+ :board-items="listItems"
:list="list"
:can-admin-list="canAdminList"
/>
diff --git a/app/assets/javascripts/boards/components/board_content.vue b/app/assets/javascripts/boards/components/board_content.vue
index 9b10e7d7db5..6b7e04df7a4 100644
--- a/app/assets/javascripts/boards/components/board_content.vue
+++ b/app/assets/javascripts/boards/components/board_content.vue
@@ -11,7 +11,10 @@ import BoardColumnDeprecated from './board_column_deprecated.vue';
export default {
components: {
- BoardColumn: gon.features?.graphqlBoardLists ? BoardColumn : BoardColumnDeprecated,
+ BoardColumn:
+ gon.features?.graphqlBoardLists || gon.features?.epicBoards
+ ? BoardColumn
+ : BoardColumnDeprecated,
BoardContentSidebar: () => import('ee_component/boards/components/board_content_sidebar.vue'),
EpicsSwimlanes: () => import('ee_component/boards/components/epics_swimlanes.vue'),
GlAlert,
@@ -33,10 +36,10 @@ export default {
},
},
computed: {
- ...mapState(['boardLists', 'error']),
+ ...mapState(['boardLists', 'error', 'isEpicBoard']),
...mapGetters(['isSwimlanesOn']),
boardListsToUse() {
- return this.glFeatures.graphqlBoardLists || this.isSwimlanesOn
+ return this.glFeatures.graphqlBoardLists || this.isSwimlanesOn || this.isEpicBoard
? sortBy([...Object.values(this.boardLists)], 'position')
: this.lists;
},
diff --git a/app/assets/javascripts/boards/components/board_list.vue b/app/assets/javascripts/boards/components/board_list.vue
index 7495b1163be..4bd5a530b8c 100644
--- a/app/assets/javascripts/boards/components/board_list.vue
+++ b/app/assets/javascripts/boards/components/board_list.vue
@@ -12,8 +12,8 @@ import BoardNewIssue from './board_new_issue.vue';
export default {
name: 'BoardList',
i18n: {
- loadingIssues: __('Loading issues'),
- loadingMoreissues: __('Loading more issues'),
+ loading: __('Loading'),
+ loadingMoreboardItems: __('Loading more'),
showingAllIssues: __('Showing all issues'),
},
components: {
@@ -30,7 +30,7 @@ export default {
type: Object,
required: true,
},
- issues: {
+ boardItems: {
type: Array,
required: true,
},
@@ -51,11 +51,11 @@ export default {
...mapState(['pageInfoByListId', 'listsFlags']),
paginatedIssueText() {
return sprintf(__('Showing %{pageSize} of %{total} issues'), {
- pageSize: this.issues.length,
+ pageSize: this.boardItems.length,
total: this.list.issuesCount,
});
},
- issuesSizeExceedsMax() {
+ boardItemsSizeExceedsMax() {
return this.list.maxIssueCount > 0 && this.list.issuesCount > this.list.maxIssueCount;
},
hasNextPage() {
@@ -72,7 +72,7 @@ export default {
return this.canAdminList ? this.$refs.list.$el : this.$refs.list;
},
showingAllIssues() {
- return this.issues.length === this.list.issuesCount;
+ return this.boardItems.length === this.list.issuesCount;
},
treeRootWrapper() {
return this.canAdminList ? Draggable : 'ul';
@@ -85,14 +85,14 @@ export default {
tag: 'ul',
'ghost-class': 'board-card-drag-active',
'data-list-id': this.list.id,
- value: this.issues,
+ value: this.boardItems,
};
return this.canAdminList ? options : {};
},
},
watch: {
- issues() {
+ boardItems() {
this.$nextTick(() => {
this.showCount = this.scrollHeight() > Math.ceil(this.listHeight());
});
@@ -112,7 +112,7 @@ export default {
this.listRef.removeEventListener('scroll', this.onScroll);
},
methods: {
- ...mapActions(['fetchIssuesForList', 'moveIssue']),
+ ...mapActions(['fetchItemsForList', 'moveIssue']),
listHeight() {
return this.listRef.getBoundingClientRect().height;
},
@@ -126,7 +126,7 @@ export default {
this.listRef.scrollTop = 0;
},
loadNextPage() {
- this.fetchIssuesForList({ listId: this.list.id, fetchNext: true });
+ this.fetchItemsForList({ listId: this.list.id, fetchNext: true });
},
toggleForm() {
this.showIssueForm = !this.showIssueForm;
@@ -201,7 +201,7 @@ export default {
<div
v-if="loading"
class="gl-mt-4 gl-text-center"
- :aria-label="$options.i18n.loadingIssues"
+ :aria-label="$options.i18n.loading"
data-testid="board_list_loading"
>
<gl-loading-icon />
@@ -214,23 +214,27 @@ export default {
v-bind="treeRootOptions"
:data-board="list.id"
:data-board-type="list.listType"
- :class="{ 'bg-danger-100': issuesSizeExceedsMax }"
+ :class="{ 'bg-danger-100': boardItemsSizeExceedsMax }"
class="board-list gl-w-full gl-h-full gl-list-style-none gl-mb-0 gl-p-2 js-board-list"
data-testid="tree-root-wrapper"
@start="handleDragOnStart"
@end="handleDragOnEnd"
>
<board-card
- v-for="(issue, index) in issues"
+ v-for="(item, index) in boardItems"
ref="issue"
- :key="issue.id"
+ :key="item.id"
:index="index"
:list="list"
- :issue="issue"
+ :issue="item"
:disabled="disabled"
/>
<li v-if="showCount" class="board-list-count gl-text-center" data-issue-id="-1">
- <gl-loading-icon v-if="loadingMore" :label="$options.i18n.loadingMoreissues" />
+ <gl-loading-icon
+ v-if="loadingMore"
+ :label="$options.i18n.loadingMoreboardItems"
+ data-testid="count-loading-icon"
+ />
<span v-if="showingAllIssues">{{ $options.i18n.showingAllIssues }}</span>
<span v-else>{{ paginatedIssueText }}</span>
</li>
diff --git a/app/assets/javascripts/boards/components/board_list_deprecated.vue b/app/assets/javascripts/boards/components/board_list_deprecated.vue
index 9b4961d362d..d59fbcc1b31 100644
--- a/app/assets/javascripts/boards/components/board_list_deprecated.vue
+++ b/app/assets/javascripts/boards/components/board_list_deprecated.vue
@@ -11,7 +11,7 @@ import {
sortableEnd,
} from '../mixins/sortable_default_options';
import boardsStore from '../stores/boards_store';
-import boardCard from './board_card.vue';
+import boardCard from './board_card_deprecated.vue';
import boardNewIssue from './board_new_issue_deprecated.vue';
// This component is being replaced in favor of './board_list.vue' for GraphQL boards
diff --git a/app/assets/javascripts/boards/components/boards_selector.vue b/app/assets/javascripts/boards/components/boards_selector.vue
index 2a064aaa885..3bd94631396 100644
--- a/app/assets/javascripts/boards/components/boards_selector.vue
+++ b/app/assets/javascripts/boards/components/boards_selector.vue
@@ -158,6 +158,18 @@ export default {
cancel() {
this.showPage('');
},
+ boardUpdate(data) {
+ if (!data?.[this.parentType]) {
+ return [];
+ }
+ return data[this.parentType].boards.edges.map(({ node }) => ({
+ id: getIdFromGraphQLId(node.id),
+ name: node.name,
+ }));
+ },
+ boardQuery() {
+ return this.groupId ? groupQuery : projectQuery;
+ },
loadBoards(toggleDropdown = true) {
if (toggleDropdown && this.boards.length > 0) {
return;
@@ -167,21 +179,14 @@ export default {
variables() {
return { fullPath: this.fullPath };
},
- query() {
- return this.groupId ? groupQuery : projectQuery;
- },
+ query: this.boardQuery,
loadingKey: 'loadingBoards',
- update(data) {
- if (!data?.[this.parentType]) {
- return [];
- }
- return data[this.parentType].boards.edges.map(({ node }) => ({
- id: getIdFromGraphQLId(node.id),
- name: node.name,
- }));
- },
+ update: this.boardUpdate,
});
+ this.loadRecentBoards();
+ },
+ loadRecentBoards() {
this.loadingRecentBoards = true;
// Follow up to fetch recent boards using GraphQL
// https://gitlab.com/gitlab-org/gitlab/-/issues/300985
diff --git a/app/assets/javascripts/boards/components/config_toggle.vue b/app/assets/javascripts/boards/components/config_toggle.vue
new file mode 100644
index 00000000000..7ec99e51f5b
--- /dev/null
+++ b/app/assets/javascripts/boards/components/config_toggle.vue
@@ -0,0 +1,64 @@
+<script>
+import { GlButton, GlModalDirective, GlTooltipDirective } from '@gitlab/ui';
+import { formType } from '~/boards/constants';
+import eventHub from '~/boards/eventhub';
+import { s__, __ } from '~/locale';
+
+export default {
+ components: {
+ GlButton,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ GlModalDirective,
+ },
+ props: {
+ boardsStore: {
+ type: Object,
+ required: true,
+ },
+ canAdminList: {
+ type: Boolean,
+ required: true,
+ },
+ hasScope: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ state: this.boardsStore.state,
+ };
+ },
+ computed: {
+ buttonText() {
+ return this.canAdminList ? s__('Boards|Edit board') : s__('Boards|View scope');
+ },
+ tooltipTitle() {
+ return this.hasScope ? __("This board's scope is reduced") : '';
+ },
+ },
+ methods: {
+ showPage() {
+ eventHub.$emit('showBoardModal', formType.edit);
+ return this.boardsStore.showPage(formType.edit);
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="gl-ml-3 gl-display-flex gl-align-items-center">
+ <gl-button
+ v-gl-modal-directive="'board-config-modal'"
+ v-gl-tooltip
+ :title="tooltipTitle"
+ :class="{ 'dot-highlight': hasScope }"
+ data-qa-selector="boards_config_button"
+ @click.prevent="showPage"
+ >
+ {{ buttonText }}
+ </gl-button>
+ </div>
+</template>
diff --git a/app/assets/javascripts/boards/config_toggle.js b/app/assets/javascripts/boards/config_toggle.js
index 2d1ec238274..7f327c5764d 100644
--- a/app/assets/javascripts/boards/config_toggle.js
+++ b/app/assets/javascripts/boards/config_toggle.js
@@ -1 +1,24 @@
-export default () => {};
+import Vue from 'vue';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import ConfigToggle from './components/config_toggle.vue';
+
+export default (boardsStore) => {
+ const el = document.querySelector('.js-board-config');
+
+ if (!el) {
+ return;
+ }
+
+ gl.boardConfigToggle = new Vue({
+ el,
+ render(h) {
+ return h(ConfigToggle, {
+ props: {
+ boardsStore,
+ canAdminList: parseBoolean(el.dataset.canAdminList),
+ hasScope: parseBoolean(el.dataset.hasScope),
+ },
+ });
+ },
+ });
+};
diff --git a/app/assets/javascripts/boards/index.js b/app/assets/javascripts/boards/index.js
index 859295318ed..f9dfa60a59b 100644
--- a/app/assets/javascripts/boards/index.js
+++ b/app/assets/javascripts/boards/index.js
@@ -6,7 +6,6 @@ import 'ee_else_ce/boards/models/issue';
import 'ee_else_ce/boards/models/list';
import BoardSidebar from 'ee_else_ce/boards/components/board_sidebar';
import initNewListDropdown from 'ee_else_ce/boards/components/new_list_dropdown';
-import boardConfigToggle from 'ee_else_ce/boards/config_toggle';
import {
setWeightFetchingState,
setEpicFetchingState,
@@ -40,6 +39,7 @@ import {
} from '~/lib/utils/common_utils';
import { __ } from '~/locale';
import sidebarEventHub from '~/sidebar/event_hub';
+import boardConfigToggle from './config_toggle';
import mountMultipleBoardsSwitcher from './mount_multiple_boards_switcher';
Vue.use(VueApollo);
diff --git a/app/assets/javascripts/boards/mount_multiple_boards_switcher.js b/app/assets/javascripts/boards/mount_multiple_boards_switcher.js
index fa58af24ba2..7bec0901ed2 100644
--- a/app/assets/javascripts/boards/mount_multiple_boards_switcher.js
+++ b/app/assets/javascripts/boards/mount_multiple_boards_switcher.js
@@ -1,7 +1,7 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import { mapGetters } from 'vuex';
-import BoardsSelector from '~/boards/components/boards_selector.vue';
+import BoardsSelector from 'ee_else_ce/boards/components/boards_selector.vue';
import BoardsSelectorDeprecated from '~/boards/components/boards_selector_deprecated.vue';
import store from '~/boards/stores';
import createDefaultClient from '~/lib/graphql';
@@ -51,7 +51,7 @@ export default (params = {}) => {
...mapGetters(['shouldUseGraphQL']),
},
render(createElement) {
- if (this.shouldUseGraphQL) {
+ if (this.shouldUseGraphQL || params.isEpicBoard) {
return createElement(BoardsSelector, {
props: this.boardsSelectorProps,
});
diff --git a/app/assets/javascripts/boards/stores/actions.js b/app/assets/javascripts/boards/stores/actions.js
index a7cf1e9e647..b8d84899782 100644
--- a/app/assets/javascripts/boards/stores/actions.js
+++ b/app/assets/javascripts/boards/stores/actions.js
@@ -1,6 +1,12 @@
import { pick } from 'lodash';
import boardListsQuery from 'ee_else_ce/boards/graphql/board_lists.query.graphql';
-import { BoardType, ListType, inactiveId, flashAnimationDuration } from '~/boards/constants';
+import {
+ BoardType,
+ ListType,
+ inactiveId,
+ flashAnimationDuration,
+ ISSUABLE,
+} from '~/boards/constants';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import createGqClient, { fetchPolicies } from '~/lib/graphql';
import { convertObjectPropsToCamelCase, urlParamsToObject } from '~/lib/utils/common_utils';
@@ -79,7 +85,11 @@ export default {
}
},
- fetchLists: ({ commit, state, dispatch }) => {
+ fetchLists: ({ dispatch }) => {
+ dispatch('fetchIssueLists');
+ },
+
+ fetchIssueLists: ({ commit, state, dispatch }) => {
const { boardType, filterParams, fullPath, boardId } = state;
const variables = {
@@ -253,8 +263,8 @@ export default {
});
},
- fetchIssuesForList: ({ state, commit }, { listId, fetchNext = false }) => {
- commit(types.REQUEST_ISSUES_FOR_LIST, { listId, fetchNext });
+ fetchItemsForList: ({ state, commit }, { listId, fetchNext = false }) => {
+ commit(types.REQUEST_ITEMS_FOR_LIST, { listId, fetchNext });
const { fullPath, boardId, boardType, filterParams } = state;
@@ -279,11 +289,11 @@ export default {
})
.then(({ data }) => {
const { lists } = data[boardType]?.board;
- const listIssues = formatListIssues(lists);
+ const listItems = formatListIssues(lists);
const listPageInfo = formatListsPageInfo(lists);
- commit(types.RECEIVE_ISSUES_FOR_LIST_SUCCESS, { listIssues, listPageInfo, listId });
+ commit(types.RECEIVE_ITEMS_FOR_LIST_SUCCESS, { listItems, listPageInfo, listId });
})
- .catch(() => commit(types.RECEIVE_ISSUES_FOR_LIST_FAILURE, listId));
+ .catch(() => commit(types.RECEIVE_ITEMS_FOR_LIST_FAILURE, listId));
},
resetIssues: ({ commit }) => {
@@ -294,8 +304,8 @@ export default {
{ state, commit },
{ issueId, issueIid, issuePath, fromListId, toListId, moveBeforeId, moveAfterId },
) => {
- const originalIssue = state.issues[issueId];
- const fromList = state.issuesByListId[fromListId];
+ const originalIssue = state.boardItems[issueId];
+ const fromList = state.boardItemsByListId[fromListId];
const originalIndex = fromList.indexOf(Number(issueId));
commit(types.MOVE_ISSUE, { originalIssue, fromListId, toListId, moveBeforeId, moveAfterId });
@@ -532,10 +542,17 @@ export default {
commit(types.SET_SELECTED_PROJECT, project);
},
- toggleBoardItemMultiSelection: ({ commit, state }, boardItem) => {
+ toggleBoardItemMultiSelection: ({ commit, state, dispatch, getters }, boardItem) => {
const { selectedBoardItems } = state;
const index = selectedBoardItems.indexOf(boardItem);
+ // If user already selected an item (activeIssue) without using mult-select,
+ // include that item in the selection and unset state.ActiveId to hide the sidebar.
+ if (getters.activeIssue) {
+ commit(types.ADD_BOARD_ITEM_TO_SELECTION, getters.activeIssue);
+ dispatch('unsetActiveId');
+ }
+
if (index === -1) {
commit(types.ADD_BOARD_ITEM_TO_SELECTION, boardItem);
} else {
@@ -547,6 +564,20 @@ export default {
commit(types.SET_ADD_COLUMN_FORM_VISIBLE, visible);
},
+ resetBoardItemMultiSelection: ({ commit }) => {
+ commit(types.RESET_BOARD_ITEM_SELECTION);
+ },
+
+ toggleBoardItem: ({ state, dispatch }, { boardItem, sidebarType = ISSUABLE }) => {
+ dispatch('resetBoardItemMultiSelection');
+
+ if (boardItem.id === state.activeId) {
+ dispatch('unsetActiveId');
+ } else {
+ dispatch('setActiveId', { id: boardItem.id, sidebarType });
+ }
+ },
+
fetchBacklog: () => {
notImplemented();
},
diff --git a/app/assets/javascripts/boards/stores/getters.js b/app/assets/javascripts/boards/stores/getters.js
index cab97088bc6..308dbd0f1b0 100644
--- a/app/assets/javascripts/boards/stores/getters.js
+++ b/app/assets/javascripts/boards/stores/getters.js
@@ -4,17 +4,17 @@ import { inactiveId } from '../constants';
export default {
isSidebarOpen: (state) => state.activeId !== inactiveId,
isSwimlanesOn: () => false,
- getIssueById: (state) => (id) => {
- return state.issues[id] || {};
+ getBoardItemById: (state) => (id) => {
+ return state.boardItems[id] || {};
},
- getIssuesByList: (state, getters) => (listId) => {
- const listIssueIds = state.issuesByListId[listId] || [];
- return listIssueIds.map((id) => getters.getIssueById(id));
+ getBoardItemsByList: (state, getters) => (listId) => {
+ const listItemsIds = state.boardItemsByListId[listId] || [];
+ return listItemsIds.map((id) => getters.getBoardItemById(id));
},
activeIssue: (state) => {
- return state.issues[state.activeId] || {};
+ return state.boardItems[state.activeId] || {};
},
groupPathForActiveIssue: (_, getters) => {
diff --git a/app/assets/javascripts/boards/stores/mutation_types.js b/app/assets/javascripts/boards/stores/mutation_types.js
index a89e961ae2d..4b43cca9675 100644
--- a/app/assets/javascripts/boards/stores/mutation_types.js
+++ b/app/assets/javascripts/boards/stores/mutation_types.js
@@ -14,9 +14,9 @@ export const MOVE_LIST = 'MOVE_LIST';
export const UPDATE_LIST_FAILURE = 'UPDATE_LIST_FAILURE';
export const REMOVE_LIST = 'REMOVE_LIST';
export const REMOVE_LIST_FAILURE = 'REMOVE_LIST_FAILURE';
-export const REQUEST_ISSUES_FOR_LIST = 'REQUEST_ISSUES_FOR_LIST';
-export const RECEIVE_ISSUES_FOR_LIST_FAILURE = 'RECEIVE_ISSUES_FOR_LIST_FAILURE';
-export const RECEIVE_ISSUES_FOR_LIST_SUCCESS = 'RECEIVE_ISSUES_FOR_LIST_SUCCESS';
+export const REQUEST_ITEMS_FOR_LIST = 'REQUEST_ITEMS_FOR_LIST';
+export const RECEIVE_ITEMS_FOR_LIST_FAILURE = 'RECEIVE_ITEMS_FOR_LIST_FAILURE';
+export const RECEIVE_ITEMS_FOR_LIST_SUCCESS = 'RECEIVE_ITEMS_FOR_LIST_SUCCESS';
export const CREATE_ISSUE_FAILURE = 'CREATE_ISSUE_FAILURE';
export const REQUEST_ADD_ISSUE = 'REQUEST_ADD_ISSUE';
export const RECEIVE_ADD_ISSUE_SUCCESS = 'RECEIVE_ADD_ISSUE_SUCCESS';
@@ -45,3 +45,4 @@ export const REMOVE_BOARD_ITEM_FROM_SELECTION = 'REMOVE_BOARD_ITEM_FROM_SELECTIO
export const SET_ADD_COLUMN_FORM_VISIBLE = 'SET_ADD_COLUMN_FORM_VISIBLE';
export const ADD_LIST_TO_HIGHLIGHTED_LISTS = 'ADD_LIST_TO_HIGHLIGHTED_LISTS';
export const REMOVE_LIST_FROM_HIGHLIGHTED_LISTS = 'REMOVE_LIST_FROM_HIGHLIGHTED_LISTS';
+export const RESET_BOARD_ITEM_SELECTION = 'RESET_BOARD_ITEM_SELECTION';
diff --git a/app/assets/javascripts/boards/stores/mutations.js b/app/assets/javascripts/boards/stores/mutations.js
index 79c98c3d90c..8246ed8eb09 100644
--- a/app/assets/javascripts/boards/stores/mutations.js
+++ b/app/assets/javascripts/boards/stores/mutations.js
@@ -11,13 +11,13 @@ const notImplemented = () => {
};
export const removeIssueFromList = ({ state, listId, issueId }) => {
- Vue.set(state.issuesByListId, listId, pull(state.issuesByListId[listId], issueId));
+ Vue.set(state.boardItemsByListId, listId, pull(state.boardItemsByListId[listId], issueId));
const list = state.boardLists[listId];
Vue.set(state.boardLists, listId, { ...list, issuesCount: list.issuesCount - 1 });
};
export const addIssueToList = ({ state, listId, issueId, moveBeforeId, moveAfterId, atIndex }) => {
- const listIssues = state.issuesByListId[listId];
+ const listIssues = state.boardItemsByListId[listId];
let newIndex = atIndex || 0;
if (moveBeforeId) {
newIndex = listIssues.indexOf(moveBeforeId) + 1;
@@ -25,19 +25,20 @@ export const addIssueToList = ({ state, listId, issueId, moveBeforeId, moveAfter
newIndex = listIssues.indexOf(moveAfterId);
}
listIssues.splice(newIndex, 0, issueId);
- Vue.set(state.issuesByListId, listId, listIssues);
+ Vue.set(state.boardItemsByListId, listId, listIssues);
const list = state.boardLists[listId];
Vue.set(state.boardLists, listId, { ...list, issuesCount: list.issuesCount + 1 });
};
export default {
[mutationTypes.SET_INITIAL_BOARD_DATA](state, data) {
- const { boardType, disabled, boardId, fullPath, boardConfig } = data;
+ const { boardType, disabled, boardId, fullPath, boardConfig, isEpicBoard } = data;
state.boardId = boardId;
state.fullPath = fullPath;
state.boardType = boardType;
state.disabled = disabled;
state.boardConfig = boardConfig;
+ state.isEpicBoard = isEpicBoard;
},
[mutationTypes.RECEIVE_BOARD_LISTS_SUCCESS]: (state, lists) => {
@@ -103,26 +104,23 @@ export default {
state.boardLists = listsBackup;
},
- [mutationTypes.REQUEST_ISSUES_FOR_LIST]: (state, { listId, fetchNext }) => {
+ [mutationTypes.REQUEST_ITEMS_FOR_LIST]: (state, { listId, fetchNext }) => {
Vue.set(state.listsFlags, listId, { [fetchNext ? 'isLoadingMore' : 'isLoading']: true });
},
- [mutationTypes.RECEIVE_ISSUES_FOR_LIST_SUCCESS]: (
- state,
- { listIssues, listPageInfo, listId },
- ) => {
- const { listData, issues } = listIssues;
- Vue.set(state, 'issues', { ...state.issues, ...issues });
+ [mutationTypes.RECEIVE_ITEMS_FOR_LIST_SUCCESS]: (state, { listItems, listPageInfo, listId }) => {
+ const { listData, boardItems } = listItems;
+ Vue.set(state, 'boardItems', { ...state.boardItems, ...boardItems });
Vue.set(
- state.issuesByListId,
+ state.boardItemsByListId,
listId,
- union(state.issuesByListId[listId] || [], listData[listId]),
+ union(state.boardItemsByListId[listId] || [], listData[listId]),
);
Vue.set(state.pageInfoByListId, listId, listPageInfo[listId]);
Vue.set(state.listsFlags, listId, { isLoading: false, isLoadingMore: false });
},
- [mutationTypes.RECEIVE_ISSUES_FOR_LIST_FAILURE]: (state, listId) => {
+ [mutationTypes.RECEIVE_ITEMS_FOR_LIST_FAILURE]: (state, listId) => {
state.error = s__(
'Boards|An error occurred while fetching the board issues. Please reload the page.',
);
@@ -130,18 +128,18 @@ export default {
},
[mutationTypes.RESET_ISSUES]: (state) => {
- Object.keys(state.issuesByListId).forEach((listId) => {
- Vue.set(state.issuesByListId, listId, []);
+ Object.keys(state.boardItemsByListId).forEach((listId) => {
+ Vue.set(state.boardItemsByListId, listId, []);
});
},
[mutationTypes.UPDATE_ISSUE_BY_ID]: (state, { issueId, prop, value }) => {
- if (!state.issues[issueId]) {
+ if (!state.boardItems[issueId]) {
/* eslint-disable-next-line @gitlab/require-i18n-strings */
throw new Error('No issue found.');
}
- Vue.set(state.issues[issueId], prop, value);
+ Vue.set(state.boardItems[issueId], prop, value);
},
[mutationTypes.SET_ASSIGNEE_LOADING](state, isLoading) {
@@ -168,7 +166,7 @@ export default {
const toList = state.boardLists[toListId];
const issue = moveIssueListHelper(originalIssue, fromList, toList);
- Vue.set(state.issues, issue.id, issue);
+ Vue.set(state.boardItems, issue.id, issue);
removeIssueFromList({ state, listId: fromListId, issueId: issue.id });
addIssueToList({ state, listId: toListId, issueId: issue.id, moveBeforeId, moveAfterId });
@@ -176,7 +174,7 @@ export default {
[mutationTypes.MOVE_ISSUE_SUCCESS]: (state, { issue }) => {
const issueId = getIdFromGraphQLId(issue.id);
- Vue.set(state.issues, issueId, formatIssue({ ...issue, id: issueId }));
+ Vue.set(state.boardItems, issueId, formatIssue({ ...issue, id: issueId }));
},
[mutationTypes.MOVE_ISSUE_FAILURE]: (
@@ -184,7 +182,7 @@ export default {
{ originalIssue, fromListId, toListId, originalIndex },
) => {
state.error = s__('Boards|An error occurred while moving the issue. Please try again.');
- Vue.set(state.issues, originalIssue.id, originalIssue);
+ Vue.set(state.boardItems, originalIssue.id, originalIssue);
removeIssueFromList({ state, listId: toListId, issueId: originalIssue.id });
addIssueToList({
state,
@@ -217,7 +215,7 @@ export default {
issueId: issue.id,
atIndex: position,
});
- Vue.set(state.issues, issue.id, issue);
+ Vue.set(state.boardItems, issue.id, issue);
},
[mutationTypes.ADD_ISSUE_TO_LIST_FAILURE]: (state, { list, issueId }) => {
@@ -227,7 +225,7 @@ export default {
[mutationTypes.REMOVE_ISSUE_FROM_LIST]: (state, { list, issue }) => {
removeIssueFromList({ state, listId: list.id, issueId: issue.id });
- Vue.delete(state.issues, issue.id);
+ Vue.delete(state.boardItems, issue.id);
},
[mutationTypes.SET_CURRENT_PAGE]: () => {
@@ -282,4 +280,8 @@ export default {
[mutationTypes.REMOVE_LIST_FROM_HIGHLIGHTED_LISTS]: (state, listId) => {
state.highlightedLists = state.highlightedLists.filter((id) => id !== listId);
},
+
+ [mutationTypes.RESET_BOARD_ITEM_SELECTION]: (state) => {
+ state.selectedBoardItems = [];
+ },
};
diff --git a/app/assets/javascripts/boards/stores/state.js b/app/assets/javascripts/boards/stores/state.js
index 91544d6c9c5..85d92589d30 100644
--- a/app/assets/javascripts/boards/stores/state.js
+++ b/app/assets/javascripts/boards/stores/state.js
@@ -2,16 +2,17 @@ import { inactiveId } from '~/boards/constants';
export default () => ({
boardType: null,
+ fullPath: null,
disabled: false,
isShowingLabels: true,
activeId: inactiveId,
sidebarType: '',
boardLists: {},
listsFlags: {},
- issuesByListId: {},
+ boardItemsByListId: {},
isSettingAssignees: false,
pageInfoByListId: {},
- issues: {},
+ boardItems: {},
filterParams: {},
boardConfig: {},
labels: [],
diff --git a/app/assets/javascripts/clone_panel.js b/app/assets/javascripts/clone_panel.js
index c9fae8f17a4..ec831a77bde 100644
--- a/app/assets/javascripts/clone_panel.js
+++ b/app/assets/javascripts/clone_panel.js
@@ -15,7 +15,6 @@ export default function initClonePanel() {
}
$('a', $cloneOptions).on('click', (e) => {
- e.preventDefault();
const $this = $(e.currentTarget);
const url = $this.attr('href');
if (url && (url.startsWith('vscode://') || url.startsWith('xcode://'))) {
diff --git a/app/assets/javascripts/clusters_list/store/actions.js b/app/assets/javascripts/clusters_list/store/actions.js
index 45d3e0cbc23..40a86a1e58c 100644
--- a/app/assets/javascripts/clusters_list/store/actions.js
+++ b/app/assets/javascripts/clusters_list/store/actions.js
@@ -1,9 +1,9 @@
+import * as Sentry from '@sentry/browser';
import { deprecatedCreateFlash as flash } from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { parseIntPagination, normalizeHeaders } from '~/lib/utils/common_utils';
import Poll from '~/lib/utils/poll';
import { __ } from '~/locale';
-import * as Sentry from '~/sentry/wrapper';
import { MAX_REQUESTS } from '../constants';
import * as types from './mutation_types';
diff --git a/app/assets/javascripts/commit/pipelines/pipelines_bundle.js b/app/assets/javascripts/commit/pipelines/pipelines_bundle.js
index 920ffde3e32..2e050c066f1 100644
--- a/app/assets/javascripts/commit/pipelines/pipelines_bundle.js
+++ b/app/assets/javascripts/commit/pipelines/pipelines_bundle.js
@@ -31,10 +31,8 @@ export default () => {
return createElement(CommitPipelinesTable, {
props: {
endpoint: pipelineTableViewEl.dataset.endpoint,
- helpPagePath: pipelineTableViewEl.dataset.helpPagePath,
emptyStateSvgPath: pipelineTableViewEl.dataset.emptyStateSvgPath,
errorStateSvgPath: pipelineTableViewEl.dataset.errorStateSvgPath,
- autoDevopsHelpPath: pipelineTableViewEl.dataset.helpAutoDevopsPath,
},
});
},
diff --git a/app/assets/javascripts/commit/pipelines/pipelines_table.vue b/app/assets/javascripts/commit/pipelines/pipelines_table.vue
index 787152d00ef..81d96333f7a 100644
--- a/app/assets/javascripts/commit/pipelines/pipelines_table.vue
+++ b/app/assets/javascripts/commit/pipelines/pipelines_table.vue
@@ -25,14 +25,6 @@ export default {
type: String,
required: true,
},
- helpPagePath: {
- type: String,
- required: true,
- },
- autoDevopsHelpPath: {
- type: String,
- required: true,
- },
errorStateSvgPath: {
type: String,
required: true,
@@ -212,7 +204,6 @@ export default {
<pipelines-table-component
:pipelines="state.pipelines"
:update-graph-dropdown="updateGraphDropdown"
- :auto-devops-help-path="autoDevopsHelpPath"
:view-type="viewType"
>
<template #table-header-actions>
diff --git a/app/assets/javascripts/create_cluster/eks_cluster/constants.js b/app/assets/javascripts/create_cluster/eks_cluster/constants.js
index 0f0db2090c1..1c698cc2796 100644
--- a/app/assets/javascripts/create_cluster/eks_cluster/constants.js
+++ b/app/assets/javascripts/create_cluster/eks_cluster/constants.js
@@ -1,8 +1,9 @@
export const DEFAULT_REGION = 'us-east-2';
export const KUBERNETES_VERSIONS = [
- { name: '1.14', value: '1.14' },
{ name: '1.15', value: '1.15' },
- { name: '1.16', value: '1.16', default: true },
+ { name: '1.16', value: '1.16' },
{ name: '1.17', value: '1.17' },
+ { name: '1.18', value: '1.18' },
+ { name: '1.19', value: '1.19', default: true },
];
diff --git a/app/assets/javascripts/deprecated_jquery_dropdown/gl_dropdown.js b/app/assets/javascripts/deprecated_jquery_dropdown/gl_dropdown.js
index 162491312a8..a1dd12ff769 100644
--- a/app/assets/javascripts/deprecated_jquery_dropdown/gl_dropdown.js
+++ b/app/assets/javascripts/deprecated_jquery_dropdown/gl_dropdown.js
@@ -29,6 +29,26 @@ const FILTER_INPUT = '.dropdown-input .dropdown-input-field:not(.dropdown-no-fil
const NO_FILTER_INPUT = '.dropdown-input .dropdown-input-field.dropdown-no-filter';
+let mouseEventListenersAdded = false;
+let mousedownTarget = null;
+let mouseupTarget = null;
+
+function addGlobalMouseEventListeners() {
+ // Remember mousedown and mouseup locations.
+ // Required in the `hide.bs.dropdown` listener for
+ // dropdown close prevention in some cases.
+ document.addEventListener('mousedown', ({ target }) => {
+ mousedownTarget = target;
+ });
+ document.addEventListener('mouseup', ({ target }) => {
+ mouseupTarget = target;
+ });
+ document.addEventListener('click', () => {
+ mousedownTarget = null;
+ mouseupTarget = null;
+ });
+}
+
export class GitLabDropdown {
constructor(el1, options) {
let selector;
@@ -36,9 +56,14 @@ export class GitLabDropdown {
this.el = el1;
this.options = options;
this.updateLabel = this.updateLabel.bind(this);
- this.hidden = this.hidden.bind(this);
this.opened = this.opened.bind(this);
+ this.hide = this.hide.bind(this);
+ this.hidden = this.hidden.bind(this);
this.shouldPropagate = this.shouldPropagate.bind(this);
+ if (!mouseEventListenersAdded) {
+ addGlobalMouseEventListeners();
+ mouseEventListenersAdded = true;
+ }
self = this;
selector = $(this.el).data('target');
this.dropdown = selector != null ? $(selector) : $(this.el).parent();
@@ -132,6 +157,7 @@ export class GitLabDropdown {
}
// Event listeners
this.dropdown.on('shown.bs.dropdown', this.opened);
+ this.dropdown.on('hide.bs.dropdown', this.hide);
this.dropdown.on('hidden.bs.dropdown', this.hidden);
$(this.el).on('update.label', this.updateLabel);
this.dropdown.on('click', '.dropdown-menu, .dropdown-menu-close', this.shouldPropagate);
@@ -334,6 +360,21 @@ export class GitLabDropdown {
$menu.css('bottom', '100%');
}
+ hide(e) {
+ // Prevent dropdowns with a search from being closed when the
+ // mousedown event happened inside the dropdown box and only
+ // the mouseup event did not.
+ if (this.options.search && mousedownTarget) {
+ const isIn = (element, $possibleContainer) => Boolean($possibleContainer.has(element).length);
+ const $menu = this.dropdown.find('.dropdown-menu');
+ const mousedownInsideDropdown = isIn(mousedownTarget, $menu);
+ const mouseupOutsideDropdown = !isIn(mouseupTarget, $menu);
+ if (mousedownInsideDropdown && mouseupOutsideDropdown) {
+ e.preventDefault();
+ }
+ }
+ }
+
hidden(e) {
this.resetRows();
this.removeArrowKeyEvent();
diff --git a/app/assets/javascripts/design_management/components/design_notes/design_discussion.vue b/app/assets/javascripts/design_management/components/design_notes/design_discussion.vue
index 33f0aa00cad..41b123c7cb1 100644
--- a/app/assets/javascripts/design_management/components/design_notes/design_discussion.vue
+++ b/app/assets/javascripts/design_management/components/design_notes/design_discussion.vue
@@ -257,8 +257,8 @@ export default {
<reply-placeholder
v-if="!isFormVisible"
class="qa-discussion-reply"
- :button-text="__('Reply...')"
- @onClick="showForm"
+ :placeholder-text="__('Reply…')"
+ @focus="showForm"
/>
<apollo-mutation
v-else
diff --git a/app/assets/javascripts/diffs/components/diff_discussion_reply.vue b/app/assets/javascripts/diffs/components/diff_discussion_reply.vue
index 9027d0c8aa4..3766c125325 100644
--- a/app/assets/javascripts/diffs/components/diff_discussion_reply.vue
+++ b/app/assets/javascripts/diffs/components/diff_discussion_reply.vue
@@ -35,8 +35,9 @@ export default {
<slot v-if="hasForm" name="form"></slot>
<template v-else-if="renderReplyPlaceholder">
<reply-placeholder
- :button-text="__('Start a new discussion...')"
- @onClick="$emit('showNewDiscussionForm')"
+ :placeholder-text="__('Start a new discussion…')"
+ :label-text="__('New discussion')"
+ @focus="$emit('showNewDiscussionForm')"
/>
</template>
</template>
diff --git a/app/assets/javascripts/diffs/store/utils.js b/app/assets/javascripts/diffs/store/utils.js
index 87b4f33c216..b37a75eb2a3 100644
--- a/app/assets/javascripts/diffs/store/utils.js
+++ b/app/assets/javascripts/diffs/store/utils.js
@@ -283,7 +283,7 @@ export function addContextLines(options) {
* Trims the first char of the `richText` property when it's either a space or a diff symbol.
* @param {Object} line
* @returns {Object}
- * @deprecated
+ * @deprecated Use `line.rich_text = line.rich_text ? line.rich_text.replace(/^[+ -]/, '') : undefined;` instead!. For more information, see https://gitlab.com/gitlab-org/gitlab/-/issues/299329
*/
export function trimFirstCharOfLineContent(line = {}) {
// eslint-disable-next-line no-param-reassign
diff --git a/app/assets/javascripts/editor/constants.js b/app/assets/javascripts/editor/constants.js
index d9e6a6c13e2..c991316dda2 100644
--- a/app/assets/javascripts/editor/constants.js
+++ b/app/assets/javascripts/editor/constants.js
@@ -16,6 +16,9 @@ export const EDITOR_READY_EVENT = 'editor-ready';
export const EDITOR_TYPE_CODE = 'vs.editor.ICodeEditor';
export const EDITOR_TYPE_DIFF = 'vs.editor.IDiffEditor';
+export const EDITOR_CODE_INSTANCE_FN = 'createInstance';
+export const EDITOR_DIFF_INSTANCE_FN = 'createDiffInstance';
+
//
// EXTENSIONS' CONSTANTS
//
diff --git a/app/assets/javascripts/editor/extensions/editor_lite_webide_ext.js b/app/assets/javascripts/editor/extensions/editor_lite_webide_ext.js
new file mode 100644
index 00000000000..83b0386d470
--- /dev/null
+++ b/app/assets/javascripts/editor/extensions/editor_lite_webide_ext.js
@@ -0,0 +1,164 @@
+import { debounce } from 'lodash';
+import { KeyCode, KeyMod, Range } from 'monaco-editor';
+import { EDITOR_TYPE_DIFF } from '~/editor/constants';
+import { EditorLiteExtension } from '~/editor/extensions/editor_lite_extension_base';
+import Disposable from '~/ide/lib/common/disposable';
+import { editorOptions } from '~/ide/lib/editor_options';
+import keymap from '~/ide/lib/keymap.json';
+
+const isDiffEditorType = (instance) => {
+ return instance.getEditorType() === EDITOR_TYPE_DIFF;
+};
+
+export const UPDATE_DIMENSIONS_DELAY = 200;
+
+export class EditorWebIdeExtension extends EditorLiteExtension {
+ constructor({ instance, modelManager, ...options } = {}) {
+ super({
+ instance,
+ ...options,
+ modelManager,
+ disposable: new Disposable(),
+ debouncedUpdate: debounce(() => {
+ instance.updateDimensions();
+ }, UPDATE_DIMENSIONS_DELAY),
+ });
+
+ window.addEventListener('resize', instance.debouncedUpdate, false);
+
+ instance.onDidDispose(() => {
+ window.removeEventListener('resize', instance.debouncedUpdate);
+
+ // catch any potential errors with disposing the error
+ // this is mainly for tests caused by elements not existing
+ try {
+ instance.disposable.dispose();
+ } catch (e) {
+ if (process.env.NODE_ENV !== 'test') {
+ // eslint-disable-next-line no-console
+ console.error(e);
+ }
+ }
+ });
+
+ EditorWebIdeExtension.addActions(instance);
+ }
+
+ static addActions(instance) {
+ const { store } = instance;
+ const getKeyCode = (key) => {
+ const monacoKeyMod = key.indexOf('KEY_') === 0;
+
+ return monacoKeyMod ? KeyCode[key] : KeyMod[key];
+ };
+
+ keymap.forEach((command) => {
+ const { bindings, id, label, action } = command;
+
+ const keybindings = bindings.map((binding) => {
+ const keys = binding.split('+');
+
+ // eslint-disable-next-line no-bitwise
+ return keys.length > 1 ? getKeyCode(keys[0]) | getKeyCode(keys[1]) : getKeyCode(keys[0]);
+ });
+
+ instance.addAction({
+ id,
+ label,
+ keybindings,
+ run() {
+ store.dispatch(action.name, action.params);
+ return null;
+ },
+ });
+ });
+ }
+
+ createModel(file, head = null) {
+ return this.modelManager.addModel(file, head);
+ }
+
+ attachModel(model) {
+ if (isDiffEditorType(this)) {
+ this.setModel({
+ original: model.getOriginalModel(),
+ modified: model.getModel(),
+ });
+
+ return;
+ }
+
+ this.setModel(model.getModel());
+
+ this.updateOptions(
+ editorOptions.reduce((acc, obj) => {
+ Object.keys(obj).forEach((key) => {
+ Object.assign(acc, {
+ [key]: obj[key](model),
+ });
+ });
+ return acc;
+ }, {}),
+ );
+ }
+
+ attachMergeRequestModel(model) {
+ this.setModel({
+ original: model.getBaseModel(),
+ modified: model.getModel(),
+ });
+ }
+
+ updateDimensions() {
+ this.layout();
+ this.updateDiffView();
+ }
+
+ setPos({ lineNumber, column }) {
+ this.revealPositionInCenter({
+ lineNumber,
+ column,
+ });
+ this.setPosition({
+ lineNumber,
+ column,
+ });
+ }
+
+ onPositionChange(cb) {
+ if (!this.onDidChangeCursorPosition) {
+ return;
+ }
+
+ this.disposable.add(this.onDidChangeCursorPosition((e) => cb(this, e)));
+ }
+
+ updateDiffView() {
+ if (!isDiffEditorType(this)) {
+ return;
+ }
+
+ this.updateOptions({
+ renderSideBySide: EditorWebIdeExtension.renderSideBySide(this.getDomNode()),
+ });
+ }
+
+ replaceSelectedText(text) {
+ let selection = this.getSelection();
+ const range = new Range(
+ selection.startLineNumber,
+ selection.startColumn,
+ selection.endLineNumber,
+ selection.endColumn,
+ );
+
+ this.executeEdits('', [{ range, text }]);
+
+ selection = this.getSelection();
+ this.setPosition({ lineNumber: selection.endLineNumber, column: selection.endColumn });
+ }
+
+ static renderSideBySide(domElement) {
+ return domElement.offsetWidth >= 700;
+ }
+}
diff --git a/app/assets/javascripts/experiment_tracking.js b/app/assets/javascripts/experiment_tracking.js
new file mode 100644
index 00000000000..4611af3f857
--- /dev/null
+++ b/app/assets/javascripts/experiment_tracking.js
@@ -0,0 +1,25 @@
+import { get } from 'lodash';
+import Tracking from '~/tracking';
+
+const TRACKING_CONTEXT_SCHEMA = 'iglu:com.gitlab/gitlab_experiment/jsonschema/1-0-0';
+
+export default class ExperimentTracking {
+ constructor(experimentName, { label } = {}) {
+ this.label = label;
+ this.experimentData = get(window, ['gon', 'global', 'experiment', experimentName]);
+ }
+
+ event(action) {
+ if (!this.experimentData) {
+ return false;
+ }
+
+ return Tracking.event(document.body.dataset.page, action, {
+ label: this.label,
+ context: {
+ schema: TRACKING_CONTEXT_SCHEMA,
+ data: this.experimentData,
+ },
+ });
+ }
+}
diff --git a/app/assets/javascripts/feature_flags/components/edit_feature_flag.vue b/app/assets/javascripts/feature_flags/components/edit_feature_flag.vue
index b1e60066e11..e7f4b51c964 100644
--- a/app/assets/javascripts/feature_flags/components/edit_feature_flag.vue
+++ b/app/assets/javascripts/feature_flags/components/edit_feature_flag.vue
@@ -86,6 +86,8 @@ export default {
data-track-event="click_button"
data-track-label="feature_flag_toggle"
class="gl-mr-4"
+ :label="__('Feature flag status')"
+ label-position="hidden"
@change="toggleActive"
/>
<h3 class="page-title gl-m-0">{{ title }}</h3>
diff --git a/app/assets/javascripts/flash.js b/app/assets/javascripts/flash.js
index d14af53746e..d26a6bc5f6b 100644
--- a/app/assets/javascripts/flash.js
+++ b/app/assets/javascripts/flash.js
@@ -1,5 +1,5 @@
+import * as Sentry from '@sentry/browser';
import { escape } from 'lodash';
-import * as Sentry from '~/sentry/wrapper';
import { spriteIcon } from './lib/utils/common_utils';
const FLASH_TYPES = {
diff --git a/app/assets/javascripts/groups/components/invite_members_banner.vue b/app/assets/javascripts/groups/components/invite_members_banner.vue
index 81c5e3ce85d..747cea6a46e 100644
--- a/app/assets/javascripts/groups/components/invite_members_banner.vue
+++ b/app/assets/javascripts/groups/components/invite_members_banner.vue
@@ -35,7 +35,9 @@ export default {
this.track(this.$options.dismissEvent);
},
trackOnShow() {
- if (!this.isDismissed) this.track(this.$options.displayEvent);
+ this.$nextTick(() => {
+ if (!this.isDismissed) this.track(this.$options.displayEvent);
+ });
},
addTrackingAttributesToButton() {
if (this.$refs.banner === undefined) return;
diff --git a/app/assets/javascripts/ide/components/branches/search_list.vue b/app/assets/javascripts/ide/components/branches/search_list.vue
index 1ae7cf9339d..62e93335a20 100644
--- a/app/assets/javascripts/ide/components/branches/search_list.vue
+++ b/app/assets/javascripts/ide/components/branches/search_list.vue
@@ -57,7 +57,10 @@ export default {
<template>
<div>
- <label class="dropdown-input pt-3 pb-3 mb-0 border-bottom block position-relative" @click.stop>
+ <label
+ class="dropdown-input gl-pt-3 gl-pb-5 gl-mb-0 gl-border-b-1 gl-border-b-solid gl-display-block"
+ @click.stop
+ >
<input
ref="searchInput"
v-model="search"
diff --git a/app/assets/javascripts/ide/components/file_templates/bar.vue b/app/assets/javascripts/ide/components/file_templates/bar.vue
index bd4c4f18141..0803925104d 100644
--- a/app/assets/javascripts/ide/components/file_templates/bar.vue
+++ b/app/assets/javascripts/ide/components/file_templates/bar.vue
@@ -49,7 +49,9 @@ export default {
</script>
<template>
- <div class="d-flex align-items-center ide-file-templates qa-file-templates-bar">
+ <div
+ class="d-flex align-items-center ide-file-templates qa-file-templates-bar gl-relative gl-z-index-1"
+ >
<strong class="gl-mr-3"> {{ __('File templates') }} </strong>
<dropdown
:data="templateTypes"
diff --git a/app/assets/javascripts/ide/components/merge_requests/list.vue b/app/assets/javascripts/ide/components/merge_requests/list.vue
index 680e8841a1f..7cb6d4d3dac 100644
--- a/app/assets/javascripts/ide/components/merge_requests/list.vue
+++ b/app/assets/javascripts/ide/components/merge_requests/list.vue
@@ -75,7 +75,10 @@ export default {
<template>
<div>
- <label class="dropdown-input pt-3 pb-3 mb-0 border-bottom block" @click.stop>
+ <label
+ class="dropdown-input gl-pt-3 gl-pb-5 gl-mb-0 gl-border-b-1 gl-border-b-solid gl-display-block"
+ @click.stop
+ >
<tokened-input
v-model="search"
:tokens="searchTokens"
diff --git a/app/assets/javascripts/ide/components/nav_form.vue b/app/assets/javascripts/ide/components/nav_form.vue
index 62bb4841760..98f0504298b 100644
--- a/app/assets/javascripts/ide/components/nav_form.vue
+++ b/app/assets/javascripts/ide/components/nav_form.vue
@@ -1,13 +1,12 @@
<script>
-import Tab from '~/vue_shared/components/tabs/tab.vue';
-import Tabs from '~/vue_shared/components/tabs/tabs';
+import { GlTab, GlTabs } from '@gitlab/ui';
import BranchesSearchList from './branches/search_list.vue';
import MergeRequestSearchList from './merge_requests/list.vue';
export default {
components: {
- Tabs,
- Tab,
+ GlTab,
+ GlTabs,
BranchesSearchList,
MergeRequestSearchList,
},
@@ -23,20 +22,14 @@ export default {
<template>
<div class="ide-nav-form p-0">
- <tabs v-if="showMergeRequests" stop-propagation>
- <tab active>
- <template #title>
- {{ __('Branches') }}
- </template>
+ <gl-tabs v-if="showMergeRequests">
+ <gl-tab :title="__('Branches')">
<branches-search-list />
- </tab>
- <tab>
- <template #title>
- {{ __('Merge Requests') }}
- </template>
+ </gl-tab>
+ <gl-tab :title="__('Merge Requests')">
<merge-request-search-list />
- </tab>
- </tabs>
+ </gl-tab>
+ </gl-tabs>
<branches-search-list v-else />
</div>
</template>
diff --git a/app/assets/javascripts/ide/components/pipelines/list.vue b/app/assets/javascripts/ide/components/pipelines/list.vue
index 2526db0cd7b..907ac496982 100644
--- a/app/assets/javascripts/ide/components/pipelines/list.vue
+++ b/app/assets/javascripts/ide/components/pipelines/list.vue
@@ -32,7 +32,7 @@ export default {
SafeHtml,
},
computed: {
- ...mapState(['pipelinesEmptyStateSvgPath', 'links']),
+ ...mapState(['pipelinesEmptyStateSvgPath']),
...mapGetters(['currentProject']),
...mapGetters('pipelines', ['jobsCount', 'failedJobsCount', 'failedStages', 'pipelineFailed']),
...mapState('pipelines', [
@@ -85,7 +85,6 @@ export default {
</header>
<empty-state
v-if="!latestPipeline"
- :help-page-path="links.ciHelpPagePath"
:empty-state-svg-path="pipelinesEmptyStateSvgPath"
:can-set-ci="true"
class="mb-auto mt-auto"
diff --git a/app/assets/javascripts/ide/components/repo_editor.vue b/app/assets/javascripts/ide/components/repo_editor.vue
index 690060f5cb0..b57dcd4276c 100644
--- a/app/assets/javascripts/ide/components/repo_editor.vue
+++ b/app/assets/javascripts/ide/components/repo_editor.vue
@@ -1,6 +1,15 @@
<script>
import { mapState, mapGetters, mapActions } from 'vuex';
+import {
+ EDITOR_TYPE_DIFF,
+ EDITOR_CODE_INSTANCE_FN,
+ EDITOR_DIFF_INSTANCE_FN,
+} from '~/editor/constants';
+import EditorLite from '~/editor/editor_lite';
+import { EditorWebIdeExtension } from '~/editor/extensions/editor_lite_webide_ext';
import { deprecatedCreateFlash as flash } from '~/flash';
+import ModelManager from '~/ide/lib/common/model_manager';
+import { defaultDiffEditorOptions, defaultEditorOptions } from '~/ide/lib/editor_options';
import { __ } from '~/locale';
import {
WEBIDE_MARK_FILE_CLICKED,
@@ -20,7 +29,6 @@ import {
FILE_VIEW_MODE_PREVIEW,
} from '../constants';
import eventHub from '../eventhub';
-import Editor from '../lib/editor';
import { getRulesWithTraversal } from '../lib/editorconfig/parser';
import mapRulesToMonaco from '../lib/editorconfig/rules_mapper';
import { getFileEditorOrDefault } from '../stores/modules/editor/utils';
@@ -46,6 +54,9 @@ export default {
content: '',
images: {},
rules: {},
+ globalEditor: null,
+ modelManager: new ModelManager(),
+ isEditorLoading: true,
};
},
computed: {
@@ -132,6 +143,7 @@ export default {
// Compare key to allow for files opened in review mode to be cached differently
if (oldVal.key !== this.file.key) {
+ this.isEditorLoading = true;
this.initEditor();
if (this.currentActivityView !== leftSidebarViews.edit.name) {
@@ -149,6 +161,7 @@ export default {
}
},
viewer() {
+ this.isEditorLoading = false;
if (!this.file.pending) {
this.createEditorInstance();
}
@@ -181,11 +194,11 @@ export default {
},
},
beforeDestroy() {
- this.editor.dispose();
+ this.globalEditor.dispose();
},
mounted() {
- if (!this.editor) {
- this.editor = Editor.create(this.$store, this.editorOptions);
+ if (!this.globalEditor) {
+ this.globalEditor = new EditorLite();
}
this.initEditor();
@@ -211,8 +224,6 @@ export default {
return;
}
- this.editor.clearEditor();
-
this.registerSchemaForFile();
Promise.all([this.fetchFileData(), this.fetchEditorconfigRules()])
@@ -251,20 +262,45 @@ export default {
return;
}
- this.editor.dispose();
+ const isDiff = this.viewer !== viewerTypes.edit;
+ const shouldDisposeEditor = isDiff !== (this.editor?.getEditorType() === EDITOR_TYPE_DIFF);
- this.$nextTick(() => {
- if (this.viewer === viewerTypes.edit) {
- this.editor.createInstance(this.$refs.editor);
- } else {
- this.editor.createDiffInstance(this.$refs.editor);
+ if (this.editor && !shouldDisposeEditor) {
+ this.setupEditor();
+ } else {
+ if (this.editor && shouldDisposeEditor) {
+ this.editor.dispose();
}
+ const instanceOptions = isDiff ? defaultDiffEditorOptions : defaultEditorOptions;
+ const method = isDiff ? EDITOR_DIFF_INSTANCE_FN : EDITOR_CODE_INSTANCE_FN;
- this.setupEditor();
- });
+ this.editor = this.globalEditor[method]({
+ el: this.$refs.editor,
+ blobPath: this.file.path,
+ blobGlobalId: this.file.key,
+ blobContent: this.content || this.file.content,
+ ...instanceOptions,
+ ...this.editorOptions,
+ });
+
+ this.editor.use(
+ new EditorWebIdeExtension({
+ instance: this.editor,
+ modelManager: this.modelManager,
+ store: this.$store,
+ file: this.file,
+ options: this.editorOptions,
+ }),
+ );
+
+ this.$nextTick(() => {
+ this.setupEditor();
+ });
+ }
},
+
setupEditor() {
- if (!this.file || !this.editor.instance || this.file.loading) return;
+ if (!this.file || !this.editor || this.file.loading) return;
const head = this.getStagedFile(this.file.path);
@@ -279,6 +315,8 @@ export default {
this.editor.attachModel(this.model);
}
+ this.isEditorLoading = false;
+
this.model.updateOptions(this.rules);
this.model.onChange((model) => {
@@ -298,7 +336,7 @@ export default {
});
});
- this.editor.setPosition({
+ this.editor.setPos({
lineNumber: this.fileEditor.editorRow,
column: this.fileEditor.editorColumn,
});
@@ -308,6 +346,10 @@ export default {
fileLanguage: this.model.language,
});
+ this.$nextTick(() => {
+ this.editor.updateDimensions();
+ });
+
this.$emit('editorSetup');
if (performance.getEntriesByName(WEBIDE_MARK_FILE_CLICKED).length) {
eventHub.$emit(WEBIDE_MEASURE_FILE_AFTER_INTERACTION);
@@ -344,7 +386,7 @@ export default {
});
},
onPaste(event) {
- const editor = this.editor.instance;
+ const { editor } = this;
const reImage = /^image\/(png|jpg|jpeg|gif)$/;
const file = event.clipboardData.files[0];
@@ -395,6 +437,7 @@ export default {
<a
href="javascript:void(0);"
role="button"
+ data-testid="edit-tab"
@click.prevent="updateEditor({ viewMode: $options.FILE_VIEW_MODE_EDITOR })"
>
{{ __('Edit') }}
@@ -404,6 +447,7 @@ export default {
<a
href="javascript:void(0);"
role="button"
+ data-testid="preview-tab"
@click.prevent="updateEditor({ viewMode: $options.FILE_VIEW_MODE_PREVIEW })"
>{{ previewMode.previewTitle }}</a
>
@@ -414,6 +458,7 @@ export default {
<div
v-show="showEditor"
ref="editor"
+ :key="`content-editor`"
:class="{
'is-readonly': isCommitModeActive,
'is-deleted': file.deleted,
@@ -421,6 +466,8 @@ export default {
}"
class="multi-file-editor-holder"
data-qa-selector="editor_container"
+ data-testid="editor-container"
+ :data-editor-loading="isEditorLoading"
@focusout="triggerFilesChange"
></div>
<content-viewer
diff --git a/app/assets/javascripts/ide/components/repo_tab.vue b/app/assets/javascripts/ide/components/repo_tab.vue
index d28751c9571..64ec2cc67c7 100644
--- a/app/assets/javascripts/ide/components/repo_tab.vue
+++ b/app/assets/javascripts/ide/components/repo_tab.vue
@@ -1,5 +1,5 @@
<script>
-import { GlIcon } from '@gitlab/ui';
+import { GlIcon, GlTab } from '@gitlab/ui';
import { mapActions, mapGetters } from 'vuex';
import { __, sprintf } from '~/locale';
@@ -13,6 +13,7 @@ export default {
FileIcon,
GlIcon,
ChangedFileIcon,
+ GlTab,
},
props: {
tab: {
@@ -71,29 +72,30 @@ export default {
</script>
<template>
- <li
- :class="{
- active: tab.active,
- disabled: tab.pending,
- }"
+ <gl-tab
+ :active="tab.active"
+ :disabled="tab.pending"
+ :title="tab.name"
@click="clickFile(tab)"
@mouseover="mouseOverTab"
@mouseout="mouseOutTab"
>
- <div :title="getUrlForPath(tab.path)" class="multi-file-tab">
- <file-icon :file-name="tab.name" :size="16" />
- {{ tab.name }}
- <file-status-icon :file="tab" />
- </div>
- <button
- :aria-label="closeLabel"
- :disabled="tab.pending"
- type="button"
- class="multi-file-tab-close"
- @click.stop.prevent="closeFile(tab)"
- >
- <gl-icon v-if="!showChangedIcon" :size="12" name="close" />
- <changed-file-icon v-else :file="tab" />
- </button>
- </li>
+ <template #title>
+ <div :title="getUrlForPath(tab.path)" class="multi-file-tab">
+ <file-icon :file-name="tab.name" :size="16" />
+ {{ tab.name }}
+ <file-status-icon :file="tab" />
+ </div>
+ <button
+ :aria-label="closeLabel"
+ :disabled="tab.pending"
+ type="button"
+ class="multi-file-tab-close"
+ @click.stop.prevent="closeFile(tab)"
+ >
+ <gl-icon v-if="!showChangedIcon" :size="12" name="close" />
+ <changed-file-icon v-else :file="tab" />
+ </button>
+ </template>
+ </gl-tab>
</template>
diff --git a/app/assets/javascripts/ide/components/repo_tabs.vue b/app/assets/javascripts/ide/components/repo_tabs.vue
index c03694e3619..932040c7fa5 100644
--- a/app/assets/javascripts/ide/components/repo_tabs.vue
+++ b/app/assets/javascripts/ide/components/repo_tabs.vue
@@ -1,10 +1,12 @@
<script>
+import { GlTabs } from '@gitlab/ui';
import { mapActions, mapGetters } from 'vuex';
import RepoTab from './repo_tab.vue';
export default {
components: {
RepoTab,
+ GlTabs,
},
props: {
activeFile: {
@@ -42,8 +44,8 @@ export default {
<template>
<div class="multi-file-tabs">
- <ul ref="tabsScroller" class="list-unstyled gl-mb-0">
+ <gl-tabs>
<repo-tab v-for="tab in files" :key="tab.key" :tab="tab" />
- </ul>
+ </gl-tabs>
</div>
</template>
diff --git a/app/assets/javascripts/ide/index.js b/app/assets/javascripts/ide/index.js
index 1b4b59ef62f..f4a0f324e4a 100644
--- a/app/assets/javascripts/ide/index.js
+++ b/app/assets/javascripts/ide/index.js
@@ -53,7 +53,6 @@ export function initIde(el, options = {}) {
promotionSvgPath: el.dataset.promotionSvgPath,
});
this.setLinks({
- ciHelpPagePath: el.dataset.ciHelpPagePath,
webIDEHelpPagePath: el.dataset.webIdeHelpPagePath,
});
this.setInitialData({
diff --git a/app/assets/javascripts/import_entities/import_groups/components/import_table.vue b/app/assets/javascripts/import_entities/import_groups/components/import_table.vue
index 7c5f48dcafc..a0a44ee74dc 100644
--- a/app/assets/javascripts/import_entities/import_groups/components/import_table.vue
+++ b/app/assets/javascripts/import_entities/import_groups/components/import_table.vue
@@ -33,6 +33,11 @@ export default {
type: String,
required: true,
},
+ canCreateGroup: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
@@ -147,10 +152,15 @@ export default {
</div>
<gl-loading-icon v-if="$apollo.loading" size="md" class="gl-mt-5" />
<template v-else>
- <gl-empty-state v-if="hasEmptyFilter" :title="__('Sorry, your filter produced no results')" />
+ <gl-empty-state
+ v-if="hasEmptyFilter"
+ :title="__('Sorry, your filter produced no results')"
+ :description="__('To widen your search, change or remove filters above.')"
+ />
<gl-empty-state
v-else-if="!hasGroups"
- :title="s__('BulkImport|No groups available for import')"
+ :title="s__('BulkImport|You have no groups to import')"
+ :description="s__('Check your source instance permissions.')"
/>
<div v-else class="gl-display-flex gl-flex-direction-column gl-align-items-center">
<table class="gl-w-full">
@@ -166,6 +176,7 @@ export default {
:key="group.id"
:group="group"
:available-namespaces="availableNamespaces"
+ :can-create-group="canCreateGroup"
@update-target-namespace="updateTargetNamespace(group.id, $event)"
@update-new-name="updateNewName(group.id, $event)"
@import-group="importGroup(group.id)"
diff --git a/app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue b/app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue
index 1707ab10c89..1f3eee0c141 100644
--- a/app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue
+++ b/app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue
@@ -1,6 +1,7 @@
<script>
import { GlButton, GlIcon, GlLink, GlFormInput } from '@gitlab/ui';
import { joinPaths } from '~/lib/utils/url_utility';
+import { s__ } from '~/locale';
import Select2Select from '~/vue_shared/components/select2_select.vue';
import ImportStatus from '../../components/import_status.vue';
import { STATUSES } from '../../constants';
@@ -23,6 +24,11 @@ export default {
type: Array,
required: true,
},
+ canCreateGroup: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
computed: {
isDisabled() {
@@ -34,11 +40,23 @@ export default {
},
select2Options() {
+ const availableNamespacesData = this.availableNamespaces.map((namespace) => ({
+ id: namespace.full_path,
+ text: namespace.full_path,
+ }));
+
+ if (!this.canCreateGroup) {
+ return { data: availableNamespacesData };
+ }
+
return {
- data: this.availableNamespaces.map((namespace) => ({
- id: namespace.full_path,
- text: namespace.full_path,
- })),
+ data: [
+ { id: '', text: s__('BulkImport|No parent') },
+ {
+ text: s__('BulkImport|Existing groups'),
+ children: availableNamespacesData,
+ },
+ ],
};
},
},
diff --git a/app/assets/javascripts/import_entities/import_groups/index.js b/app/assets/javascripts/import_entities/import_groups/index.js
index cd837a840e4..0700358f6ce 100644
--- a/app/assets/javascripts/import_entities/import_groups/index.js
+++ b/app/assets/javascripts/import_entities/import_groups/index.js
@@ -1,5 +1,6 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
+import { parseBoolean } from '~/lib/utils/common_utils';
import Translate from '~/vue_shared/translate';
import ImportTable from './components/import_table.vue';
import { createApolloClient } from './graphql/client_factory';
@@ -16,6 +17,7 @@ export function mountImportGroupsApp(mountElement) {
createBulkImportPath,
jobsPath,
sourceUrl,
+ canCreateGroup,
} = mountElement.dataset;
const apolloProvider = new VueApollo({
defaultClient: createApolloClient({
@@ -35,6 +37,7 @@ export function mountImportGroupsApp(mountElement) {
return createElement(ImportTable, {
props: {
sourceUrl,
+ canCreateGroup: parseBoolean(canCreateGroup),
},
});
},
diff --git a/app/assets/javascripts/incidents_settings/constants.js b/app/assets/javascripts/incidents_settings/constants.js
index fcac9c519c2..818af4ecb90 100644
--- a/app/assets/javascripts/incidents_settings/constants.js
+++ b/app/assets/javascripts/incidents_settings/constants.js
@@ -51,7 +51,7 @@ export const NO_ISSUE_TEMPLATE_SELECTED = { key: '', name: __('No template selec
export const TAKING_INCIDENT_ACTION_DOCS_LINK =
'/help/operations/metrics/alerts#trigger-actions-from-alerts';
export const ISSUE_TEMPLATES_DOCS_LINK =
- '/help/user/project/description_templates#creating-issue-templates';
+ '/help/user/project/description_templates#create-an-issue-template';
/* PagerDuty integration settings constants */
diff --git a/app/assets/javascripts/integrations/edit/components/jira_trigger_fields.vue b/app/assets/javascripts/integrations/edit/components/jira_trigger_fields.vue
index af4e9acf4ba..22a767cfaae 100644
--- a/app/assets/javascripts/integrations/edit/components/jira_trigger_fields.vue
+++ b/app/assets/javascripts/integrations/edit/components/jira_trigger_fields.vue
@@ -1,7 +1,16 @@
<script>
-import { GlFormGroup, GlFormCheckbox, GlFormRadio } from '@gitlab/ui';
+import {
+ GlFormGroup,
+ GlFormCheckbox,
+ GlFormRadio,
+ GlFormInput,
+ GlLink,
+ GlSprintf,
+} from '@gitlab/ui';
import { mapGetters } from 'vuex';
+import { helpPagePath } from '~/helpers/help_page_helper';
import { s__ } from '~/locale';
+import eventHub from '../event_hub';
const commentDetailOptions = [
{
@@ -18,12 +27,41 @@ const commentDetailOptions = [
},
];
+const ISSUE_TRANSITION_AUTO = 'auto';
+const ISSUE_TRANSITION_CUSTOM = 'custom';
+
+const issueTransitionOptions = [
+ {
+ value: ISSUE_TRANSITION_AUTO,
+ label: s__('JiraService|Move to Done'),
+ help: s__(
+ 'JiraService|Automatically transitions Jira issues to the "Done" category. %{linkStart}Learn more%{linkEnd}',
+ ),
+ link: helpPagePath('user/project/integrations/jira.html', {
+ anchor: 'automatic-issue-transitions',
+ }),
+ },
+ {
+ value: ISSUE_TRANSITION_CUSTOM,
+ label: s__('JiraService|Use custom transitions'),
+ help: s__(
+ 'JiraService|Set a custom final state by using transition IDs. %{linkStart}Learn about transition IDs%{linkEnd}',
+ ),
+ link: helpPagePath('user/project/integrations/jira.html', {
+ anchor: 'custom-issue-transitions',
+ }),
+ },
+];
+
export default {
name: 'JiraTriggerFields',
components: {
GlFormGroup,
GlFormCheckbox,
GlFormRadio,
+ GlFormInput,
+ GlLink,
+ GlSprintf,
},
props: {
initialTriggerCommit: {
@@ -43,21 +81,52 @@ export default {
required: false,
default: 'standard',
},
+ initialJiraIssueTransitionId: {
+ type: String,
+ required: false,
+ default: '',
+ },
},
data() {
return {
+ validated: false,
triggerCommit: this.initialTriggerCommit,
triggerMergeRequest: this.initialTriggerMergeRequest,
enableComments: this.initialEnableComments,
commentDetail: this.initialCommentDetail,
+ jiraIssueTransitionId: this.initialJiraIssueTransitionId,
+ issueTransitionMode: this.initialJiraIssueTransitionId.length
+ ? ISSUE_TRANSITION_CUSTOM
+ : ISSUE_TRANSITION_AUTO,
commentDetailOptions,
+ issueTransitionOptions,
};
},
computed: {
...mapGetters(['isInheriting']),
- showEnableComments() {
+ showTriggerSettings() {
return this.triggerCommit || this.triggerMergeRequest;
},
+ validIssueTransitionId() {
+ return !this.validated || this.jiraIssueTransitionId.length > 0;
+ },
+ },
+ created() {
+ eventHub.$on('validateForm', this.validateForm);
+ },
+ beforeDestroy() {
+ eventHub.$off('validateForm', this.validateForm);
+ },
+ methods: {
+ validateForm() {
+ this.validated = true;
+ },
+ showCustomIssueTransitions(currentOption) {
+ return (
+ this.issueTransitionMode === ISSUE_TRANSITION_CUSTOM &&
+ currentOption === ISSUE_TRANSITION_CUSTOM
+ );
+ },
},
};
</script>
@@ -89,7 +158,7 @@ export default {
</gl-form-group>
<gl-form-group
- v-show="showEnableComments"
+ v-show="showTriggerSettings"
:label="s__('Integrations|Comment settings:')"
label-for="service[comment_on_event_enabled]"
class="gl-pl-6"
@@ -106,7 +175,7 @@ export default {
</gl-form-group>
<gl-form-group
- v-show="showEnableComments && enableComments"
+ v-show="showTriggerSettings && enableComments"
:label="s__('Integrations|Comment detail:')"
label-for="service[comment_detail]"
class="gl-pl-9"
@@ -126,5 +195,51 @@ export default {
</template>
</gl-form-radio>
</gl-form-group>
+
+ <gl-form-group
+ v-show="showTriggerSettings"
+ :label="s__('JiraService|Transition Jira issues to their final state:')"
+ class="gl-pl-6"
+ data-testid="issue-transition-settings"
+ >
+ <input type="hidden" name="service[jira_issue_transition_id]" value="" />
+
+ <gl-form-radio
+ v-for="issueTransitionOption in issueTransitionOptions"
+ :key="issueTransitionOption.value"
+ v-model="issueTransitionMode"
+ :value="issueTransitionOption.value"
+ :disabled="isInheriting"
+ :data-qa-selector="`service_issue_transition_mode_${issueTransitionOption.value}`"
+ >
+ {{ issueTransitionOption.label }}
+
+ <template v-if="showCustomIssueTransitions(issueTransitionOption.value)">
+ <gl-form-input
+ v-model="jiraIssueTransitionId"
+ name="service[jira_issue_transition_id]"
+ type="text"
+ class="gl-my-3"
+ data-qa-selector="service_jira_issue_transition_id_field"
+ :placeholder="s__('JiraService|For example, 12, 24')"
+ :disabled="isInheriting"
+ :required="true"
+ :state="validIssueTransitionId"
+ />
+
+ <span class="invalid-feedback">
+ {{ s__('This field is required.') }}
+ </span>
+ </template>
+
+ <template #help>
+ <gl-sprintf :message="issueTransitionOption.help">
+ <template #link="{ content }">
+ <gl-link :href="issueTransitionOption.link" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </template>
+ </gl-form-radio>
+ </gl-form-group>
</div>
</template>
diff --git a/app/assets/javascripts/integrations/edit/index.js b/app/assets/javascripts/integrations/edit/index.js
index ab9bdd9ca2e..1ae353ab6e3 100644
--- a/app/assets/javascripts/integrations/edit/index.js
+++ b/app/assets/javascripts/integrations/edit/index.js
@@ -28,6 +28,7 @@ function parseDatasetToProps(data) {
testPath,
resetPath,
vulnerabilitiesIssuetype,
+ jiraIssueTransitionId,
...booleanAttributes
} = data;
const {
@@ -59,6 +60,7 @@ function parseDatasetToProps(data) {
initialTriggerMergeRequest: mergeRequestEvents,
initialEnableComments: enableComments,
initialCommentDetail: commentDetail,
+ initialJiraIssueTransitionId: jiraIssueTransitionId,
},
jiraIssuesProps: {
showJiraIssuesIntegration,
diff --git a/app/assets/javascripts/invite_members/components/group_select.vue b/app/assets/javascripts/invite_members/components/group_select.vue
new file mode 100644
index 00000000000..4a72e97db8c
--- /dev/null
+++ b/app/assets/javascripts/invite_members/components/group_select.vue
@@ -0,0 +1,103 @@
+<script>
+import { GlDropdown, GlDropdownItem, GlDropdownText, GlSearchBoxByType } from '@gitlab/ui';
+import { debounce } from 'lodash';
+import Api from '~/api';
+import { s__ } from '~/locale';
+import { SEARCH_DELAY } from '../constants';
+
+export default {
+ name: 'GroupSelect',
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownText,
+ GlSearchBoxByType,
+ },
+ model: {
+ prop: 'selectedGroup',
+ },
+ data() {
+ return {
+ isFetching: false,
+ groups: [],
+ selectedGroup: {},
+ searchTerm: '',
+ };
+ },
+ computed: {
+ selectedGroupName() {
+ return this.selectedGroup.name || this.$options.i18n.dropdownText;
+ },
+ isFetchResultEmpty() {
+ return this.groups.length === 0;
+ },
+ },
+ watch: {
+ searchTerm() {
+ this.retrieveGroups();
+ },
+ },
+ mounted() {
+ this.retrieveGroups();
+ },
+ methods: {
+ retrieveGroups: debounce(function debouncedRetrieveGroups() {
+ this.isFetching = true;
+ return Api.groups(this.searchTerm, this.$options.defaultFetchOptions)
+ .then((response) => {
+ this.groups = response.map((group) => ({
+ id: group.id,
+ name: group.full_name,
+ path: group.path,
+ }));
+ this.isFetching = false;
+ })
+ .catch(() => {
+ this.isFetching = false;
+ });
+ }, SEARCH_DELAY),
+ selectGroup(group) {
+ this.selectedGroup = group;
+
+ this.$emit('input', this.selectedGroup);
+ },
+ },
+ i18n: {
+ dropdownText: s__('GroupSelect|Select a group'),
+ searchPlaceholder: s__('GroupSelect|Search groups'),
+ emptySearchResult: s__('GroupSelect|No matching results'),
+ },
+ defaultFetchOptions: {
+ exclude_internal: true,
+ active: true,
+ },
+};
+</script>
+<template>
+ <div>
+ <gl-dropdown
+ data-testid="group-select-dropdown"
+ :text="selectedGroupName"
+ block
+ menu-class="gl-w-full!"
+ >
+ <gl-search-box-by-type
+ v-model.trim="searchTerm"
+ :is-loading="isFetching"
+ :placeholder="$options.i18n.searchPlaceholder"
+ data-qa-selector="group_select_dropdown_search_field"
+ />
+ <gl-dropdown-item
+ v-for="group in groups"
+ :key="group.id"
+ :name="group.name"
+ @click="selectGroup(group)"
+ >
+ {{ group.name }}
+ </gl-dropdown-item>
+ <gl-dropdown-text v-if="isFetchResultEmpty && !isFetching" data-testid="empty-result-message">
+ <span class="gl-text-gray-500">{{ $options.i18n.emptySearchResult }}</span>
+ </gl-dropdown-text>
+ </gl-dropdown>
+ </div>
+</template>
diff --git a/app/assets/javascripts/invite_members/components/invite_group_trigger.vue b/app/assets/javascripts/invite_members/components/invite_group_trigger.vue
new file mode 100644
index 00000000000..c9de078319a
--- /dev/null
+++ b/app/assets/javascripts/invite_members/components/invite_group_trigger.vue
@@ -0,0 +1,34 @@
+<script>
+import { GlButton } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import eventHub from '../event_hub';
+
+export default {
+ components: {
+ GlButton,
+ },
+ props: {
+ displayText: {
+ type: String,
+ required: false,
+ default: s__('InviteMembers|Invite a group'),
+ },
+ classes: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ },
+ methods: {
+ openModal() {
+ eventHub.$emit('openModal', { inviteeType: 'group' });
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-button :class="classes" data-qa-selector="invite_a_group_button" @click="openModal">
+ {{ displayText }}
+ </gl-button>
+</template>
diff --git a/app/assets/javascripts/invite_members/components/invite_members_modal.vue b/app/assets/javascripts/invite_members/components/invite_members_modal.vue
index f5a65882fba..cd9c3b0b5d3 100644
--- a/app/assets/javascripts/invite_members/components/invite_members_modal.vue
+++ b/app/assets/javascripts/invite_members/components/invite_members_modal.vue
@@ -11,9 +11,10 @@ import {
} from '@gitlab/ui';
import { partition, isString } from 'lodash';
import Api from '~/api';
+import GroupSelect from '~/invite_members/components/group_select.vue';
import MembersTokenSelect from '~/invite_members/components/members_token_select.vue';
import { BV_SHOW_MODAL, BV_HIDE_MODAL } from '~/lib/utils/constants';
-import { s__, __, sprintf } from '~/locale';
+import { s__, sprintf } from '~/locale';
import eventHub from '../event_hub';
export default {
@@ -28,6 +29,7 @@ export default {
GlButton,
GlFormInput,
MembersTokenSelect,
+ GroupSelect,
},
props: {
id: {
@@ -60,21 +62,21 @@ export default {
visible: true,
modalId: 'invite-members-modal',
selectedAccessLevel: this.defaultAccessLevel,
+ inviteeType: 'members',
newUsersToInvite: [],
selectedDate: undefined,
+ groupToBeSharedWith: {},
};
},
computed: {
- inviteToName() {
- return this.name.toUpperCase();
- },
- inviteToType() {
- return this.isProject ? __('project') : __('group');
+ isInviteGroup() {
+ return this.inviteeType === 'group';
},
introText() {
- return sprintf(s__("InviteMembersModal|You're inviting members to the %{name} %{type}"), {
- name: this.inviteToName,
- type: this.inviteToType,
+ const inviteTo = this.isProject ? 'toProject' : 'toGroup';
+
+ return sprintf(this.$options.labels[this.inviteeType][inviteTo].introText, {
+ name: this.name.toUpperCase(),
});
},
toastOptions() {
@@ -82,12 +84,12 @@ export default {
onComplete: () => {
this.selectedAccessLevel = this.defaultAccessLevel;
this.newUsersToInvite = [];
+ this.groupToBeSharedWith = {};
},
};
},
basePostData() {
return {
- access_level: this.selectedAccessLevel,
expires_at: this.selectedDate,
format: 'json',
};
@@ -97,9 +99,16 @@ export default {
(key) => this.accessLevels[key] === Number(this.selectedAccessLevel),
);
},
+ inviteDisabled() {
+ return (
+ this.newUsersToInvite.length === 0 && Object.keys(this.groupToBeSharedWith).length === 0
+ );
+ },
},
mounted() {
- eventHub.$on('openModal', this.openModal);
+ eventHub.$on('openModal', (options) => {
+ this.openModal(options);
+ });
},
methods: {
partitionNewUsersToInvite() {
@@ -113,26 +122,42 @@ export default {
usersToAddById.map((user) => user.id).join(','),
];
},
- openModal() {
+ openModal({ inviteeType }) {
+ this.inviteeType = inviteeType;
+
this.$root.$emit(BV_SHOW_MODAL, this.modalId);
},
closeModal() {
this.$root.$emit(BV_HIDE_MODAL, this.modalId);
},
sendInvite() {
- this.submitForm();
+ if (this.isInviteGroup) {
+ this.submitShareWithGroup();
+ } else {
+ this.submitInviteMembers();
+ }
this.closeModal();
},
cancelInvite() {
this.selectedAccessLevel = this.defaultAccessLevel;
this.selectedDate = undefined;
- this.newUsersToInvite = '';
+ this.newUsersToInvite = [];
+ this.groupToBeSharedWith = {};
this.closeModal();
},
changeSelectedItem(item) {
this.selectedAccessLevel = item;
},
- submitForm() {
+ submitShareWithGroup() {
+ const apiShareWithGroup = this.isProject
+ ? Api.projectShareWithGroup.bind(Api)
+ : Api.groupShareWithGroup.bind(Api);
+
+ apiShareWithGroup(this.id, this.shareWithGroupPostData(this.groupToBeSharedWith.id))
+ .then(this.showToastMessageSuccess)
+ .catch(this.showToastMessageError);
+ },
+ submitInviteMembers() {
const [usersToInviteByEmail, usersToAddById] = this.partitionNewUsersToInvite();
const promises = [];
@@ -155,10 +180,25 @@ export default {
Promise.all(promises).then(this.showToastMessageSuccess).catch(this.showToastMessageError);
},
inviteByEmailPostData(usersToInviteByEmail) {
- return { ...this.basePostData, email: usersToInviteByEmail };
+ return {
+ ...this.basePostData,
+ email: usersToInviteByEmail,
+ access_level: this.selectedAccessLevel,
+ };
},
addByUserIdPostData(usersToAddById) {
- return { ...this.basePostData, user_id: usersToAddById };
+ return {
+ ...this.basePostData,
+ user_id: usersToAddById,
+ access_level: this.selectedAccessLevel,
+ };
+ },
+ shareWithGroupPostData(groupToBeSharedWith) {
+ return {
+ ...this.basePostData,
+ group_id: groupToBeSharedWith,
+ group_access: this.selectedAccessLevel,
+ };
},
showToastMessageSuccess() {
this.$toast.show(this.$options.labels.toastMessageSuccessful, this.toastOptions);
@@ -170,9 +210,28 @@ export default {
},
},
labels: {
- modalTitle: s__('InviteMembersModal|Invite team members'),
- newUsersToInvite: s__('InviteMembersModal|GitLab member or Email address'),
- userPlaceholder: s__('InviteMembersModal|Search for members to invite'),
+ members: {
+ modalTitle: s__('InviteMembersModal|Invite team members'),
+ searchField: s__('InviteMembersModal|GitLab member or Email address'),
+ placeHolder: s__('InviteMembersModal|Search for members to invite'),
+ toGroup: {
+ introText: s__("InviteMembersModal|You're inviting members to the %{name} group"),
+ },
+ toProject: {
+ introText: s__("InviteMembersModal|You're inviting members to the %{name} project"),
+ },
+ },
+ group: {
+ modalTitle: s__('InviteMembersModal|Invite a group'),
+ searchField: s__('InviteMembersModal|Select a group to invite'),
+ placeHolder: s__('InviteMembersModal|Search for a group to invite'),
+ toGroup: {
+ introText: s__("InviteMembersModal|You're inviting a group to the %{name} group"),
+ },
+ toProject: {
+ introText: s__("InviteMembersModal|You're inviting a group to the %{name} project"),
+ },
+ },
accessLevel: s__('InviteMembersModal|Choose a role permission'),
accessExpireDate: s__('InviteMembersModal|Access expiration date (optional)'),
toastMessageSuccessful: s__('InviteMembersModal|Members were successfully added'),
@@ -189,27 +248,34 @@ export default {
<gl-modal
:modal-id="modalId"
size="sm"
- :title="$options.labels.modalTitle"
+ data-qa-selector="invite_members_modal_content"
+ :title="$options.labels[inviteeType].modalTitle"
:header-close-label="$options.labels.headerCloseLabel"
>
- <div class="gl-ml-5 gl-mr-5">
- <div>{{ introText }}</div>
+ <div>
+ <p ref="introText">{{ introText }}</p>
<label :id="$options.membersTokenSelectLabelId" class="gl-font-weight-bold gl-mt-5">{{
- $options.labels.newUsersToInvite
+ $options.labels[inviteeType].searchField
}}</label>
<div class="gl-mt-2">
<members-token-select
+ v-if="!isInviteGroup"
v-model="newUsersToInvite"
- :label="$options.labels.newUsersToInvite"
:aria-labelledby="$options.membersTokenSelectLabelId"
- :placeholder="$options.labels.userPlaceholder"
+ :placeholder="$options.labels[inviteeType].placeHolder"
/>
+ <group-select v-if="isInviteGroup" v-model="groupToBeSharedWith" />
</div>
- <label class="gl-font-weight-bold gl-mt-5">{{ $options.labels.accessLevel }}</label>
+ <label class="gl-font-weight-bold gl-mt-3">{{ $options.labels.accessLevel }}</label>
<div class="gl-mt-2 gl-w-half gl-xs-w-full">
- <gl-dropdown class="gl-shadow-none gl-w-full" v-bind="$attrs" :text="selectedRoleName">
+ <gl-dropdown
+ class="gl-shadow-none gl-w-full"
+ data-qa-selector="access_level_dropdown"
+ v-bind="$attrs"
+ :text="selectedRoleName"
+ >
<template v-for="(key, item) in accessLevels">
<gl-dropdown-item
:key="key"
@@ -223,7 +289,7 @@ export default {
</gl-dropdown>
</div>
- <div class="gl-mt-2">
+ <div class="gl-mt-2 gl-w-half gl-xs-w-full">
<gl-sprintf :message="$options.labels.readMoreText">
<template #link="{ content }">
<gl-link :href="helpLink" target="_blank">{{ content }}</gl-link>
@@ -231,7 +297,7 @@ export default {
</gl-sprintf>
</div>
- <label class="gl-font-weight-bold gl-mt-5" for="expires_at">{{
+ <label class="gl-font-weight-bold gl-mt-5 gl-display-block" for="expires_at">{{
$options.labels.accessExpireDate
}}</label>
<div class="gl-mt-2 gl-w-half gl-xs-w-full gl-display-inline-block">
@@ -253,15 +319,16 @@ export default {
</div>
<template #modal-footer>
- <div class="gl-display-flex gl-flex-direction-row gl-justify-content-end gl-flex-wrap gl-p-3">
+ <div class="gl-display-flex gl-flex-direction-row gl-justify-content-end gl-flex-wrap gl-m-0">
<gl-button ref="cancelButton" @click="cancelInvite">
{{ $options.labels.cancelButtonText }}
</gl-button>
<div class="gl-mr-3"></div>
<gl-button
ref="inviteButton"
- :disabled="!newUsersToInvite"
+ :disabled="inviteDisabled"
variant="success"
+ data-qa-selector="invite_button"
@click="sendInvite"
>{{ $options.labels.inviteButtonText }}</gl-button
>
diff --git a/app/assets/javascripts/invite_members/components/invite_members_trigger.vue b/app/assets/javascripts/invite_members/components/invite_members_trigger.vue
index eb97c458f88..f8cc74511d9 100644
--- a/app/assets/javascripts/invite_members/components/invite_members_trigger.vue
+++ b/app/assets/javascripts/invite_members/components/invite_members_trigger.vue
@@ -27,14 +27,14 @@ export default {
},
methods: {
openModal() {
- eventHub.$emit('openModal');
+ eventHub.$emit('openModal', { inviteeType: 'members' });
},
},
};
</script>
<template>
- <gl-link :class="classes" @click="openModal">
+ <gl-link :class="classes" data-qa-selector="invite_members_button" @click="openModal">
<div v-if="icon" class="nav-icon-container">
<gl-icon :size="16" :name="icon" />
</div>
diff --git a/app/assets/javascripts/invite_members/components/members_token_select.vue b/app/assets/javascripts/invite_members/components/members_token_select.vue
index 233a214013b..db6a7888786 100644
--- a/app/assets/javascripts/invite_members/components/members_token_select.vue
+++ b/app/assets/javascripts/invite_members/components/members_token_select.vue
@@ -3,7 +3,7 @@ import { GlTokenSelector, GlAvatar, GlAvatarLabeled, GlSprintf } from '@gitlab/u
import { debounce } from 'lodash';
import { __ } from '~/locale';
import { getUsers } from '~/rest_api';
-import { USER_SEARCH_DELAY } from '../constants';
+import { SEARCH_DELAY } from '../constants';
export default {
components: {
@@ -67,7 +67,7 @@ export default {
.catch(() => {
this.loading = false;
});
- }, USER_SEARCH_DELAY),
+ }, SEARCH_DELAY),
handleInput() {
this.$emit('input', this.selectedTokens);
},
diff --git a/app/assets/javascripts/invite_members/constants.js b/app/assets/javascripts/invite_members/constants.js
index 1ff2125c292..2044dad896f 100644
--- a/app/assets/javascripts/invite_members/constants.js
+++ b/app/assets/javascripts/invite_members/constants.js
@@ -1 +1 @@
-export const USER_SEARCH_DELAY = 200;
+export const SEARCH_DELAY = 200;
diff --git a/app/assets/javascripts/invite_members/init_invite_group_trigger.js b/app/assets/javascripts/invite_members/init_invite_group_trigger.js
new file mode 100644
index 00000000000..c01bb1bae28
--- /dev/null
+++ b/app/assets/javascripts/invite_members/init_invite_group_trigger.js
@@ -0,0 +1,20 @@
+import Vue from 'vue';
+import InviteGroupTrigger from '~/invite_members/components/invite_group_trigger.vue';
+
+export default function initInviteGroupTrigger() {
+ const el = document.querySelector('.js-invite-group-trigger');
+
+ if (!el) {
+ return false;
+ }
+
+ return new Vue({
+ el,
+ render: (createElement) =>
+ createElement(InviteGroupTrigger, {
+ props: {
+ ...el.dataset,
+ },
+ }),
+ });
+}
diff --git a/app/assets/javascripts/issue_show/components/app.vue b/app/assets/javascripts/issue_show/components/app.vue
index e70c18040b3..d1a8d334796 100644
--- a/app/assets/javascripts/issue_show/components/app.vue
+++ b/app/assets/javascripts/issue_show/components/app.vue
@@ -307,7 +307,7 @@ export default {
});
},
- updateAndShowForm(templates = []) {
+ updateAndShowForm(templates = {}) {
if (!this.showForm) {
this.showForm = true;
this.store.setFormState({
diff --git a/app/assets/javascripts/issue_show/components/fields/description_template.vue b/app/assets/javascripts/issue_show/components/fields/description_template.vue
index dbec6f15cab..570bc7df3cf 100644
--- a/app/assets/javascripts/issue_show/components/fields/description_template.vue
+++ b/app/assets/javascripts/issue_show/components/fields/description_template.vue
@@ -13,9 +13,9 @@ export default {
required: true,
},
issuableTemplates: {
- type: Array,
+ type: [Object, Array],
required: false,
- default: () => [],
+ default: () => {},
},
projectPath: {
type: String,
diff --git a/app/assets/javascripts/issue_show/components/form.vue b/app/assets/javascripts/issue_show/components/form.vue
index b7425448052..76ea489fb86 100644
--- a/app/assets/javascripts/issue_show/components/form.vue
+++ b/app/assets/javascripts/issue_show/components/form.vue
@@ -26,9 +26,9 @@ export default {
required: true,
},
issuableTemplates: {
- type: Array,
+ type: [Object, Array],
required: false,
- default: () => [],
+ default: () => {},
},
issuableType: {
type: String,
@@ -72,7 +72,7 @@ export default {
},
computed: {
hasIssuableTemplates() {
- return this.issuableTemplates.length;
+ return Object.values(Object(this.issuableTemplates)).length;
},
showLockedWarning() {
return this.formState.lockedWarningVisible && !this.formState.updateLoading;
diff --git a/app/assets/javascripts/issue_show/stores/index.js b/app/assets/javascripts/issue_show/stores/index.js
index 06bbd406e3a..a50913d3455 100644
--- a/app/assets/javascripts/issue_show/stores/index.js
+++ b/app/assets/javascripts/issue_show/stores/index.js
@@ -11,7 +11,7 @@ export default class Store {
lockedWarningVisible: false,
updateLoading: false,
lock_version: 0,
- issuableTemplates: [],
+ issuableTemplates: {},
};
}
diff --git a/app/assets/javascripts/issue_show/utils/parse_data.js b/app/assets/javascripts/issue_show/utils/parse_data.js
index 19d1e0eebcb..f1e6bd2419a 100644
--- a/app/assets/javascripts/issue_show/utils/parse_data.js
+++ b/app/assets/javascripts/issue_show/utils/parse_data.js
@@ -1,5 +1,5 @@
+import * as Sentry from '@sentry/browser';
import { sanitize } from '~/lib/dompurify';
-import * as Sentry from '~/sentry/wrapper';
// We currently load + parse the data from the issue app and related merge request
let cachedParsedData;
diff --git a/app/assets/javascripts/jira_connect/components/app.vue b/app/assets/javascripts/jira_connect/components/app.vue
index a4ba86dc6a1..4290971623e 100644
--- a/app/assets/javascripts/jira_connect/components/app.vue
+++ b/app/assets/javascripts/jira_connect/components/app.vue
@@ -60,15 +60,15 @@ export default {
<template>
<div>
- <gl-alert v-if="errorMessage" class="gl-mb-6" variant="danger" :dismissible="false">
+ <gl-alert v-if="errorMessage" class="gl-mb-7" variant="danger" :dismissible="false">
{{ errorMessage }}
</gl-alert>
- <h2>{{ s__('JiraService|GitLab for Jira Configuration') }}</h2>
+ <h2 class="gl-text-center">{{ s__('JiraService|GitLab for Jira Configuration') }}</h2>
<div
v-if="showNewUI"
- class="gl-display-flex gl-justify-content-space-between gl-my-7 gl-pb-4 gl-border-b-solid gl-border-b-1 gl-border-b-gray-200"
+ class="jira-connect-app-body gl-display-flex gl-justify-content-space-between gl-my-7 gl-pb-4 gl-border-b-solid gl-border-b-1 gl-border-b-gray-200"
>
<h5 class="gl-align-self-center gl-mb-0" data-testid="new-jira-connect-ui-heading">
{{ s__('Integrations|Linked namespaces') }}
diff --git a/app/assets/javascripts/jira_connect/index.js b/app/assets/javascripts/jira_connect/index.js
index 7191fce3c33..96029e2711b 100644
--- a/app/assets/javascripts/jira_connect/index.js
+++ b/app/assets/javascripts/jira_connect/index.js
@@ -77,6 +77,7 @@ export async function initJiraConnect() {
Vue.use(GlFeatureFlagsPlugin);
const { groupsPath, subscriptionsPath, usersPath } = el.dataset;
+ AP.sizeToParent();
return new Vue({
el,
diff --git a/app/assets/javascripts/merge_request_tabs.js b/app/assets/javascripts/merge_request_tabs.js
index 4dab796d8a4..81b9db6b4d5 100644
--- a/app/assets/javascripts/merge_request_tabs.js
+++ b/app/assets/javascripts/merge_request_tabs.js
@@ -361,10 +361,8 @@ export default class MergeRequestTabs {
return createElement(CommitPipelinesTable, {
props: {
endpoint: pipelineTableViewEl.dataset.endpoint,
- helpPagePath: pipelineTableViewEl.dataset.helpPagePath,
emptyStateSvgPath: pipelineTableViewEl.dataset.emptyStateSvgPath,
errorStateSvgPath: pipelineTableViewEl.dataset.errorStateSvgPath,
- autoDevopsHelpPath: pipelineTableViewEl.dataset.helpAutoDevopsPath,
canCreatePipelineInTargetProject: Boolean(
mrWidgetData?.can_create_pipeline_in_target_project,
),
diff --git a/app/assets/javascripts/monitoring/stores/actions.js b/app/assets/javascripts/monitoring/stores/actions.js
index 8522ac6a57d..a0b4fd0b608 100644
--- a/app/assets/javascripts/monitoring/stores/actions.js
+++ b/app/assets/javascripts/monitoring/stores/actions.js
@@ -1,7 +1,7 @@
+import * as Sentry from '@sentry/browser';
import { deprecatedCreateFlash as createFlash } from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { convertToFixedRange } from '~/lib/utils/datetime_range';
-import * as Sentry from '~/sentry/wrapper';
import { convertObjectPropsToCamelCase } from '../../lib/utils/common_utils';
import { s__, sprintf } from '../../locale';
import { ENVIRONMENT_AVAILABLE_STATE, OVERVIEW_DASHBOARD_PATH, VARIABLE_TYPES } from '../constants';
diff --git a/app/assets/javascripts/notes/components/discussion_actions.vue b/app/assets/javascripts/notes/components/discussion_actions.vue
index 27408bc3354..6f0745d4fb0 100644
--- a/app/assets/javascripts/notes/components/discussion_actions.vue
+++ b/app/assets/javascripts/notes/components/discussion_actions.vue
@@ -50,8 +50,8 @@ export default {
<div class="discussion-with-resolve-btn clearfix">
<reply-placeholder
data-qa-selector="discussion_reply_tab"
- :button-text="s__('MergeRequests|Reply...')"
- @onClick="$emit('showReplyForm')"
+ :placeholder-text="__('Reply…')"
+ @focus="$emit('showReplyForm')"
/>
<div v-if="userCanResolveDiscussion" class="btn-group discussion-actions" role="group">
diff --git a/app/assets/javascripts/notes/components/discussion_reply_placeholder.vue b/app/assets/javascripts/notes/components/discussion_reply_placeholder.vue
index 0204169214b..1165a869d2b 100644
--- a/app/assets/javascripts/notes/components/discussion_reply_placeholder.vue
+++ b/app/assets/javascripts/notes/components/discussion_reply_placeholder.vue
@@ -1,23 +1,30 @@
<script>
+import { __ } from '~/locale';
+
export default {
name: 'ReplyPlaceholder',
props: {
- buttonText: {
+ placeholderText: {
+ type: String,
+ required: false,
+ default: __('Reply…'),
+ },
+ labelText: {
type: String,
- required: true,
+ required: false,
+ default: __('Reply to comment'),
},
},
};
</script>
<template>
- <button
- ref="button"
- type="button"
- class="js-vue-discussion-reply btn btn-text-field"
- :title="s__('MergeRequests|Add a reply')"
- @click="$emit('onClick')"
- >
- {{ buttonText }}
- </button>
+ <textarea
+ ref="textarea"
+ rows="1"
+ class="reply-placeholder-text-field js-vue-discussion-reply"
+ :placeholder="placeholderText"
+ :aria-label="labelText"
+ @focus="$emit('focus')"
+ ></textarea>
</template>
diff --git a/app/assets/javascripts/notes/components/note_form.vue b/app/assets/javascripts/notes/components/note_form.vue
index 653bc450d0b..a28c467117a 100644
--- a/app/assets/javascripts/notes/components/note_form.vue
+++ b/app/assets/javascripts/notes/components/note_form.vue
@@ -345,7 +345,7 @@ export default {
class="note-textarea js-gfm-input js-note-text js-autosize markdown-area js-vue-issue-note-form"
data-qa-selector="reply_field"
dir="auto"
- :aria-label="__('Description')"
+ :aria-label="__('Reply to comment')"
:placeholder="__('Write a comment or drag your files here…')"
@keydown.meta.enter="handleKeySubmit()"
@keydown.ctrl.enter="handleKeySubmit()"
diff --git a/app/assets/javascripts/notes/stores/utils.js b/app/assets/javascripts/notes/stores/utils.js
index 627e405c75c..592e634e034 100644
--- a/app/assets/javascripts/notes/stores/utils.js
+++ b/app/assets/javascripts/notes/stores/utils.js
@@ -1,4 +1,4 @@
-import { trimFirstCharOfLineContent } from '~/diffs/store/utils';
+import { trimFirstCharOfLineContent } from '~/diffs/store/utils'; // eslint-disable-line import/no-deprecated
import createGqClient, { fetchPolicies } from '~/lib/graphql';
import AjaxCache from '~/lib/utils/ajax_cache';
import { sprintf, __ } from '~/locale';
@@ -34,7 +34,7 @@ export const hasQuickActions = (note) => createQuickActionsRegex().test(note);
export const stripQuickActions = (note) => note.replace(createQuickActionsRegex(), '').trim();
export const prepareDiffLines = (diffLines) =>
- diffLines.map((line) => ({ ...trimFirstCharOfLineContent(line) }));
+ diffLines.map((line) => ({ ...trimFirstCharOfLineContent(line) })); // eslint-disable-line import/no-deprecated
export const gqClient = createGqClient(
{},
diff --git a/app/assets/javascripts/notifications/constants.js b/app/assets/javascripts/notifications/constants.js
index 07c569a0293..c12f6a75f96 100644
--- a/app/assets/javascripts/notifications/constants.js
+++ b/app/assets/javascripts/notifications/constants.js
@@ -22,10 +22,10 @@ export const i18n = {
owner_disabled: __('Notifications have been disabled by the project or group owner'),
},
updateNotificationLevelErrorMessage: __(
- 'An error occured while updating the notification settings. Please try again.',
+ 'An error occurred while updating the notification settings. Please try again.',
),
loadNotificationLevelErrorMessage: __(
- 'An error occured while loading the notification settings. Please try again.',
+ 'An error occurred while loading the notification settings. Please try again.',
),
customNotificationsModal: {
title: __('Custom notification events'),
diff --git a/app/assets/javascripts/packages/list/constants.js b/app/assets/javascripts/packages/list/constants.js
index d47eb8c3421..25a55200df2 100644
--- a/app/assets/javascripts/packages/list/constants.js
+++ b/app/assets/javascripts/packages/list/constants.js
@@ -71,7 +71,7 @@ export const PACKAGE_TYPES = [
type: PackageType.MAVEN,
},
{
- title: s__('PackageRegistry|NPM'),
+ title: s__('PackageRegistry|npm'),
type: PackageType.NPM,
},
{
diff --git a/app/assets/javascripts/packages/shared/utils.js b/app/assets/javascripts/packages/shared/utils.js
index 677550f77ec..d34372e89b6 100644
--- a/app/assets/javascripts/packages/shared/utils.js
+++ b/app/assets/javascripts/packages/shared/utils.js
@@ -14,7 +14,7 @@ export const getPackageTypeLabel = (packageType) => {
case PackageType.MAVEN:
return s__('PackageType|Maven');
case PackageType.NPM:
- return s__('PackageType|NPM');
+ return s__('PackageType|npm');
case PackageType.NUGET:
return s__('PackageType|NuGet');
case PackageType.PYPI:
diff --git a/app/assets/javascripts/pages/admin/instance_statistics/index.js b/app/assets/javascripts/pages/admin/instance_statistics/index.js
deleted file mode 100644
index d6b0a834ce3..00000000000
--- a/app/assets/javascripts/pages/admin/instance_statistics/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import initInstanceStatisticsApp from '~/analytics/instance_statistics';
-
-document.addEventListener('DOMContentLoaded', () => initInstanceStatisticsApp());
diff --git a/app/assets/javascripts/pages/admin/usage_trends/index.js b/app/assets/javascripts/pages/admin/usage_trends/index.js
new file mode 100644
index 00000000000..23d2bd85979
--- /dev/null
+++ b/app/assets/javascripts/pages/admin/usage_trends/index.js
@@ -0,0 +1,3 @@
+import initUsageTrendsApp from '~/analytics/usage_trends';
+
+initUsageTrendsApp();
diff --git a/app/assets/javascripts/pages/groups/edit/index.js b/app/assets/javascripts/pages/groups/edit/index.js
index 95ee512b71a..176d2406751 100644
--- a/app/assets/javascripts/pages/groups/edit/index.js
+++ b/app/assets/javascripts/pages/groups/edit/index.js
@@ -6,6 +6,7 @@ import TransferDropdown from '~/groups/transfer_dropdown';
import groupsSelect from '~/groups_select';
import mountBadgeSettings from '~/pages/shared/mount_badge_settings';
import projectSelect from '~/project_select';
+import initSearchSettings from '~/search_settings';
import initSettingsPanels from '~/settings_panels';
import setupTransferEdit from '~/transfer_edit';
@@ -24,5 +25,7 @@ document.addEventListener('DOMContentLoaded', () => {
projectSelect();
+ initSearchSettings();
+
return new TransferDropdown();
});
diff --git a/app/assets/javascripts/pages/groups/group_members/index.js b/app/assets/javascripts/pages/groups/group_members/index.js
index 3496f699b06..63afc6fe94d 100644
--- a/app/assets/javascripts/pages/groups/group_members/index.js
+++ b/app/assets/javascripts/pages/groups/group_members/index.js
@@ -1,6 +1,7 @@
import Vue from 'vue';
import { groupMemberRequestFormatter } from '~/groups/members/utils';
import groupsSelect from '~/groups_select';
+import initInviteGroupTrigger from '~/invite_members/init_invite_group_trigger';
import initInviteMembersModal from '~/invite_members/init_invite_members_modal';
import initInviteMembersTrigger from '~/invite_members/init_invite_members_trigger';
import { s__ } from '~/locale';
@@ -70,5 +71,6 @@ memberExpirationDate('.js-access-expiration-date-groups');
mountRemoveMemberModal();
initInviteMembersModal();
initInviteMembersTrigger();
+initInviteGroupTrigger();
new UsersSelect(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js b/app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js
index 378b8663777..b31a926dbe9 100644
--- a/app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js
+++ b/app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js
@@ -4,6 +4,7 @@ import initSharedRunnersForm from '~/group_settings/mount_shared_runners';
import { FILTERED_SEARCH } from '~/pages/constants';
import initFilteredSearch from '~/pages/search/init_filtered_search';
import { initInstallRunner } from '~/pages/shared/mount_runner_instructions';
+import initSearchSettings from '~/search_settings';
import initSettingsPanels from '~/settings_panels';
document.addEventListener('DOMContentLoaded', () => {
@@ -21,4 +22,6 @@ document.addEventListener('DOMContentLoaded', () => {
initVariableList();
initInstallRunner();
+
+ initSearchSettings();
});
diff --git a/app/assets/javascripts/pages/groups/settings/packages_and_registries/index.js b/app/assets/javascripts/pages/groups/settings/packages_and_registries/index.js
index 3b922622d2c..d13bf026777 100644
--- a/app/assets/javascripts/pages/groups/settings/packages_and_registries/index.js
+++ b/app/assets/javascripts/pages/groups/settings/packages_and_registries/index.js
@@ -1,3 +1,6 @@
import bundle from '~/packages_and_registries/settings/group/bundle';
+import initSearchSettings from '~/search_settings';
bundle();
+
+document.addEventListener('DOMContentLoaded', initSearchSettings);
diff --git a/app/assets/javascripts/pages/groups/settings/repository/show/index.js b/app/assets/javascripts/pages/groups/settings/repository/show/index.js
index a1bcf6dbf57..33c5c40f2be 100644
--- a/app/assets/javascripts/pages/groups/settings/repository/show/index.js
+++ b/app/assets/javascripts/pages/groups/settings/repository/show/index.js
@@ -1,4 +1,5 @@
import DueDateSelectors from '~/due_date_select';
+import initSearchSettings from '~/search_settings';
import initSettingsPanels from '~/settings_panels';
document.addEventListener('DOMContentLoaded', () => {
@@ -6,4 +7,6 @@ document.addEventListener('DOMContentLoaded', () => {
initSettingsPanels();
new DueDateSelectors(); // eslint-disable-line no-new
+
+ initSearchSettings();
});
diff --git a/app/assets/javascripts/pages/projects/feature_flags_user_lists/edit/index.js b/app/assets/javascripts/pages/projects/feature_flags_user_lists/edit/index.js
index bbe84322462..43fd5375222 100644
--- a/app/assets/javascripts/pages/projects/feature_flags_user_lists/edit/index.js
+++ b/app/assets/javascripts/pages/projects/feature_flags_user_lists/edit/index.js
@@ -1,3 +1,5 @@
+/* eslint-disable no-new */
+
import Vue from 'vue';
import Vuex from 'vuex';
import EditUserList from '~/user_lists/components/edit_user_list.vue';
@@ -5,15 +7,13 @@ import createStore from '~/user_lists/store/edit';
Vue.use(Vuex);
-document.addEventListener('DOMContentLoaded', () => {
- const el = document.getElementById('js-edit-user-list');
- const { userListsDocsPath } = el.dataset;
- return new Vue({
- el,
- store: createStore(el.dataset),
- provide: { userListsDocsPath },
- render(h) {
- return h(EditUserList, {});
- },
- });
+const el = document.getElementById('js-edit-user-list');
+const { userListsDocsPath } = el.dataset;
+new Vue({
+ el,
+ store: createStore(el.dataset),
+ provide: { userListsDocsPath },
+ render(h) {
+ return h(EditUserList, {});
+ },
});
diff --git a/app/assets/javascripts/pages/projects/feature_flags_user_lists/new/index.js b/app/assets/javascripts/pages/projects/feature_flags_user_lists/new/index.js
index 679f0af8efc..e855447d5ce 100644
--- a/app/assets/javascripts/pages/projects/feature_flags_user_lists/new/index.js
+++ b/app/assets/javascripts/pages/projects/feature_flags_user_lists/new/index.js
@@ -1,3 +1,5 @@
+/* eslint-disable no-new */
+
import Vue from 'vue';
import Vuex from 'vuex';
import NewUserList from '~/user_lists/components/new_user_list.vue';
@@ -5,18 +7,16 @@ import createStore from '~/user_lists/store/new';
Vue.use(Vuex);
-document.addEventListener('DOMContentLoaded', () => {
- const el = document.getElementById('js-new-user-list');
- const { userListsDocsPath, featureFlagsPath } = el.dataset;
- return new Vue({
- el,
- store: createStore(el.dataset),
- provide: {
- userListsDocsPath,
- featureFlagsPath,
- },
- render(h) {
- return h(NewUserList);
- },
- });
+const el = document.getElementById('js-new-user-list');
+const { userListsDocsPath, featureFlagsPath } = el.dataset;
+new Vue({
+ el,
+ store: createStore(el.dataset),
+ provide: {
+ userListsDocsPath,
+ featureFlagsPath,
+ },
+ render(h) {
+ return h(NewUserList);
+ },
});
diff --git a/app/assets/javascripts/pages/projects/project_members/index.js b/app/assets/javascripts/pages/projects/project_members/index.js
index ed11b07be4a..8d403b7688a 100644
--- a/app/assets/javascripts/pages/projects/project_members/index.js
+++ b/app/assets/javascripts/pages/projects/project_members/index.js
@@ -1,6 +1,7 @@
import Vue from 'vue';
import { deprecatedCreateFlash as flash } from '~/flash';
import groupsSelect from '~/groups_select';
+import initInviteGroupTrigger from '~/invite_members/init_invite_group_trigger';
import initInviteMembersModal from '~/invite_members/init_invite_members_modal';
import initInviteMembersTrigger from '~/invite_members/init_invite_members_trigger';
import { __ } from '~/locale';
@@ -29,6 +30,7 @@ memberExpirationDate('.js-access-expiration-date-groups');
mountRemoveMemberModal();
initInviteMembersModal();
initInviteMembersTrigger();
+initInviteGroupTrigger();
new Members(); // eslint-disable-line no-new
new UsersSelect(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js b/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
index be9259ec3ca..b7e8d4b03ac 100644
--- a/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
+++ b/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
@@ -6,6 +6,7 @@ import initDeployFreeze from '~/deploy_freeze';
import { initInstallRunner } from '~/pages/shared/mount_runner_instructions';
import initSharedRunnersToggle from '~/projects/settings/mount_shared_runners_toggle';
import registrySettingsApp from '~/registry/settings/registry_settings_bundle';
+import initSearchSettings from '~/search_settings';
import initSettingsPanels from '~/settings_panels';
document.addEventListener('DOMContentLoaded', () => {
@@ -42,4 +43,6 @@ document.addEventListener('DOMContentLoaded', () => {
}
initInstallRunner();
+
+ initSearchSettings();
});
diff --git a/app/assets/javascripts/pages/projects/settings/operations/show/index.js b/app/assets/javascripts/pages/projects/settings/operations/show/index.js
index 3a46241e2eb..4a800ab150d 100644
--- a/app/assets/javascripts/pages/projects/settings/operations/show/index.js
+++ b/app/assets/javascripts/pages/projects/settings/operations/show/index.js
@@ -3,6 +3,7 @@ import mountErrorTrackingForm from '~/error_tracking_settings';
import mountGrafanaIntegration from '~/grafana_integration';
import initIncidentsSettings from '~/incidents_settings';
import mountOperationSettings from '~/operation_settings';
+import initSearchSettings from '~/search_settings';
import initSettingsPanels from '~/settings_panels';
initIncidentsSettings();
@@ -13,3 +14,7 @@ if (!IS_EE) {
initSettingsPanels();
}
mountAlertsSettings(document.querySelector('.js-alerts-settings'));
+
+document.addEventListener('DOMContentLoaded', () => {
+ initSearchSettings();
+});
diff --git a/app/assets/javascripts/pages/projects/settings/repository/show/index.js b/app/assets/javascripts/pages/projects/settings/repository/show/index.js
index e90954c14c5..c7bcbb83051 100644
--- a/app/assets/javascripts/pages/projects/settings/repository/show/index.js
+++ b/app/assets/javascripts/pages/projects/settings/repository/show/index.js
@@ -1,4 +1,5 @@
import MirrorRepos from '~/mirrors/mirror_repos';
+import initSearchSettings from '~/search_settings';
import initForm from '../form';
document.addEventListener('DOMContentLoaded', () => {
@@ -6,4 +7,6 @@ document.addEventListener('DOMContentLoaded', () => {
const mirrorReposContainer = document.querySelector('.js-mirror-settings');
if (mirrorReposContainer) new MirrorRepos(mirrorReposContainer).init();
+
+ initSearchSettings();
});
diff --git a/app/assets/javascripts/pages/projects/show/index.js b/app/assets/javascripts/pages/projects/show/index.js
index 0494dad6e33..e5ec9976ac5 100644
--- a/app/assets/javascripts/pages/projects/show/index.js
+++ b/app/assets/javascripts/pages/projects/show/index.js
@@ -24,9 +24,12 @@ new UserCallout({
});
// Project show page loads different overview content based on user preferences
-const treeSlider = document.getElementById('js-tree-list');
-if (treeSlider) {
+
+if (document.querySelector('.js-upload-blob-form')) {
initUploadForm();
+}
+
+if (document.getElementById('js-tree-list')) {
initTree();
}
diff --git a/app/assets/javascripts/pages/projects/tags/new/index.js b/app/assets/javascripts/pages/projects/tags/new/index.js
index 11a19a673b1..b071e7a45fc 100644
--- a/app/assets/javascripts/pages/projects/tags/new/index.js
+++ b/app/assets/javascripts/pages/projects/tags/new/index.js
@@ -3,8 +3,6 @@ import GLForm from '../../../../gl_form';
import RefSelectDropdown from '../../../../ref_select_dropdown';
import ZenMode from '../../../../zen_mode';
-document.addEventListener('DOMContentLoaded', () => {
- new ZenMode(); // eslint-disable-line no-new
- new GLForm($('.tag-form')); // eslint-disable-line no-new
- new RefSelectDropdown($('.js-branch-select')); // eslint-disable-line no-new
-});
+new ZenMode(); // eslint-disable-line no-new
+new GLForm($('.tag-form')); // eslint-disable-line no-new
+new RefSelectDropdown($('.js-branch-select')); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/performance/constants.js b/app/assets/javascripts/performance/constants.js
index 069f3c265f3..4ac758550e0 100644
--- a/app/assets/javascripts/performance/constants.js
+++ b/app/assets/javascripts/performance/constants.js
@@ -54,3 +54,24 @@ export const MR_DIFFS_MARK_DIFF_FILES_END = 'mr-diffs-mark-diff-files-end';
// Measures
export const MR_DIFFS_MEASURE_FILE_TREE_DONE = 'mr-diffs-measure-file-tree-done';
export const MR_DIFFS_MEASURE_DIFF_FILES_DONE = 'mr-diffs-measure-diff-files-done';
+
+//
+// Pipelines Detail namespace
+//
+
+// Marks
+export const PIPELINES_DETAIL_LINKS_MARK_CALCULATE_START =
+ 'pipelines-detail-links-mark-calculate-start';
+export const PIPELINES_DETAIL_LINKS_MARK_CALCULATE_END =
+ 'pipelines-detail-links-mark-calculate-end';
+
+// Measures
+export const PIPELINES_DETAIL_LINKS_MEASURE_CALCULATION =
+ 'Pipelines Detail Graph: Links Calculation';
+
+// Metrics
+// Note: These strings must match the backend
+// (defined in: app/services/ci/prometheus_metrics/observe_histograms_service.rb)
+export const PIPELINES_DETAIL_LINK_DURATION = 'pipeline_graph_link_calculation_duration_seconds';
+export const PIPELINES_DETAIL_LINKS_TOTAL = 'pipeline_graph_links_total';
+export const PIPELINES_DETAIL_LINKS_JOB_RATIO = 'pipeline_graph_link_per_job_ratio';
diff --git a/app/assets/javascripts/performance_bar/components/performance_bar_app.vue b/app/assets/javascripts/performance_bar/components/performance_bar_app.vue
index 85789cd1fdf..232de605e07 100644
--- a/app/assets/javascripts/performance_bar/components/performance_bar_app.vue
+++ b/app/assets/javascripts/performance_bar/components/performance_bar_app.vue
@@ -30,6 +30,10 @@ export default {
type: String,
required: true,
},
+ statsUrl: {
+ type: String,
+ required: true,
+ },
},
detailedMetrics: [
{
@@ -169,6 +173,9 @@ export default {
class="ml-auto"
@change-current-request="changeCurrentRequest"
/>
+ <div v-if="statsUrl" id="peek-stats" class="view">
+ <a class="gl-text-blue-300" :href="statsUrl">{{ s__('PerformanceBar|Stats') }}</a>
+ </div>
</div>
</div>
</template>
diff --git a/app/assets/javascripts/performance_bar/index.js b/app/assets/javascripts/performance_bar/index.js
index 522e34753e9..51b6108868f 100644
--- a/app/assets/javascripts/performance_bar/index.js
+++ b/app/assets/javascripts/performance_bar/index.js
@@ -29,6 +29,7 @@ const initPerformanceBar = (el) => {
requestId: performanceBarData.requestId,
peekUrl: performanceBarData.peekUrl,
profileUrl: performanceBarData.profileUrl,
+ statsUrl: performanceBarData.statsUrl,
};
},
mounted() {
@@ -119,6 +120,7 @@ const initPerformanceBar = (el) => {
requestId: this.requestId,
peekUrl: this.peekUrl,
profileUrl: this.profileUrl,
+ statsUrl: this.statsUrl,
},
on: {
'add-request': this.addRequestManually,
diff --git a/app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_header.vue b/app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_header.vue
index ab41c0170e9..1381cd2f6c3 100644
--- a/app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_header.vue
+++ b/app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_header.vue
@@ -1,12 +1,35 @@
<script>
+import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import PipelineStatus from './pipeline_status.vue';
import ValidationSegment from './validation_segment.vue';
+const baseClasses = ['gl-p-5', 'gl-bg-gray-10', 'gl-border-solid', 'gl-border-gray-100'];
+
+const pipelineStatusClasses = [
+ ...baseClasses,
+ 'gl-border-1',
+ 'gl-border-b-0!',
+ 'gl-rounded-top-base',
+];
+
+const validationSegmentClasses = [...baseClasses, 'gl-border-1', 'gl-rounded-base'];
+
+const validationSegmentWithPipelineStatusClasses = [
+ ...baseClasses,
+ 'gl-border-1',
+ 'gl-rounded-bottom-left-base',
+ 'gl-rounded-bottom-right-base',
+];
+
export default {
- validationSegmentClasses:
- 'gl-p-5 gl-bg-gray-10 gl-border-solid gl-border-1 gl-border-gray-100 gl-rounded-base',
+ pipelineStatusClasses,
+ validationSegmentClasses,
+ validationSegmentWithPipelineStatusClasses,
components: {
+ PipelineStatus,
ValidationSegment,
},
+ mixins: [glFeatureFlagsMixin()],
props: {
ciConfigData: {
type: Object,
@@ -17,12 +40,25 @@ export default {
required: true,
},
},
+ computed: {
+ showPipelineStatus() {
+ return this.glFeatures.pipelineStatusForPipelineEditor;
+ },
+ // make sure corners are rounded correctly depending on if
+ // pipeline status is rendered
+ validationStyling() {
+ return this.showPipelineStatus
+ ? this.$options.validationSegmentWithPipelineStatusClasses
+ : this.$options.validationSegmentClasses;
+ },
+ },
};
</script>
<template>
<div class="gl-mb-5">
+ <pipeline-status v-if="showPipelineStatus" :class="$options.pipelineStatusClasses" />
<validation-segment
- :class="$options.validationSegmentClasses"
+ :class="validationStyling"
:loading="isCiConfigDataLoading"
:ci-config="ciConfigData"
/>
diff --git a/app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue b/app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue
new file mode 100644
index 00000000000..b1ea464be99
--- /dev/null
+++ b/app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue
@@ -0,0 +1,120 @@
+<script>
+import { GlIcon, GlLink, GlLoadingIcon, GlSprintf } from '@gitlab/ui';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { s__ } from '~/locale';
+import getCommitSha from '~/pipeline_editor/graphql/queries/client/commit_sha.graphql';
+import getPipelineQuery from '~/pipeline_editor/graphql/queries/client/pipeline.graphql';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
+
+const POLL_INTERVAL = 10000;
+export const i18n = {
+ fetchError: s__('Pipeline|We are currently unable to fetch pipeline data'),
+ fetchLoading: s__('Pipeline|Checking pipeline status'),
+ pipelineInfo: s__(
+ `Pipeline|Pipeline %{idStart}#%{idEnd} %{statusStart}%{statusEnd} for %{commitStart}%{commitEnd}`,
+ ),
+};
+
+export default {
+ i18n,
+ components: {
+ CiIcon,
+ GlIcon,
+ GlLink,
+ GlLoadingIcon,
+ GlSprintf,
+ },
+ inject: ['projectFullPath'],
+ apollo: {
+ commitSha: {
+ query: getCommitSha,
+ },
+ pipeline: {
+ query: getPipelineQuery,
+ variables() {
+ return {
+ fullPath: this.projectFullPath,
+ sha: this.commitSha,
+ };
+ },
+ update: (data) => {
+ const { id, commitPath = '', shortSha = '', detailedStatus = {} } =
+ data.project?.pipeline || {};
+
+ return {
+ id,
+ commitPath,
+ shortSha,
+ detailedStatus,
+ };
+ },
+ error() {
+ this.hasError = true;
+ },
+ pollInterval: POLL_INTERVAL,
+ },
+ },
+ data() {
+ return {
+ hasError: false,
+ };
+ },
+ computed: {
+ hasPipelineData() {
+ return Boolean(this.$apollo.queries.pipeline?.id);
+ },
+ isQueryLoading() {
+ return this.$apollo.queries.pipeline.loading && !this.hasPipelineData;
+ },
+ status() {
+ return this.pipeline.detailedStatus;
+ },
+ pipelineId() {
+ return getIdFromGraphQLId(this.pipeline.id);
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="gl-white-space-nowrap gl-max-w-full">
+ <template v-if="isQueryLoading">
+ <gl-loading-icon class="gl-mr-auto gl-display-inline-block" size="sm" />
+ <span data-testid="pipeline-loading-msg">{{ $options.i18n.fetchLoading }}</span>
+ </template>
+ <template v-else-if="hasError">
+ <gl-icon class="gl-mr-auto" name="warning-solid" />
+ <span data-testid="pipeline-error-msg">{{ $options.i18n.fetchError }}</span>
+ </template>
+ <template v-else>
+ <a :href="status.detailsPath" class="gl-mr-auto">
+ <ci-icon :status="status" :size="18" />
+ </a>
+ <span class="gl-font-weight-bold">
+ <gl-sprintf :message="$options.i18n.pipelineInfo">
+ <template #id="{ content }">
+ <gl-link
+ :href="status.detailsPath"
+ class="pipeline-id gl-font-weight-normal pipeline-number"
+ target="_blank"
+ data-testid="pipeline-id"
+ >
+ {{ content }}{{ pipelineId }}</gl-link
+ >
+ </template>
+ <template #status>{{ status.text }}</template>
+ <template #commit>
+ <gl-link
+ :href="pipeline.commitPath"
+ class="commit-sha gl-font-weight-normal"
+ target="_blank"
+ data-testid="pipeline-commit"
+ >
+ {{ pipeline.shortSha }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
+ </span>
+ </template>
+ </div>
+</template>
diff --git a/app/assets/javascripts/pipeline_editor/graphql/queries/client/pipeline.graphql b/app/assets/javascripts/pipeline_editor/graphql/queries/client/pipeline.graphql
new file mode 100644
index 00000000000..7cc7f92fb60
--- /dev/null
+++ b/app/assets/javascripts/pipeline_editor/graphql/queries/client/pipeline.graphql
@@ -0,0 +1,17 @@
+query getPipeline($fullPath: ID!, $sha: String!) {
+ project(fullPath: $fullPath) @client {
+ pipeline(sha: $sha) {
+ commitPath
+ id
+ iid
+ shortSha
+ status
+ detailedStatus {
+ detailsPath
+ icon
+ group
+ text
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/pipeline_editor/graphql/resolvers.js b/app/assets/javascripts/pipeline_editor/graphql/resolvers.js
index 81e75c32846..13f6200693b 100644
--- a/app/assets/javascripts/pipeline_editor/graphql/resolvers.js
+++ b/app/assets/javascripts/pipeline_editor/graphql/resolvers.js
@@ -11,6 +11,29 @@ export const resolvers = {
}),
};
},
+
+ /* eslint-disable @gitlab/require-i18n-strings */
+ project() {
+ return {
+ __typename: 'Project',
+ pipeline: {
+ __typename: 'Pipeline',
+ commitPath: `/-/commit/aabbccdd`,
+ id: 'gid://gitlab/Ci::Pipeline/118',
+ iid: '28',
+ shortSha: 'aabbccdd',
+ status: 'SUCCESS',
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ detailsPath: '/root/sample-ci-project/-/pipelines/118"',
+ group: 'success',
+ icon: 'status_success',
+ text: 'passed',
+ },
+ },
+ };
+ },
+ /* eslint-enable @gitlab/require-i18n-strings */
},
Mutation: {
lintCI: (_, { endpoint, content, dry_run }) => {
diff --git a/app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue b/app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue
index 5070971c563..bd112697b49 100644
--- a/app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue
+++ b/app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue
@@ -17,6 +17,7 @@ import {
GlLoadingIcon,
GlSafeHtmlDirective as SafeHtml,
} from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
import { uniqueId } from 'lodash';
import Vue from 'vue';
import axios from '~/lib/utils/axios_utils';
@@ -24,7 +25,6 @@ import { backOff } from '~/lib/utils/common_utils';
import httpStatusCodes from '~/lib/utils/http_status';
import { redirectTo } from '~/lib/utils/url_utility';
import { s__, __, n__ } from '~/locale';
-import * as Sentry from '~/sentry/wrapper';
import { VARIABLE_TYPE, FILE_TYPE, CONFIG_VARIABLES_TIMEOUT } from '../constants';
export default {
diff --git a/app/assets/javascripts/pipelines/components/graph/graph_component.vue b/app/assets/javascripts/pipelines/components/graph/graph_component.vue
index 93156d5d05b..0d81a383009 100644
--- a/app/assets/javascripts/pipelines/components/graph/graph_component.vue
+++ b/app/assets/javascripts/pipelines/components/graph/graph_component.vue
@@ -15,14 +15,19 @@ export default {
StageColumnComponent,
},
props: {
+ pipeline: {
+ type: Object,
+ required: true,
+ },
isLinkedPipeline: {
type: Boolean,
required: false,
default: false,
},
- pipeline: {
- type: Object,
- required: true,
+ metricsPath: {
+ type: String,
+ required: false,
+ default: '',
},
type: {
type: String,
@@ -66,6 +71,12 @@ export default {
hasUpstreamPipelines() {
return Boolean(this.pipeline?.upstream?.length > 0);
},
+ metricsConfig() {
+ return {
+ path: this.metricsPath,
+ collectMetrics: true,
+ };
+ },
// The show downstream check prevents showing redundant linked columns
showDownstreamPipelines() {
return (
@@ -145,6 +156,7 @@ export default {
:container-id="containerId"
:container-measurements="measurements"
:highlighted-job="hoveredJobName"
+ :metrics-config="metricsConfig"
default-link-color="gl-stroke-transparent"
@error="onError"
@highlightedJobsChange="updateHighlightedJobs"
diff --git a/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue b/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
index f596333237d..0e6d268fc19 100644
--- a/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
+++ b/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
@@ -2,7 +2,7 @@
import { GlAlert, GlLoadingIcon } from '@gitlab/ui';
import getPipelineDetails from 'shared_queries/pipelines/get_pipeline_details.query.graphql';
import { __ } from '~/locale';
-import { DEFAULT, LOAD_FAILURE } from '../../constants';
+import { DEFAULT, DRAW_FAILURE, LOAD_FAILURE } from '../../constants';
import PipelineGraph from './graph_component.vue';
import { unwrapPipelineData, toggleQueryPollingByVisibility, reportToSentry } from './utils';
@@ -14,6 +14,9 @@ export default {
PipelineGraph,
},
inject: {
+ metricsPath: {
+ default: '',
+ },
pipelineIid: {
default: '',
},
@@ -29,6 +32,7 @@ export default {
};
},
errorTexts: {
+ [DRAW_FAILURE]: __('An error occurred while drawing job relationship links.'),
[LOAD_FAILURE]: __('We are currently unable to fetch data for this pipeline.'),
[DEFAULT]: __('An unknown error occurred while loading this graph.'),
},
@@ -53,6 +57,11 @@ export default {
computed: {
alert() {
switch (this.alertType) {
+ case DRAW_FAILURE:
+ return {
+ text: this.$options.errorTexts[DRAW_FAILURE],
+ variant: 'danger',
+ };
case LOAD_FAILURE:
return {
text: this.$options.errorTexts[LOAD_FAILURE],
@@ -88,8 +97,8 @@ export default {
},
reportFailure(type) {
this.showAlert = true;
- this.failureType = type;
- reportToSentry(this.$options.name, this.failureType);
+ this.alertType = type;
+ reportToSentry(this.$options.name, this.alertType);
},
},
};
@@ -102,6 +111,7 @@ export default {
<gl-loading-icon v-if="showLoadingIcon" class="gl-mx-auto gl-my-4" size="lg" />
<pipeline-graph
v-if="pipeline"
+ :metrics-path="metricsPath"
:pipeline="pipeline"
@error="reportFailure"
@refreshPipelineGraph="refreshPipelineGraph"
diff --git a/app/assets/javascripts/pipelines/components/graph/utils.js b/app/assets/javascripts/pipelines/components/graph/utils.js
index 1a935599bfa..94807ea41b1 100644
--- a/app/assets/javascripts/pipelines/components/graph/utils.js
+++ b/app/assets/javascripts/pipelines/components/graph/utils.js
@@ -1,6 +1,6 @@
+import * as Sentry from '@sentry/browser';
import Visibility from 'visibilityjs';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import * as Sentry from '~/sentry/wrapper';
import { unwrapStagesWithNeeds } from '../unwrapping_utils';
const addMulti = (mainPipelineProjectPath, linkedPipeline) => {
diff --git a/app/assets/javascripts/pipelines/components/graph_shared/api.js b/app/assets/javascripts/pipelines/components/graph_shared/api.js
new file mode 100644
index 00000000000..04ac15ae24c
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/graph_shared/api.js
@@ -0,0 +1,8 @@
+import axios from '~/lib/utils/axios_utils';
+import { reportToSentry } from '../graph/utils';
+
+export const reportPerformance = (path, stats) => {
+ axios.post(path, stats).catch((err) => {
+ reportToSentry('links_inner_perf', `error: ${err}`);
+ });
+};
diff --git a/app/assets/javascripts/pipelines/components/graph_shared/links_inner.vue b/app/assets/javascripts/pipelines/components/graph_shared/links_inner.vue
index 289e04e02c5..84ca0bf1443 100644
--- a/app/assets/javascripts/pipelines/components/graph_shared/links_inner.vue
+++ b/app/assets/javascripts/pipelines/components/graph_shared/links_inner.vue
@@ -1,8 +1,19 @@
<script>
import { isEmpty } from 'lodash';
+import {
+ PIPELINES_DETAIL_LINKS_MARK_CALCULATE_START,
+ PIPELINES_DETAIL_LINKS_MARK_CALCULATE_END,
+ PIPELINES_DETAIL_LINKS_MEASURE_CALCULATION,
+ PIPELINES_DETAIL_LINK_DURATION,
+ PIPELINES_DETAIL_LINKS_TOTAL,
+ PIPELINES_DETAIL_LINKS_JOB_RATIO,
+} from '~/performance/constants';
+import { performanceMarkAndMeasure } from '~/performance/utils';
import { DRAW_FAILURE } from '../../constants';
import { createJobsHash, generateJobNeedsDict } from '../../utils';
+import { reportToSentry } from '../graph/utils';
import { parseData } from '../parsing_utils';
+import { reportPerformance } from './api';
import { generateLinksData } from './drawing_utils';
export default {
@@ -25,6 +36,15 @@ export default {
type: Array,
required: true,
},
+ totalGroups: {
+ type: Number,
+ required: true,
+ },
+ metricsConfig: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
defaultLinkColor: {
type: String,
required: false,
@@ -43,6 +63,9 @@ export default {
};
},
computed: {
+ shouldCollectMetrics() {
+ return this.metricsConfig.collectMetrics && this.metricsConfig.path;
+ },
hasHighlightedJob() {
return Boolean(this.highlightedJob);
},
@@ -87,23 +110,70 @@ export default {
this.$emit('highlightedJobsChange', jobs);
},
},
+ errorCaptured(err, _vm, info) {
+ reportToSentry(this.$options.name, `error: ${err}, info: ${info}`);
+ },
mounted() {
if (!isEmpty(this.pipelineData)) {
this.prepareLinkData();
}
},
methods: {
+ beginPerfMeasure() {
+ if (this.shouldCollectMetrics) {
+ performanceMarkAndMeasure({ mark: PIPELINES_DETAIL_LINKS_MARK_CALCULATE_START });
+ }
+ },
+ finishPerfMeasureAndSend() {
+ if (this.shouldCollectMetrics) {
+ performanceMarkAndMeasure({
+ mark: PIPELINES_DETAIL_LINKS_MARK_CALCULATE_END,
+ measures: [
+ {
+ name: PIPELINES_DETAIL_LINKS_MEASURE_CALCULATION,
+ start: PIPELINES_DETAIL_LINKS_MARK_CALCULATE_START,
+ },
+ ],
+ });
+ }
+
+ window.requestAnimationFrame(() => {
+ const duration = window.performance.getEntriesByName(
+ PIPELINES_DETAIL_LINKS_MEASURE_CALCULATION,
+ )[0]?.duration;
+
+ if (!duration) {
+ return;
+ }
+
+ const data = {
+ histograms: [
+ { name: PIPELINES_DETAIL_LINK_DURATION, value: duration },
+ { name: PIPELINES_DETAIL_LINKS_TOTAL, value: this.links.length },
+ {
+ name: PIPELINES_DETAIL_LINKS_JOB_RATIO,
+ value: this.links.length / this.totalGroups,
+ },
+ ],
+ };
+
+ reportPerformance(this.metricsConfig.path, data);
+ });
+ },
isLinkHighlighted(linkRef) {
return this.highlightedLinks.includes(linkRef);
},
prepareLinkData() {
+ this.beginPerfMeasure();
try {
const arrayOfJobs = this.pipelineData.flatMap(({ groups }) => groups);
const parsedData = parseData(arrayOfJobs);
this.links = generateLinksData(parsedData, this.containerId, `-${this.pipelineId}`);
- } catch {
+ } catch (err) {
this.$emit('error', DRAW_FAILURE);
+ reportToSentry(this.$options.name, err);
}
+ this.finishPerfMeasureAndSend();
},
getLinkClasses(link) {
return [
diff --git a/app/assets/javascripts/pipelines/components/graph_shared/links_layer.vue b/app/assets/javascripts/pipelines/components/graph_shared/links_layer.vue
index 1c1bc7ecb2a..baf0a4d50de 100644
--- a/app/assets/javascripts/pipelines/components/graph_shared/links_layer.vue
+++ b/app/assets/javascripts/pipelines/components/graph_shared/links_layer.vue
@@ -1,6 +1,7 @@
<script>
import { GlAlert } from '@gitlab/ui';
import { __ } from '~/locale';
+import { reportToSentry } from '../graph/utils';
import LinksInner from './links_inner.vue';
export default {
@@ -50,6 +51,9 @@ export default {
);
},
},
+ errorCaptured(err, _vm, info) {
+ reportToSentry(this.$options.name, `error: ${err}, info: ${info}`);
+ },
methods: {
dismissAlert() {
this.alertDismissed = true;
@@ -66,6 +70,7 @@ export default {
v-if="showLinkedLayers"
:container-measurements="containerMeasurements"
:pipeline-data="pipelineData"
+ :total-groups="numGroups"
v-bind="$attrs"
v-on="$listeners"
>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue
index 8a656bb47f4..90c6acc9e6f 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue
@@ -1,5 +1,6 @@
<script>
import { GlButton } from '@gitlab/ui';
+import { helpPagePath } from '~/helpers/help_page_helper';
import { s__ } from '~/locale';
export default {
@@ -14,10 +15,6 @@ export default {
GlButton,
},
props: {
- helpPagePath: {
- type: String,
- required: true,
- },
emptyStateSvgPath: {
type: String,
required: true,
@@ -27,6 +24,11 @@ export default {
required: true,
},
},
+ computed: {
+ ciHelpPagePath() {
+ return helpPagePath('ci/quick_start/index.md');
+ },
+ },
};
</script>
<template>
@@ -47,7 +49,7 @@ export default {
<div class="gl-text-center">
<gl-button
- :href="helpPagePath"
+ :href="ciHelpPagePath"
variant="info"
category="primary"
data-testid="get-started-pipelines"
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue
index 823ada133d2..a61ffe8f0fc 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue
@@ -1,5 +1,6 @@
<script>
import { GlLink, GlPopover, GlSprintf, GlTooltipDirective, GlBadge } from '@gitlab/ui';
+import { helpPagePath } from '~/helpers/help_page_helper';
import { SCHEDULE_ORIGIN } from '../../constants';
export default {
@@ -26,10 +27,6 @@ export default {
type: String,
required: true,
},
- autoDevopsHelpPath: {
- type: String,
- required: true,
- },
},
computed: {
user() {
@@ -44,6 +41,12 @@ export default {
this.pipeline?.project?.full_path !== `/${this.targetProjectFullPath}`,
);
},
+ autoDevopsTagId() {
+ return `pipeline-url-autodevops-${this.pipeline.id}`;
+ },
+ autoDevopsHelpPath() {
+ return helpPagePath('topics/autodevops/index.md');
+ },
},
};
</script>
@@ -103,38 +106,43 @@ export default {
data-testid="pipeline-url-failure"
>{{ __('error') }}</gl-badge
>
- <gl-link
- v-if="pipeline.flags.auto_devops"
- :id="`pipeline-url-autodevops-${pipeline.id}`"
- tabindex="0"
- data-testid="pipeline-url-autodevops"
- role="button"
- ><gl-badge variant="info" size="sm">{{ __('Auto DevOps') }}</gl-badge></gl-link
- >
- <gl-popover
- :target="`pipeline-url-autodevops-${pipeline.id}`"
- triggers="focus"
- placement="top"
- >
- <template #title>
- <div class="gl-font-weight-normal gl-line-height-normal">
- <gl-sprintf
- :message="
- __(
- 'This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}',
- )
- "
- >
- <template #strong="{ content }">
- <b>{{ content }}</b>
- </template>
- </gl-sprintf>
- </div>
- </template>
- <gl-link :href="autoDevopsHelpPath" target="_blank" rel="noopener noreferrer nofollow">{{
- __('Learn more about Auto DevOps')
- }}</gl-link>
- </gl-popover>
+ <template v-if="pipeline.flags.auto_devops">
+ <gl-link
+ :id="autoDevopsTagId"
+ tabindex="0"
+ data-testid="pipeline-url-autodevops"
+ role="button"
+ >
+ <gl-badge variant="info" size="sm">
+ {{ __('Auto DevOps') }}
+ </gl-badge>
+ </gl-link>
+ <gl-popover :target="autoDevopsTagId" triggers="focus" placement="top">
+ <template #title>
+ <div class="gl-font-weight-normal gl-line-height-normal">
+ <gl-sprintf
+ :message="
+ __(
+ 'This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}',
+ )
+ "
+ >
+ <template #strong="{ content }">
+ <b>{{ content }}</b>
+ </template>
+ </gl-sprintf>
+ </div>
+ </template>
+ <gl-link
+ :href="autoDevopsHelpPath"
+ data-testid="pipeline-url-autodevops-link"
+ target="_blank"
+ >
+ {{ __('Learn more about Auto DevOps') }}
+ </gl-link>
+ </gl-popover>
+ </template>
+
<gl-badge
v-if="pipeline.flags.stuck"
variant="warning"
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue
index 48009a9fcb8..19d93e7d083 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue
@@ -52,10 +52,6 @@ export default {
required: false,
default: '',
},
- helpPagePath: {
- type: String,
- required: true,
- },
emptyStateSvgPath: {
type: String,
required: true,
@@ -68,10 +64,6 @@ export default {
type: String,
required: true,
},
- autoDevopsHelpPath: {
- type: String,
- required: true,
- },
hasGitlabCi: {
type: Boolean,
required: true,
@@ -337,7 +329,6 @@ export default {
<empty-state
v-else-if="stateToRender === $options.stateMap.emptyState"
- :help-page-path="helpPagePath"
:empty-state-svg-path="emptyStateSvgPath"
:can-set-ci="canCreatePipeline"
/>
@@ -362,7 +353,6 @@ export default {
:pipelines="state.pipelines"
:pipeline-schedule-url="pipelineScheduleUrl"
:update-graph-dropdown="updateGraphDropdown"
- :auto-devops-help-path="autoDevopsHelpPath"
:view-type="viewType"
/>
</div>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue
index 24c67184e56..fdc8c3e1866 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue
@@ -32,10 +32,6 @@ export default {
required: false,
default: false,
},
- autoDevopsHelpPath: {
- type: String,
- required: true,
- },
viewType: {
type: String,
required: true,
@@ -102,7 +98,6 @@ export default {
:pipeline="model"
:pipeline-schedule-url="pipelineScheduleUrl"
:update-graph-dropdown="updateGraphDropdown"
- :auto-devops-help-path="autoDevopsHelpPath"
:view-type="viewType"
:canceling-pipeline="cancelingPipeline"
/>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table_row.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table_row.vue
index 572abe2a24a..68deca313eb 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table_row.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table_row.vue
@@ -47,10 +47,6 @@ export default {
required: false,
default: false,
},
- autoDevopsHelpPath: {
- type: String,
- required: true,
- },
viewType: {
type: String,
required: true,
@@ -194,11 +190,7 @@ export default {
</div>
</div>
- <pipeline-url
- :pipeline="pipeline"
- :pipeline-schedule-url="pipelineScheduleUrl"
- :auto-devops-help-path="autoDevopsHelpPath"
- />
+ <pipeline-url :pipeline="pipeline" :pipeline-schedule-url="pipelineScheduleUrl" />
<pipeline-triggerer :pipeline="pipeline" />
<div class="table-section section-wrap section-20">
diff --git a/app/assets/javascripts/pipelines/pipeline_details_bundle.js b/app/assets/javascripts/pipelines/pipeline_details_bundle.js
index f837851e5c1..e287f188523 100644
--- a/app/assets/javascripts/pipelines/pipeline_details_bundle.js
+++ b/app/assets/javascripts/pipelines/pipeline_details_bundle.js
@@ -93,8 +93,13 @@ export default async function initPipelineDetailsBundle() {
/* webpackChunkName: 'createPipelinesDetailApp' */ './pipeline_details_graph'
);
- const { pipelineProjectPath, pipelineIid } = dataset;
- createPipelinesDetailApp(SELECTORS.PIPELINE_GRAPH, pipelineProjectPath, pipelineIid);
+ const { metricsPath, pipelineProjectPath, pipelineIid } = dataset;
+ createPipelinesDetailApp(
+ SELECTORS.PIPELINE_GRAPH,
+ pipelineProjectPath,
+ pipelineIid,
+ metricsPath,
+ );
} catch {
Flash(__('An error occurred while loading the pipeline.'));
}
diff --git a/app/assets/javascripts/pipelines/pipeline_details_graph.js b/app/assets/javascripts/pipelines/pipeline_details_graph.js
index 55f3731a3ca..a5e2c792ffd 100644
--- a/app/assets/javascripts/pipelines/pipeline_details_graph.js
+++ b/app/assets/javascripts/pipelines/pipeline_details_graph.js
@@ -16,7 +16,7 @@ const apolloProvider = new VueApollo({
),
});
-const createPipelinesDetailApp = (selector, pipelineProjectPath, pipelineIid) => {
+const createPipelinesDetailApp = (selector, pipelineProjectPath, pipelineIid, metricsPath) => {
// eslint-disable-next-line no-new
new Vue({
el: selector,
@@ -25,6 +25,7 @@ const createPipelinesDetailApp = (selector, pipelineProjectPath, pipelineIid) =>
},
apolloProvider,
provide: {
+ metricsPath,
pipelineProjectPath,
pipelineIid,
dataMethod: GRAPHQL,
diff --git a/app/assets/javascripts/pipelines/pipelines_index.js b/app/assets/javascripts/pipelines/pipelines_index.js
index 7bcc51e18e5..0e2e9785956 100644
--- a/app/assets/javascripts/pipelines/pipelines_index.js
+++ b/app/assets/javascripts/pipelines/pipelines_index.js
@@ -23,11 +23,9 @@ export const initPipelinesIndex = (selector = '#pipelines-list-vue') => {
const {
endpoint,
pipelineScheduleUrl,
- helpPagePath,
emptyStateSvgPath,
errorStateSvgPath,
noPipelinesSvgPath,
- autoDevopsHelpPath,
newPipelinePath,
canCreatePipeline,
hasGitlabCi,
@@ -56,11 +54,9 @@ export const initPipelinesIndex = (selector = '#pipelines-list-vue') => {
store: this.store,
endpoint,
pipelineScheduleUrl,
- helpPagePath,
emptyStateSvgPath,
errorStateSvgPath,
noPipelinesSvgPath,
- autoDevopsHelpPath,
newPipelinePath,
canCreatePipeline: parseBoolean(canCreatePipeline),
hasGitlabCi: parseBoolean(hasGitlabCi),
diff --git a/app/assets/javascripts/profile/profile.js b/app/assets/javascripts/profile/profile.js
index a7332b81b9f..dad2c18fb18 100644
--- a/app/assets/javascripts/profile/profile.js
+++ b/app/assets/javascripts/profile/profile.js
@@ -95,6 +95,7 @@ export default class Profile {
updateHeaderAvatar() {
$('.header-user-avatar').attr('src', this.avatarGlCrop.dataURL);
+ $('.js-sidebar-user-avatar').attr('src', this.avatarGlCrop.dataURL);
}
setRepoRadio() {
diff --git a/app/assets/javascripts/projects/commits/store/actions.js b/app/assets/javascripts/projects/commits/store/actions.js
index 72d4f0c31e5..741dc20b1f1 100644
--- a/app/assets/javascripts/projects/commits/store/actions.js
+++ b/app/assets/javascripts/projects/commits/store/actions.js
@@ -1,8 +1,8 @@
+import * as Sentry from '@sentry/browser';
import { deprecatedCreateFlash as createFlash } from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { joinPaths } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
-import * as Sentry from '~/sentry/wrapper';
import * as types from './mutation_types';
export default {
diff --git a/app/assets/javascripts/projects/compare/components/app.vue b/app/assets/javascripts/projects/compare/components/app.vue
index 05bd0f1370b..bee93e434d6 100644
--- a/app/assets/javascripts/projects/compare/components/app.vue
+++ b/app/assets/javascripts/projects/compare/components/app.vue
@@ -69,21 +69,21 @@ export default {
<gl-button category="primary" variant="success" class="gl-ml-3" @click="onSubmit">
{{ s__('CompareRevisions|Compare') }}
</gl-button>
- <a
+ <gl-button
v-if="projectMergeRequestPath"
:href="projectMergeRequestPath"
data-testid="projectMrButton"
class="btn btn-default gl-button gl-ml-3"
>
{{ s__('CompareRevisions|View open merge request') }}
- </a>
- <a
+ </gl-button>
+ <gl-button
v-else-if="createMrPath"
:href="createMrPath"
data-testid="createMrButton"
class="btn btn-default gl-button gl-ml-3"
>
{{ s__('CompareRevisions|Create merge request') }}
- </a>
+ </gl-button>
</form>
</template>
diff --git a/app/assets/javascripts/projects/pipelines/charts/components/pipeline_charts.vue b/app/assets/javascripts/projects/pipelines/charts/components/pipeline_charts.vue
index 733f833d51a..09ca1fbe6c6 100644
--- a/app/assets/javascripts/projects/pipelines/charts/components/pipeline_charts.vue
+++ b/app/assets/javascripts/projects/pipelines/charts/components/pipeline_charts.vue
@@ -252,10 +252,10 @@ export default {
},
errorTexts: {
[LOAD_ANALYTICS_FAILURE]: s__(
- 'PipelineCharts|An error has ocurred when retrieving the analytics data',
+ 'PipelineCharts|An error has occurred when retrieving the analytics data',
),
[LOAD_PIPELINES_FAILURE]: s__(
- 'PipelineCharts|An error has ocurred when retrieving the pipelines data',
+ 'PipelineCharts|An error has occurred when retrieving the pipelines data',
),
[PARSE_FAILURE]: s__('PipelineCharts|There was an error parsing the data for the charts.'),
[DEFAULT]: s__('PipelineCharts|An unknown error occurred while processing CI/CD analytics.'),
diff --git a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
index 9b3c0dd2755..fb00f58abae 100644
--- a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
+++ b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
@@ -95,7 +95,7 @@ export default {
})
.catch((err) => {
this.showAlert(
- sprintf(__('An error occured while saving changes: %{error}'), {
+ sprintf(__('An error occurred while saving changes: %{error}'), {
error: err?.response?.data?.message,
}),
);
diff --git a/app/assets/javascripts/projects/upload_file_experiment.js b/app/assets/javascripts/projects/upload_file_experiment.js
new file mode 100644
index 00000000000..c2a68043489
--- /dev/null
+++ b/app/assets/javascripts/projects/upload_file_experiment.js
@@ -0,0 +1,21 @@
+import ExperimentTracking from '~/experiment_tracking';
+
+function trackEvent(eventName) {
+ const Tracking = new ExperimentTracking('empty_repo_upload', { label: 'blob-upload-modal' });
+
+ Tracking.event(eventName);
+}
+
+export function initUploadFileTrigger() {
+ const uploadFileTriggerEl = document.querySelector('.js-upload-file-experiment-trigger');
+
+ if (uploadFileTriggerEl) {
+ uploadFileTriggerEl.addEventListener('click', () => {
+ trackEvent('click_upload_modal_trigger');
+ });
+ }
+}
+
+export function trackUploadFileFormSubmitted() {
+ trackEvent('click_upload_modal_form_submit');
+}
diff --git a/app/assets/javascripts/reports/components/grouped_test_reports_app.vue b/app/assets/javascripts/reports/components/grouped_test_reports_app.vue
index 033b8798473..466fbab6841 100644
--- a/app/assets/javascripts/reports/components/grouped_test_reports_app.vue
+++ b/app/assets/javascripts/reports/components/grouped_test_reports_app.vue
@@ -86,7 +86,7 @@ export default {
}
if (!report.name) {
- return s__('Reports|An error occured while loading report');
+ return s__('Reports|An error occurred while loading report');
}
return reportTextBuilder(name, summary);
diff --git a/app/assets/javascripts/security_configuration/components/configuration_table.vue b/app/assets/javascripts/security_configuration/components/configuration_table.vue
index 9475cc1781f..d1ac7190c37 100644
--- a/app/assets/javascripts/security_configuration/components/configuration_table.vue
+++ b/app/assets/javascripts/security_configuration/components/configuration_table.vue
@@ -4,6 +4,7 @@ import { s__, sprintf } from '~/locale';
import {
REPORT_TYPE_SAST,
REPORT_TYPE_DAST,
+ REPORT_TYPE_DAST_PROFILES,
REPORT_TYPE_DEPENDENCY_SCANNING,
REPORT_TYPE_CONTAINER_SCANNING,
REPORT_TYPE_COVERAGE_FUZZING,
@@ -40,6 +41,7 @@ export default {
const COMPONENTS = {
[REPORT_TYPE_SAST]: ManageSast,
[REPORT_TYPE_DAST]: Upgrade,
+ [REPORT_TYPE_DAST_PROFILES]: Upgrade,
[REPORT_TYPE_DEPENDENCY_SCANNING]: Upgrade,
[REPORT_TYPE_CONTAINER_SCANNING]: Upgrade,
[REPORT_TYPE_COVERAGE_FUZZING]: Upgrade,
@@ -81,7 +83,8 @@ export default {
{{ item.description }}
<gl-link
target="_blank"
- :href="item.link"
+ data-testid="help-link"
+ :href="item.helpPath"
:aria-label="getFeatureDocumentationLinkLabel(item)"
>
{{ s__('SecurityConfiguration|More information') }}
diff --git a/app/assets/javascripts/security_configuration/components/features_constants.js b/app/assets/javascripts/security_configuration/components/features_constants.js
index d846a2761d9..c0eef0611a0 100644
--- a/app/assets/javascripts/security_configuration/components/features_constants.js
+++ b/app/assets/javascripts/security_configuration/components/features_constants.js
@@ -4,6 +4,7 @@ import { s__ } from '~/locale';
import {
REPORT_TYPE_SAST,
REPORT_TYPE_DAST,
+ REPORT_TYPE_DAST_PROFILES,
REPORT_TYPE_SECRET_DETECTION,
REPORT_TYPE_DEPENDENCY_SCANNING,
REPORT_TYPE_CONTAINER_SCANNING,
@@ -22,6 +23,10 @@ export const DAST_NAME = s__('Dynamic Application Security Testing (DAST)');
export const DAST_DESCRIPTION = s__('Analyze a review version of your web application.');
export const DAST_HELP_PATH = helpPagePath('user/application_security/dast/index');
+export const DAST_PROFILES_NAME = s__('DAST Scans');
+export const DAST_PROFILES_DESCRIPTION = s__('Analyze a review version of your web application.');
+export const DAST_PROFILES_HELP_PATH = helpPagePath('user/application_security/dast/index');
+
export const SECRET_DETECTION_NAME = s__('Secret Detection');
export const SECRET_DETECTION_DESCRIPTION = s__(
'Analyze your source code and git history for secrets.',
@@ -80,6 +85,12 @@ export const features = [
type: REPORT_TYPE_DAST,
},
{
+ name: DAST_PROFILES_NAME,
+ description: DAST_PROFILES_DESCRIPTION,
+ helpPath: DAST_PROFILES_HELP_PATH,
+ type: REPORT_TYPE_DAST_PROFILES,
+ },
+ {
name: SECRET_DETECTION_NAME,
description: SECRET_DETECTION_DESCRIPTION,
helpPath: SECRET_DETECTION_HELP_PATH,
diff --git a/app/assets/javascripts/sentry/sentry_config.js b/app/assets/javascripts/sentry/sentry_config.js
index 4277ffec545..bc3b2f16a6a 100644
--- a/app/assets/javascripts/sentry/sentry_config.js
+++ b/app/assets/javascripts/sentry/sentry_config.js
@@ -1,6 +1,6 @@
+import * as Sentry from '@sentry/browser';
import $ from 'jquery';
import { __ } from '~/locale';
-import * as Sentry from '~/sentry/wrapper';
const IGNORE_ERRORS = [
// Random plugins/extensions
diff --git a/app/assets/javascripts/sentry/wrapper.js b/app/assets/javascripts/sentry/wrapper.js
deleted file mode 100644
index 24039e6141c..00000000000
--- a/app/assets/javascripts/sentry/wrapper.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// Temporarily commented out to investigate performance: https://gitlab.com/gitlab-org/gitlab/-/issues/251179
-// export * from '@sentry/browser';
-
-export function init(...args) {
- return args;
-}
-
-export function setUser(...args) {
- return args;
-}
-
-export function captureException(...args) {
- return args;
-}
-
-export function captureMessage(...args) {
- return args;
-}
-
-export function withScope(fn) {
- fn({
- setTag(...args) {
- return args;
- },
- });
-}
diff --git a/app/assets/javascripts/sidebar/components/subscriptions/subscriptions.vue b/app/assets/javascripts/sidebar/components/subscriptions/subscriptions.vue
index 9b06c20a6f3..c0424dc2873 100644
--- a/app/assets/javascripts/sidebar/components/subscriptions/subscriptions.vue
+++ b/app/assets/javascripts/sidebar/components/subscriptions/subscriptions.vue
@@ -122,6 +122,8 @@ export default {
:value="subscribed"
class="hide-collapsed"
data-testid="subscription-toggle"
+ :label="__('Notifications')"
+ label-position="hidden"
@change="toggleSubscription"
/>
</div>
diff --git a/app/assets/javascripts/sidebar/components/time_tracking/help_state.vue b/app/assets/javascripts/sidebar/components/time_tracking/help_state.vue
index e0f60b9af08..d1a5685fdd3 100644
--- a/app/assets/javascripts/sidebar/components/time_tracking/help_state.vue
+++ b/app/assets/javascripts/sidebar/components/time_tracking/help_state.vue
@@ -1,10 +1,14 @@
<script>
/* eslint-disable vue/no-v-html */
+import { GlButton } from '@gitlab/ui';
import { joinPaths } from '~/lib/utils/url_utility';
import { sprintf, s__ } from '../../../locale';
export default {
name: 'TimeTrackingHelpState',
+ components: {
+ GlButton,
+ },
computed: {
href() {
return joinPaths(gon.relative_url_root || '', '/help/user/project/time_tracking.md');
@@ -40,7 +44,7 @@ export default {
<p>{{ __('Quick actions can be used in the issues description and comment boxes.') }}</p>
<p v-html="estimateText"></p>
<p v-html="spendText"></p>
- <a :href="href" class="btn btn-default learn-more-button"> {{ __('Learn more') }} </a>
+ <gl-button :href="href">{{ __('Learn more') }}</gl-button>
</div>
</div>
</template>
diff --git a/app/assets/javascripts/static_site_editor/constants.js b/app/assets/javascripts/static_site_editor/constants.js
index 4cabd943e22..5fb20b00705 100644
--- a/app/assets/javascripts/static_site_editor/constants.js
+++ b/app/assets/javascripts/static_site_editor/constants.js
@@ -12,7 +12,7 @@ export const SUBMIT_CHANGES_MERGE_REQUEST_ERROR = s__(
'StaticSiteEditor|Could not create merge request.',
);
export const LOAD_CONTENT_ERROR = __(
- 'An error ocurred while loading your content. Please try again.',
+ 'An error occurred while loading your content. Please try again.',
);
export const DEFAULT_FORMATTING_CHANGES_COMMIT_MESSAGE = s__(
diff --git a/app/assets/javascripts/tracking.js b/app/assets/javascripts/tracking.js
index 5d82d56f4ba..db6fca4bd05 100644
--- a/app/assets/javascripts/tracking.js
+++ b/app/assets/javascripts/tracking.js
@@ -1,5 +1,13 @@
import { omitBy, isUndefined } from 'lodash';
+export const STANDARD_CONTEXT = {
+ schema: 'iglu:com.gitlab/gitlab_standard/jsonschema/1-0-3',
+ data: {
+ environment: process.env.NODE_ENV,
+ source: 'gitlab-javascript',
+ },
+};
+
const DEFAULT_SNOWPLOW_OPTIONS = {
namespace: 'gl',
hostname: window.location.hostname,
@@ -67,8 +75,13 @@ export default class Tracking {
// eslint-disable-next-line @gitlab/require-i18n-strings
if (!category) throw new Error('Tracking: no category provided for tracking.');
- const { label, property, value, context } = data;
- const contexts = context ? [context] : undefined;
+ const { label, property, value } = data;
+ const contexts = [STANDARD_CONTEXT];
+
+ if (data.context) {
+ contexts.push(data.context);
+ }
+
return window.snowplow('trackStructEvent', category, action, label, property, value, contexts);
}
@@ -134,7 +147,8 @@ export function initDefaultTrackers() {
if (!Tracking.enabled()) return;
window.snowplow('enableActivityTracking', 30, 30);
- window.snowplow('trackPageView'); // must be after enableActivityTracking
+ // must be after enableActivityTracking
+ window.snowplow('trackPageView', null, [STANDARD_CONTEXT]);
if (window.snowplowOptions.formTracking) window.snowplow('enableFormTracking');
if (window.snowplowOptions.linkClickTracking) window.snowplow('enableLinkClickTracking');
diff --git a/app/assets/javascripts/user_popovers.js b/app/assets/javascripts/user_popovers.js
index c18f4fb46cc..682932f6750 100644
--- a/app/assets/javascripts/user_popovers.js
+++ b/app/assets/javascripts/user_popovers.js
@@ -59,11 +59,33 @@ const populateUserInfo = (user) => {
};
const initializedPopovers = new Map();
+let domObservedForChanges = false;
-export default (elements = document.querySelectorAll('.js-user-link')) => {
+const addPopoversToModifiedTree = new MutationObserver(() => {
+ const userLinks = document?.querySelectorAll('.js-user-link, .gfm-project_member');
+
+ if (userLinks) {
+ addPopovers(userLinks); /* eslint-disable-line no-use-before-define */
+ }
+});
+
+function observeBody() {
+ if (!domObservedForChanges) {
+ addPopoversToModifiedTree.observe(document.body, {
+ subtree: true,
+ childList: true,
+ });
+
+ domObservedForChanges = true;
+ }
+}
+
+export default function addPopovers(elements = document.querySelectorAll('.js-user-link')) {
const userLinks = Array.from(elements);
const UserPopoverComponent = Vue.extend(UserPopover);
+ observeBody();
+
return userLinks
.filter(({ dataset }) => dataset.user || dataset.userId)
.map((el) => {
@@ -105,4 +127,4 @@ export default (elements = document.querySelectorAll('.js-user-link')) => {
return renderedPopover;
});
-};
+}
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue
index 2335e2984e4..31414418e04 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue
@@ -162,7 +162,7 @@ export default {
<rect x="250" y="7" width="84" height="16" rx="4" />
</gl-skeleton-loader>
</div>
- <div v-else class="media-body space-children">
+ <div v-else class="media-body space-children gl-display-flex gl-align-items-center">
<span v-if="shouldBeRebased" class="bold">
{{
s__(`mrWidget|Fast-forward merge is not possible.
diff --git a/app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue b/app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue
index bcea7ca654e..fa1cb311b34 100644
--- a/app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue
+++ b/app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue
@@ -11,12 +11,12 @@ import {
GlButton,
GlSafeHtmlDirective,
} from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
import highlightCurrentUser from '~/behaviors/markdown/highlight_current_user';
import { fetchPolicies } from '~/lib/graphql';
import { toggleContainerClasses } from '~/lib/utils/dom_utils';
import { visitUrl, joinPaths } from '~/lib/utils/url_utility';
import { s__ } from '~/locale';
-import * as Sentry from '~/sentry/wrapper';
import Tracking from '~/tracking';
import initUserPopovers from '~/user_popovers';
import AlertDetailsTable from '~/vue_shared/components/alert_details_table.vue';
@@ -368,7 +368,7 @@ export default {
<alert-details-table :alert="alert" :loading="loading" />
</gl-tab>
<gl-tab
- v-if="isThreatMonitoringPage"
+ v-if="!isThreatMonitoringPage"
:data-testid="$options.tabsConfig[1].id"
:title="$options.tabsConfig[1].title"
>
diff --git a/app/assets/javascripts/vue_shared/alert_details/components/alert_metrics.vue b/app/assets/javascripts/vue_shared/alert_details/components/alert_metrics.vue
index dd4faa03c00..9d5006564ef 100644
--- a/app/assets/javascripts/vue_shared/alert_details/components/alert_metrics.vue
+++ b/app/assets/javascripts/vue_shared/alert_details/components/alert_metrics.vue
@@ -1,7 +1,7 @@
<script>
+import * as Sentry from '@sentry/browser';
import Vue from 'vue';
import Vuex from 'vuex';
-import * as Sentry from '~/sentry/wrapper';
Vue.use(Vuex);
diff --git a/app/assets/javascripts/vue_shared/components/settings/settings_block.vue b/app/assets/javascripts/vue_shared/components/settings/settings_block.vue
index 31094b985a2..92ae4575c52 100644
--- a/app/assets/javascripts/vue_shared/components/settings/settings_block.vue
+++ b/app/assets/javascripts/vue_shared/components/settings/settings_block.vue
@@ -5,6 +5,11 @@ import { __ } from '~/locale';
export default {
components: { GlButton },
props: {
+ slideAnimated: {
+ type: Boolean,
+ default: true,
+ required: false,
+ },
defaultExpanded: {
type: Boolean,
default: false,
@@ -28,7 +33,7 @@ export default {
</script>
<template>
- <section class="settings no-animate" :class="{ expanded }">
+ <section class="settings" :class="{ 'no-animate': !slideAnimated, expanded }">
<div class="settings-header">
<h4><slot name="title"></slot></h4>
<gl-button @click="sectionExpanded = !sectionExpanded">
diff --git a/app/assets/javascripts/vue_shared/components/tabs/tab.vue b/app/assets/javascripts/vue_shared/components/tabs/tab.vue
deleted file mode 100644
index d24c27cfcc3..00000000000
--- a/app/assets/javascripts/vue_shared/components/tabs/tab.vue
+++ /dev/null
@@ -1,47 +0,0 @@
-<script>
-export default {
- props: {
- title: {
- type: String,
- required: false,
- default: '',
- },
- active: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- // props can't be updated, so we map it to data where we can
- localActive: this.active,
- };
- },
- watch: {
- active() {
- this.localActive = this.active;
- },
- },
- created() {
- this.isTab = true;
- },
- updated() {
- if (this.$parent) {
- this.$parent.$forceUpdate();
- }
- },
-};
-</script>
-
-<template>
- <div
- :class="{
- active: localActive,
- }"
- class="tab-pane"
- role="tabpanel"
- >
- <slot></slot>
- </div>
-</template>
diff --git a/app/assets/javascripts/vue_shared/components/tabs/tabs.js b/app/assets/javascripts/vue_shared/components/tabs/tabs.js
deleted file mode 100644
index 233df96a520..00000000000
--- a/app/assets/javascripts/vue_shared/components/tabs/tabs.js
+++ /dev/null
@@ -1,76 +0,0 @@
-export default {
- props: {
- stopPropagation: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- currentIndex: 0,
- tabs: [],
- };
- },
- mounted() {
- this.updateTabs();
- },
- methods: {
- updateTabs() {
- this.tabs = this.$children.filter((child) => child.isTab);
- this.currentIndex = this.tabs.findIndex((tab) => tab.localActive);
- },
- setTab(e, index) {
- if (this.stopPropagation) {
- e.stopPropagation();
- e.preventDefault();
- }
-
- this.tabs[this.currentIndex].localActive = false;
- this.tabs[index].localActive = true;
-
- this.currentIndex = index;
- },
- },
- render(h) {
- const navItems = this.tabs.map((tab, i) =>
- h(
- 'li',
- {
- key: i,
- },
- [
- h(
- 'a',
- {
- class: tab.localActive ? 'active' : null,
- attrs: {
- href: '#',
- },
- on: {
- click: (e) => this.setTab(e, i),
- },
- },
- tab.$slots.title || tab.title,
- ),
- ],
- ),
- );
- const nav = h(
- 'ul',
- {
- class: 'nav-links tab-links',
- },
- [navItems],
- );
- const content = h(
- 'div',
- {
- class: ['tab-content'],
- },
- [this.$slots.default],
- );
-
- return h('div', {}, [[nav], content]);
- },
-};
diff --git a/app/assets/javascripts/vue_shared/components/tooltip_on_truncate.vue b/app/assets/javascripts/vue_shared/components/tooltip_on_truncate.vue
index 8aa6e29adf1..c5fdb5fc242 100644
--- a/app/assets/javascripts/vue_shared/components/tooltip_on_truncate.vue
+++ b/app/assets/javascripts/vue_shared/components/tooltip_on_truncate.vue
@@ -1,11 +1,11 @@
<script>
+import { GlTooltipDirective as GlTooltip } from '@gitlab/ui';
import { isFunction } from 'lodash';
import { hasHorizontalOverflow } from '~/lib/utils/dom_utils';
-import tooltip from '../directives/tooltip';
export default {
directives: {
- tooltip,
+ GlTooltip,
},
props: {
title: {
@@ -59,9 +59,8 @@ export default {
<template>
<span
v-if="showTooltip"
- v-tooltip
+ v-gl-tooltip="{ placement }"
:title="title"
- :data-placement="placement"
class="js-show-tooltip gl-min-w-0"
>
<slot></slot>
diff --git a/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue b/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue
index 5a08e992084..afb1ea702fa 100644
--- a/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue
+++ b/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue
@@ -36,6 +36,11 @@ export default {
required: false,
default: () => [VALID_IMAGE_FILE_MIMETYPE.mimetype],
},
+ singleFileSelection: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
@@ -79,7 +84,7 @@ export default {
return;
}
- this.$emit('change', files);
+ this.$emit('change', this.singleFileSelection ? files[0] : files);
},
ondragenter(e) {
this.dragCounter += 1;
@@ -92,7 +97,7 @@ export default {
this.$refs.fileUpload.click();
},
onFileInputChange(e) {
- this.$emit('change', e.target.files);
+ this.$emit('change', this.singleFileSelection ? e.target.files[0] : e.target.files);
},
},
};
@@ -119,9 +124,15 @@ export default {
data-testid="dropzone-area"
>
<gl-icon name="upload" :size="iconStyles.size" :class="iconStyles.class" />
- <p class="gl-mb-0">
+ <p class="gl-mb-0" data-testid="upload-text">
<slot name="upload-text" :openFileUpload="openFileUpload">
- <gl-sprintf :message="__('Drop or %{linkStart}upload%{linkEnd} files to attach')">
+ <gl-sprintf
+ :message="
+ singleFileSelection
+ ? __('Drop or %{linkStart}upload%{linkEnd} file to attach')
+ : __('Drop or %{linkStart}upload%{linkEnd} files to attach')
+ "
+ >
<template #link="{ content }">
<gl-link @click.stop="openFileUpload">
{{ content }}
@@ -139,7 +150,7 @@ export default {
name="upload_file"
:accept="validFileMimetypes"
class="hide"
- multiple
+ :multiple="!singleFileSelection"
@change="onFileInputChange"
/>
</slot>
diff --git a/app/assets/javascripts/vue_shared/directives/tooltip.js b/app/assets/javascripts/vue_shared/directives/tooltip.js
deleted file mode 100644
index 0eb505bfce8..00000000000
--- a/app/assets/javascripts/vue_shared/directives/tooltip.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import $ from 'jquery';
-import '~/commons/bootstrap';
-import { parseBoolean } from '~/lib/utils/common_utils';
-
-export default {
- bind(el) {
- const glTooltipDelay = localStorage.getItem('gl-tooltip-delay');
- const delay = glTooltipDelay ? JSON.parse(glTooltipDelay) : 0;
-
- $(el).tooltip({
- trigger: 'hover',
- delay,
- // By default, sanitize is run even if there is no `html` or `template` present
- // so let's optimize to only run this when necessary.
- // https://github.com/twbs/bootstrap/blob/c5966de27395a407f9a3d20d0eb2ff8e8fb7b564/js/src/tooltip.js#L716
- sanitize: parseBoolean(el.dataset.html) || Boolean(el.dataset.template),
- });
- },
-
- componentUpdated(el) {
- $(el).tooltip('_fixTitle');
-
- // update visible tooltips
- const tooltipInstance = $(el).data('bs.tooltip');
- const tip = tooltipInstance.getTipElement();
- tooltipInstance.setElementContent(
- $(tip.querySelectorAll('.tooltip-inner')),
- tooltipInstance.getTitle(),
- );
- },
-
- unbind(el) {
- $(el).tooltip('dispose');
- },
-};
diff --git a/app/assets/javascripts/vue_shared/security_reports/constants.js b/app/assets/javascripts/vue_shared/security_reports/constants.js
index aac5a5c1def..56a8853412d 100644
--- a/app/assets/javascripts/vue_shared/security_reports/constants.js
+++ b/app/assets/javascripts/vue_shared/security_reports/constants.js
@@ -18,6 +18,7 @@ export const REPORT_FILE_TYPES = {
*/
export const REPORT_TYPE_SAST = 'sast';
export const REPORT_TYPE_DAST = 'dast';
+export const REPORT_TYPE_DAST_PROFILES = 'dast_profiles';
export const REPORT_TYPE_SECRET_DETECTION = 'secret_detection';
export const REPORT_TYPE_DEPENDENCY_SCANNING = 'dependency_scanning';
export const REPORT_TYPE_CONTAINER_SCANNING = 'container_scanning';
diff --git a/app/assets/stylesheets/framework.scss b/app/assets/stylesheets/framework.scss
index 7931f4deea0..1fe94a796f5 100644
--- a/app/assets/stylesheets/framework.scss
+++ b/app/assets/stylesheets/framework.scss
@@ -42,7 +42,6 @@
@import 'framework/notes';
@import 'framework/tabs';
@import 'framework/timeline';
-@import 'framework/tooltips';
@import 'framework/toggle';
@import 'framework/typography';
@import 'framework/zen';
diff --git a/app/assets/stylesheets/framework/buttons.scss b/app/assets/stylesheets/framework/buttons.scss
index b51fec925cb..91af41c68dd 100644
--- a/app/assets/stylesheets/framework/buttons.scss
+++ b/app/assets/stylesheets/framework/buttons.scss
@@ -216,6 +216,7 @@
color: $gray-700;
}
+ // deprecated class
&.btn-text-field {
width: 100%;
text-align: left;
diff --git a/app/assets/stylesheets/framework/diffs.scss b/app/assets/stylesheets/framework/diffs.scss
index e30caeb1dfb..bd15022eadf 100644
--- a/app/assets/stylesheets/framework/diffs.scss
+++ b/app/assets/stylesheets/framework/diffs.scss
@@ -1035,7 +1035,6 @@ table.code {
auto;
// Retina cursor
- // scss-lint:disable DuplicateProperty
cursor: image-set(image-url('illustrations/image_comment_light_cursor.svg') 1x,
image-url('illustrations/image_comment_light_cursor@2x.svg') 2x) $image-comment-cursor-left-offset $image-comment-cursor-top-offset,
auto;
diff --git a/app/assets/stylesheets/framework/editor-lite.scss b/app/assets/stylesheets/framework/editor-lite.scss
index c3b287a6c3d..eda3e33a6aa 100644
--- a/app/assets/stylesheets/framework/editor-lite.scss
+++ b/app/assets/stylesheets/framework/editor-lite.scss
@@ -3,6 +3,11 @@
@include gl-display-flex;
@include gl-justify-content-center;
@include gl-align-items-center;
+ @include gl-z-index-0;
+
+ > * {
+ filter: blur(5px);
+ }
&::before {
content: '';
diff --git a/app/assets/stylesheets/framework/filters.scss b/app/assets/stylesheets/framework/filters.scss
index 07d59847829..5803b274d9b 100644
--- a/app/assets/stylesheets/framework/filters.scss
+++ b/app/assets/stylesheets/framework/filters.scss
@@ -453,7 +453,7 @@
.search-token-target-branch {
.value {
font-family: $monospace-font;
- font-size: 13px;
+ font-size: $gl-font-size-monospace;
}
}
diff --git a/app/assets/stylesheets/framework/layout.scss b/app/assets/stylesheets/framework/layout.scss
index cac3695e1a1..4f9896dd58a 100644
--- a/app/assets/stylesheets/framework/layout.scss
+++ b/app/assets/stylesheets/framework/layout.scss
@@ -8,9 +8,8 @@ html {
body {
// Improves readability for dyslexic users; supported only in Chrome/Safari so far
- // scss-lint:disable PropertySpelling
text-decoration-skip: ink;
- // scss-lint:enable PropertySpelling
+
&.navless {
background-color: $white !important;
}
diff --git a/app/assets/stylesheets/framework/lists.scss b/app/assets/stylesheets/framework/lists.scss
index b0334da6943..b81e9828dec 100644
--- a/app/assets/stylesheets/framework/lists.scss
+++ b/app/assets/stylesheets/framework/lists.scss
@@ -283,12 +283,6 @@ ul.indent-list {
to { transform: rotate(360deg); }
}
-.namespace-title {
- .tooltip-inner {
- max-width: 350px;
- }
-}
-
.horizontal-list {
padding-left: 0;
list-style: none;
diff --git a/app/assets/stylesheets/framework/mixins.scss b/app/assets/stylesheets/framework/mixins.scss
index e29e204b14f..1e2fc1445e8 100644
--- a/app/assets/stylesheets/framework/mixins.scss
+++ b/app/assets/stylesheets/framework/mixins.scss
@@ -433,7 +433,6 @@
@mixin middle-dot-divider {
&::after {
// Duplicate `content` property used as a fallback
- // scss-lint:disable DuplicateProperty
content: '\00B7'; // middle dot fallback if browser does not support alternative content
content: '\00B7' / ''; // tell screen readers to ignore the content https://www.w3.org/TR/css-content-3/#accessibility
padding: 0 0.375rem;
diff --git a/app/assets/stylesheets/framework/tooltips.scss b/app/assets/stylesheets/framework/tooltips.scss
deleted file mode 100644
index edc2fb532c8..00000000000
--- a/app/assets/stylesheets/framework/tooltips.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-.tooltip-inner {
- font-size: $gl-font-size-small;
- border-radius: $border-radius-default;
- line-height: $gl-line-height;
- font-weight: $gl-font-weight-normal;
-}
diff --git a/app/assets/stylesheets/framework/typography.scss b/app/assets/stylesheets/framework/typography.scss
index 496e2aba421..4852700d878 100644
--- a/app/assets/stylesheets/framework/typography.scss
+++ b/app/assets/stylesheets/framework/typography.scss
@@ -78,7 +78,7 @@
code {
font-family: $monospace-font;
white-space: pre-wrap;
- word-wrap: normal;
+ overflow-wrap: break-word;
word-break: keep-all;
}
@@ -604,7 +604,7 @@ pre {
display: block;
padding: $gl-padding-8 $input-horizontal-padding;
margin: 0 0 $gl-padding-8;
- font-size: 13px;
+ font-size: $gl-font-size-monospace;
word-break: break-all;
word-wrap: break-word;
color: $gl-text-color;
@@ -646,7 +646,7 @@ code {
*/
textarea.js-gfm-input {
font-family: $monospace-font;
- font-size: 13px;
+ font-size: $gl-font-size-monospace;
}
.strikethrough {
@@ -699,13 +699,11 @@ textarea {
opacity: 1; // FF defaults to 0.54
}
- // scss-lint:disable PseudoElement
// support Edge vendor prefix
&::-ms-input-placeholder {
color: $gl-text-color-tertiary;
}
- // scss-lint:disable PseudoElement
// support IE vendor prefix
&:-ms-input-placeholder {
color: $gl-text-color-tertiary;
diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss
index 4bf9236407f..089f130843f 100644
--- a/app/assets/stylesheets/framework/variables.scss
+++ b/app/assets/stylesheets/framework/variables.scss
@@ -443,7 +443,7 @@ $gl-avatar-size: 40px;
$border-radius-default: 4px;
$border-radius-small: 2px;
$border-radius-large: 8px;
-$default-icon-size: 18px;
+$default-icon-size: 16px;
$layout-link-gray: #7e7c7c;
$btn-side-margin: 10px;
$btn-sm-side-margin: 7px;
diff --git a/app/assets/stylesheets/highlight/conflict_colors.scss b/app/assets/stylesheets/highlight/conflict_colors.scss
index 98ca3775b72..910dc6f4ad6 100644
--- a/app/assets/stylesheets/highlight/conflict_colors.scss
+++ b/app/assets/stylesheets/highlight/conflict_colors.scss
@@ -1,5 +1,4 @@
// Disabled to use the color map for creating color schemes
-// scss-lint:disable ColorVariable
$conflict-colors: (
white-header-head-neutral : #e1fad7,
white-line-head-neutral : #effdec,
@@ -116,4 +115,3 @@ $conflict-colors: (
none_line_not_chosen : $gray-light
);
-// scss-lint:enable ColorVariable
diff --git a/app/assets/stylesheets/mailer_client_specific.scss b/app/assets/stylesheets/mailer_client_specific.scss
index 41bedecf90f..0547aa7752f 100644
--- a/app/assets/stylesheets/mailer_client_specific.scss
+++ b/app/assets/stylesheets/mailer_client_specific.scss
@@ -3,7 +3,6 @@
// These are client-specific rules, ignore some linting rules
//
// stylelint-disable property-no-vendor-prefix, property-no-unknown, length-zero-no-unit
-// scss-lint:disable PropertySpelling, ZeroUnit
body,
table,
diff --git a/app/assets/stylesheets/page_bundles/ide.scss b/app/assets/stylesheets/page_bundles/ide.scss
index 7c4d51ab677..009019a45d9 100644
--- a/app/assets/stylesheets/page_bundles/ide.scss
+++ b/app/assets/stylesheets/page_bundles/ide.scss
@@ -1043,8 +1043,7 @@ $ide-commit-header-height: 48px;
.input-icon {
right: auto;
left: 10px;
- top: 50%;
- transform: translateY(-50%);
+ top: 1rem;
}
}
diff --git a/app/assets/stylesheets/page_bundles/jira_connect.scss b/app/assets/stylesheets/page_bundles/jira_connect.scss
index 25401a161da..eb2dd6e578e 100644
--- a/app/assets/stylesheets/page_bundles/jira_connect.scss
+++ b/app/assets/stylesheets/page_bundles/jira_connect.scss
@@ -20,36 +20,23 @@
@import '@gitlab/ui/src/components/base/tooltip/tooltip';
$atlaskit-border-color: #dfe1e6;
+$header-height: 40px;
-.ac-content {
- margin: 20px;
-
- .subscription-form {
- margin-bottom: 20px;
-
- .field-group-input {
- display: flex;
- padding-top: $gl-padding-4;
+.subscription-form {
+ .field-group-input {
+ display: flex;
+ padding-top: $gl-padding-4;
- .ak-button {
- align-items: center;
- height: auto;
- margin-left: $btn-margin-5;
- }
+ .ak-button {
+ align-items: center;
+ height: auto;
+ margin-left: $btn-margin-5;
}
}
}
-$header-height: 40px;
-
.jira-connect-header {
- border-bottom: 1px solid $gray-100;
- display: flex;
- align-items: center;
- justify-content: center;
min-height: $header-height;
- padding-left: 16px;
- padding-right: 16px;
position: fixed;
top: 0;
left: 0;
@@ -57,7 +44,6 @@ $header-height: 40px;
}
.jira-connect-user {
- font-size: $gl-font-size;
position: fixed;
top: 10px;
right: 20px;
@@ -65,20 +51,17 @@ $header-height: 40px;
.jira-connect-app {
margin-top: $header-height;
+ height: calc(100% - #{$header-height});
+ max-width: 1000px;
+}
+
+.jira-connect-app-body {
max-width: 600px;
- min-height: 95vh;
- padding-top: 48px;
- padding-left: 16px;
- padding-right: 16px;
margin-left: auto;
margin-right: auto;
- text-align: center;
-}
-
-.gl-mt-5 {
- margin-top: 16px;
}
+// for external_link buttons
svg {
fill: currentColor;
@@ -115,12 +98,3 @@ svg {
}
}
}
-
-.empty-subscriptions {
- color: $gray-900;
-}
-
-.browser-limitations-notice {
- font-size: $gl-font-size;
- margin-top: 32px;
-}
diff --git a/app/assets/stylesheets/page_bundles/signup.scss b/app/assets/stylesheets/page_bundles/signup.scss
index a207c10b04f..d6c3a3ff5da 100644
--- a/app/assets/stylesheets/page_bundles/signup.scss
+++ b/app/assets/stylesheets/page_bundles/signup.scss
@@ -32,11 +32,6 @@
@include media-breakpoint-down(md) {
width: 100%;
}
-
- img {
- width: $default-icon-size;
- height: $default-icon-size;
- }
}
.decline-page {
diff --git a/app/assets/stylesheets/pages/clusters.scss b/app/assets/stylesheets/pages/clusters.scss
index f7b8a4c5b84..98074f8af29 100644
--- a/app/assets/stylesheets/pages/clusters.scss
+++ b/app/assets/stylesheets/pages/clusters.scss
@@ -105,6 +105,7 @@
border: 0;
&.table-row-header {
+ // stylelint-disable-next-line
background-color: none;
border: 0;
font-weight: bold;
diff --git a/app/assets/stylesheets/pages/login.scss b/app/assets/stylesheets/pages/login.scss
index 019d827798c..2d04354a99d 100644
--- a/app/assets/stylesheets/pages/login.scss
+++ b/app/assets/stylesheets/pages/login.scss
@@ -106,17 +106,6 @@
width: 100%;
}
}
-
- .omniauth-btn {
- width: 100%;
- padding: $gl-padding-8;
-
- img {
- width: $default-icon-size;
- height: $default-icon-size;
- margin-right: $gl-padding;
- }
- }
}
.new-session-tabs {
diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss
index a62df1258af..c20d795b810 100644
--- a/app/assets/stylesheets/pages/merge_requests.scss
+++ b/app/assets/stylesheets/pages/merge_requests.scss
@@ -4,6 +4,7 @@
*/
$mr-widget-min-height: 69px;
+$tabs-holder-z-index: 250;
.space-children {
@include clearfix;
@@ -675,7 +676,7 @@ $mr-widget-min-height: 69px;
.mr-version-controls {
position: relative;
- z-index: 203;
+ z-index: $tabs-holder-z-index + 10;
background: $white;
color: $gl-text-color;
margin-top: -1px;
@@ -745,7 +746,7 @@ $mr-widget-min-height: 69px;
.merge-request-tabs-holder,
.epic-tabs-holder {
top: $header-height;
- z-index: 250;
+ z-index: $tabs-holder-z-index;
background-color: $body-bg;
border-bottom: 1px solid $border-color;
diff --git a/app/assets/stylesheets/pages/note_form.scss b/app/assets/stylesheets/pages/note_form.scss
index ffbfa47f9bd..b1bd15e0bd7 100644
--- a/app/assets/stylesheets/pages/note_form.scss
+++ b/app/assets/stylesheets/pages/note_form.scss
@@ -302,8 +302,21 @@ table {
width: 100%;
}
}
+}
+
+.discussion-reply-holder {
+ .reply-placeholder-text-field {
+ font-family: $monospace-font;
+ font-size: $gl-font-size-monospace;
+ border-radius: $gl-border-radius-base;
+ width: 100%;
+ resize: none;
+ padding: $gl-padding-8 $gl-padding-12;
+ line-height: 1;
+ border: 1px solid $border-color;
+ background-color: $white;
+ overflow: hidden;
- .btn-text-field {
@include media-breakpoint-down(xs) {
margin-bottom: $gl-padding-8;
}
diff --git a/app/assets/stylesheets/startup/startup-signin.scss b/app/assets/stylesheets/startup/startup-signin.scss
index 4b88b94f3a6..6b78abdb5e0 100644
--- a/app/assets/stylesheets/startup/startup-signin.scss
+++ b/app/assets/stylesheets/startup/startup-signin.scss
@@ -2142,11 +2142,6 @@ table.code {
width: 100%;
padding: 8px;
}
-.login-page .omniauth-container .omniauth-btn img {
- width: 1.125rem;
- height: 1.125rem;
- margin-right: 16px;
-}
.login-page .new-session-tabs {
display: flex;
box-shadow: 0 0 0 1px #dbdbdb;
diff --git a/app/assets/stylesheets/themes/theme_helper.scss b/app/assets/stylesheets/themes/theme_helper.scss
index 417377b514e..aae9f3ded4f 100644
--- a/app/assets/stylesheets/themes/theme_helper.scss
+++ b/app/assets/stylesheets/themes/theme_helper.scss
@@ -92,6 +92,7 @@
.notification-dot {
will-change: border-color, background-color;
+ // stylelint-disable-next-line
border-color: $nav-svg-color + 33;
}
diff --git a/app/assets/stylesheets/vendors/atwho.scss b/app/assets/stylesheets/vendors/atwho.scss
index f31dbbeafe8..b92331facee 100644
--- a/app/assets/stylesheets/vendors/atwho.scss
+++ b/app/assets/stylesheets/vendors/atwho.scss
@@ -1,6 +1,7 @@
.atwho-view {
overflow-y: auto;
overflow-x: hidden;
+ max-width: calc(100% - 6px);
.name,
small.aliases,
@@ -80,10 +81,6 @@
}
@include media-breakpoint-down(xs) {
- .atwho-view-ul {
- width: 350px;
- }
-
.atwho-view ul li {
overflow: hidden;
text-overflow: ellipsis;
diff --git a/app/controllers/admin/instance_statistics_controller.rb b/app/controllers/admin/instance_statistics_controller.rb
deleted file mode 100644
index 30891fcfe7c..00000000000
--- a/app/controllers/admin/instance_statistics_controller.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class Admin::InstanceStatisticsController < Admin::ApplicationController
- include Analytics::UniqueVisitsHelper
-
- before_action :check_feature_flag
-
- track_unique_visits :index, target_id: 'i_analytics_instance_statistics'
-
- feature_category :devops_reports
-
- def index
- end
-
- def check_feature_flag
- render_404 unless Feature.enabled?(:instance_statistics, default_enabled: true)
- end
-end
diff --git a/app/controllers/admin/usage_trends_controller.rb b/app/controllers/admin/usage_trends_controller.rb
new file mode 100644
index 00000000000..7073f71a1a8
--- /dev/null
+++ b/app/controllers/admin/usage_trends_controller.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class Admin::UsageTrendsController < Admin::ApplicationController
+ include Analytics::UniqueVisitsHelper
+
+ track_unique_visits :index, target_id: 'i_analytics_instance_statistics'
+
+ feature_category :devops_reports
+
+ def index
+ end
+end
diff --git a/app/controllers/concerns/check_rate_limit.rb b/app/controllers/concerns/check_rate_limit.rb
new file mode 100644
index 00000000000..c4de3315e22
--- /dev/null
+++ b/app/controllers/concerns/check_rate_limit.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+# == CheckRateLimit
+#
+# Controller concern that checks if the rate limit for a given action is throttled by calling the
+# Gitlab::ApplicationRateLimiter class. If the action is throttled for the current user, the request
+# will be logged and an error message will be rendered with a Too Many Requests response status.
+module CheckRateLimit
+ def check_rate_limit(key)
+ return unless rate_limiter.throttled?(key, scope: current_user, users_allowlist: rate_limit_users_allowlist)
+
+ rate_limiter.log_request(request, "#{key}_request_limit".to_sym, current_user)
+ render plain: _('This endpoint has been requested too many times. Try again later.'), status: :too_many_requests
+ end
+
+ def rate_limiter
+ ::Gitlab::ApplicationRateLimiter
+ end
+
+ def rate_limit_users_allowlist
+ Gitlab::CurrentSettings.current_application_settings.notes_create_limit_allowlist
+ end
+end
diff --git a/app/controllers/concerns/comment_and_close_flag.rb b/app/controllers/concerns/comment_and_close_flag.rb
index e2f3272abbc..02a68d2857c 100644
--- a/app/controllers/concerns/comment_and_close_flag.rb
+++ b/app/controllers/concerns/comment_and_close_flag.rb
@@ -5,7 +5,7 @@ module CommentAndCloseFlag
included do
before_action do
- push_frontend_feature_flag(:remove_comment_close_reopen, @group)
+ push_frontend_feature_flag(:remove_comment_close_reopen, @group || @project&.group)
end
end
end
diff --git a/app/controllers/concerns/notes_actions.rb b/app/controllers/concerns/notes_actions.rb
index 036d95622ef..2d8168af2e3 100644
--- a/app/controllers/concerns/notes_actions.rb
+++ b/app/controllers/concerns/notes_actions.rb
@@ -3,6 +3,7 @@
module NotesActions
include RendersNotes
include Gitlab::Utils::StrongMemoize
+ include CheckRateLimit
extend ActiveSupport::Concern
# last_fetched_at is an integer number of microseconds, which is the same
@@ -15,6 +16,7 @@ module NotesActions
before_action :require_noteable!, only: [:index, :create]
before_action :authorize_admin_note!, only: [:update, :destroy]
before_action :note_project, only: [:create]
+ before_action -> { check_rate_limit(:notes_create) }, only: [:create]
end
def index
@@ -31,9 +33,9 @@ module NotesActions
# We know there's more data, so tell the frontend to poll again after 1ms
set_polling_interval_header(interval: 1) if meta[:more]
- # We might still want to investigate further adjusting ETag caching with paginated notes, but
- # let's avoid ETag caching for now until we confirm the viability of paginated notes.
- ::Gitlab::EtagCaching::Middleware.skip!(response)
+ # Only present an ETag for the empty response to ensure pagination works
+ # as expected
+ ::Gitlab::EtagCaching::Middleware.skip!(response) if notes.present?
render json: meta.merge(notes: notes)
end
diff --git a/app/controllers/concerns/security_and_compliance_permissions.rb b/app/controllers/concerns/security_and_compliance_permissions.rb
new file mode 100644
index 00000000000..104f3638bb7
--- /dev/null
+++ b/app/controllers/concerns/security_and_compliance_permissions.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module SecurityAndCompliancePermissions
+ extend ActiveSupport::Concern
+
+ included do
+ before_action :ensure_security_and_compliance_enabled!
+ end
+
+ private
+
+ def ensure_security_and_compliance_enabled!
+ render_404 unless can?(current_user, :access_security_and_compliance, project)
+ end
+end
diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb
index 3bb00978aac..0080ae1a5be 100644
--- a/app/controllers/projects/blob_controller.rb
+++ b/app/controllers/projects/blob_controller.rb
@@ -31,9 +31,7 @@ class Projects::BlobController < Projects::ApplicationController
before_action :editor_variables, except: [:show, :preview, :diff]
before_action :validate_diff_params, only: :diff
before_action :set_last_commit_sha, only: [:edit, :update]
- before_action only: :new do
- record_experiment_user(:ci_syntax_templates, namespace_id: @project.namespace_id) if params[:file_name] == @project.ci_config_path_or_default
- end
+ before_action :record_experiment, only: :new
track_redis_hll_event :create, :update, name: 'g_edit_by_sfe'
@@ -263,4 +261,10 @@ class Projects::BlobController < Projects::ApplicationController
def visitor_id
current_user&.id
end
+
+ def record_experiment
+ return unless params[:file_name] == @project.ci_config_path_or_default && @project.namespace.recent?
+
+ record_experiment_user(:ci_syntax_templates_b, namespace_id: @project.namespace_id)
+ end
end
diff --git a/app/controllers/projects/ci/pipeline_editor_controller.rb b/app/controllers/projects/ci/pipeline_editor_controller.rb
index 3552915b561..79e4ec375b7 100644
--- a/app/controllers/projects/ci/pipeline_editor_controller.rb
+++ b/app/controllers/projects/ci/pipeline_editor_controller.rb
@@ -5,6 +5,7 @@ class Projects::Ci::PipelineEditorController < Projects::ApplicationController
before_action do
push_frontend_feature_flag(:ci_config_visualization_tab, @project, default_enabled: :yaml)
push_frontend_feature_flag(:ci_config_merged_tab, @project, default_enabled: :yaml)
+ push_frontend_feature_flag(:pipeline_status_for_pipeline_editor, @project, default_enabled: :yaml)
end
feature_category :pipeline_authoring
diff --git a/app/controllers/projects/notes_controller.rb b/app/controllers/projects/notes_controller.rb
index 71a93701dc4..77fd7688caf 100644
--- a/app/controllers/projects/notes_controller.rb
+++ b/app/controllers/projects/notes_controller.rb
@@ -10,7 +10,6 @@ class Projects::NotesController < Projects::ApplicationController
before_action :authorize_read_note!
before_action :authorize_create_note!, only: [:create]
before_action :authorize_resolve_note!, only: [:resolve, :unresolve]
- before_action :create_rate_limit, only: [:create]
feature_category :issue_tracking
@@ -91,20 +90,4 @@ class Projects::NotesController < Projects::ApplicationController
def whitelist_query_limiting
Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-foss/issues/42383')
end
-
- def create_rate_limit
- key = :notes_create
- return unless rate_limiter.throttled?(key, scope: [current_user], users_allowlist: rate_limit_users_allowlist)
-
- rate_limiter.log_request(request, "#{key}_request_limit".to_sym, current_user)
- render plain: _('This endpoint has been requested too many times. Try again later.'), status: :too_many_requests
- end
-
- def rate_limiter
- ::Gitlab::ApplicationRateLimiter
- end
-
- def rate_limit_users_allowlist
- Gitlab::CurrentSettings.current_application_settings.notes_create_limit_allowlist
- end
end
diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index 59b14bbb91d..aa1c6ab7550 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -13,8 +13,8 @@ class Projects::PipelinesController < Projects::ApplicationController
before_action :authorize_create_pipeline!, only: [:new, :create, :config_variables]
before_action :authorize_update_pipeline!, only: [:retry, :cancel]
before_action do
- push_frontend_feature_flag(:pipelines_security_report_summary, project)
- push_frontend_feature_flag(:new_pipeline_form, project, default_enabled: true)
+ push_frontend_feature_flag(:pipelines_security_report_summary, project, default_enabled: :yaml)
+ push_frontend_feature_flag(:new_pipeline_form, project, default_enabled: :yaml)
push_frontend_feature_flag(:graphql_pipeline_details, project, type: :development, default_enabled: :yaml)
push_frontend_feature_flag(:graphql_pipeline_details_users, current_user, type: :development, default_enabled: :yaml)
push_frontend_feature_flag(:ci_mini_pipeline_gl_dropdown, project, type: :development, default_enabled: :yaml)
diff --git a/app/controllers/projects/security/configuration_controller.rb b/app/controllers/projects/security/configuration_controller.rb
index 9366ca7b0ed..cafc392134b 100644
--- a/app/controllers/projects/security/configuration_controller.rb
+++ b/app/controllers/projects/security/configuration_controller.rb
@@ -3,6 +3,8 @@
module Projects
module Security
class ConfigurationController < Projects::ApplicationController
+ include SecurityAndCompliancePermissions
+
feature_category :static_application_security_testing
def show
diff --git a/app/controllers/projects/templates_controller.rb b/app/controllers/projects/templates_controller.rb
index ab05c9694fd..b4b8fb97049 100644
--- a/app/controllers/projects/templates_controller.rb
+++ b/app/controllers/projects/templates_controller.rb
@@ -25,7 +25,7 @@ class Projects::TemplatesController < Projects::ApplicationController
def names
respond_to do |format|
- format.json { render json: TemplateFinder.all_template_names_array(project, params[:template_type].to_s.pluralize) }
+ format.json { render json: TemplateFinder.all_template_names_hash_or_array(project, params[:template_type].to_s) }
end
end
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index ebffb62cff3..1185bcc9ea8 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -74,7 +74,11 @@ class ProjectsController < Projects::ApplicationController
@project = ::Projects::CreateService.new(current_user, project_params(attributes: project_params_create_attributes)).execute
if @project.saved?
- experiment(:new_project_readme, actor: current_user).track(:created, property: active_new_project_tab)
+ experiment(:new_project_readme, actor: current_user).track(
+ :created,
+ property: active_new_project_tab,
+ value: project_params[:initialize_with_readme].to_i
+ )
redirect_to(
project_path(@project, custom_import_params),
notice: _("Project '%{project_name}' was successfully created.") % { project_name: @project.name }
@@ -329,6 +333,8 @@ class ProjectsController < Projects::ApplicationController
if can?(current_user, :download_code, @project)
return render 'projects/no_repo' unless @project.repository_exists?
+ experiment(:empty_repo_upload, project: @project).track(:view_project_show) if @project.can_current_user_push_to_default_branch?
+
if @project.empty_repo?
record_experiment_user(:invite_members_empty_project_version_a)
@@ -393,6 +399,7 @@ class ProjectsController < Projects::ApplicationController
metrics_dashboard_access_level
analytics_access_level
operations_access_level
+ security_and_compliance_access_level
]
end
diff --git a/app/controllers/root_controller.rb b/app/controllers/root_controller.rb
index 191134472c2..67cb2b9558d 100644
--- a/app/controllers/root_controller.rb
+++ b/app/controllers/root_controller.rb
@@ -69,7 +69,7 @@ class RootController < Dashboard::ProjectsController
end
def customize_homepage
- @customize_homepage = experiment_enabled?(:customize_homepage)
+ @customize_homepage = Feature.enabled?(:customize_homepage, default_enabled: :yaml)
end
end
diff --git a/app/finders/packages/npm/package_finder.rb b/app/finders/packages/npm/package_finder.rb
index 2854226e178..04b124ddd83 100644
--- a/app/finders/packages/npm/package_finder.rb
+++ b/app/finders/packages/npm/package_finder.rb
@@ -2,29 +2,41 @@
module Packages
module Npm
class PackageFinder
- attr_reader :project, :package_name
-
delegate :find_by_version, to: :execute
+ delegate :last, to: :execute
- def initialize(project, package_name)
- @project = project
+ def initialize(package_name, project: nil, namespace: nil)
@package_name = package_name
+ @project = project
+ @namespace = namespace
end
def execute
- return Packages::Package.none unless project
-
- packages
+ base.npm
+ .with_name(@package_name)
+ .last_of_each_version
+ .preload_files
end
private
- def packages
- project.packages
- .npm
- .with_name(package_name)
- .last_of_each_version
- .preload_files
+ def base
+ if @project
+ packages_for_project
+ elsif @namespace
+ packages_for_namespace
+ else
+ ::Packages::Package.none
+ end
+ end
+
+ def packages_for_project
+ @project.packages
+ end
+
+ def packages_for_namespace
+ projects = ::Project.in_namespace(@namespace.self_and_descendants.select(:id))
+ ::Packages::Package.for_projects(projects.select(:id))
end
end
end
diff --git a/app/finders/template_finder.rb b/app/finders/template_finder.rb
index 36f8d144908..739beee236c 100644
--- a/app/finders/template_finder.rb
+++ b/app/finders/template_finder.rb
@@ -22,16 +22,26 @@ class TemplateFinder
end
end
+ # This is temporary and will be removed once we introduce group level inherited templates and
+ # remove the inherited_issuable_templates FF
+ def all_template_names_hash_or_array(project, issuable_type)
+ if project.inherited_issuable_templates_enabled?
+ all_template_names(project, issuable_type.pluralize)
+ else
+ all_template_names_array(project, issuable_type.pluralize)
+ end
+ end
+
def all_template_names(project, type)
return {} if !VENDORED_TEMPLATES.key?(type.to_s) && type.to_s != 'licenses'
build(type, project).template_names
end
- # This is issues and merge requests description templates only.
- # This will be removed once we introduce group level inherited templates
+ # This is for issues and merge requests description templates only.
+ # This will be removed once we introduce group level inherited templates and remove the inherited_issuable_templates FF
def all_template_names_array(project, type)
- all_template_names(project, type).values.flatten.uniq
+ all_template_names(project, type).values.flatten.select { |tmpl| tmpl[:project_id] == project.id }.compact.uniq
end
end
diff --git a/app/graphql/mutations/custom_emoji/create.rb b/app/graphql/mutations/custom_emoji/create.rb
index 9ec96be0f26..5cf54f8f877 100644
--- a/app/graphql/mutations/custom_emoji/create.rb
+++ b/app/graphql/mutations/custom_emoji/create.rb
@@ -31,6 +31,7 @@ module Mutations
group = authorized_find!(group_path: group_path)
# See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37911#note_444682238
args[:external] = true
+ args[:creator] = current_user
custom_emoji = group.custom_emoji.create(args)
diff --git a/app/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver.rb b/app/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver.rb
index 9df07df24d8..a5f81149d4e 100644
--- a/app/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver.rb
+++ b/app/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver.rb
@@ -3,13 +3,13 @@
module Resolvers
module Admin
module Analytics
- module InstanceStatistics
+ module UsageTrends
class MeasurementsResolver < BaseResolver
include Gitlab::Graphql::Authorize::AuthorizeResource
- type Types::Admin::Analytics::InstanceStatistics::MeasurementType, null: true
+ type Types::Admin::Analytics::UsageTrends::MeasurementType, null: true
- argument :identifier, Types::Admin::Analytics::InstanceStatistics::MeasurementIdentifierEnum,
+ argument :identifier, Types::Admin::Analytics::UsageTrends::MeasurementIdentifierEnum,
required: true,
description: 'The type of measurement/statistics to retrieve.'
@@ -24,7 +24,7 @@ module Resolvers
def resolve(identifier:, recorded_before: nil, recorded_after: nil)
authorize!
- ::Analytics::InstanceStatistics::Measurement
+ ::Analytics::UsageTrends::Measurement
.recorded_after(recorded_after)
.recorded_before(recorded_before)
.with_identifier(identifier)
diff --git a/app/graphql/resolvers/alert_management/http_integrations_resolver.rb b/app/graphql/resolvers/alert_management/http_integrations_resolver.rb
new file mode 100644
index 00000000000..94a72bca7c7
--- /dev/null
+++ b/app/graphql/resolvers/alert_management/http_integrations_resolver.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Resolvers
+ module AlertManagement
+ class HttpIntegrationsResolver < BaseResolver
+ alias_method :project, :synchronized_object
+
+ type Types::AlertManagement::HttpIntegrationType.connection_type, null: true
+
+ def resolve(**args)
+ http_integrations
+ end
+
+ private
+
+ def http_integrations
+ return [] unless Ability.allowed?(current_user, :admin_operations, project)
+
+ ::AlertManagement::HttpIntegrationsFinder.new(project, {}).execute
+ end
+ end
+ end
+end
diff --git a/app/graphql/resolvers/ci/config_resolver.rb b/app/graphql/resolvers/ci/config_resolver.rb
index 852bb47e215..f8670649e48 100644
--- a/app/graphql/resolvers/ci/config_resolver.rb
+++ b/app/graphql/resolvers/ci/config_resolver.rb
@@ -16,7 +16,7 @@ module Resolvers
argument :content, GraphQL::STRING_TYPE,
required: true,
- description: "Contents of '.gitlab-ci.yml'."
+ description: "Contents of `.gitlab-ci.yml`."
argument :dry_run, GraphQL::BOOLEAN_TYPE,
required: false,
diff --git a/app/graphql/resolvers/full_path_resolver.rb b/app/graphql/resolvers/full_path_resolver.rb
index d01cdf749a1..b5e90da78b2 100644
--- a/app/graphql/resolvers/full_path_resolver.rb
+++ b/app/graphql/resolvers/full_path_resolver.rb
@@ -7,7 +7,7 @@ module Resolvers
prepended do
argument :full_path, GraphQL::ID_TYPE,
required: true,
- description: 'The full path of the project, group or namespace, e.g., "gitlab-org/gitlab-foss".'
+ description: 'The full path of the project, group or namespace, e.g., `gitlab-org/gitlab-foss`.'
end
def model_by_full_path(model, full_path)
diff --git a/app/graphql/types/admin/analytics/instance_statistics/measurement_identifier_enum.rb b/app/graphql/types/admin/analytics/usage_trends/measurement_identifier_enum.rb
index c6ca5963588..392957eb49d 100644
--- a/app/graphql/types/admin/analytics/instance_statistics/measurement_identifier_enum.rb
+++ b/app/graphql/types/admin/analytics/usage_trends/measurement_identifier_enum.rb
@@ -3,7 +3,7 @@
module Types
module Admin
module Analytics
- module InstanceStatistics
+ module UsageTrends
class MeasurementIdentifierEnum < BaseEnum
graphql_name 'MeasurementIdentifier'
description 'Possible identifier types for a measurement'
diff --git a/app/graphql/types/admin/analytics/instance_statistics/measurement_type.rb b/app/graphql/types/admin/analytics/usage_trends/measurement_type.rb
index 17a5af8d36b..c8ca702706f 100644
--- a/app/graphql/types/admin/analytics/instance_statistics/measurement_type.rb
+++ b/app/graphql/types/admin/analytics/usage_trends/measurement_type.rb
@@ -3,13 +3,13 @@
module Types
module Admin
module Analytics
- module InstanceStatistics
+ module UsageTrends
class MeasurementType < BaseObject
include Gitlab::Graphql::Authorize::AuthorizeResource
- graphql_name 'InstanceStatisticsMeasurement'
+ graphql_name 'UsageTrendsMeasurement'
description 'Represents a recorded measurement (object count) for the Admins'
- authorize :read_instance_statistics_measurements
+ authorize :read_usage_trends_measurement
field :recorded_at, Types::TimeType, null: true,
description: 'The time the measurement was recorded.'
@@ -17,7 +17,7 @@ module Types
field :count, GraphQL::INT_TYPE, null: false,
description: 'Object count.'
- field :identifier, Types::Admin::Analytics::InstanceStatistics::MeasurementIdentifierEnum, null: false,
+ field :identifier, Types::Admin::Analytics::UsageTrends::MeasurementIdentifierEnum, null: false,
description: 'The type of objects being measured.'
end
end
diff --git a/app/graphql/types/alert_management/http_integration_type.rb b/app/graphql/types/alert_management/http_integration_type.rb
index 88782050b94..0d5bb50a77c 100644
--- a/app/graphql/types/alert_management/http_integration_type.rb
+++ b/app/graphql/types/alert_management/http_integration_type.rb
@@ -20,3 +20,5 @@ module Types
end
end
end
+
+Types::AlertManagement::HttpIntegrationType.prepend_ee_mod
diff --git a/app/graphql/types/board_type.rb b/app/graphql/types/board_type.rb
index f8bd31d5fa0..d125ce352c4 100644
--- a/app/graphql/types/board_type.rb
+++ b/app/graphql/types/board_type.rb
@@ -3,7 +3,7 @@
module Types
class BoardType < BaseObject
graphql_name 'Board'
- description 'Represents a project or group board'
+ description 'Represents a project or group issue board'
accepts ::Board
authorize :read_board
diff --git a/app/graphql/types/ci_configuration/sast/ui_component_size_enum.rb b/app/graphql/types/ci_configuration/sast/ui_component_size_enum.rb
index 3a208f9d3e4..76d2a314c13 100644
--- a/app/graphql/types/ci_configuration/sast/ui_component_size_enum.rb
+++ b/app/graphql/types/ci_configuration/sast/ui_component_size_enum.rb
@@ -7,9 +7,9 @@ module Types
graphql_name 'SastUiComponentSize'
description 'Size of UI component in SAST configuration page'
- value 'SMALL'
- value 'MEDIUM'
- value 'LARGE'
+ value 'SMALL', description: "The size of UI component in SAST configuration page is small."
+ value 'MEDIUM', description: "The size of UI component in SAST configuration page is medium."
+ value 'LARGE', description: "The size of UI component in SAST configuration page is large."
end
end
end
diff --git a/app/graphql/types/global_id_type.rb b/app/graphql/types/global_id_type.rb
index ed28c3ffd7e..007d86f60b8 100644
--- a/app/graphql/types/global_id_type.rb
+++ b/app/graphql/types/global_id_type.rb
@@ -67,7 +67,10 @@ module Types
end
self.define_singleton_method(:suitable?) do |gid|
- gid&.model_class&.ancestors&.include?(model_class)
+ next false if gid.nil?
+
+ gid.model_name.safe_constantize.present? &&
+ gid.model_class.ancestors.include?(model_class)
end
self.define_singleton_method(:coerce_input) do |string, ctx|
diff --git a/app/graphql/types/label_type.rb b/app/graphql/types/label_type.rb
index 94fd15e075c..4e8718a80da 100644
--- a/app/graphql/types/label_type.rb
+++ b/app/graphql/types/label_type.rb
@@ -19,5 +19,9 @@ module Types
description: 'Background color of the label.'
field :text_color, GraphQL::STRING_TYPE, null: false,
description: 'Text color of the label.'
+ field :created_at, Types::TimeType, null: false,
+ description: 'When this label was created.'
+ field :updated_at, Types::TimeType, null: false,
+ description: 'When this label was last updated.'
end
end
diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb
index 166f5617da2..cf583131ed0 100644
--- a/app/graphql/types/mutation_type.rb
+++ b/app/graphql/types/mutation_type.rb
@@ -24,6 +24,7 @@ module Types
mount_mutation Mutations::AwardEmojis::Toggle
mount_mutation Mutations::Boards::Create
mount_mutation Mutations::Boards::Destroy
+ mount_mutation Mutations::Boards::Update
mount_mutation Mutations::Boards::Issues::IssueMoveList
mount_mutation Mutations::Boards::Lists::Create
mount_mutation Mutations::Boards::Lists::Update
diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb
index 7205c615271..c2858886f09 100644
--- a/app/graphql/types/project_type.rb
+++ b/app/graphql/types/project_type.rb
@@ -273,6 +273,12 @@ module Types
description: 'Integrations which can receive alerts for the project.',
resolver: Resolvers::AlertManagement::IntegrationsResolver
+ field :alert_management_http_integrations,
+ Types::AlertManagement::HttpIntegrationType.connection_type,
+ null: true,
+ description: 'HTTP Integrations which can receive alerts for the project.',
+ resolver: Resolvers::AlertManagement::HttpIntegrationsResolver
+
field :releases,
Types::ReleaseType.connection_type,
null: true,
diff --git a/app/graphql/types/query_type.rb b/app/graphql/types/query_type.rb
index 1d1ab4f2e17..48b9900fe36 100644
--- a/app/graphql/types/query_type.rb
+++ b/app/graphql/types/query_type.rb
@@ -78,14 +78,20 @@ module Types
field :issue, Types::IssueType,
null: true,
- description: 'Find an issue.' do
+ description: 'Find an Issue.' do
argument :id, ::Types::GlobalIDType[::Issue], required: true, description: 'The global ID of the Issue.'
end
- field :instance_statistics_measurements, Types::Admin::Analytics::InstanceStatistics::MeasurementType.connection_type,
+ field :instance_statistics_measurements, Types::Admin::Analytics::UsageTrends::MeasurementType.connection_type,
null: true,
description: 'Get statistics on the instance.',
- resolver: Resolvers::Admin::Analytics::InstanceStatistics::MeasurementsResolver
+ deprecated: { reason: 'This field was renamed. Use the `usageTrendsMeasurements` field instead.', milestone: '13.10' },
+ resolver: Resolvers::Admin::Analytics::UsageTrends::MeasurementsResolver
+
+ field :usage_trends_measurements, Types::Admin::Analytics::UsageTrends::MeasurementType.connection_type,
+ null: true,
+ description: 'Get statistics on the instance.',
+ resolver: Resolvers::Admin::Analytics::UsageTrends::MeasurementsResolver
field :ci_application_settings, Types::Ci::ApplicationSettingType,
null: true,
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 8268ab1ad56..9af45daaca4 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -280,7 +280,7 @@ module ApplicationHelper
def page_class
class_names = []
- class_names << 'issue-boards-page gl-overflow-hidden' if current_controller?(:boards)
+ class_names << 'issue-boards-page gl-overflow-auto' if current_controller?(:boards)
class_names << 'environment-logs-page' if current_controller?(:logs)
class_names << 'with-performance-bar' if performance_bar_enabled?
class_names << system_message_class
diff --git a/app/helpers/auth_helper.rb b/app/helpers/auth_helper.rb
index 24c1d224c89..305b9a1faf3 100644
--- a/app/helpers/auth_helper.rb
+++ b/app/helpers/auth_helper.rb
@@ -1,7 +1,20 @@
# frozen_string_literal: true
module AuthHelper
- PROVIDERS_WITH_ICONS = %w(twitter github gitlab bitbucket google_oauth2 facebook azure_oauth2 authentiq salesforce atlassian_oauth2 openid_connect).freeze
+ PROVIDERS_WITH_ICONS = %w(
+ atlassian_oauth2
+ authentiq
+ azure_activedirectory_v2
+ azure_oauth2
+ bitbucket
+ facebook
+ github
+ gitlab
+ google_oauth2
+ openid_connect
+ salesforce
+ twitter
+ ).freeze
LDAP_PROVIDER = /\Aldap/.freeze
def ldap_enabled?
@@ -125,11 +138,11 @@ module AuthHelper
label = label_for_provider(provider)
if provider_has_custom_icon?(provider)
- image_tag(icon_for_provider(provider), alt: label, title: "Sign in with #{label}")
+ image_tag(icon_for_provider(provider), alt: label, title: "Sign in with #{label}", class: "gl-button-icon")
elsif provider_has_builtin_icon?(provider)
file_name = "#{provider.to_s.split('_').first}_#{size}.png"
- image_tag("auth_buttons/#{file_name}", alt: label, title: "Sign in with #{label}")
+ image_tag("auth_buttons/#{file_name}", alt: label, title: "Sign in with #{label}", class: "gl-button-icon")
else
label
end
diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb
index f5c75d62097..2f5bfc181cb 100644
--- a/app/helpers/commits_helper.rb
+++ b/app/helpers/commits_helper.rb
@@ -105,7 +105,7 @@ module CommitsHelper
tooltip = _("Browse Directory")
end
- link_to url, class: "btn gl-button btn-default has-tooltip", title: tooltip, data: { container: "body" } do
+ link_to url, class: "btn gl-button btn-default btn-icon has-tooltip", title: tooltip, data: { container: "body" } do
sprite_icon('folder-open')
end
end
@@ -127,7 +127,7 @@ module CommitsHelper
end
def conditionally_paginate_diff_files(diffs, paginate:, per: Projects::CommitController::COMMIT_DIFFS_PER_PAGE)
- if paginate && Feature.enabled?(:paginate_commit_view, @project, type: :development)
+ if paginate
Kaminari.paginate_array(diffs.diff_files.to_a).page(params[:page]).per(per)
else
diffs.diff_files
diff --git a/app/helpers/invite_members_helper.rb b/app/helpers/invite_members_helper.rb
index 889365e39de..961ef613a06 100644
--- a/app/helpers/invite_members_helper.rb
+++ b/app/helpers/invite_members_helper.rb
@@ -23,6 +23,14 @@ module InviteMembersHelper
end
end
+ def show_invite_members_track_event
+ if directly_invite_members?
+ 'show_invite_members'
+ elsif indirectly_invite_members?
+ 'show_invite_members_version_b'
+ end
+ end
+
def invite_group_members?(group)
experiment_enabled?(:invite_members_empty_group_version_a) && Ability.allowed?(current_user, :admin_group_member, group)
end
diff --git a/app/helpers/issuables_description_templates_helper.rb b/app/helpers/issuables_description_templates_helper.rb
index 110b3954900..5f69098de56 100644
--- a/app/helpers/issuables_description_templates_helper.rb
+++ b/app/helpers/issuables_description_templates_helper.rb
@@ -5,7 +5,8 @@ module IssuablesDescriptionTemplatesHelper
include GitlabRoutingHelper
def template_dropdown_tag(issuable, &block)
- title = selected_template(issuable) || "Choose a template"
+ selected_template = selected_template(issuable)
+ title = selected_template || "Choose a template"
options = {
toggle_class: 'js-issuable-selector',
title: title,
@@ -15,7 +16,7 @@ module IssuablesDescriptionTemplatesHelper
data: {
data: issuable_templates(ref_project, issuable.to_ability_name),
field_name: 'issuable_template',
- selected: selected_template(issuable),
+ selected: selected_template,
project_id: ref_project.id
}
}
@@ -28,15 +29,21 @@ module IssuablesDescriptionTemplatesHelper
def issuable_templates(project, issuable_type)
@template_types ||= {}
@template_types[project.id] ||= {}
- @template_types[project.id][issuable_type] ||= TemplateFinder.all_template_names_array(project, issuable_type.pluralize)
+ @template_types[project.id][issuable_type] ||= TemplateFinder.all_template_names_hash_or_array(project, issuable_type)
end
def issuable_templates_names(issuable)
- issuable_templates(ref_project, issuable.to_ability_name).map { |template| template[:name] }
+ all_templates = issuable_templates(ref_project, issuable.to_ability_name)
+
+ if ref_project.inherited_issuable_templates_enabled?
+ all_templates.values.flatten.map { |tpl| tpl[:name] if tpl[:project_id] == ref_project.id }.compact.uniq
+ else
+ all_templates.map { |template| template[:name] }
+ end
end
def selected_template(issuable)
- params[:issuable_template] if issuable_templates(ref_project, issuable.to_ability_name).any? { |template| template[:name] == params[:issuable_template] }
+ params[:issuable_template] if issuable_templates_names(issuable).any? { |tmpl_name| tmpl_name == params[:issuable_template] }
end
def template_names_path(parent, issuable)
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index f5cd89d96b4..b5c4e0b5550 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -379,10 +379,15 @@ module ProjectsHelper
private
def can_read_security_configuration?(project, current_user)
- ::Feature.enabled?(:secure_security_and_compliance_configuration_page_on_ce, @subject, default_enabled: :yaml) &&
+ show_security_and_compliance_config? &&
+ can?(current_user, :access_security_and_compliance, project) &&
can?(current_user, :read_security_configuration, project)
end
+ def show_security_and_compliance_config?
+ ::Feature.enabled?(:secure_security_and_compliance_configuration_page_on_ce, @subject, default_enabled: :yaml)
+ end
+
def get_project_security_nav_tabs(project, current_user)
if can_read_security_configuration?(project, current_user)
[:security_and_compliance, :security_configuration]
@@ -646,7 +651,8 @@ module ProjectsHelper
metricsDashboardAccessLevel: feature.metrics_dashboard_access_level,
operationsAccessLevel: feature.operations_access_level,
showDefaultAwardEmojis: project.show_default_award_emojis?,
- allowEditingCommitMessages: project.allow_editing_commit_messages?
+ allowEditingCommitMessages: project.allow_editing_commit_messages?,
+ securityAndComplianceAccessLevel: project.security_and_compliance_access_level
}
end
@@ -668,10 +674,13 @@ module ProjectsHelper
pagesAvailable: Gitlab.config.pages.enabled,
pagesAccessControlEnabled: Gitlab.config.pages.access_control,
pagesAccessControlForced: ::Gitlab::Pages.access_control_is_forced?,
- pagesHelpPath: help_page_path('user/project/pages/introduction', anchor: 'gitlab-pages-access-control')
+ pagesHelpPath: help_page_path('user/project/pages/introduction', anchor: 'gitlab-pages-access-control'),
+ securityAndComplianceAvailable: show_security_and_compliance_toggle?
}
end
+ alias_method :show_security_and_compliance_toggle?, :show_security_and_compliance_config?
+
def project_permissions_panel_data_json(project)
project_permissions_panel_data(project).to_json.html_safe
end
diff --git a/app/helpers/services_helper.rb b/app/helpers/services_helper.rb
index 14d20e7c622..8fc63dcdb3a 100644
--- a/app/helpers/services_helper.rb
+++ b/app/helpers/services_helper.rb
@@ -86,7 +86,7 @@ module ServicesHelper
end
def integration_form_data(integration, group: nil)
- {
+ form_data = {
id: integration.id,
show_active: integration.show_active_box?.to_s,
activated: (integration.active || integration.new_record?).to_s,
@@ -106,6 +106,12 @@ module ServicesHelper
test_path: scoped_test_integration_path(integration),
reset_path: scoped_reset_integration_path(integration, group: group)
}
+
+ if integration.is_a?(JiraService)
+ form_data[:jira_issue_transition_id] = integration.jira_issue_transition_id
+ end
+
+ form_data
end
def trigger_events_for_service(integration)
diff --git a/app/helpers/stat_anchors_helper.rb b/app/helpers/stat_anchors_helper.rb
index 1e8e6371284..d9429f28be7 100644
--- a/app/helpers/stat_anchors_helper.rb
+++ b/app/helpers/stat_anchors_helper.rb
@@ -5,13 +5,14 @@ module StatAnchorsHelper
{}.tap do |attrs|
attrs[:class] = %w(nav-link gl-display-flex gl-align-items-center) << extra_classes(anchor)
attrs[:itemprop] = anchor.itemprop if anchor.itemprop
+ attrs[:data] = anchor.data if anchor.data
end
end
private
def button_attribute(anchor)
- "btn-#{anchor.class_modifier || 'dashed'}"
+ anchor.class_modifier || 'btn-dashed'
end
def extra_classes(anchor)
diff --git a/app/models/analytics/instance_statistics.rb b/app/models/analytics/instance_statistics.rb
deleted file mode 100644
index df7b26e4fa6..00000000000
--- a/app/models/analytics/instance_statistics.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-module Analytics
- module InstanceStatistics
- def self.table_name_prefix
- 'analytics_instance_statistics_'
- end
- end
-end
diff --git a/app/models/analytics/instance_statistics/measurement.rb b/app/models/analytics/usage_trends/measurement.rb
index c8b76e005ef..40d7c7fae2e 100644
--- a/app/models/analytics/instance_statistics/measurement.rb
+++ b/app/models/analytics/usage_trends/measurement.rb
@@ -1,8 +1,10 @@
# frozen_string_literal: true
module Analytics
- module InstanceStatistics
+ module UsageTrends
class Measurement < ApplicationRecord
+ self.table_name = 'analytics_instance_statistics_measurements'
+
EXPERIMENTAL_IDENTIFIERS = %i[pipelines_succeeded pipelines_failed pipelines_canceled pipelines_skipped].freeze
enum identifier: {
@@ -58,4 +60,4 @@ module Analytics
end
end
-Analytics::InstanceStatistics::Measurement.prepend_if_ee('EE::Analytics::InstanceStatistics::Measurement')
+Analytics::UsageTrends::Measurement.prepend_if_ee('EE::Analytics::UsageTrends::Measurement')
diff --git a/app/models/bulk_imports/entity.rb b/app/models/bulk_imports/entity.rb
index 16224fde502..ae1e3693809 100644
--- a/app/models/bulk_imports/entity.rb
+++ b/app/models/bulk_imports/entity.rb
@@ -37,8 +37,9 @@ class BulkImports::Entity < ApplicationRecord
validates :project, absence: true, if: :group
validates :group, absence: true, if: :project
- validates :source_type, :source_full_path, :destination_name,
- :destination_namespace, presence: true
+ validates :source_type, :source_full_path, :destination_name, presence: true
+ validates :destination_namespace, exclusion: [nil], if: :group
+ validates :destination_namespace, presence: true, if: :project
validate :validate_parent_is_a_group, if: :parent
validate :validate_imported_entity_type
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index db151126caf..d072bced639 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -564,7 +564,10 @@ module Ci
end
def features
- { trace_sections: true }
+ {
+ trace_sections: true,
+ failure_reasons: self.class.failure_reasons.keys
+ }
end
def merge_request
diff --git a/app/models/clusters/agent_token.rb b/app/models/clusters/agent_token.rb
index b260822f784..8266f40133d 100644
--- a/app/models/clusters/agent_token.rb
+++ b/app/models/clusters/agent_token.rb
@@ -7,9 +7,11 @@ module Clusters
self.table_name = 'cluster_agent_tokens'
- belongs_to :agent, class_name: 'Clusters::Agent'
+ belongs_to :agent, class_name: 'Clusters::Agent', optional: false
belongs_to :created_by_user, class_name: 'User', optional: true
before_save :ensure_token
+
+ validates :description, length: { maximum: 1024 }
end
end
diff --git a/app/models/concerns/project_features_compatibility.rb b/app/models/concerns/project_features_compatibility.rb
index 07bec07e556..a06bfdf5825 100644
--- a/app/models/concerns/project_features_compatibility.rb
+++ b/app/models/concerns/project_features_compatibility.rb
@@ -34,6 +34,10 @@ module ProjectFeaturesCompatibility
write_feature_attribute_boolean(:snippets_access_level, value)
end
+ def security_and_compliance_enabled=(value)
+ write_feature_attribute_boolean(:security_and_compliance_access_level, value)
+ end
+
def repository_access_level=(value)
write_feature_attribute_string(:repository_access_level, value)
end
@@ -78,6 +82,10 @@ module ProjectFeaturesCompatibility
write_feature_attribute_string(:operations_access_level, value)
end
+ def security_and_compliance_access_level=(value)
+ write_feature_attribute_string(:security_and_compliance_access_level, value)
+ end
+
private
def write_feature_attribute_boolean(field, value)
diff --git a/app/models/custom_emoji.rb b/app/models/custom_emoji.rb
index f4c914c6a3a..aea48a5ec20 100644
--- a/app/models/custom_emoji.rb
+++ b/app/models/custom_emoji.rb
@@ -6,6 +6,7 @@ class CustomEmoji < ApplicationRecord
belongs_to :namespace, inverse_of: :custom_emoji
belongs_to :group, -> { where(type: 'Group') }, foreign_key: 'namespace_id'
+ belongs_to :creator, class_name: "User", inverse_of: :created_custom_emoji
# For now only external emoji are supported. See https://gitlab.com/gitlab-org/gitlab/-/issues/230467
validates :external, inclusion: { in: [true] }
@@ -15,6 +16,7 @@ class CustomEmoji < ApplicationRecord
validate :valid_emoji_name
validates :group, presence: true
+ validates :creator, presence: true
validates :name,
uniqueness: { scope: [:namespace_id, :name] },
presence: true,
diff --git a/app/models/group.rb b/app/models/group.rb
index 1eaa4499eb5..afcf3fe69e6 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -34,6 +34,7 @@ class Group < Namespace
has_many :milestones
has_many :iterations
+ has_many :iterations_cadences, class_name: 'Iterations::Cadence'
has_many :services
has_many :shared_group_links, foreign_key: :shared_with_group_id, class_name: 'GroupGroupLink'
has_many :shared_with_group_links, foreign_key: :shared_group_id, class_name: 'GroupGroupLink'
@@ -364,13 +365,28 @@ class Group < Namespace
# rubocop: enable CodeReuse/ServiceClass
# rubocop: disable CodeReuse/ServiceClass
- def refresh_members_authorized_projects(blocking: true, priority: UserProjectAccessChangedService::HIGH_PRIORITY)
+ def refresh_members_authorized_projects(
+ blocking: true,
+ priority: UserProjectAccessChangedService::HIGH_PRIORITY,
+ direct_members_only: false
+ )
+
+ user_ids = if direct_members_only
+ users_ids_of_direct_members
+ else
+ user_ids_for_project_authorizations
+ end
+
UserProjectAccessChangedService
- .new(user_ids_for_project_authorizations)
+ .new(user_ids)
.execute(blocking: blocking, priority: priority)
end
# rubocop: enable CodeReuse/ServiceClass
+ def users_ids_of_direct_members
+ direct_members.pluck(:user_id)
+ end
+
def user_ids_for_project_authorizations
members_with_parents.pluck(:user_id)
end
@@ -381,6 +397,12 @@ class Group < Namespace
end
end
+ def direct_members
+ GroupMember.active_without_invites_and_requests
+ .non_minimal_access
+ .where(source_id: id)
+ end
+
def members_with_parents
# Avoids an unnecessary SELECT when the group has no parents
source_ids =
diff --git a/app/models/iteration.rb b/app/models/iteration.rb
index 7a35bb1cd1f..012a062712f 100644
--- a/app/models/iteration.rb
+++ b/app/models/iteration.rb
@@ -16,6 +16,7 @@ class Iteration < ApplicationRecord
belongs_to :project
belongs_to :group
+ belongs_to :iterations_cadence, class_name: 'Iterations::Cadence', foreign_key: :iterations_cadence_id, inverse_of: :iterations
has_internal_id :iid, scope: :project
has_internal_id :iid, scope: :group
@@ -26,6 +27,9 @@ class Iteration < ApplicationRecord
validate :dates_do_not_overlap, if: :start_or_due_dates_changed?
validate :future_date, if: :start_or_due_dates_changed?, unless: :skip_future_date_validation
validate :no_project, unless: :skip_project_validation
+ validate :validate_group
+
+ before_create :set_iterations_cadence
scope :upcoming, -> { with_state(:upcoming) }
scope :started, -> { with_state(:started) }
@@ -135,6 +139,30 @@ class Iteration < ApplicationRecord
errors.add(:project_id, s_("is not allowed. We do not currently support project-level iterations"))
end
+
+ # TODO: this method should be removed as part of https://gitlab.com/gitlab-org/gitlab/-/issues/296099
+ def set_iterations_cadence
+ return if iterations_cadence
+ # For now we support only group iterations
+ # issue to clarify project iterations: https://gitlab.com/gitlab-org/gitlab/-/issues/299864
+ return unless group
+
+ self.iterations_cadence = group.iterations_cadences.first || create_default_cadence
+ end
+
+ def create_default_cadence
+ cadence_title = "#{group.name} Iterations"
+
+ Iterations::Cadence.create!(group: group, title: cadence_title, start_date: start_date)
+ end
+
+ # TODO: remove this as part of https://gitlab.com/gitlab-org/gitlab/-/issues/296100
+ def validate_group
+ return unless iterations_cadence
+ return if iterations_cadence.group_id == group_id
+
+ errors.add(:group, s_('is not valid. The iteration group has to match the iteration cadence group.'))
+ end
end
Iteration.prepend_if_ee('EE::Iteration')
diff --git a/app/models/iterations/cadence.rb b/app/models/iterations/cadence.rb
new file mode 100644
index 00000000000..4f8e148d18f
--- /dev/null
+++ b/app/models/iterations/cadence.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class Iterations::Cadence < ApplicationRecord
+ self.table_name = 'iterations_cadences'
+
+ belongs_to :group
+ has_many :iterations, foreign_key: :iterations_cadence_id, inverse_of: :iterations_cadence
+
+ validates :title, presence: true
+ validates :start_date, presence: true
+ validates :group_id, presence: true
+ validates :active, presence: true
+ validates :automatic, presence: true
+end
diff --git a/app/models/list.rb b/app/models/list.rb
index 49834af3dfb..5bd00a1d7ef 100644
--- a/app/models/list.rb
+++ b/app/models/list.rb
@@ -14,6 +14,7 @@ class List < ApplicationRecord
validates :label_id, uniqueness: { scope: :board_id }, if: :label?
scope :preload_associated_models, -> { preload(:board, label: :priorities) }
+ scope :without_types, ->(list_types) { where.not(list_type: list_types) }
alias_method :preferences, :list_user_preferences
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 1374e8a814a..8d558098d94 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -317,6 +317,8 @@ class MergeRequest < ApplicationRecord
scope :preload_author, -> { preload(:author) }
scope :preload_approved_by_users, -> { preload(:approved_by_users) }
scope :preload_metrics, -> (relation) { preload(metrics: relation) }
+ scope :preload_project_and_latest_diff, -> { preload(:source_project, :latest_merge_request_diff) }
+ scope :preload_latest_diff_comment, -> { preload(latest_merge_request_diff: :merge_request_diff_commits) }
scope :with_web_entity_associations, -> { preload(:author, :target_project) }
scope :with_auto_merge_enabled, -> do
@@ -374,8 +376,7 @@ class MergeRequest < ApplicationRecord
alias_attribute :auto_merge_enabled, :merge_when_pipeline_succeeds
alias_method :issuing_parent, :target_project
- delegate :active?, :builds_with_coverage, to: :head_pipeline, prefix: true, allow_nil: true
- delegate :success?, :active?, to: :actual_head_pipeline, prefix: true, allow_nil: true
+ delegate :builds_with_coverage, to: :head_pipeline, prefix: true, allow_nil: true
RebaseLockTimeout = Class.new(StandardError)
@@ -435,6 +436,18 @@ class MergeRequest < ApplicationRecord
target_project.latest_pipeline(target_branch, sha)
end
+ def head_pipeline_active?
+ !!head_pipeline&.active?
+ end
+
+ def actual_head_pipeline_active?
+ !!actual_head_pipeline&.active?
+ end
+
+ def actual_head_pipeline_success?
+ !!actual_head_pipeline&.success?
+ end
+
# Pattern used to extract `!123` merge request references from text
#
# This pattern supports cross-project references.
diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index 3342fb1fce9..21e8a6fec74 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -164,6 +164,10 @@ class Namespace < ApplicationRecord
name = host.delete_suffix(gitlab_host)
Namespace.where(parent_id: nil).by_path(name)
end
+
+ def top_most
+ where(parent_id: nil)
+ end
end
def package_settings
@@ -400,6 +404,10 @@ class Namespace < ApplicationRecord
!has_parent?
end
+ def recent?
+ created_at >= 90.days.ago
+ end
+
private
def all_projects_with_pages
diff --git a/app/models/notification_setting.rb b/app/models/notification_setting.rb
index 82e39e4f207..72813b17501 100644
--- a/app/models/notification_setting.rb
+++ b/app/models/notification_setting.rb
@@ -49,7 +49,8 @@ class NotificationSetting < ApplicationRecord
:failed_pipeline,
:fixed_pipeline,
:success_pipeline,
- :moved_project
+ :moved_project,
+ :merge_when_pipeline_succeeds
].freeze
def self.email_events(source = nil)
diff --git a/app/models/packages/nuget.rb b/app/models/packages/nuget.rb
index 42c167e9b7f..f152eedb8fc 100644
--- a/app/models/packages/nuget.rb
+++ b/app/models/packages/nuget.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
module Packages
module Nuget
+ TEMPORARY_PACKAGE_NAME = 'NuGet.Temporary.Package'
+
def self.table_name_prefix
'packages_nuget_'
end
diff --git a/app/models/packages/package.rb b/app/models/packages/package.rb
index 391540634be..b0e7ff09982 100644
--- a/app/models/packages/package.rb
+++ b/app/models/packages/package.rb
@@ -40,11 +40,11 @@ class Packages::Package < ApplicationRecord
validate :unique_debian_package_name, if: :debian_package?
validate :valid_conan_package_recipe, if: :conan?
- validate :valid_npm_package_name, if: :npm?
validate :valid_composer_global_name, if: :composer?
validate :package_already_taken, if: :npm?
validates :name, format: { with: Gitlab::Regex.conan_recipe_component_regex }, if: :conan?
validates :name, format: { with: Gitlab::Regex.generic_package_name_regex }, if: :generic?
+ validates :name, format: { with: Gitlab::Regex.npm_package_name_regex }, if: :npm?
validates :name, format: { with: Gitlab::Regex.nuget_package_name_regex }, if: :nuget?
validates :name, format: { with: Gitlab::Regex.debian_package_name_regex }, if: :debian_package?
validates :name, inclusion: { in: %w[incoming] }, if: :debian_incoming?
@@ -98,12 +98,12 @@ class Packages::Package < ApplicationRecord
end
scope :preload_composer, -> { preload(:composer_metadatum) }
- scope :without_nuget_temporary_name, -> { where.not(name: Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME) }
+ scope :without_nuget_temporary_name, -> { where.not(name: Packages::Nuget::TEMPORARY_PACKAGE_NAME) }
scope :has_version, -> { where.not(version: nil) }
scope :processed, -> do
where.not(package_type: :nuget).or(
- where.not(name: Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME)
+ where.not(name: Packages::Nuget::TEMPORARY_PACKAGE_NAME)
)
end
scope :preload_files, -> { preload(:package_files) }
@@ -247,14 +247,6 @@ class Packages::Package < ApplicationRecord
end
end
- def valid_npm_package_name
- return unless project&.root_namespace
-
- unless name =~ %r{\A@#{project.root_namespace.path}/[^/]+\z}
- errors.add(:name, 'is not valid')
- end
- end
-
def package_already_taken
return unless project
diff --git a/app/models/packages/rubygems.rb b/app/models/packages/rubygems.rb
new file mode 100644
index 00000000000..1aa6b16f47e
--- /dev/null
+++ b/app/models/packages/rubygems.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+module Packages
+ module Rubygems
+ TEMPORARY_PACKAGE_NAME = 'Gem.Temporary.Package'
+
+ def self.table_name_prefix
+ 'packages_rubygems_'
+ end
+ end
+end
diff --git a/app/models/packages/rubygems/metadatum.rb b/app/models/packages/rubygems/metadatum.rb
index 42db1f3defc..d4e5feb7c98 100644
--- a/app/models/packages/rubygems/metadatum.rb
+++ b/app/models/packages/rubygems/metadatum.rb
@@ -3,7 +3,6 @@
module Packages
module Rubygems
class Metadatum < ApplicationRecord
- self.table_name = 'packages_rubygems_metadata'
self.primary_key = :package_id
belongs_to :package, -> { where(package_type: :rubygems) }, inverse_of: :rubygems_metadatum
diff --git a/app/models/pages/lookup_path.rb b/app/models/pages/lookup_path.rb
index c6781f8f6e3..46c347e5cf5 100644
--- a/app/models/pages/lookup_path.rb
+++ b/app/models/pages/lookup_path.rb
@@ -52,7 +52,7 @@ module Pages
def zip_source
return unless deployment&.file
- return if deployment.file.file_storage? && !Feature.enabled?(:pages_serve_with_zip_file_protocol, project)
+ return if deployment.file.file_storage? && !Feature.enabled?(:pages_serve_with_zip_file_protocol, project, default_enabled: true)
return if deployment.migrated? && !Feature.enabled?(:pages_serve_from_migrated_zip, project)
diff --git a/app/models/project.rb b/app/models/project.rb
index 2b9b7dcf733..08e3203a81e 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -392,7 +392,8 @@ class Project < ApplicationRecord
:merge_requests_access_level, :forking_access_level, :issues_access_level,
:wiki_access_level, :snippets_access_level, :builds_access_level,
:repository_access_level, :pages_access_level, :metrics_dashboard_access_level, :analytics_access_level,
- :operations_enabled?, :operations_access_level, to: :project_feature, allow_nil: true
+ :operations_enabled?, :operations_access_level, :security_and_compliance_access_level,
+ to: :project_feature, allow_nil: true
delegate :show_default_award_emojis, :show_default_award_emojis=,
:show_default_award_emojis?,
to: :project_setting, allow_nil: true
@@ -2532,6 +2533,10 @@ class Project < ApplicationRecord
Projects::GitGarbageCollectWorker
end
+ def inherited_issuable_templates_enabled?
+ Feature.enabled?(:inherited_issuable_templates, self, default_enabled: :yaml)
+ end
+
private
def find_service(services, name)
diff --git a/app/models/project_feature.rb b/app/models/project_feature.rb
index 7b204cfb1c0..3f86a1ce979 100644
--- a/app/models/project_feature.rb
+++ b/app/models/project_feature.rb
@@ -3,7 +3,8 @@
class ProjectFeature < ApplicationRecord
include Featurable
- FEATURES = %i(issues forking merge_requests wiki snippets builds repository pages metrics_dashboard analytics operations).freeze
+ FEATURES = %i(issues forking merge_requests wiki snippets builds repository pages metrics_dashboard analytics operations security_and_compliance).freeze
+ EXPORTABLE_FEATURES = (FEATURES - [:security_and_compliance]).freeze
set_available_features(FEATURES)
@@ -37,16 +38,17 @@ class ProjectFeature < ApplicationRecord
validate :repository_children_level
validate :allowed_access_levels
- default_value_for :builds_access_level, value: ENABLED, allows_nil: false
- default_value_for :issues_access_level, value: ENABLED, allows_nil: false
- default_value_for :forking_access_level, value: ENABLED, allows_nil: false
- default_value_for :merge_requests_access_level, value: ENABLED, allows_nil: false
- default_value_for :snippets_access_level, value: ENABLED, allows_nil: false
- default_value_for :wiki_access_level, value: ENABLED, allows_nil: false
- default_value_for :repository_access_level, value: ENABLED, allows_nil: false
- default_value_for :analytics_access_level, value: ENABLED, allows_nil: false
+ default_value_for :builds_access_level, value: ENABLED, allows_nil: false
+ default_value_for :issues_access_level, value: ENABLED, allows_nil: false
+ default_value_for :forking_access_level, value: ENABLED, allows_nil: false
+ default_value_for :merge_requests_access_level, value: ENABLED, allows_nil: false
+ default_value_for :snippets_access_level, value: ENABLED, allows_nil: false
+ default_value_for :wiki_access_level, value: ENABLED, allows_nil: false
+ default_value_for :repository_access_level, value: ENABLED, allows_nil: false
+ default_value_for :analytics_access_level, value: ENABLED, allows_nil: false
default_value_for :metrics_dashboard_access_level, value: PRIVATE, allows_nil: false
- default_value_for :operations_access_level, value: ENABLED, allows_nil: false
+ default_value_for :operations_access_level, value: ENABLED, allows_nil: false
+ default_value_for :security_and_compliance_access_level, value: PRIVATE, allows_nil: false
default_value_for(:pages_access_level, allows_nil: false) do |feature|
if ::Gitlab::Pages.access_control_is_forced?
diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb
index 5857d86f921..12f7bac23e4 100644
--- a/app/models/project_services/jira_service.rb
+++ b/app/models/project_services/jira_service.rb
@@ -124,15 +124,11 @@ class JiraService < IssueTrackerService
end
def fields
- transition_id_help_path = help_page_path('user/project/integrations/jira', anchor: 'obtaining-a-transition-id')
- transition_id_help_link_start = '<a href="%{transition_id_help_path}" target="_blank" rel="noopener noreferrer">'.html_safe % { transition_id_help_path: transition_id_help_path }
-
[
{ type: 'text', name: 'url', title: s_('JiraService|Web URL'), placeholder: 'https://jira.example.com', required: true },
{ type: 'text', name: 'api_url', title: s_('JiraService|Jira API URL'), placeholder: s_('JiraService|If different from Web URL') },
{ type: 'text', name: 'username', title: s_('JiraService|Username or Email'), placeholder: s_('JiraService|Use a username for server version and an email for cloud version'), required: true },
- { type: 'password', name: 'password', title: s_('JiraService|Password or API token'), placeholder: s_('JiraService|Use a password for server version and an API token for cloud version'), required: true },
- { type: 'text', name: 'jira_issue_transition_id', title: s_('JiraService|Jira workflow transition IDs'), placeholder: s_('JiraService|For example, 12, 24'), help: s_('JiraService|Set transition IDs for Jira workflow transitions. %{link_start}Learn more%{link_end}'.html_safe % { link_start: transition_id_help_link_start, link_end: '</a>'.html_safe }) }
+ { type: 'password', name: 'password', title: s_('JiraService|Password or API token'), placeholder: s_('JiraService|Use a password for server version and an API token for cloud version'), required: true }
]
end
@@ -159,17 +155,19 @@ class JiraService < IssueTrackerService
# support any events.
end
- def find_issue(issue_key, rendered_fields: false)
- options = {}
- options = options.merge(expand: 'renderedFields') if rendered_fields
+ def find_issue(issue_key, rendered_fields: false, transitions: false)
+ expands = []
+ expands << 'renderedFields' if rendered_fields
+ expands << 'transitions' if transitions
+ options = { expand: expands.join(',') } if expands.any?
- jira_request { client.Issue.find(issue_key, options) }
+ jira_request { client.Issue.find(issue_key, options || {}) }
end
def close_issue(entity, external_issue, current_user)
- issue = find_issue(external_issue.iid)
+ issue = find_issue(external_issue.iid, transitions: automatic_issue_transitions?)
- return if issue.nil? || has_resolution?(issue) || !jira_issue_transition_id.present?
+ return if issue.nil? || has_resolution?(issue)
commit_id = case entity
when Commit then entity.id
@@ -260,24 +258,52 @@ class JiraService < IssueTrackerService
end
end
+ def automatic_issue_transitions?
+ jira_issue_transition_id.blank?
+ end
+
# jira_issue_transition_id can have multiple values split by , or ;
# the issue is transitioned at the order given by the user
# if any transition fails it will log the error message and stop the transition sequence
def transition_issue(issue)
- jira_issue_transition_id.scan(Gitlab::Regex.jira_transition_id_regex).each do |transition_id|
- issue.transitions.build.save!(transition: { id: transition_id })
- rescue => error
- log_error(
- "Issue transition failed",
- error: {
- exception_class: error.class.name,
- exception_message: error.message,
- exception_backtrace: Gitlab::BacktraceCleaner.clean_backtrace(error.backtrace)
- },
- client_url: client_url
- )
- return false
+ return transition_issue_to_done(issue) if automatic_issue_transitions?
+
+ jira_issue_transition_id.scan(Gitlab::Regex.jira_transition_id_regex).all? do |transition_id|
+ transition_issue_to_id(issue, transition_id)
+ end
+ end
+
+ def transition_issue_to_id(issue, transition_id)
+ issue.transitions.build.save!(
+ transition: { id: transition_id }
+ )
+
+ true
+ rescue => error
+ log_error(
+ "Issue transition failed",
+ error: {
+ exception_class: error.class.name,
+ exception_message: error.message,
+ exception_backtrace: Gitlab::BacktraceCleaner.clean_backtrace(error.backtrace)
+ },
+ client_url: client_url
+ )
+
+ false
+ end
+
+ def transition_issue_to_done(issue)
+ transitions = issue.transitions rescue []
+
+ transition = transitions.find do |transition|
+ status = transition&.to&.statusCategory
+ status && status['key'] == 'done'
end
+
+ return false unless transition
+
+ transition_issue_to_id(issue, transition.id)
end
def log_usage(action, user)
diff --git a/app/models/project_services/mattermost_service.rb b/app/models/project_services/mattermost_service.rb
index c1055db78e5..9cff979fcf2 100644
--- a/app/models/project_services/mattermost_service.rb
+++ b/app/models/project_services/mattermost_service.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class MattermostService < ChatNotificationService
- include ::SlackService::Notifier
+ include SlackMattermost::Notifier
def title
'Mattermost notifications'
diff --git a/app/models/project_services/slack_mattermost/notifier.rb b/app/models/project_services/slack_mattermost/notifier.rb
new file mode 100644
index 00000000000..1a78cea5933
--- /dev/null
+++ b/app/models/project_services/slack_mattermost/notifier.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module SlackMattermost
+ module Notifier
+ private
+
+ def notify(message, opts)
+ # See https://gitlab.com/gitlab-org/slack-notifier/#custom-http-client
+ notifier = Slack::Messenger.new(webhook, opts.merge(http_client: HTTPClient))
+ notifier.ping(
+ message.pretext,
+ attachments: message.attachments,
+ fallback: message.fallback
+ )
+ end
+
+ class HTTPClient
+ def self.post(uri, params = {})
+ params.delete(:http_options) # these are internal to the client and we do not want them
+ Gitlab::HTTP.post(uri, body: params)
+ end
+ end
+ end
+end
diff --git a/app/models/project_services/slack_service.rb b/app/models/project_services/slack_service.rb
index 79245e84238..abe799bdff5 100644
--- a/app/models/project_services/slack_service.rb
+++ b/app/models/project_services/slack_service.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class SlackService < ChatNotificationService
+ include SlackMattermost::Notifier
+
prop_accessor EVENT_CHANNEL['alert']
def title
@@ -35,27 +37,4 @@ class SlackService < ChatNotificationService
super
end
-
- module Notifier
- private
-
- def notify(message, opts)
- # See https://gitlab.com/gitlab-org/slack-notifier/#custom-http-client
- notifier = Slack::Messenger.new(webhook, opts.merge(http_client: HTTPClient))
- notifier.ping(
- message.pretext,
- attachments: message.attachments,
- fallback: message.fallback
- )
- end
-
- class HTTPClient
- def self.post(uri, params = {})
- params.delete(:http_options) # these are internal to the client and we do not want them
- Gitlab::HTTP.post(uri, body: params)
- end
- end
- end
-
- include Notifier
end
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 06a13194e1a..84ca8f0c12a 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -43,7 +43,7 @@ class Repository
changelog license_blob license_key gitignore
gitlab_ci_yml branch_names tag_names branch_count
tag_count avatar exists? root_ref merged_branch_names
- has_visible_content? issue_template_names_by_category merge_request_template_names_by_category
+ has_visible_content? issue_template_names_hash merge_request_template_names_hash
user_defined_metrics_dashboard_paths xcode_project? has_ambiguous_refs?).freeze
# Methods that use cache_method but only memoize the value
@@ -60,8 +60,8 @@ class Repository
gitignore: :gitignore,
gitlab_ci: :gitlab_ci_yml,
avatar: :avatar,
- issue_template: :issue_template_names_by_category,
- merge_request_template: :merge_request_template_names_by_category,
+ issue_template: :issue_template_names_hash,
+ merge_request_template: :merge_request_template_names_hash,
metrics_dashboard: :user_defined_metrics_dashboard_paths,
xcode_config: :xcode_project?
}.freeze
@@ -573,15 +573,15 @@ class Repository
cache_method :avatar
# store issue_template_names as hash
- def issue_template_names_by_category
+ def issue_template_names_hash
Gitlab::Template::IssueTemplate.repository_template_names(project)
end
- cache_method :issue_template_names_by_category, fallback: {}
+ cache_method :issue_template_names_hash, fallback: {}
- def merge_request_template_names_by_category
+ def merge_request_template_names_hash
Gitlab::Template::MergeRequestTemplate.repository_template_names(project)
end
- cache_method :merge_request_template_names_by_category, fallback: {}
+ cache_method :merge_request_template_names_hash, fallback: {}
def user_defined_metrics_dashboard_paths
Gitlab::Metrics::Dashboard::RepoDashboardFinder.list_dashboards(project)
diff --git a/app/models/snippet.rb b/app/models/snippet.rb
index ab8782ed87f..b68e166af48 100644
--- a/app/models/snippet.rb
+++ b/app/models/snippet.rb
@@ -216,8 +216,10 @@ class Snippet < ApplicationRecord
def blobs
return [] unless repository_exists?
- branch = default_branch
- list_files(branch).map { |file| Blob.lazy(repository, branch, file) }
+ files = list_files(default_branch)
+ items = files.map { |file| [default_branch, file] }
+
+ repository.blobs_at(items).compact
end
def hook_attrs
diff --git a/app/models/user.rb b/app/models/user.rb
index 1f8b680c7e5..d91fc3ebce4 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -179,6 +179,7 @@ class User < ApplicationRecord
has_many :merge_request_reviewers, inverse_of: :reviewer
has_many :assigned_issues, class_name: "Issue", through: :issue_assignees, source: :issue
has_many :assigned_merge_requests, class_name: "MergeRequest", through: :merge_request_assignees, source: :merge_request
+ has_many :created_custom_emoji, class_name: 'CustomEmoji', inverse_of: :creator
has_many :bulk_imports
diff --git a/app/policies/analytics/instance_statistics/measurement_policy.rb b/app/policies/analytics/usage_trends/measurement_policy.rb
index 3d6a5a08ff6..da3c0927ea5 100644
--- a/app/policies/analytics/instance_statistics/measurement_policy.rb
+++ b/app/policies/analytics/usage_trends/measurement_policy.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module Analytics
- module InstanceStatistics
+ module UsageTrends
class MeasurementPolicy < BasePolicy
delegate { :global }
end
diff --git a/app/policies/global_policy.rb b/app/policies/global_policy.rb
index 9c79a797a6a..5ee34ebbb2f 100644
--- a/app/policies/global_policy.rb
+++ b/app/policies/global_policy.rb
@@ -100,7 +100,7 @@ class GlobalPolicy < BasePolicy
enable :update_custom_attribute
enable :approve_user
enable :reject_user
- enable :read_instance_statistics_measurements
+ enable :read_usage_trends_measurement
end
# We can't use `read_statistics` because the user may have different permissions for different projects
diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb
index aaf985d6c63..c15c4682654 100644
--- a/app/policies/project_policy.rb
+++ b/app/policies/project_policy.rb
@@ -156,6 +156,7 @@ class ProjectPolicy < BasePolicy
metrics_dashboard
analytics
operations
+ security_and_compliance
]
features.each do |f|
@@ -640,6 +641,10 @@ class ProjectPolicy < BasePolicy
enable :set_pipeline_variables
end
+ rule { ~security_and_compliance_disabled & can?(:developer_access) }.policy do
+ enable :access_security_and_compliance
+ end
+
private
def user_is_user?
diff --git a/app/presenters/packages/composer/packages_presenter.rb b/app/presenters/packages/composer/packages_presenter.rb
index ed0e9d3b731..381cf2dd2c9 100644
--- a/app/presenters/packages/composer/packages_presenter.rb
+++ b/app/presenters/packages/composer/packages_presenter.rb
@@ -11,7 +11,7 @@ module Packages
end
def root
- path = api_v4_group___packages_composer_package_name_path({ id: @group.id, package_name: '%package%$%hash%', format: '.json' }, true)
+ path = expose_path(api_v4_group___packages_composer_package_name_path({ id: @group.id, package_name: '%package%$%hash%', format: '.json' }, true))
{ 'packages' => [], 'provider-includes' => { 'p/%hash%.json' => { 'sha256' => provider_sha } }, 'providers-url' => path }
end
diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb
index e13ef7a3811..a2d25e425da 100644
--- a/app/presenters/project_presenter.rb
+++ b/app/presenters/project_presenter.rb
@@ -10,10 +10,11 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
include BlobHelper
include ChecksCollaboration
include Gitlab::Utils::StrongMemoize
+ include Gitlab::Experiment::Dsl
presents :project
- AnchorData = Struct.new(:is_link, :label, :link, :class_modifier, :icon, :itemprop)
+ AnchorData = Struct.new(:is_link, :label, :link, :class_modifier, :icon, :itemprop, :data)
MAX_TOPICS_TO_SHOW = 3
def statistic_icon(icon_name = 'plus-square-o')
@@ -33,6 +34,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
def statistics_buttons(show_auto_devops_callout:)
[
+ upload_anchor_data,
readme_anchor_data,
license_anchor_data,
changelog_anchor_data,
@@ -49,6 +51,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
def empty_repo_statistics_buttons
[
+ upload_anchor_data,
new_file_anchor_data,
readme_anchor_data,
license_anchor_data,
@@ -154,6 +157,8 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
end
def can_current_user_push_to_branch?(branch)
+ return false unless current_user
+
user_access(project).can_push_to_branch?(branch)
end
@@ -232,19 +237,47 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
empty_repo? ? nil : project_tags_path(project))
end
+ def upload_anchor_data
+ strong_memoize(:upload_anchor_data) do
+ next unless can_current_user_push_to_default_branch?
+
+ experiment(:empty_repo_upload, project: project) do |e|
+ e.use {}
+ e.try do
+ AnchorData.new(false,
+ statistic_icon('upload') + _('Upload file'),
+ '#modal-upload-blob',
+ 'js-upload-file-experiment-trigger',
+ nil,
+ nil,
+ {
+ 'toggle' => 'modal',
+ 'target' => '#modal-upload-blob'
+ }
+ )
+ end
+ e.run
+ end
+ end
+ end
+
+ def empty_repo_upload_experiment?
+ upload_anchor_data.present?
+ end
+
def new_file_anchor_data
- if current_user && can_current_user_push_to_default_branch?
+ if can_current_user_push_to_default_branch?
new_file_path = empty_repo? ? ide_edit_path(project, default_branch_or_master) : project_new_blob_path(project, default_branch_or_master)
AnchorData.new(false,
statistic_icon + _('New file'),
new_file_path,
- 'dashed')
+ 'btn-dashed')
end
end
def readme_anchor_data
- if current_user && can_current_user_push_to_default_branch? && readme_path.nil?
+ if can_current_user_push_to_default_branch? && readme_path.nil?
AnchorData.new(false,
statistic_icon + _('Add README'),
empty_repo? ? add_readme_ide_path : add_readme_path)
@@ -252,13 +285,13 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
AnchorData.new(false,
statistic_icon('doc-text') + _('README'),
default_view != 'readme' ? readme_path : '#readme',
- 'default',
+ 'btn-default',
'doc-text')
end
end
def changelog_anchor_data
- if current_user && can_current_user_push_to_default_branch? && repository.changelog.blank?
+ if can_current_user_push_to_default_branch? && repository.changelog.blank?
AnchorData.new(false,
statistic_icon + _('Add CHANGELOG'),
empty_repo? ? add_changelog_ide_path : add_changelog_path)
@@ -266,7 +299,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
AnchorData.new(false,
statistic_icon('doc-text') + _('CHANGELOG'),
changelog_path,
- 'default')
+ 'btn-default')
end
end
@@ -277,11 +310,11 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
AnchorData.new(false,
icon + content_tag(:span, license_short_name, class: 'project-stat-value'),
license_path,
- 'default',
+ 'btn-default',
nil,
'license')
else
- if current_user && can_current_user_push_to_default_branch?
+ if can_current_user_push_to_default_branch?
AnchorData.new(false,
content_tag(:span, statistic_icon + _('Add LICENSE'), class: 'add-license-link d-flex'),
empty_repo? ? add_license_ide_path : add_license_path)
@@ -294,7 +327,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
end
def contribution_guide_anchor_data
- if current_user && can_current_user_push_to_default_branch? && repository.contribution_guide.blank?
+ if can_current_user_push_to_default_branch? && repository.contribution_guide.blank?
AnchorData.new(false,
statistic_icon + _('Add CONTRIBUTING'),
empty_repo? ? add_contribution_guide_ide_path : add_contribution_guide_path)
@@ -302,7 +335,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
AnchorData.new(false,
statistic_icon('doc-text') + _('CONTRIBUTING'),
contribution_guide_path,
- 'default')
+ 'btn-default')
end
end
@@ -312,7 +345,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
AnchorData.new(false,
statistic_icon('settings') + _('Auto DevOps enabled'),
project_settings_ci_cd_path(project, anchor: 'autodevops-settings'),
- 'default')
+ 'btn-default')
else
AnchorData.new(false,
statistic_icon + _('Enable Auto DevOps'),
@@ -337,7 +370,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
AnchorData.new(false,
_('Kubernetes'),
cluster_link,
- 'default')
+ 'btn-default')
end
end
end
@@ -351,7 +384,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
AnchorData.new(false,
statistic_icon('doc-text') + _('CI/CD configuration'),
ci_configuration_path,
- 'default')
+ 'btn-default')
end
end
diff --git a/app/serializers/base_discussion_entity.rb b/app/serializers/base_discussion_entity.rb
index 8d4c3906847..7d3b9651b8b 100644
--- a/app/serializers/base_discussion_entity.rb
+++ b/app/serializers/base_discussion_entity.rb
@@ -40,7 +40,7 @@ class BaseDiscussionEntity < Grape::Entity
end
expose :resolve_with_issue_path do |discussion|
- new_project_issue_path(discussion.project, merge_request_to_resolve_discussions_of: discussion.noteable.iid, discussion_to_resolve: discussion.id)
+ new_project_issue_path(discussion.project, merge_request_to_resolve_discussions_of: discussion.noteable.iid, discussion_to_resolve: discussion.id) if discussion&.project&.issues_enabled?
end
end
diff --git a/app/serializers/current_board_entity.rb b/app/serializers/current_board_entity.rb
index f9d6691dc84..08f31bc698f 100644
--- a/app/serializers/current_board_entity.rb
+++ b/app/serializers/current_board_entity.rb
@@ -3,6 +3,8 @@
class CurrentBoardEntity < Grape::Entity
expose :id
expose :name
+ expose :hide_backlog_list
+ expose :hide_closed_list
end
CurrentBoardEntity.prepend_if_ee('EE::CurrentBoardEntity')
diff --git a/app/services/boards/lists/list_service.rb b/app/services/boards/lists/list_service.rb
index e4c789c4597..3c296cde51e 100644
--- a/app/services/boards/lists/list_service.rb
+++ b/app/services/boards/lists/list_service.rb
@@ -9,7 +9,26 @@ module Boards
end
lists = board.lists.preload_associated_models
- params[:list_id].present? ? lists.where(id: params[:list_id]) : lists # rubocop: disable CodeReuse/ActiveRecord
+
+ return lists.id_in(params[:list_id]) if params[:list_id].present?
+
+ list_types = unavailable_list_types_for(board)
+ lists.without_types(list_types)
+ end
+
+ private
+
+ def unavailable_list_types_for(board)
+ hidden_lists_for(board)
+ end
+
+ def hidden_lists_for(board)
+ hidden = []
+
+ hidden << ::List.list_types[:backlog] if board.hide_backlog_list
+ hidden << ::List.list_types[:closed] if board.hide_closed_list
+
+ hidden
end
end
end
diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb
index dc42411dfa1..0fd47e625fd 100644
--- a/app/services/ci/create_pipeline_service.rb
+++ b/app/services/ci/create_pipeline_service.rb
@@ -122,7 +122,9 @@ module Ci
end
def record_conversion_event
- Experiments::RecordConversionEventWorker.perform_async(:ci_syntax_templates, current_user.id)
+ return unless project.namespace.recent?
+
+ Experiments::RecordConversionEventWorker.perform_async(:ci_syntax_templates_b, current_user.id)
end
def create_namespace_onboarding_action
diff --git a/app/services/clusters/kubernetes.rb b/app/services/clusters/kubernetes.rb
index 819ac4c8464..ef549b56946 100644
--- a/app/services/clusters/kubernetes.rb
+++ b/app/services/clusters/kubernetes.rb
@@ -14,5 +14,7 @@ module Clusters
GITLAB_CROSSPLANE_DATABASE_ROLE_BINDING_NAME = 'gitlab-crossplane-database-rolebinding'
KNATIVE_SERVING_NAMESPACE = 'knative-serving'
ISTIO_SYSTEM_NAMESPACE = 'istio-system'
+ GITLAB_CILIUM_ROLE_NAME = 'gitlab-cilium-role'
+ GITLAB_CILIUM_ROLE_BINDING_NAME = 'gitlab-cilium-rolebinding'
end
end
diff --git a/app/services/clusters/kubernetes/create_or_update_service_account_service.rb b/app/services/clusters/kubernetes/create_or_update_service_account_service.rb
index eabc428d0d2..ecad33fc7c0 100644
--- a/app/services/clusters/kubernetes/create_or_update_service_account_service.rb
+++ b/app/services/clusters/kubernetes/create_or_update_service_account_service.rb
@@ -53,6 +53,8 @@ module Clusters
create_or_update_knative_serving_role_binding
create_or_update_crossplane_database_role
create_or_update_crossplane_database_role_binding
+ create_or_update_cilium_role
+ create_or_update_cilium_role_binding
end
private
@@ -97,6 +99,14 @@ module Clusters
kubeclient.update_role_binding(crossplane_database_role_binding_resource)
end
+ def create_or_update_cilium_role
+ kubeclient.update_role(cilium_role_resource)
+ end
+
+ def create_or_update_cilium_role_binding
+ kubeclient.update_role_binding(cilium_role_binding_resource)
+ end
+
def service_account_resource
Gitlab::Kubernetes::ServiceAccount.new(
service_account_name,
@@ -175,6 +185,28 @@ module Clusters
service_account_name: service_account_name
).generate
end
+
+ def cilium_role_resource
+ Gitlab::Kubernetes::Role.new(
+ name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME,
+ namespace: service_account_namespace,
+ rules: [{
+ apiGroups: %w(cilium.io),
+ resources: %w(ciliumnetworkpolicies),
+ verbs: %w(get list create update patch)
+ }]
+ ).generate
+ end
+
+ def cilium_role_binding_resource
+ Gitlab::Kubernetes::RoleBinding.new(
+ name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_BINDING_NAME,
+ role_name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME,
+ role_kind: :Role,
+ namespace: service_account_namespace,
+ service_account_name: service_account_name
+ ).generate
+ end
end
end
end
diff --git a/app/services/groups/destroy_service.rb b/app/services/groups/destroy_service.rb
index c7107e2fa56..a27330d1104 100644
--- a/app/services/groups/destroy_service.rb
+++ b/app/services/groups/destroy_service.rb
@@ -31,11 +31,11 @@ module Groups
# If any other groups are shared with the group that is being destroyed,
# we should specifically trigger update of all project authorizations
- # for users that are the members of this group.
+ # for users that are the direct members of this group.
# If not, the project authorization records of these users to projects within the shared groups
# will never be removed, causing inconsistencies with access permissions.
if any_other_groups_are_shared_with_this_group?
- user_ids_for_project_authorizations_refresh = group.user_ids_for_project_authorizations
+ user_ids_for_project_authorizations_refresh = group.users_ids_of_direct_members
end
group.destroy
diff --git a/app/services/groups/group_links/create_service.rb b/app/services/groups/group_links/create_service.rb
index 589ac7ccde7..57c746c3841 100644
--- a/app/services/groups/group_links/create_service.rb
+++ b/app/services/groups/group_links/create_service.rb
@@ -18,7 +18,7 @@ module Groups
)
if link.save
- group.refresh_members_authorized_projects
+ group.refresh_members_authorized_projects(direct_members_only: true)
success(link: link)
else
error(link.errors.full_messages.to_sentence, 409)
diff --git a/app/services/groups/group_links/destroy_service.rb b/app/services/groups/group_links/destroy_service.rb
index b0d496ae78c..05504a80f46 100644
--- a/app/services/groups/group_links/destroy_service.rb
+++ b/app/services/groups/group_links/destroy_service.rb
@@ -16,7 +16,7 @@ module Groups
groups_to_refresh = links.map(&:shared_with_group)
groups_to_refresh.uniq.each do |group|
- group.refresh_members_authorized_projects
+ group.refresh_members_authorized_projects(direct_members_only: true)
end
else
Gitlab::AppLogger.info(
diff --git a/app/services/groups/group_links/update_service.rb b/app/services/groups/group_links/update_service.rb
index 71b52cb616c..3703d535482 100644
--- a/app/services/groups/group_links/update_service.rb
+++ b/app/services/groups/group_links/update_service.rb
@@ -13,7 +13,7 @@ module Groups
group_link.update!(group_link_params)
if requires_authorization_refresh?(group_link_params)
- group_link.shared_with_group.refresh_members_authorized_projects
+ group_link.shared_with_group.refresh_members_authorized_projects(direct_members_only: true)
end
end
diff --git a/app/services/issuable/process_assignees.rb b/app/services/issuable/process_assignees.rb
new file mode 100644
index 00000000000..c9c6b0bed85
--- /dev/null
+++ b/app/services/issuable/process_assignees.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+# This follows the rules specified in the specs.
+# See spec/requests/api/graphql/mutations/merge_requests/set_assignees_spec.rb
+
+module Issuable
+ class ProcessAssignees
+ def initialize(assignee_ids:, add_assignee_ids:, remove_assignee_ids:, existing_assignee_ids: nil, extra_assignee_ids: nil)
+ @assignee_ids = assignee_ids
+ @add_assignee_ids = add_assignee_ids
+ @remove_assignee_ids = remove_assignee_ids
+ @existing_assignee_ids = existing_assignee_ids || []
+ @extra_assignee_ids = extra_assignee_ids || []
+ end
+
+ def execute
+ if assignee_ids.blank?
+ updated_new_assignees = new_assignee_ids
+ updated_new_assignees |= add_assignee_ids if add_assignee_ids
+ updated_new_assignees -= remove_assignee_ids if remove_assignee_ids
+ else
+ updated_new_assignees = assignee_ids
+ end
+
+ updated_new_assignees.uniq
+ end
+
+ private
+
+ attr_accessor :assignee_ids, :add_assignee_ids, :remove_assignee_ids, :existing_assignee_ids, :extra_assignee_ids
+
+ def new_assignee_ids
+ existing_assignee_ids | extra_assignee_ids
+ end
+ end
+end
diff --git a/app/services/issues/export_csv_service.rb b/app/services/issues/export_csv_service.rb
index 2181c46c90d..dd43c77adfa 100644
--- a/app/services/issues/export_csv_service.rb
+++ b/app/services/issues/export_csv_service.rb
@@ -5,6 +5,12 @@ module Issues
include Gitlab::Routing.url_helpers
include GitlabRoutingHelper
+ def initialize(issuables_relation, project)
+ super
+
+ @labels = @issuables.labels_hash.transform_values { |labels| labels.sort.join(',').presence }
+ end
+
def email(user)
Notify.issues_csv_email(user, project, csv_data, csv_builder.status).deliver_now
end
@@ -12,7 +18,7 @@ module Issues
private
def associations_to_preload
- %i(author assignees timelogs milestone)
+ %i(author assignees timelogs milestone project)
end
def header_to_value_hash
@@ -41,7 +47,7 @@ module Issues
end
def issue_labels(issue)
- issuables.labels_hash[issue.id].sort.join(',').presence
+ @labels[issue.id]
end
# rubocop: disable CodeReuse/ActiveRecord
diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb
index ed977a5a872..32b1079df1a 100644
--- a/app/services/merge_requests/refresh_service.rb
+++ b/app/services/merge_requests/refresh_service.rb
@@ -74,7 +74,8 @@ module MergeRequests
def post_merge_manually_merged
commit_ids = @commits.map(&:id)
merge_requests = @project.merge_requests.opened
- .preload(:latest_merge_request_diff)
+ .preload_project_and_latest_diff
+ .preload_latest_diff_comment
.where(target_branch: @push.branch_name).to_a
.select(&:diff_head_commit)
.select do |merge_request|
@@ -116,11 +117,14 @@ module MergeRequests
# Note: we should update merge requests from forks too
def reload_merge_requests
merge_requests = @project.merge_requests.opened
- .by_source_or_target_branch(@push.branch_name).to_a
+ .by_source_or_target_branch(@push.branch_name)
+ .preload_project_and_latest_diff
- merge_requests += merge_requests_for_forks.to_a
+ merge_requests_from_forks = merge_requests_for_forks
+ .preload_project_and_latest_diff
- filter_merge_requests(merge_requests).each do |merge_request|
+ merge_requests_array = merge_requests.to_a + merge_requests_from_forks.to_a
+ filter_merge_requests(merge_requests_array).each do |merge_request|
if branch_and_project_match?(merge_request) || @push.force_push?
merge_request.reload_diff(current_user)
# Clear existing merge error if the push were directed at the
diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb
index 50247532f69..cf8dce91bbd 100644
--- a/app/services/notification_service.rb
+++ b/app/services/notification_service.rb
@@ -665,7 +665,12 @@ class NotificationService
end
def merge_when_pipeline_succeeds(merge_request, current_user)
- recipients = ::NotificationRecipients::BuildService.build_recipients(merge_request, current_user, action: 'merge_when_pipeline_succeeds')
+ recipients = ::NotificationRecipients::BuildService.build_recipients(
+ merge_request,
+ current_user,
+ action: 'merge_when_pipeline_succeeds',
+ custom_action: :merge_when_pipeline_succeeds
+ )
recipients.each do |recipient|
mailer.merge_when_pipeline_succeeds_email(recipient.user.id, merge_request.id, current_user.id).deliver_later
diff --git a/app/services/packages/create_temporary_package_service.rb b/app/services/packages/create_temporary_package_service.rb
new file mode 100644
index 00000000000..ee609fd787d
--- /dev/null
+++ b/app/services/packages/create_temporary_package_service.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Packages
+ class CreateTemporaryPackageService < ::Packages::CreatePackageService
+ PACKAGE_VERSION = '0.0.0'
+
+ def execute(package_type, name: 'Temporary.Package')
+ create_package!(package_type,
+ name: name,
+ version: "#{PACKAGE_VERSION}-#{uuid}",
+ status: 'processing'
+ )
+ end
+
+ private
+
+ def uuid
+ SecureRandom.uuid
+ end
+ end
+end
diff --git a/app/services/packages/nuget/create_package_service.rb b/app/services/packages/nuget/create_package_service.rb
deleted file mode 100644
index 3999ccd3347..00000000000
--- a/app/services/packages/nuget/create_package_service.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-module Packages
- module Nuget
- class CreatePackageService < ::Packages::CreatePackageService
- TEMPORARY_PACKAGE_NAME = 'NuGet.Temporary.Package'
- PACKAGE_VERSION = '0.0.0'
-
- def execute
- create_package!(:nuget,
- name: TEMPORARY_PACKAGE_NAME,
- version: "#{PACKAGE_VERSION}-#{uuid}"
- )
- end
-
- private
-
- def uuid
- SecureRandom.uuid
- end
- end
- end
-end
diff --git a/app/services/packages/nuget/update_package_from_metadata_service.rb b/app/services/packages/nuget/update_package_from_metadata_service.rb
index 0109ee23c49..1bcab00bd92 100644
--- a/app/services/packages/nuget/update_package_from_metadata_service.rb
+++ b/app/services/packages/nuget/update_package_from_metadata_service.rb
@@ -68,7 +68,8 @@ module Packages
def update_linked_package
@package_file.package.update!(
name: package_name,
- version: package_version
+ version: package_version,
+ status: :default
)
::Packages::Nuget::CreateDependencyService.new(@package_file.package, package_dependencies)
diff --git a/app/services/pages/legacy_storage_lease.rb b/app/services/pages/legacy_storage_lease.rb
index 3f42fc8c63b..1849def0183 100644
--- a/app/services/pages/legacy_storage_lease.rb
+++ b/app/services/pages/legacy_storage_lease.rb
@@ -8,15 +8,6 @@ module Pages
LEASE_TIMEOUT = 1.hour
- # override method from exclusive lease guard to guard it by feature flag
- # TODO: just remove this method after testing this in production
- # https://gitlab.com/gitlab-org/gitlab/-/issues/282464
- def try_obtain_lease
- return yield unless Feature.enabled?(:pages_use_legacy_storage_lease, project, default_enabled: true)
-
- super
- end
-
def lease_key
"pages_legacy_storage:#{project.id}"
end
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index 08f569662a8..e3b1fd5f4c0 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -19,6 +19,8 @@ module Projects
@project = Project.new(params)
+ @project.visibility_level = @project.group.visibility_level unless @project.visibility_level_allowed_by_group?
+
# If a project is newly created it should have shared runners settings
# based on its group having it enabled. This is like the "default value"
@project.shared_runners_enabled = false if !params.key?(:shared_runners_enabled) && @project.group && @project.group.shared_runners_setting != 'enabled'
diff --git a/app/validators/json_schemas/vulnerability_finding_details.json b/app/validators/json_schemas/vulnerability_finding_details.json
index f2940866f4b..2ba1fc9e9db 100644
--- a/app/validators/json_schemas/vulnerability_finding_details.json
+++ b/app/validators/json_schemas/vulnerability_finding_details.json
@@ -6,60 +6,67 @@
"^.*$": {
"allOf": [
{ "$ref": "#/definitions/named_field" },
- { "$ref": "#/definitions/type_list" }
+ { "$ref": "#/definitions/detail_type" }
]
}
},
"definitions": {
- "type_list": {
+ "detail_type": {
"oneOf": [
{ "$ref": "#/definitions/named_list" },
{ "$ref": "#/definitions/list" },
{ "$ref": "#/definitions/table" },
-
{ "$ref": "#/definitions/text" },
{ "$ref": "#/definitions/url" },
{ "$ref": "#/definitions/code" },
- { "$ref": "#/definitions/int" },
-
+ { "$ref": "#/definitions/value" },
+ { "$ref": "#/definitions/diff" },
+ { "$ref": "#/definitions/markdown" },
{ "$ref": "#/definitions/commit" },
{ "$ref": "#/definitions/file_location" },
{ "$ref": "#/definitions/module_location" }
]
},
- "lang_text": {
- "type": "object",
- "required": [ "value", "lang" ],
- "properties": {
- "lang": { "type": "string" },
- "value": { "type": "string" }
- }
- },
- "lang_text_list": {
- "type": "array",
- "items": { "$ref": "#/definitions/lang_text" }
+ "text_value": {
+ "type": "string"
},
"named_field": {
"type": "object",
- "required": [ "name" ],
+ "required": [
+ "name"
+ ],
"properties": {
- "name": { "$ref": "#/definitions/lang_text_list" },
- "description": { "$ref": "#/definitions/lang_text_list" }
+ "name": {
+ "$ref": "#/definitions/text_value",
+ "minLength": 1
+ },
+ "description": {
+ "$ref": "#/definitions/text_value"
+ }
}
},
"named_list": {
"type": "object",
"description": "An object with named and typed fields",
- "required": [ "type", "items" ],
+ "required": [
+ "type",
+ "items"
+ ],
"properties": {
- "type": { "const": "named-list" },
+ "type": {
+ "const": "named-list"
+ },
"items": {
"type": "object",
"patternProperties": {
"^.*$": {
"allOf": [
- { "$ref": "#/definitions/named_field" },
- { "$ref": "#/definitions/type_list" }
+ {
+ "$ref": "#/definitions/named_field"
+ },
+ {
+ "$ref": "#/definitions/detail_type"
+ }
]
}
}
@@ -69,38 +76,45 @@
"list": {
"type": "object",
"description": "A list of typed fields",
- "required": [ "type", "items" ],
+ "required": [
+ "type",
+ "items"
+ ],
"properties": {
- "type": { "const": "list" },
+ "type": {
+ "const": "list"
+ },
"items": {
"type": "array",
- "items": { "$ref": "#/definitions/type_list" }
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
}
}
},
"table": {
"type": "object",
"description": "A table of typed fields",
- "required": [],
+ "required": [
+ "type",
+ "rows"
+ ],
"properties": {
- "type": { "const": "table" },
- "items": {
- "type": "object",
- "properties": {
- "header": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/type_list"
- }
- },
- "rows": {
- "type": "array",
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/type_list"
- }
- }
+ "type": {
+ "const": "table"
+ },
+ "header": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
}
}
}
@@ -109,73 +123,171 @@
"text": {
"type": "object",
"description": "Raw text",
- "required": [ "type", "value" ],
+ "required": [
+ "type",
+ "value"
+ ],
"properties": {
- "type": { "const": "text" },
- "value": { "$ref": "#/definitions/lang_text_list" }
+ "type": {
+ "const": "text"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value"
+ }
}
},
"url": {
"type": "object",
"description": "A single URL",
- "required": [ "type", "href" ],
+ "required": [
+ "type",
+ "href"
+ ],
"properties": {
- "type": { "const": "url" },
- "text": { "$ref": "#/definitions/lang_text_list" },
- "href": { "type": "string" }
+ "type": {
+ "const": "url"
+ },
+ "text": {
+ "$ref": "#/definitions/text_value"
+ },
+ "href": {
+ "type": "string",
+ "minLength": 1,
+ "examples": ["http://mysite.com"]
+ }
}
},
"code": {
"type": "object",
"description": "A codeblock",
- "required": [ "type", "value" ],
+ "required": [
+ "type",
+ "value"
+ ],
"properties": {
- "type": { "const": "code" },
- "value": { "type": "string" },
- "lang": { "type": "string" }
+ "type": {
+ "const": "code"
+ },
+ "value": {
+ "type": "string"
+ },
+ "lang": {
+ "type": "string",
+ "description": "A programming language"
+ }
}
},
- "int": {
+ "value": {
"type": "object",
- "description": "An integer",
- "required": [ "type", "value" ],
+ "description": "A field that can store a range of types of value",
+ "required": ["type", "value"],
"properties": {
- "type": { "const": "int" },
- "value": { "type": "integer" },
- "format": {
- "type": "string",
- "enum": [ "default", "hex" ]
+ "type": { "const": "value" },
+ "value": {
+ "type": ["number", "string", "boolean"]
+ }
+ }
+ },
+ "diff": {
+ "type": "object",
+ "description": "A diff",
+ "required": [
+ "type",
+ "before",
+ "after"
+ ],
+ "properties": {
+ "type": {
+ "const": "diff"
+ },
+ "before": {
+ "type": "string"
+ },
+ "after": {
+ "type": "string"
+ }
+ }
+ },
+ "markdown": {
+ "type": "object",
+ "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "markdown"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value",
+ "examples": ["Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"]
}
}
},
"commit": {
"type": "object",
- "description": "A specific commit within the project",
- "required": [ "type", "value" ],
+ "description": "A commit/tag/branch within the GitLab project",
+ "required": [
+ "type",
+ "value"
+ ],
"properties": {
- "type": { "const": "commit" },
- "value": { "type": "string", "description": "The commit SHA" }
+ "type": {
+ "const": "commit"
+ },
+ "value": {
+ "type": "string",
+ "description": "The commit SHA",
+ "minLength": 1
+ }
}
},
"file_location": {
"type": "object",
"description": "A location within a file in the project",
- "required": [ "type", "file_name", "line_start" ],
+ "required": [
+ "type",
+ "file_name",
+ "line_start"
+ ],
"properties": {
- "type": { "const": "file-location" },
- "file_name": { "type": "string" },
- "line_start": { "type": "integer" },
- "line_end": { "type": "integer" }
+ "type": {
+ "const": "file-location"
+ },
+ "file_name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "line_start": {
+ "type": "integer"
+ },
+ "line_end": {
+ "type": "integer"
+ }
}
},
"module_location": {
"type": "object",
"description": "A location within a binary module of the form module+relative_offset",
- "required": [ "type", "module_name", "offset" ],
+ "required": [
+ "type",
+ "module_name",
+ "offset"
+ ],
"properties": {
- "type": { "const": "module-location" },
- "module_name": { "type": "string" },
- "offset": { "type": "integer" }
+ "type": {
+ "const": "module-location"
+ },
+ "module_name": {
+ "type": "string",
+ "minLength": 1,
+ "examples": ["compiled_binary"]
+ },
+ "offset": {
+ "type": "integer",
+ "examples": [100]
+ }
}
}
}
diff --git a/app/views/admin/application_settings/_package_registry.html.haml b/app/views/admin/application_settings/_package_registry.html.haml
index 86df1aa6e02..19801a3e01c 100644
--- a/app/views/admin/application_settings/_package_registry.html.haml
+++ b/app/views/admin/application_settings/_package_registry.html.haml
@@ -36,7 +36,7 @@
= f.label :maven_max_file_size, _('Maximum Maven package file size in bytes'), class: 'label-bold'
= f.number_field :maven_max_file_size, class: 'form-control gl-form-input'
.form-group
- = f.label :npm_max_file_size, _('Maximum NPM package file size in bytes'), class: 'label-bold'
+ = f.label :npm_max_file_size, _('Maximum npm package file size in bytes'), class: 'label-bold'
= f.number_field :npm_max_file_size, class: 'form-control gl-form-input'
.form-group
= f.label :nuget_max_file_size, _('Maximum NuGet package file size in bytes'), class: 'label-bold'
diff --git a/app/views/admin/groups/_group.html.haml b/app/views/admin/groups/_group.html.haml
index dc122d74e90..df7af86e089 100644
--- a/app/views/admin/groups/_group.html.haml
+++ b/app/views/admin/groups/_group.html.haml
@@ -33,5 +33,5 @@
= visibility_level_icon(group.visibility_level)
.controls.gl-flex-shrink-0.gl-ml-5
- = link_to _('Edit'), admin_group_edit_path(group), id: "edit_#{dom_id(group)}", class: 'gl-button btn'
+ = link_to _('Edit'), admin_group_edit_path(group), id: "edit_#{dom_id(group)}", class: 'btn gl-button btn-default'
= link_to _('Delete'), [:admin, group], data: { confirm: _("Are you sure you want to remove %{group_name}?") % { group_name: group.name } }, method: :delete, class: 'gl-button btn btn-danger'
diff --git a/app/views/admin/projects/_projects.html.haml b/app/views/admin/projects/_projects.html.haml
index 4131c8b7edd..c2e40413a14 100644
--- a/app/views/admin/projects/_projects.html.haml
+++ b/app/views/admin/projects/_projects.html.haml
@@ -4,7 +4,7 @@
- @projects.each_with_index do |project|
%li.project-row{ class: ('no-description' if project.description.blank?) }
.controls
- = link_to 'Edit', edit_project_path(project), id: "edit_#{dom_id(project)}", class: "gl-button btn"
+ = link_to 'Edit', edit_project_path(project), id: "edit_#{dom_id(project)}", class: "btn gl-button btn-default"
%button.delete-project-button.gl-button.btn.btn-danger{ data: { delete_project_url: admin_project_path(project), project_name: project.name } }
= s_('AdminProjects|Delete')
diff --git a/app/views/admin/instance_statistics/index.html.haml b/app/views/admin/usage_trends/index.html.haml
index d5902f702e5..a0be48f71ce 100644
--- a/app/views/admin/instance_statistics/index.html.haml
+++ b/app/views/admin/usage_trends/index.html.haml
@@ -1,4 +1,4 @@
- breadcrumb_title _("Usage Trends")
- page_title _("Usage Trends")
-#js-instance-statistics-app
+#js-usage-trends-app
diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml
index 8da0c7f4300..f9b631ed6cf 100644
--- a/app/views/admin/users/index.html.haml
+++ b/app/views/admin/users/index.html.haml
@@ -5,7 +5,7 @@
%a.nav-link{ href: '#users', class: active_when(params[:tab] != 'cohorts'), data: { toggle: 'tab' }, role: 'tab' }
= s_('AdminUsers|Users')
%li.nav-item.js-users-tab-item{ role: 'presentation' }
- %a.nav-link{ href: '#cohorts', class: active_when(params[:tab] == 'cohorts'), data: { toggle: 'tab', track: { event: 'i_analytics_cohorts', action: 'click_tab' } }, role: 'tab' }
+ %a.nav-link{ href: '#cohorts', class: active_when(params[:tab] == 'cohorts'), data: { toggle: 'tab' }, role: 'tab' }
= s_('AdminUsers|Cohorts')
.tab-content
diff --git a/app/views/devise/confirmations/almost_there.haml b/app/views/devise/confirmations/almost_there.haml
index bf321bb690b..684af933f3a 100644
--- a/app/views/devise/confirmations/almost_there.haml
+++ b/app/views/devise/confirmations/almost_there.haml
@@ -1,14 +1,14 @@
-.well-confirmation.text-center.gl-mb-6
+.well-confirmation.gl-text-center.gl-mb-6
%h1.gl-mt-0
- Almost there...
+ = _("Almost there...")
%p.lead.gl-mb-6
- Please check your email to confirm your account
+ = _("Please check your email to confirm your account")
%hr
- if Gitlab::CurrentSettings.after_sign_up_text.present?
- .well-confirmation.text-center
+ .well-confirmation.gl-text-center
= markdown_field(Gitlab::CurrentSettings, :after_sign_up_text)
%p.text-center
- No confirmation email received? Please check your spam folder or
-.gl-mb-6.prepend-top-20.text-center
- %a.btn.btn-lg.btn-success{ href: new_user_confirmation_path }
- Request new confirmation email
+ = _("No confirmation email received? Please check your spam folder or")
+.gl-mb-6.prepend-top-20.gl-text-center
+ %a.btn.gl-button.btn-confirm{ href: new_user_confirmation_path }
+ = _("Request new confirmation email")
diff --git a/app/views/devise/sessions/_new_base.html.haml b/app/views/devise/sessions/_new_base.html.haml
index 270652483b7..98af69d43b7 100644
--- a/app/views/devise/sessions/_new_base.html.haml
+++ b/app/views/devise/sessions/_new_base.html.haml
@@ -20,4 +20,4 @@
= recaptcha_tags
.submit-container.move-submit-down
- = f.submit _('Sign in'), class: 'gl-button btn btn-success', data: { qa_selector: 'sign_in_button' }
+ = f.submit _('Sign in'), class: 'gl-button btn btn-confirm', data: { qa_selector: 'sign_in_button' }
diff --git a/app/views/devise/shared/_omniauth_box.html.haml b/app/views/devise/shared/_omniauth_box.html.haml
index 705fd9bbd0f..3ec859551ca 100644
--- a/app/views/devise/shared/_omniauth_box.html.haml
+++ b/app/views/devise/shared/_omniauth_box.html.haml
@@ -7,7 +7,7 @@
.d-flex.justify-content-between.flex-wrap
- providers.each do |provider|
- has_icon = provider_has_icon?(provider)
- = button_to omniauth_authorize_path(:user, provider), id: "oauth-login-#{provider}", class: "btn gl-button btn-default d-flex align-items-center omniauth-btn text-left oauth-login #{qa_class_for_provider(provider)}" do
+ = button_to omniauth_authorize_path(:user, provider), id: "oauth-login-#{provider}", class: "btn gl-button btn-default omniauth-btn oauth-login #{qa_class_for_provider(provider)}" do
- if has_icon
= provider_image_tag(provider)
%span
diff --git a/app/views/groups/group_members/index.html.haml b/app/views/groups/group_members/index.html.haml
index a5257ff20bc..de9859230d5 100644
--- a/app/views/groups/group_members/index.html.haml
+++ b/app/views/groups/group_members/index.html.haml
@@ -16,8 +16,9 @@
= html_escape(_('You can invite a new member to %{strong_start}%{group_name}%{strong_end}.')) % { group_name: @group.name, strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe }
- if can_invite_members_for_group?(@group)
.gl-w-half.gl-xs-w-full
- .gl-display-flex.gl-flex-wrap.gl-lg-justify-content-end.gl-mx-n2.gl-mb-3
- .js-invite-members-trigger.gl-px-2.gl-sm-w-auto.gl-w-full.gl-mb-4{ data: { classes: 'btn btn-success gl-button gl-mt-3 gl-sm-w-auto gl-w-full', display_text: _('Invite members') } }
+ .gl-display-flex.gl-flex-wrap.gl-justify-content-end.gl-mb-3
+ .js-invite-group-trigger{ data: { classes: 'gl-mt-3 gl-sm-w-auto gl-w-full', display_text: _('Invite a group') } }
+ .js-invite-members-trigger{ data: { classes: 'btn btn-success gl-button gl-mt-3 gl-sm-w-auto gl-w-full gl-sm-ml-3', display_text: _('Invite members') } }
= render 'groups/invite_members_modal', group: @group
- if can_manage_members && !can_invite_members_for_group?(@group)
%hr.gl-mt-4
diff --git a/app/views/groups/settings/_general.html.haml b/app/views/groups/settings/_general.html.haml
index 8ad5755fef8..e45601aa0ff 100644
--- a/app/views/groups/settings/_general.html.haml
+++ b/app/views/groups/settings/_general.html.haml
@@ -1,3 +1,5 @@
+- enable_search_settings locals: { container_class: 'gl-my-5' }
+
= form_for @group, html: { multipart: true, class: 'gl-show-field-errors js-general-settings-form' }, authenticity_token: true do |f|
%input{ type: 'hidden', name: 'update_section', value: 'js-general-settings' }
= form_errors(@group)
diff --git a/app/views/groups/settings/ci_cd/show.html.haml b/app/views/groups/settings/ci_cd/show.html.haml
index 1badb7b6ba1..508d8a45255 100644
--- a/app/views/groups/settings/ci_cd/show.html.haml
+++ b/app/views/groups/settings/ci_cd/show.html.haml
@@ -4,6 +4,8 @@
- expanded = expanded_by_default?
- general_expanded = @group.errors.empty? ? expanded : true
+- enable_search_settings locals: { container_class: 'gl-my-5' }
+
-# Given we only have one field in this form which is also admin-only,
-# we don't want to show an empty section to non-admin users,
- if can?(current_user, :update_max_artifacts_size, @group)
diff --git a/app/views/groups/settings/packages_and_registries/index.html.haml b/app/views/groups/settings/packages_and_registries/index.html.haml
index 1a12ad4902b..21eef20a987 100644
--- a/app/views/groups/settings/packages_and_registries/index.html.haml
+++ b/app/views/groups/settings/packages_and_registries/index.html.haml
@@ -2,4 +2,6 @@
- page_title _('Packages & Registries')
- @content_class = 'limit-container-width' unless fluid_layout
+- enable_search_settings locals: { container_class: 'gl-my-5' }
+
%section#js-packages-and-registries-settings{ data: { default_expanded: expanded_by_default?.to_s, group_path: @group.full_path } }
diff --git a/app/views/groups/settings/repository/show.html.haml b/app/views/groups/settings/repository/show.html.haml
index a5819320405..b15d36c631a 100644
--- a/app/views/groups/settings/repository/show.html.haml
+++ b/app/views/groups/settings/repository/show.html.haml
@@ -1,6 +1,8 @@
- breadcrumb_title _('Repository Settings')
- page_title _('Repository')
+- enable_search_settings locals: { container_class: 'gl-my-5' }
+
- deploy_token_description = s_('DeployTokens|Group deploy tokens allow access to the packages, repositories, and registry images within the group.')
= render "shared/deploy_tokens/index", group_or_project: @group, description: deploy_token_description
diff --git a/app/views/import/bulk_imports/status.html.haml b/app/views/import/bulk_imports/status.html.haml
index 778bc1ef1a4..b46720ca63e 100644
--- a/app/views/import/bulk_imports/status.html.haml
+++ b/app/views/import/bulk_imports/status.html.haml
@@ -9,4 +9,5 @@
available_namespaces_path: import_available_namespaces_path(format: :json),
create_bulk_import_path: import_bulk_imports_path(format: :json),
jobs_path: realtime_changes_import_bulk_imports_path(format: :json),
+ can_create_group: current_user.can_create_group?.to_s,
source_url: @source_url } }
diff --git a/app/views/jira_connect/subscriptions/index.html.haml b/app/views/jira_connect/subscriptions/index.html.haml
index a549ed3540b..6a549227185 100644
--- a/app/views/jira_connect/subscriptions/index.html.haml
+++ b/app/views/jira_connect/subscriptions/index.html.haml
@@ -1,61 +1,62 @@
-%header.jira-connect-header
- = brand_header_logo
+%header.jira-connect-header.gl-display-flex.gl-align-items-center.gl-justify-content-center.gl-px-5.gl-border-b-solid.gl-border-b-gray-100.gl-border-b-1.gl-bg-white
+ = link_to brand_header_logo, Gitlab.config.gitlab.url, target: '_blank', rel: 'noopener noreferrer'
-.jira-connect-user
+.jira-connect-user.gl-font-base
- if current_user
- user_link = link_to(current_user.to_reference, jira_connect_users_path, target: '_blank', rel: 'noopener noreferrer', class: 'js-jira-connect-sign-in')
= _('Signed in to GitLab as %{user_link}').html_safe % { user_link: user_link }
- elsif @subscriptions.present?
= link_to _('Sign in to GitLab'), jira_connect_users_path, target: '_blank', rel: 'noopener noreferrer', class: 'js-jira-connect-sign-in'
-.jira-connect-app
+%main.jira-connect-app.gl-px-5.gl-pt-7.gl-mx-auto
- if current_user.blank? && @subscriptions.empty?
- %h2= s_('JiraService|GitLab for Jira Configuration')
- %p= s_('JiraService|Sign in to GitLab.com to get started.')
+ .jira-connect-app-body.gl-text-center
+ %h2= s_('JiraService|GitLab for Jira Configuration')
+ %p= s_('JiraService|Sign in to GitLab.com to get started.')
- .gl-mt-7
- - sign_in_button_class = new_jira_connect_ui? ? 'btn gl-button btn-confirm' : 'ak-button ak-button__appearance-primary'
- = external_link _('Sign in to GitLab'), jira_connect_users_path, class: "#{sign_in_button_class} js-jira-connect-sign-in"
+ .gl-mt-7
+ - sign_in_button_class = new_jira_connect_ui? ? 'btn gl-button btn-confirm' : 'ak-button ak-button__appearance-primary'
+ = external_link _('Sign in to GitLab'), jira_connect_users_path, class: "#{sign_in_button_class} js-jira-connect-sign-in"
- .gl-mt-7
- %p Note: this integration only works with accounts on GitLab.com (SaaS).
+ .gl-mt-7
+ %p= s_('Integrations|Note: this integration only works with accounts on GitLab.com (SaaS).')
- else
.js-jira-connect-app{ data: jira_connect_app_data(@subscriptions) }
- - unless new_jira_connect_ui?
- %form#add-subscription-form.subscription-form{ action: jira_connect_subscriptions_path }
- .ak-field-group
- %label
- GitLab namespace
+ .jira-connect-app-body
+ - unless new_jira_connect_ui?
+ %form#add-subscription-form.subscription-form.gl-mb-5{ action: jira_connect_subscriptions_path }
+ .ak-field-group
+ %label= _('GitLab namespace')
- .ak-field-group.field-group-input
- %input#namespace-input.ak-field-text{ type: 'text', required: true, placeholder: 'e.g. "MyCompany" or "MyCompany/GroupName"' }
- %button.ak-button.ak-button__appearance-primary{ type: 'submit' }
- Link namespace to Jira
+ .ak-field-group.field-group-input
+ %input#namespace-input.ak-field-text{ type: 'text', required: true, placeholder: 'e.g. "MyCompany" or "MyCompany/GroupName"' }
+ %button.ak-button.ak-button__appearance-primary{ type: 'submit' }
+ = s_('Integrations|Link namespace to Jira')
- - if @subscriptions.present?
- %table.subscriptions.gl-w-full
- %thead
- %tr
- %th Namespace
- %th Added
- %th
- %tbody
- - @subscriptions.each do |subscription|
+ - if @subscriptions.present?
+ %table.subscriptions.gl-w-full
+ %thead
%tr
- %td= subscription.namespace.full_path
- %td= subscription.created_at
- %td= link_to 'Remove', jira_connect_subscription_path(subscription), class: 'js-jira-connect-remove-subscription'
- - else
- %h4.empty-subscriptions
- No linked namespaces
- %p= s_('Integrations|Namespaces are your GitLab groups and subgroups that will be linked to this Jira instance.')
+ %th= _('Namespace')
+ %th= _('Added')
+ %th
+ %tbody
+ - @subscriptions.each do |subscription|
+ %tr
+ %td= subscription.namespace.full_path
+ %td= subscription.created_at
+ %td= link_to _('Remove'), jira_connect_subscription_path(subscription), class: 'js-jira-connect-remove-subscription'
+ - else
+ .gl-text-center
+ %h4= s_('Integrations|No linked namespaces')
+ %p= s_('Integrations|Namespaces are your GitLab groups and subgroups that will be linked to this Jira instance.')
- %p.browser-limitations-notice
- %strong Browser limitations:
- Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use
- %a{ href: 'https://www.mozilla.org/en-US/firefox/', target: '_blank', rel: 'noopener noreferrer' } Firefox
- or enable cross‑site cookies in your browser when adding a namespace.
+ %p.jira-connect-app-body.gl-mt-7.gl-font-base.gl-text-center
+ %strong= s_('Integrations|Browser limitations')
+ - firefox_link_url = 'https://www.mozilla.org/en-US/firefox/'
+ - firefox_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: firefox_link_url }
+ = s_('Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace.').html_safe % { firefox_link_start: firefox_link_start, firefox_link_end: '</a>'.html_safe }
= link_to _('Learn more'), 'https://gitlab.com/gitlab-org/gitlab/-/issues/284211', target: '_blank', rel: 'noopener noreferrer'
= webpack_bundle_tag 'performance_bar' if performance_bar_enabled?
diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml
index 8b430f579e9..83a0eddbb39 100644
--- a/app/views/layouts/_head.html.haml
+++ b/app/views/layouts/_head.html.haml
@@ -54,8 +54,7 @@
= Gon::Base.render_data(nonce: content_security_policy_nonce)
= javascript_include_tag locale_path unless I18n.locale == :en
- -# Temporarily commented out to investigate performance: https://gitlab.com/gitlab-org/gitlab/-/issues/251179
- -# = webpack_bundle_tag "sentry" if Gitlab.config.sentry.enabled
+ = webpack_bundle_tag "sentry" if Gitlab.config.sentry.enabled
= webpack_bundle_tag 'performance_bar' if performance_bar_enabled?
= yield :page_specific_javascripts
diff --git a/app/views/layouts/jira_connect.html.haml b/app/views/layouts/jira_connect.html.haml
index da45d84a83b..e9da940ca7a 100644
--- a/app/views/layouts/jira_connect.html.haml
+++ b/app/views/layouts/jira_connect.html.haml
@@ -12,5 +12,4 @@
= Gon::Base.render_data(nonce: content_security_policy_nonce)
= yield :head
%body
- .ac-content
- = yield
+ = yield
diff --git a/app/views/layouts/nav/sidebar/_admin.html.haml b/app/views/layouts/nav/sidebar/_admin.html.haml
index f887d335807..d756867541b 100644
--- a/app/views/layouts/nav/sidebar/_admin.html.haml
+++ b/app/views/layouts/nav/sidebar/_admin.html.haml
@@ -65,11 +65,10 @@
= link_to admin_dev_ops_report_path, title: _('DevOps Report') do
%span
= _('DevOps Report')
- - if Feature.enabled?(:instance_statistics, default_enabled: true)
- = nav_link(controller: :instance_statistics) do
- = link_to admin_instance_statistics_path, title: _('Usage Trends') do
- %span
- = _('Usage Trends')
+ = nav_link(controller: :usage_trends) do
+ = link_to admin_usage_trends_path, title: _('Usage Trends') do
+ %span
+ = _('Usage Trends')
= nav_link(controller: admin_monitoring_nav_links) do
= link_to admin_system_info_path, data: { qa_selector: 'admin_monitoring_link' } do
diff --git a/app/views/layouts/nav/sidebar/_profile.html.haml b/app/views/layouts/nav/sidebar/_profile.html.haml
index a66110f28e8..4ae81d69c16 100644
--- a/app/views/layouts/nav/sidebar/_profile.html.haml
+++ b/app/views/layouts/nav/sidebar/_profile.html.haml
@@ -3,7 +3,7 @@
.context-header
= link_to profile_path, title: _('Profile Settings') do
.avatar-container.s40.settings-avatar
- = image_tag avatar_icon_for_user(current_user, 40), class: "avatar s40 avatar-tile", alt: current_user.name
+ = image_tag avatar_icon_for_user(current_user, 40), class: "avatar s40 avatar-tile js-sidebar-user-avatar", alt: current_user.name, data: { testid: 'sidebar-user-avatar' }
.sidebar-context-title= _('User Settings')
%ul.sidebar-top-level-items
= nav_link(path: 'profiles#show', html_options: {class: 'home'}) do
diff --git a/app/views/peek/_bar.html.haml b/app/views/peek/_bar.html.haml
index 9725f640be9..8914bfab336 100644
--- a/app/views/peek/_bar.html.haml
+++ b/app/views/peek/_bar.html.haml
@@ -2,5 +2,6 @@
#js-peek{ data: { env: Peek.env,
request_id: peek_request_id,
+ stats_url: ENV.fetch('GITLAB_PERFORMANCE_BAR_STATS_URL', ''),
peek_url: "#{peek_routes_path}/results" },
class: Peek.env }
diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml
index 4689fd5272a..dd24dd49a6f 100644
--- a/app/views/profiles/show.html.haml
+++ b/app/views/profiles/show.html.haml
@@ -48,17 +48,17 @@
.col-lg-8
= f.fields_for :status, @user.status do |status_form|
- emoji_button = button_tag type: :button,
- class: 'js-toggle-emoji-menu emoji-menu-toggle-button gl-button btn has-tooltip',
+ class: 'js-toggle-emoji-menu emoji-menu-toggle-button btn gl-button btn-default has-tooltip',
title: s_("Profiles|Add status emoji") do
- if custom_emoji
- = emoji_icon @user.status.emoji
+ = emoji_icon(@user.status.emoji, class: 'gl-mr-0!')
%span#js-no-emoji-placeholder.no-emoji-placeholder{ class: ('hidden' if custom_emoji) }
= sprite_icon('slight-smile', css_class: 'award-control-icon-neutral')
= sprite_icon('smiley', css_class: 'award-control-icon-positive')
= sprite_icon('smile', css_class: 'award-control-icon-super-positive')
- reset_message_button = button_tag type: :button,
id: 'js-clear-user-status-button',
- class: 'clear-user-status gl-button btn has-tooltip',
+ class: 'clear-user-status btn gl-button btn-default has-tooltip',
title: s_("Profiles|Clear status") do
= sprite_icon("close")
diff --git a/app/views/projects/_merge_request_merge_method_settings.html.haml b/app/views/projects/_merge_request_merge_method_settings.html.haml
index 1be7f7bb418..cb3fcdef403 100644
--- a/app/views/projects/_merge_request_merge_method_settings.html.haml
+++ b/app/views/projects/_merge_request_merge_method_settings.html.haml
@@ -22,7 +22,7 @@
= s_('ProjectSettings|When conflicts arise the user is given the option to rebase')
.form-check.mb-2
- = form.radio_button :merge_method, :ff, class: "js-merge-method-radio qa-radio-button-merge-ff form-check-input"
+ = form.radio_button :merge_method, :ff, class: "js-merge-method-radio form-check-input", data: { qa_selector: 'merge_ff_radio_button' }
= label_tag :project_merge_method_ff, class: 'form-check-label' do
= s_('ProjectSettings|Fast-forward merge')
.text-secondary
diff --git a/app/views/projects/blob/_template_selectors.html.haml b/app/views/projects/blob/_template_selectors.html.haml
index 70a4202a5d0..717c03ad27d 100644
--- a/app/views/projects/blob/_template_selectors.html.haml
+++ b/app/views/projects/blob/_template_selectors.html.haml
@@ -11,7 +11,7 @@
= dropdown_tag(_("Apply a template"), options: { toggle_class: 'js-metrics-dashboard-selector qa-metrics-dashboard-dropdown', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: metrics_dashboard_ymls(@project) } } )
#gitlab-ci-yml-selector.gitlab-ci-yml-selector.js-gitlab-ci-yml-selector-wrap.js-template-selector-wrap.hidden
= dropdown_tag(_("Apply a template"), options: { toggle_class: 'js-gitlab-ci-yml-selector qa-gitlab-ci-yml-dropdown', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: gitlab_ci_ymls(@project) } } )
- - if experiment_enabled?(:ci_syntax_templates, subject: current_user)
+ - if experiment_enabled?(:ci_syntax_templates_b, subject: current_user) && @project.namespace.recent?
.gitlab-ci-syntax-yml-selector.js-gitlab-ci-syntax-yml-selector-wrap.js-template-selector-wrap.hidden
= dropdown_tag(_("Learn CI/CD syntax"), options: { toggle_class: 'js-gitlab-ci-syntax-yml-selector qa-gitlab-ci-syntax-yml-dropdown', dropdown_class: 'dropdown-menu-selectable', filter: true, placeholder: "Filter", data: { data: gitlab_ci_syntax_ymls(@project) } } )
.dockerfile-selector.js-dockerfile-selector-wrap.js-template-selector-wrap.hidden
diff --git a/app/views/projects/blob/_upload.html.haml b/app/views/projects/blob/_upload.html.haml
index f400c7de5eb..b68c75701b9 100644
--- a/app/views/projects/blob/_upload.html.haml
+++ b/app/views/projects/blob/_upload.html.haml
@@ -17,7 +17,7 @@
%br
.dropzone-alerts.gl-alert.gl-alert-danger.gl-mb-5.data{ style: "display:none" }
- = render 'shared/new_commit_form', placeholder: placeholder
+ = render 'shared/new_commit_form', placeholder: placeholder, ref: local_assigns[:ref]
.form-actions
= button_tag class: 'btn gl-button btn-success btn-upload-file', id: 'submit-all', type: 'button' do
diff --git a/app/views/projects/commit/_pipelines_list.haml b/app/views/projects/commit/_pipelines_list.haml
index 81c354f1c8f..7f52e6ed7eb 100644
--- a/app/views/projects/commit/_pipelines_list.haml
+++ b/app/views/projects/commit/_pipelines_list.haml
@@ -1,8 +1,6 @@
- disable_initialization = local_assigns.fetch(:disable_initialization, false)
#commit-pipeline-table-view{ data: { disable_initialization: disable_initialization,
endpoint: endpoint,
- "help-page-path" => help_page_path('ci/quick_start/README'),
- "help-auto-devops-path" => help_page_path('topics/autodevops/index.md'),
"empty-state-svg-path" => image_path('illustrations/pipelines_empty.svg'),
"error-state-svg-path" => image_path('illustrations/pipelines_failed.svg'),
"project-id": @project.id,
diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml
index c708efe7c7b..ceb312450be 100644
--- a/app/views/projects/commits/_commit.html.haml
+++ b/app/views/projects/commits/_commit.html.haml
@@ -60,5 +60,5 @@
.commit-sha-group.btn-group.d-none.d-sm-flex
.label.label-monospace.monospace
= commit.short_id
- = clipboard_button(text: commit.id, title: _("Copy commit SHA"), class: "gl-button btn btn-default", container: "body")
+ = clipboard_button(text: commit.id, title: _("Copy commit SHA"), class: "gl-button btn btn-default btn-icon", container: "body")
= link_to_browse_code(project, commit)
diff --git a/app/views/projects/diffs/_diffs.html.haml b/app/views/projects/diffs/_diffs.html.haml
index 2f533b5848d..cec8948aaa4 100644
--- a/app/views/projects/diffs/_diffs.html.haml
+++ b/app/views/projects/diffs/_diffs.html.haml
@@ -3,7 +3,7 @@
- can_create_note = !@diff_notes_disabled && can?(current_user, :create_note, diffs.project)
- diff_page_context = local_assigns.fetch(:diff_page_context, nil)
- load_diff_files_async = Feature.enabled?(:async_commit_diff_files, @project) && diff_page_context == "is-commit"
-- paginate_diffs = local_assigns.fetch(:paginate_diffs, false) && !load_diff_files_async && Feature.enabled?(:paginate_commit_view, @project, type: :development)
+- paginate_diffs = local_assigns.fetch(:paginate_diffs, false) && !load_diff_files_async
- diff_files = conditionally_paginate_diff_files(diffs, paginate: paginate_diffs)
.content-block.oneline-block.files-changed.diff-files-changed.js-diff-files-changed
diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml
index c26017ccb79..2922ba4fb6e 100644
--- a/app/views/projects/edit.html.haml
+++ b/app/views/projects/edit.html.haml
@@ -27,7 +27,7 @@
= render "visibility_modal"
= f.submit _('Save changes'), class: "btn gl-button btn-success #{('js-confirm-danger' if show_visibility_confirm_modal?(@project))}", data: { qa_selector: 'visibility_features_permissions_save_button', check_field_name: ("project[visibility_level]" if show_visibility_confirm_modal?(@project)), check_compare_value: @project.visibility_level }
-%section.qa-merge-request-settings.rspec-merge-request-settings.settings.merge-requests-feature.no-animate#js-merge-request-settings{ class: [('expanded' if expanded), ('hidden' if @project.project_feature.send(:merge_requests_access_level) == 0)] }
+%section.rspec-merge-request-settings.settings.merge-requests-feature.no-animate#js-merge-request-settings{ class: [('expanded' if expanded), ('hidden' if @project.project_feature.send(:merge_requests_access_level) == 0)], data: { qa_selector: 'merge_request_settings_content' } }
.settings-header
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Merge requests')
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }= expanded ? _('Collapse') : _('Expand')
@@ -39,7 +39,7 @@
= form_for @project, remote: true, html: { multipart: true, class: "merge-request-settings-form js-mr-settings-form" }, authenticity_token: true do |f|
%input{ name: 'update_section', type: 'hidden', value: 'js-merge-request-settings' }
= render 'projects/merge_request_settings', form: f
- = f.submit _('Save changes'), class: "btn gl-button btn-success qa-save-merge-request-changes rspec-save-merge-request-changes"
+ = f.submit _('Save changes'), class: "btn gl-button btn-success rspec-save-merge-request-changes", data: { qa_selector: 'save_merge_request_changes_button' }
= render_if_exists 'projects/merge_request_approvals_settings', expanded: expanded
@@ -60,7 +60,7 @@
= render 'projects/service_desk_settings'
-%section.qa-advanced-settings.settings.advanced-settings.no-animate#js-project-advanced-settings{ class: ('expanded' if expanded) }
+%section.settings.advanced-settings.no-animate#js-project-advanced-settings{ class: ('expanded' if expanded), data: { qa_selector: 'advanced_settings_content' } }
.settings-header
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Advanced')
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }= expanded ? _('Collapse') : _('Expand')
@@ -96,8 +96,8 @@
.input-group-prepend
.input-group-text
#{Gitlab::Utils.append_path(root_url, @project.namespace.full_path)}/
- = f.text_field :path, class: 'form-control qa-project-path-field h-auto'
- = f.submit _('Change path'), class: "gl-button btn btn-warning qa-change-path-button"
+ = f.text_field :path, class: 'form-control h-auto', data: { qa_selector: 'project_path_field' }
+ = f.submit _('Change path'), class: "gl-button btn btn-warning", data: { qa_selector: 'change_path_button' }
= render 'transfer', project: @project
diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml
index 2c245c1a914..d16f271c8d8 100644
--- a/app/views/projects/empty.html.haml
+++ b/app/views/projects/empty.html.haml
@@ -1,5 +1,5 @@
- @content_class = "limit-container-width" unless fluid_layout
-- default_branch_name = @project.default_branch || "master"
+- default_branch_name = @project.default_branch_or_master
- @skip_current_level_breadcrumb = true
= content_for :invite_members_sidebar do
@@ -77,3 +77,6 @@
%span><
git push -u origin --all
git push -u origin --tags
+
+- if @project.empty_repo_upload_experiment?
+ = render 'projects/blob/upload', title: _('Upload New File'), placeholder: _('Upload New File'), button_title: _('Upload file'), form_path: project_create_blob_path(@project, default_branch_name), ref: default_branch_name, method: :post
diff --git a/app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml b/app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml
index e17c905e092..190bf9bf071 100644
--- a/app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml
+++ b/app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml
@@ -27,14 +27,14 @@
%td
.float-right.btn-group
- if can?(current_user, :play_pipeline_schedule, pipeline_schedule)
- = link_to play_pipeline_schedule_path(pipeline_schedule), method: :post, title: s_('Play'), class: 'btn gl-button btn-default btn-svg' do
+ = link_to play_pipeline_schedule_path(pipeline_schedule), method: :post, title: s_('Play'), class: 'btn gl-button btn-default btn-icon' do
= sprite_icon('play')
- if can?(current_user, :take_ownership_pipeline_schedule, pipeline_schedule)
= link_to take_ownership_pipeline_schedule_path(pipeline_schedule), method: :post, title: s_('PipelineSchedules|Take ownership'), class: 'btn gl-button btn-default' do
= s_('PipelineSchedules|Take ownership')
- if can?(current_user, :update_pipeline_schedule, pipeline_schedule)
- = link_to edit_pipeline_schedule_path(pipeline_schedule), title: _('Edit'), class: 'btn gl-button btn-default' do
+ = link_to edit_pipeline_schedule_path(pipeline_schedule), title: _('Edit'), class: 'btn gl-button btn-default btn-icon' do
= sprite_icon('pencil')
- if can?(current_user, :admin_pipeline_schedule, pipeline_schedule)
- = link_to pipeline_schedule_path(pipeline_schedule), title: _('Delete'), method: :delete, class: 'btn gl-button btn-danger', data: { confirm: _("Are you sure you want to delete this pipeline schedule?") } do
+ = link_to pipeline_schedule_path(pipeline_schedule), title: _('Delete'), method: :delete, class: 'btn gl-button btn-danger btn-icon', data: { confirm: _("Are you sure you want to delete this pipeline schedule?") } do
= sprite_icon('remove')
diff --git a/app/views/projects/pipelines/index.html.haml b/app/views/projects/pipelines/index.html.haml
index 6a4dd88ae07..7d7b8a155ac 100644
--- a/app/views/projects/pipelines/index.html.haml
+++ b/app/views/projects/pipelines/index.html.haml
@@ -7,8 +7,6 @@
#pipelines-list-vue{ data: { endpoint: project_pipelines_path(@project, format: :json),
project_id: @project.id,
params: params.to_json,
- "help-page-path" => help_page_path('ci/quick_start/README'),
- "auto-devops-help-path" => help_page_path('topics/autodevops/index.md'),
"pipeline-schedule-url" => pipeline_schedules_path(@project),
"empty-state-svg-path" => image_path('illustrations/pipelines_empty.svg'),
"error-state-svg-path" => image_path('illustrations/pipelines_failed.svg'),
diff --git a/app/views/projects/pipelines/new.html.haml b/app/views/projects/pipelines/new.html.haml
index 7d5cef2015d..a760aaaf9b3 100644
--- a/app/views/projects/pipelines/new.html.haml
+++ b/app/views/projects/pipelines/new.html.haml
@@ -6,7 +6,7 @@
= s_('Pipeline|Run Pipeline')
%hr
-- if Feature.enabled?(:new_pipeline_form, @project, default_enabled: true)
+- if Feature.enabled?(:new_pipeline_form, @project, default_enabled: :yaml)
#js-new-pipeline{ data: { project_id: @project.id,
pipelines_path: project_pipelines_path(@project),
config_variables_path: config_variables_namespace_project_pipelines_path(@project.namespace, @project),
diff --git a/app/views/projects/pipelines/show.html.haml b/app/views/projects/pipelines/show.html.haml
index b431ef202b3..751268ec920 100644
--- a/app/views/projects/pipelines/show.html.haml
+++ b/app/views/projects/pipelines/show.html.haml
@@ -26,4 +26,4 @@
= render "projects/pipelines/with_tabs", pipeline: @pipeline, pipeline_has_errors: pipeline_has_errors
-.js-pipeline-details-vue{ data: { endpoint: project_pipeline_path(@project, @pipeline, format: :json), pipeline_project_path: @project.full_path, pipeline_iid: @pipeline.iid } }
+.js-pipeline-details-vue{ data: { endpoint: project_pipeline_path(@project, @pipeline, format: :json), metrics_path: namespace_project_ci_prometheus_metrics_histograms_path(namespace_id: @project.namespace, project_id: @project, format: :json), pipeline_project_path: @project.full_path, pipeline_iid: @pipeline.iid } }
diff --git a/app/views/projects/project_members/index.html.haml b/app/views/projects/project_members/index.html.haml
index beb435d268a..509092b64c9 100644
--- a/app/views/projects/project_members/index.html.haml
+++ b/app/views/projects/project_members/index.html.haml
@@ -18,8 +18,9 @@
%p
= html_escape(_("Members can be added by project %{i_open}Maintainers%{i_close} or %{i_open}Owners%{i_close}")) % { i_open: '<i>'.html_safe, i_close: '</i>'.html_safe }
.col-md-12.col-lg-6
- .gl-display-flex.gl-flex-wrap.gl-lg-justify-content-end.gl-mx-n2.gl-mb-3
- .js-invite-members-trigger.gl-px-2.gl-sm-w-auto.gl-w-full.gl-mb-4{ data: { classes: 'btn btn-success gl-button gl-mt-3 gl-sm-w-auto gl-w-full', display_text: _('Invite members') } }
+ .gl-display-flex.gl-flex-wrap.gl-justify-content-end
+ .js-invite-group-trigger{ data: { classes: 'gl-mt-3 gl-sm-w-auto gl-w-full', display_text: _('Invite a group') } }
+ .js-invite-members-trigger{ data: { classes: 'btn btn-success gl-button gl-mt-3 gl-sm-w-auto gl-w-full gl-sm-ml-3', display_text: _('Invite members') } }
= render 'projects/invite_members_modal', project: @project
- else
diff --git a/app/views/projects/project_templates/_project_fields_form.html.haml b/app/views/projects/project_templates/_project_fields_form.html.haml
index 201e2d5b5fb..7908550ca88 100644
--- a/app/views/projects/project_templates/_project_fields_form.html.haml
+++ b/app/views/projects/project_templates/_project_fields_form.html.haml
@@ -8,5 +8,5 @@
.selected-icon.gl-mr-3
.selected-template
.input-group-append
- %button.btn.btn-default.change-template{ type: "button" }
+ %button.btn.gl-button.btn-default.change-template{ type: "button" }
= _('Change template')
diff --git a/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml b/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml
index 6ce01566a42..d74449ce2c7 100644
--- a/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml
+++ b/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml
@@ -23,4 +23,4 @@
= yield :push_access_levels
= render_if_exists 'projects/protected_branches/ee/code_owner_approval_form', f: f
.card-footer
- = f.submit s_('ProtectedBranch|Protect'), class: 'btn-success btn', disabled: true, data: { qa_selector: 'protect_button' }
+ = f.submit s_('ProtectedBranch|Protect'), class: 'btn-success gl-button btn', disabled: true, data: { qa_selector: 'protect_button' }
diff --git a/app/views/projects/protected_branches/shared/_index.html.haml b/app/views/projects/protected_branches/shared/_index.html.haml
index 1d3e3fb11ae..bb848d0e44c 100644
--- a/app/views/projects/protected_branches/shared/_index.html.haml
+++ b/app/views/projects/protected_branches/shared/_index.html.haml
@@ -4,7 +4,7 @@
.settings-header
%h4
Protected branches
- %button.btn.js-settings-toggle.qa-expand-protected-branches{ type: 'button' }
+ %button.btn.gl-button.js-settings-toggle.qa-expand-protected-branches{ type: 'button' }
= expanded ? 'Collapse' : 'Expand'
%p
Keep stable branches secure, and force developers to use merge requests. #{link_to "What are protected branches?", help_page_path("user/project/protected_branches")}
diff --git a/app/views/projects/settings/_general.html.haml b/app/views/projects/settings/_general.html.haml
index 3b03e213983..bd365123b81 100644
--- a/app/views/projects/settings/_general.html.haml
+++ b/app/views/projects/settings/_general.html.haml
@@ -7,7 +7,7 @@
.form-group.col-md-5
= f.label :name, class: 'label-bold', for: 'project_name_edit' do
= _('Project name')
- = f.text_field :name, class: 'form-control gl-form-input qa-project-name-field', id: "project_name_edit"
+ = f.text_field :name, class: 'form-control gl-form-input', id: "project_name_edit", data: { qa_selector: 'project_name_field' }
.form-group.col-md-7
= f.label :id, class: 'label-bold' do
@@ -40,4 +40,4 @@
%hr
= link_to _('Remove avatar'), project_avatar_path(@project), data: { confirm: _('Avatar will be removed. Are you sure?')}, method: :delete, class: 'btn btn-link'
- = f.submit _('Save changes'), class: "gl-button btn btn-success gl-mt-6 qa-save-naming-topics-avatar-button"
+ = f.submit _('Save changes'), class: "gl-button btn btn-success gl-mt-6", data: { qa_selector: 'save_naming_topics_avatar_button' }
diff --git a/app/views/projects/settings/ci_cd/_badge.html.haml b/app/views/projects/settings/ci_cd/_badge.html.haml
index 2c3e6387972..38d8c8d26e1 100644
--- a/app/views/projects/settings/ci_cd/_badge.html.haml
+++ b/app/views/projects/settings/ci_cd/_badge.html.haml
@@ -12,21 +12,21 @@
= render 'shared/ref_switcher', destination: 'badges', align_right: true
.card-body
.row
- .col-md-2.text-center
+ .col-md-2.gl-text-center
Markdown
.col-md-10.code.js-syntax-highlight
= highlight_badge('.md', badge.to_markdown, language: 'markdown')
.row
%hr
.row
- .col-md-2.text-center
+ .col-md-2.gl-text-center
HTML
.col-md-10.code.js-syntax-highlight
= highlight_badge('.html', badge.to_html, language: 'html')
.row
%hr
.row
- .col-md-2.text-center
+ .col-md-2.gl-text-center
AsciiDoc
.col-md-10.code.js-syntax-highlight
= highlight_badge('.adoc', badge.to_asciidoc)
diff --git a/app/views/projects/settings/ci_cd/_form.html.haml b/app/views/projects/settings/ci_cd/_form.html.haml
index e0c4a3d624e..3b0073848a6 100644
--- a/app/views/projects/settings/ci_cd/_form.html.haml
+++ b/app/views/projects/settings/ci_cd/_form.html.haml
@@ -96,7 +96,7 @@
= html_escape(_('The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable.')) % { regex: '<code>\(\d+.\d+%\)</code>'.html_safe }
= link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'test-coverage-parsing'), target: '_blank'
- = f.submit _('Save changes'), class: "btn btn-success", data: { qa_selector: 'save_general_pipelines_changes_button' }
+ = f.submit _('Save changes'), class: "btn gl-button btn-success", data: { qa_selector: 'save_general_pipelines_changes_button' }
%hr
diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml
index ee49377595b..4ff5ab515ec 100644
--- a/app/views/projects/settings/ci_cd/show.html.haml
+++ b/app/views/projects/settings/ci_cd/show.html.haml
@@ -5,6 +5,8 @@
- expanded = expanded_by_default?
- general_expanded = @project.errors.empty? ? expanded : true
+- enable_search_settings locals: { container_class: 'gl-my-5' }
+
%section.settings#js-general-pipeline-settings.no-animate{ class: ('expanded' if general_expanded), data: { qa_selector: 'general_pipelines_settings_content' } }
.settings-header
%h4
@@ -45,16 +47,17 @@
.settings-content
= render 'projects/runners/index'
-%section.settings.no-animate#js-artifacts-settings{ class: ('expanded' if expanded) }
- .settings-header
- %h4
- = _("Artifacts")
- %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
- = expanded ? _('Collapse') : _('Expand')
- %p
- = _("A job artifact is an archive of files and directories saved by a job when it finishes.")
- .settings-content
- #js-artifacts-settings-app{ data: { full_path: @project.full_path, help_page_path: help_page_path('ci/pipelines/job_artifacts', anchor: 'keep-artifacts-from-most-recent-successful-jobs') } }
+- if Gitlab::CurrentSettings.current_application_settings.keep_latest_artifact?
+ %section.settings.no-animate#js-artifacts-settings{ class: ('expanded' if expanded) }
+ .settings-header
+ %h4
+ = _("Artifacts")
+ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
+ = expanded ? _('Collapse') : _('Expand')
+ %p
+ = _("A job artifact is an archive of files and directories saved by a job when it finishes.")
+ .settings-content
+ #js-artifacts-settings-app{ data: { full_path: @project.full_path, help_page_path: help_page_path('ci/pipelines/job_artifacts', anchor: 'keep-artifacts-from-most-recent-successful-jobs') } }
%section.qa-variables-settings.settings.no-animate#js-cicd-variables-settings{ class: ('expanded' if expanded), data: { qa_selector: 'variables_settings_content' } }
.settings-header
diff --git a/app/views/projects/settings/operations/show.html.haml b/app/views/projects/settings/operations/show.html.haml
index 73722a5a789..5ba796f5720 100644
--- a/app/views/projects/settings/operations/show.html.haml
+++ b/app/views/projects/settings/operations/show.html.haml
@@ -2,6 +2,8 @@
- page_title _('Operations Settings')
- breadcrumb_title _('Operations Settings')
+- enable_search_settings locals: { container_class: 'gl-my-5' }
+
= render 'projects/settings/operations/alert_management'
= render 'projects/settings/operations/incidents'
= render 'projects/settings/operations/error_tracking'
diff --git a/app/views/projects/settings/repository/show.html.haml b/app/views/projects/settings/repository/show.html.haml
index 24fc137fd29..8ac42ce3f81 100644
--- a/app/views/projects/settings/repository/show.html.haml
+++ b/app/views/projects/settings/repository/show.html.haml
@@ -3,6 +3,8 @@
- @content_class = "limit-container-width" unless fluid_layout
- deploy_token_description = s_('DeployTokens|Deploy tokens allow access to packages, your repository, and registry images.')
+- enable_search_settings locals: { container_class: 'gl-my-5' }
+
= render "projects/default_branch/show"
= render_if_exists "projects/push_rules/index"
= render "projects/mirrors/mirror_repos"
diff --git a/app/views/shared/_new_commit_form.html.haml b/app/views/shared/_new_commit_form.html.haml
index 62ba89e2576..5641c67e462 100644
--- a/app/views/shared/_new_commit_form.html.haml
+++ b/app/views/shared/_new_commit_form.html.haml
@@ -3,8 +3,11 @@
= render 'shared/commit_message_container', placeholder: placeholder
-- if @project.empty_repo?
- = hidden_field_tag 'branch_name', @ref
+- if project.empty_repo?
+ - ref = local_assigns[:ref] || @ref
+ - branch_name_class = project.empty_repo_upload_experiment? ? 'js-branch-name' : nil
+
+ = hidden_field_tag 'branch_name', ref, class: branch_name_class
- else
- if can?(current_user, :push_code, @project)
.form-group.row.branch
diff --git a/app/views/shared/issuable/_search_bar.html.haml b/app/views/shared/issuable/_search_bar.html.haml
index d1e74cc771e..b82cfc86e26 100644
--- a/app/views/shared/issuable/_search_bar.html.haml
+++ b/app/views/shared/issuable/_search_bar.html.haml
@@ -195,7 +195,7 @@
#js-board-labels-toggle
- if current_user
#js-board-epics-swimlanes-toggle
- .js-board-config{ data: { can_admin_list: user_can_admin_list, has_scope: board.scoped? } }
+ .js-board-config{ data: { can_admin_list: user_can_admin_list.to_s, has_scope: board.scoped?.to_s } }
- if user_can_admin_list
- if Feature.enabled?(:board_new_list, board.resource_parent, default_enabled: :yaml)
.js-create-column-trigger{ data: board_list_data }
diff --git a/app/views/shared/issuable/_sidebar_assignees.html.haml b/app/views/shared/issuable/_sidebar_assignees.html.haml
index 2b6920ed80f..26986c913f0 100644
--- a/app/views/shared/issuable/_sidebar_assignees.html.haml
+++ b/app/views/shared/issuable/_sidebar_assignees.html.haml
@@ -43,6 +43,9 @@
- options[:dropdown_class] += ' dropdown-extended-height'
- options[:footer_content] = true
- options[:wrapper_class] = 'js-sidebar-assignee-dropdown'
+ - options[:toggle_class] += ' js-invite-members-track'
+ - data['track-event'] = show_invite_members_track_event
+ - options[:data].merge!(data)
- invite_text = _('Invite Members')
- track_label = 'edit_assignee'
diff --git a/app/views/shared/projects/_project.html.haml b/app/views/shared/projects/_project.html.haml
index 115d0c9a7c5..a33cd7c3b53 100644
--- a/app/views/shared/projects/_project.html.haml
+++ b/app/views/shared/projects/_project.html.haml
@@ -12,9 +12,10 @@
- css_class += " no-description" if project.description.blank? && !show_last_commit_as_description
- cache_key = project_list_cache_key(project, pipeline_status: pipeline_status)
- updated_tooltip = time_ago_with_tooltip(project.last_activity_date)
-- show_pipeline_status_icon = pipeline_status && can?(current_user, :read_cross_project) && project.pipeline_status.has_status? && can?(current_user, :read_build, project) && project.last_pipeline.present?
+- show_pipeline_status_icon = pipeline_status && can?(current_user, :read_cross_project) && project.pipeline_status.has_status? && can?(current_user, :read_build, project)
+- last_pipeline = project.last_pipeline if show_pipeline_status_icon
- css_controls_class = compact_mode ? [] : ["flex-lg-row", "justify-content-lg-between"]
-- css_controls_class << "with-pipeline-status" if show_pipeline_status_icon
+- css_controls_class << "with-pipeline-status" if show_pipeline_status_icon && last_pipeline.present?
- avatar_container_class = project.creator && use_creator_avatar ? '' : 'rect-avatar'
%li.project-row.d-flex{ class: css_class }
@@ -68,10 +69,10 @@
.controls.d-flex.flex-sm-column.align-items-center.align-items-sm-end.flex-wrap.flex-shrink-0.text-secondary{ class: css_controls_class.join(" ") }
.icon-container.d-flex.align-items-center
- - if show_pipeline_status_icon
+ - if show_pipeline_status_icon && last_pipeline.present?
- pipeline_path = pipelines_project_commit_path(project.pipeline_status.project, project.pipeline_status.sha, ref: project.pipeline_status.ref)
%span.icon-wrapper.pipeline-status
- = render 'ci/status/icon', status: project.last_pipeline.detailed_status(current_user), tooltip_placement: 'top', path: pipeline_path
+ = render 'ci/status/icon', status: last_pipeline.detailed_status(current_user), tooltip_placement: 'top', path: pipeline_path
= render_if_exists 'shared/projects/archived', project: project
- if stars
diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml
index cdaa739a7b3..fbd61123078 100644
--- a/app/views/users/show.html.haml
+++ b/app/views/users/show.html.haml
@@ -13,6 +13,13 @@
.user-profile
.cover-block.user-cover-block{ class: [('border-bottom' if profile_tabs.empty?)] }
= render layout: 'users/cover_controls' do
+ - if current_user && current_user.id != @user.id
+ - if current_user.following?(@user)
+ = link_to user_unfollow_path(@user, :json) , class: link_classes + 'btn gl-button btn-default', method: :post do
+ = _('Unfollow')
+ - else
+ = link_to user_follow_path(@user, :json) , class: link_classes + 'btn gl-button btn-default', method: :post do
+ = _('Follow')
- if @user == current_user
= link_to profile_path, class: link_classes + 'btn gl-button btn-default btn-icon has-tooltip',
title: s_('UserProfile|Edit profile'), 'aria-label': 'Edit profile', data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } do
@@ -26,13 +33,6 @@
= link_to new_abuse_report_path(user_id: @user.id, ref_url: request.referrer), class: link_classes + 'btn gl-button btn-default btn-icon',
title: s_('UserProfile|Report abuse'), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } do
= sprite_icon('error')
- - if current_user && current_user.id != @user.id
- - if current_user.following?(@user)
- = link_to user_unfollow_path(@user, :json) , class: link_classes + 'btn gl-button btn-default', method: :post do
- = _('Unfollow')
- - else
- = link_to user_follow_path(@user, :json) , class: link_classes + 'btn gl-button btn-default', method: :post do
- = _('Follow')
- if can?(current_user, :read_user_profile, @user)
= link_to user_path(@user, rss_url_options), class: link_classes + 'btn gl-button btn-default btn-icon has-tooltip',
title: s_('UserProfile|Subscribe'), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } do
diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml
index 59ab0a4d05b..b8481382577 100644
--- a/app/workers/all_queues.yml
+++ b/app/workers/all_queues.yml
@@ -131,6 +131,14 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: cronjob:analytics_usage_trends_count_job_trigger
+ :feature_category: :devops_reports
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: cronjob:authorized_project_update_periodic_recalculate
:feature_category: :source_code_management
:has_external_dependencies:
@@ -347,14 +355,6 @@
:weight: 1
:idempotent:
:tags: []
-- :name: cronjob:releases_create_evidence
- :feature_category: :release_evidence
- :has_external_dependencies:
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent:
- :tags: []
- :name: cronjob:releases_manage_evidence
:feature_category: :release_evidence
:has_external_dependencies:
@@ -1413,6 +1413,14 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: analytics_usage_trends_counter_job
+ :feature_category: :devops_reports
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: approve_blocked_pending_approval_users
:feature_category: :users
:has_external_dependencies:
@@ -2084,6 +2092,14 @@
:weight: 2
:idempotent:
:tags: []
+- :name: releases_create_evidence
+ :feature_category: :release_evidence
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent:
+ :tags: []
- :name: remote_mirror_notification
:feature_category: :source_code_management
:has_external_dependencies:
diff --git a/app/workers/analytics/instance_statistics/count_job_trigger_worker.rb b/app/workers/analytics/instance_statistics/count_job_trigger_worker.rb
index 81a765d5d08..3ec92bc7635 100644
--- a/app/workers/analytics/instance_statistics/count_job_trigger_worker.rb
+++ b/app/workers/analytics/instance_statistics/count_job_trigger_worker.rb
@@ -2,31 +2,19 @@
module Analytics
module InstanceStatistics
+ # This worker will be removed in 14.0
class CountJobTriggerWorker
include ApplicationWorker
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
- DEFAULT_DELAY = 3.minutes.freeze
-
feature_category :devops_reports
urgency :low
idempotent!
def perform
- recorded_at = Time.zone.now
-
- worker_arguments = Gitlab::Analytics::InstanceStatistics::WorkersArgumentBuilder.new(
- measurement_identifiers: ::Analytics::InstanceStatistics::Measurement.measurement_identifier_values,
- recorded_at: recorded_at
- ).execute
-
- perform_in = DEFAULT_DELAY.minutes.from_now
- worker_arguments.each do |args|
- CounterJobWorker.perform_in(perform_in, *args)
-
- perform_in += DEFAULT_DELAY
- end
+ # Delegate to the new worker
+ Analytics::UsageTrends::CountJobTriggerWorker.new.perform
end
end
end
diff --git a/app/workers/analytics/instance_statistics/counter_job_worker.rb b/app/workers/analytics/instance_statistics/counter_job_worker.rb
index c07b2569453..4beed8a3e2f 100644
--- a/app/workers/analytics/instance_statistics/counter_job_worker.rb
+++ b/app/workers/analytics/instance_statistics/counter_job_worker.rb
@@ -2,6 +2,7 @@
module Analytics
module InstanceStatistics
+ # This worker will be removed in 14.0
class CounterJobWorker
include ApplicationWorker
@@ -10,24 +11,9 @@ module Analytics
idempotent!
- def perform(measurement_identifier, min_id, max_id, recorded_at)
- query_scope = ::Analytics::InstanceStatistics::Measurement.identifier_query_mapping[measurement_identifier].call
-
- count = if min_id.nil? || max_id.nil? # table is empty
- 0
- else
- counter(query_scope, min_id, max_id)
- end
-
- return if count == Gitlab::Database::BatchCounter::FALLBACK
-
- InstanceStatistics::Measurement.insert_all([{ recorded_at: recorded_at, count: count, identifier: measurement_identifier }])
- end
-
- private
-
- def counter(query_scope, min_id, max_id)
- Gitlab::Database::BatchCount.batch_count(query_scope, start: min_id, finish: max_id)
+ def perform(*args)
+ # Delegate to the new worker
+ Analytics::UsageTrends::CounterJobWorker.new.perform(*args)
end
end
end
diff --git a/app/workers/analytics/usage_trends/count_job_trigger_worker.rb b/app/workers/analytics/usage_trends/count_job_trigger_worker.rb
new file mode 100644
index 00000000000..37f5c19d64c
--- /dev/null
+++ b/app/workers/analytics/usage_trends/count_job_trigger_worker.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Analytics
+ module UsageTrends
+ class CountJobTriggerWorker
+ extend ::Gitlab::Utils::Override
+ include ApplicationWorker
+ include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
+
+ DEFAULT_DELAY = 3.minutes.freeze
+
+ feature_category :devops_reports
+ urgency :low
+
+ idempotent!
+
+ def perform
+ recorded_at = Time.zone.now
+
+ worker_arguments = Gitlab::Analytics::UsageTrends::WorkersArgumentBuilder.new(
+ measurement_identifiers: ::Analytics::UsageTrends::Measurement.measurement_identifier_values,
+ recorded_at: recorded_at
+ ).execute
+
+ perform_in = DEFAULT_DELAY.minutes.from_now
+ worker_arguments.each do |args|
+ CounterJobWorker.perform_in(perform_in, *args)
+
+ perform_in += DEFAULT_DELAY
+ end
+ end
+ end
+ end
+end
diff --git a/app/workers/analytics/usage_trends/counter_job_worker.rb b/app/workers/analytics/usage_trends/counter_job_worker.rb
new file mode 100644
index 00000000000..275c6ac2de2
--- /dev/null
+++ b/app/workers/analytics/usage_trends/counter_job_worker.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Analytics
+ module UsageTrends
+ class CounterJobWorker
+ extend ::Gitlab::Utils::Override
+ include ApplicationWorker
+
+ feature_category :devops_reports
+ urgency :low
+
+ idempotent!
+
+ def perform(measurement_identifier, min_id, max_id, recorded_at)
+ query_scope = ::Analytics::UsageTrends::Measurement.identifier_query_mapping[measurement_identifier].call
+
+ count = if min_id.nil? || max_id.nil? # table is empty
+ 0
+ else
+ counter(query_scope, min_id, max_id)
+ end
+
+ return if count == Gitlab::Database::BatchCounter::FALLBACK
+
+ UsageTrends::Measurement.insert_all([{ recorded_at: recorded_at, count: count, identifier: measurement_identifier }])
+ end
+
+ private
+
+ def counter(query_scope, min_id, max_id)
+ Gitlab::Database::BatchCount.batch_count(query_scope, start: min_id, finish: max_id)
+ end
+ end
+ end
+end
diff --git a/app/workers/post_receive.rb b/app/workers/post_receive.rb
index ac55f883fc5..313b901c08e 100644
--- a/app/workers/post_receive.rb
+++ b/app/workers/post_receive.rb
@@ -123,6 +123,7 @@ class PostReceive # rubocop:disable Scalability/IdempotentWorker
def after_project_changes_hooks(project, user, refs, changes)
experiment(:new_project_readme, actor: user).track_initial_writes(project)
+ experiment(:empty_repo_upload, project: project).track(:initial_write) if project.empty_repo?
repository_update_hook_data = Gitlab::DataBuilder::Repository.update(project, user, changes, refs)
SystemHooksService.new.execute_hooks(repository_update_hook_data, :repository_update_hooks)
Gitlab::UsageDataCounters::SourceCodeCounter.count(:pushes)
diff --git a/app/workers/releases/create_evidence_worker.rb b/app/workers/releases/create_evidence_worker.rb
index db75fae1639..d22329216f9 100644
--- a/app/workers/releases/create_evidence_worker.rb
+++ b/app/workers/releases/create_evidence_worker.rb
@@ -3,7 +3,6 @@
module Releases
class CreateEvidenceWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker
- include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
feature_category :release_evidence
diff --git a/bin/actioncable b/bin/actioncable
index 0aacb19e070..14600ec1177 100755
--- a/bin/actioncable
+++ b/bin/actioncable
@@ -36,7 +36,7 @@ start_foreground()
stop()
{
get_puma_pid
- kill -QUIT "$(get_puma_pid)"
+ kill -INT "$(get_puma_pid)"
}
reload()
diff --git a/bin/web_puma b/bin/web_puma
index 6a9b729f6dd..c1ab4718f0d 100755
--- a/bin/web_puma
+++ b/bin/web_puma
@@ -36,7 +36,7 @@ start_foreground()
stop()
{
get_puma_pid
- kill -QUIT "$(get_puma_pid)"
+ kill -INT "$(get_puma_pid)"
}
reload()
diff --git a/changelogs/unreleased/16119-jira-issue-transition-automatic.yml b/changelogs/unreleased/16119-jira-issue-transition-automatic.yml
new file mode 100644
index 00000000000..7d2a7a7b6c0
--- /dev/null
+++ b/changelogs/unreleased/16119-jira-issue-transition-automatic.yml
@@ -0,0 +1,5 @@
+---
+title: Support automatic transitions of Jira issues
+merge_request: 53760
+author:
+type: changed
diff --git a/changelogs/unreleased/20917-do-not-show-button-to-resolve-discussion-opening-an-issue-when-issu.yml b/changelogs/unreleased/20917-do-not-show-button-to-resolve-discussion-opening-an-issue-when-issu.yml
new file mode 100644
index 00000000000..afa3336d83b
--- /dev/null
+++ b/changelogs/unreleased/20917-do-not-show-button-to-resolve-discussion-opening-an-issue-when-issu.yml
@@ -0,0 +1,5 @@
+---
+title: Do not show button to resolve discussion opening an issue when issues are disabled
+merge_request: 54263
+author:
+type: fixed
diff --git a/changelogs/unreleased/221296-skip_orphaned_pool_repositories_on_restore.yml b/changelogs/unreleased/221296-skip_orphaned_pool_repositories_on_restore.yml
new file mode 100644
index 00000000000..387fd59236d
--- /dev/null
+++ b/changelogs/unreleased/221296-skip_orphaned_pool_repositories_on_restore.yml
@@ -0,0 +1,5 @@
+---
+title: Skip orphaned pool repositories on restore
+merge_request: 54112
+author:
+type: fixed
diff --git a/changelogs/unreleased/231064-update-settings-buttons-to-pajamas.yml b/changelogs/unreleased/231064-update-settings-buttons-to-pajamas.yml
new file mode 100644
index 00000000000..780cb864703
--- /dev/null
+++ b/changelogs/unreleased/231064-update-settings-buttons-to-pajamas.yml
@@ -0,0 +1,5 @@
+---
+title: Update protected branches buttons to pajamas style
+merge_request: 54612
+author:
+type: other
diff --git a/changelogs/unreleased/231126-yo-gitlab-ui.yml b/changelogs/unreleased/231126-yo-gitlab-ui.yml
new file mode 100644
index 00000000000..4b726401bdc
--- /dev/null
+++ b/changelogs/unreleased/231126-yo-gitlab-ui.yml
@@ -0,0 +1,6 @@
+---
+title: Apply GitLab UI button styles to buttons in ee/app/views/subscriptions/groups
+ directory
+merge_request: 51784
+author: Yogi (@yo)
+type: other
diff --git a/changelogs/unreleased/241058-mg-update-reply-placeholder.yml b/changelogs/unreleased/241058-mg-update-reply-placeholder.yml
new file mode 100644
index 00000000000..04a1368b46b
--- /dev/null
+++ b/changelogs/unreleased/241058-mg-update-reply-placeholder.yml
@@ -0,0 +1,5 @@
+---
+title: Update accessibility of the "Reply to discussion" UX
+merge_request: 54380
+author:
+type: other
diff --git a/changelogs/unreleased/273292-fy21q4-foundations-kr2-audit-and-update-buttons-on-sessionscontrol.yml b/changelogs/unreleased/273292-fy21q4-foundations-kr2-audit-and-update-buttons-on-sessionscontrol.yml
new file mode 100644
index 00000000000..c6f180481bd
--- /dev/null
+++ b/changelogs/unreleased/273292-fy21q4-foundations-kr2-audit-and-update-buttons-on-sessionscontrol.yml
@@ -0,0 +1,6 @@
+---
+title: Update the Sign In button to use the new confirm button variant, migrate OAuth
+ buttons to use the default variant of GlButton.
+merge_request: 53254
+author:
+type: other
diff --git a/changelogs/unreleased/275169-remove-service-desk-issue-prefix.yml b/changelogs/unreleased/275169-remove-service-desk-issue-prefix.yml
new file mode 100644
index 00000000000..9ac7247129b
--- /dev/null
+++ b/changelogs/unreleased/275169-remove-service-desk-issue-prefix.yml
@@ -0,0 +1,5 @@
+---
+title: Remove service desk issue prefix
+merge_request: 54140
+author: Lee Tickett @leetickett
+type: changed
diff --git a/changelogs/unreleased/285438-rename-instance-statistics-to-usage-trends.yml b/changelogs/unreleased/285438-rename-instance-statistics-to-usage-trends.yml
new file mode 100644
index 00000000000..7ab19331bfc
--- /dev/null
+++ b/changelogs/unreleased/285438-rename-instance-statistics-to-usage-trends.yml
@@ -0,0 +1,6 @@
+---
+title: Deprecate instanceStatisticsMeasurements in favor of usageTrendsMeasurements
+ GraphQL field
+merge_request: 54153
+author:
+type: changed
diff --git a/changelogs/unreleased/292498-webid-extension.yml b/changelogs/unreleased/292498-webid-extension.yml
new file mode 100644
index 00000000000..f2e89b78e72
--- /dev/null
+++ b/changelogs/unreleased/292498-webid-extension.yml
@@ -0,0 +1,5 @@
+---
+title: Introduce WebIDE as an extension for Editor Lite
+merge_request: 51527
+author:
+type: changed
diff --git a/changelogs/unreleased/292602-remove-fetch_mirror_check_tags_changed-ff.yml b/changelogs/unreleased/292602-remove-fetch_mirror_check_tags_changed-ff.yml
new file mode 100644
index 00000000000..b55370ee108
--- /dev/null
+++ b/changelogs/unreleased/292602-remove-fetch_mirror_check_tags_changed-ff.yml
@@ -0,0 +1,5 @@
+---
+title: Improve pull mirroring performance
+merge_request: 54353
+author:
+type: performance
diff --git a/changelogs/unreleased/293921-wrap-iterations.yml b/changelogs/unreleased/293921-wrap-iterations.yml
new file mode 100644
index 00000000000..0b1c4de2642
--- /dev/null
+++ b/changelogs/unreleased/293921-wrap-iterations.yml
@@ -0,0 +1,5 @@
+---
+title: Add iterations_cadences table and respective model
+merge_request: 50707
+author:
+type: other
diff --git a/changelogs/unreleased/297240-enable-skip_dag_manual_and_delayed_jobs.yml b/changelogs/unreleased/297240-enable-skip_dag_manual_and_delayed_jobs.yml
new file mode 100644
index 00000000000..8c83a73fdfd
--- /dev/null
+++ b/changelogs/unreleased/297240-enable-skip_dag_manual_and_delayed_jobs.yml
@@ -0,0 +1,5 @@
+---
+title: Fix not skipped manual and delayed DAG jobs
+merge_request: 54073
+author:
+type: fixed
diff --git a/changelogs/unreleased/299034-group-group-links-project-authorizations-refresh-can-be-limited-to.yml b/changelogs/unreleased/299034-group-group-links-project-authorizations-refresh-can-be-limited-to.yml
new file mode 100644
index 00000000000..cb64ea9f16a
--- /dev/null
+++ b/changelogs/unreleased/299034-group-group-links-project-authorizations-refresh-can-be-limited-to.yml
@@ -0,0 +1,6 @@
+---
+title: Limit Project Authorizations refresh for shared groups only to direct members
+ of the group being shared with
+merge_request: 51869
+author:
+type: performance
diff --git a/changelogs/unreleased/299895-experiment-cleanup-customize_homepage-banner.yml b/changelogs/unreleased/299895-experiment-cleanup-customize_homepage-banner.yml
new file mode 100644
index 00000000000..07752ef9f78
--- /dev/null
+++ b/changelogs/unreleased/299895-experiment-cleanup-customize_homepage-banner.yml
@@ -0,0 +1,5 @@
+---
+title: Enable customize homepage banner by default
+merge_request: 54357
+author:
+type: added
diff --git a/changelogs/unreleased/30010-graphql-doc.yml b/changelogs/unreleased/30010-graphql-doc.yml
new file mode 100644
index 00000000000..bc4757e4c24
--- /dev/null
+++ b/changelogs/unreleased/30010-graphql-doc.yml
@@ -0,0 +1,5 @@
+---
+title: Add documentation for graphQL queries
+merge_request: 54302
+author:
+type: other
diff --git a/changelogs/unreleased/300417-agent-token-description.yml b/changelogs/unreleased/300417-agent-token-description.yml
new file mode 100644
index 00000000000..2ec438ac75f
--- /dev/null
+++ b/changelogs/unreleased/300417-agent-token-description.yml
@@ -0,0 +1,5 @@
+---
+title: Add description field to cluster agent token
+merge_request: 54091
+author:
+type: changed
diff --git a/changelogs/unreleased/300435-add-label.yml b/changelogs/unreleased/300435-add-label.yml
new file mode 100644
index 00000000000..544ae90a238
--- /dev/null
+++ b/changelogs/unreleased/300435-add-label.yml
@@ -0,0 +1,5 @@
+---
+title: Add GlToggle label in sidebar subscription toggle
+merge_request: 54548
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/300443-add-label.yml b/changelogs/unreleased/300443-add-label.yml
new file mode 100644
index 00000000000..93694ba5ad3
--- /dev/null
+++ b/changelogs/unreleased/300443-add-label.yml
@@ -0,0 +1,5 @@
+---
+title: Add GlToggle label in edit feature flag
+merge_request: 54546
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/300458-send-gitlab_standard-context-with-requirements-events-from-the-fro.yml b/changelogs/unreleased/300458-send-gitlab_standard-context-with-requirements-events-from-the-fro.yml
new file mode 100644
index 00000000000..8f05ba746f7
--- /dev/null
+++ b/changelogs/unreleased/300458-send-gitlab_standard-context-with-requirements-events-from-the-fro.yml
@@ -0,0 +1,5 @@
+---
+title: Send gitlab_standard context with events from the frontend
+merge_request: 52959
+author:
+type: changed
diff --git a/changelogs/unreleased/301032-license-creation-via-api.yml b/changelogs/unreleased/301032-license-creation-via-api.yml
new file mode 100644
index 00000000000..a16d1442981
--- /dev/null
+++ b/changelogs/unreleased/301032-license-creation-via-api.yml
@@ -0,0 +1,5 @@
+---
+title: Hide repeated trial offers on self-hosted instances
+merge_request: 54550
+author:
+type: fixed
diff --git a/changelogs/unreleased/320949-ci-help-path-remove-prop.yml b/changelogs/unreleased/320949-ci-help-path-remove-prop.yml
new file mode 100644
index 00000000000..62cf0b2de64
--- /dev/null
+++ b/changelogs/unreleased/320949-ci-help-path-remove-prop.yml
@@ -0,0 +1,5 @@
+---
+title: Update 'Get Started with CI/CD' button with latest URL
+merge_request: 54344
+author:
+type: changed
diff --git a/changelogs/unreleased/321027-enable-ci_trigger_payload_into_pipeline.yml b/changelogs/unreleased/321027-enable-ci_trigger_payload_into_pipeline.yml
new file mode 100644
index 00000000000..b42836a2011
--- /dev/null
+++ b/changelogs/unreleased/321027-enable-ci_trigger_payload_into_pipeline.yml
@@ -0,0 +1,5 @@
+---
+title: Implement passing trigger payload into pipeline variable
+merge_request: 54544
+author:
+type: added
diff --git a/changelogs/unreleased/321054-enable-quick-actions-usage-data.yml b/changelogs/unreleased/321054-enable-quick-actions-usage-data.yml
new file mode 100644
index 00000000000..759d5375cc6
--- /dev/null
+++ b/changelogs/unreleased/321054-enable-quick-actions-usage-data.yml
@@ -0,0 +1,5 @@
+---
+title: Add quick action data to usage ping
+merge_request: 54293
+author:
+type: other
diff --git a/changelogs/unreleased/321283-update-kubernetes-version-supported.yml b/changelogs/unreleased/321283-update-kubernetes-version-supported.yml
new file mode 100644
index 00000000000..66cd57ff2a5
--- /dev/null
+++ b/changelogs/unreleased/321283-update-kubernetes-version-supported.yml
@@ -0,0 +1,5 @@
+---
+title: Update k8s version for EKS cluster
+merge_request: 54389
+author: Vincent Firmin @winkies
+type: fixed
diff --git a/changelogs/unreleased/321297-load-only-metadata-for-markdown-video-include.yml b/changelogs/unreleased/321297-load-only-metadata-for-markdown-video-include.yml
new file mode 100644
index 00000000000..74e9bc68e6e
--- /dev/null
+++ b/changelogs/unreleased/321297-load-only-metadata-for-markdown-video-include.yml
@@ -0,0 +1,5 @@
+---
+title: Add preload attribute to markdown videos
+merge_request: 54350
+author:
+type: performance
diff --git a/changelogs/unreleased/321420-spell-npm-with-lowercase-letters-in-package-registry-ui.yml b/changelogs/unreleased/321420-spell-npm-with-lowercase-letters-in-package-registry-ui.yml
new file mode 100644
index 00000000000..c3db475ff87
--- /dev/null
+++ b/changelogs/unreleased/321420-spell-npm-with-lowercase-letters-in-package-registry-ui.yml
@@ -0,0 +1,5 @@
+---
+title: Spell "npm" with lowercase letters in Package Registry UI
+merge_request: 54163
+author: Simon Stieger @sim0
+type: other
diff --git a/changelogs/unreleased/321488-mr-changes-view-render-version-dropdowns-above-navbar.yml b/changelogs/unreleased/321488-mr-changes-view-render-version-dropdowns-above-navbar.yml
new file mode 100644
index 00000000000..101ab1bfffc
--- /dev/null
+++ b/changelogs/unreleased/321488-mr-changes-view-render-version-dropdowns-above-navbar.yml
@@ -0,0 +1,5 @@
+---
+title: Render version dropdowns in MR changes view above tab navbar
+merge_request: 54159
+author: Simon Stieger @sim0
+type: fixed
diff --git a/changelogs/unreleased/321667-follow-first.yml b/changelogs/unreleased/321667-follow-first.yml
new file mode 100644
index 00000000000..e0670e58fa5
--- /dev/null
+++ b/changelogs/unreleased/321667-follow-first.yml
@@ -0,0 +1,5 @@
+---
+title: Show user follow button first instead of center
+merge_request: 54326
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/321677-enable-pages-zip-file-protocol-by-default.yml b/changelogs/unreleased/321677-enable-pages-zip-file-protocol-by-default.yml
new file mode 100644
index 00000000000..b745c40c932
--- /dev/null
+++ b/changelogs/unreleased/321677-enable-pages-zip-file-protocol-by-default.yml
@@ -0,0 +1,5 @@
+---
+title: Enable pages_serve_with_zip_file_protocol by default
+merge_request: 54650
+author:
+type: changed
diff --git a/changelogs/unreleased/321834-fj-remove-nil-values-from-snippet-blobs.yml b/changelogs/unreleased/321834-fj-remove-nil-values-from-snippet-blobs.yml
new file mode 100644
index 00000000000..ffbe850246e
--- /dev/null
+++ b/changelogs/unreleased/321834-fj-remove-nil-values-from-snippet-blobs.yml
@@ -0,0 +1,5 @@
+---
+title: Fix bug when snippet blobs array contain a nil value
+merge_request: 54552
+author:
+type: fixed
diff --git a/changelogs/unreleased/321939-fix-error-when-rendering-project-pipeline.yml b/changelogs/unreleased/321939-fix-error-when-rendering-project-pipeline.yml
new file mode 100644
index 00000000000..06ee0f27cc0
--- /dev/null
+++ b/changelogs/unreleased/321939-fix-error-when-rendering-project-pipeline.yml
@@ -0,0 +1,5 @@
+---
+title: Fix rendering of projects when the last pipeline changes during rendering
+merge_request: 54651
+author:
+type: fixed
diff --git a/changelogs/unreleased/321958-fix-npm-instance-level-api-with-scoped-packages.yml b/changelogs/unreleased/321958-fix-npm-instance-level-api-with-scoped-packages.yml
new file mode 100644
index 00000000000..2a1ca8c7845
--- /dev/null
+++ b/changelogs/unreleased/321958-fix-npm-instance-level-api-with-scoped-packages.yml
@@ -0,0 +1,5 @@
+---
+title: Fix the npm instance level API to exclude subgroups
+merge_request: 54554
+author:
+type: fixed
diff --git a/changelogs/unreleased/322198-fix-metrics-tab.yml b/changelogs/unreleased/322198-fix-metrics-tab.yml
new file mode 100644
index 00000000000..d7600177be7
--- /dev/null
+++ b/changelogs/unreleased/322198-fix-metrics-tab.yml
@@ -0,0 +1,5 @@
+---
+title: Fix Metric tab not showing up on operations page
+merge_request: 54736
+author:
+type: fixed
diff --git a/changelogs/unreleased/33685-lift-npm-package-naming-convention-for-project-level-api.yml b/changelogs/unreleased/33685-lift-npm-package-naming-convention-for-project-level-api.yml
new file mode 100644
index 00000000000..0aedf325fcf
--- /dev/null
+++ b/changelogs/unreleased/33685-lift-npm-package-naming-convention-for-project-level-api.yml
@@ -0,0 +1,5 @@
+---
+title: Lift the NPM package naming convention for the project level API
+merge_request: 53266
+author:
+type: changed
diff --git a/changelogs/unreleased/33748-dont-close-auto-suggest-select-boxes-if-only-mouseup-outside-box.yml b/changelogs/unreleased/33748-dont-close-auto-suggest-select-boxes-if-only-mouseup-outside-box.yml
new file mode 100644
index 00000000000..e9ed4250c2e
--- /dev/null
+++ b/changelogs/unreleased/33748-dont-close-auto-suggest-select-boxes-if-only-mouseup-outside-box.yml
@@ -0,0 +1,5 @@
+---
+title: Don't close auto suggest select boxes on click if only the mouseup (but not the mousedown) event happened outside the box
+merge_request: 51139
+author: Simon Stieger @sim0
+type: fixed
diff --git a/changelogs/unreleased/ab-index-rename.yml b/changelogs/unreleased/ab-index-rename.yml
new file mode 100644
index 00000000000..3fe01db7581
--- /dev/null
+++ b/changelogs/unreleased/ab-index-rename.yml
@@ -0,0 +1,5 @@
+---
+title: Rename indexes to remove inconsistencies
+merge_request: 51011
+author:
+type: other
diff --git a/changelogs/unreleased/add-kas-api-url-config.yml b/changelogs/unreleased/add-kas-api-url-config.yml
new file mode 100644
index 00000000000..e1e7682c659
--- /dev/null
+++ b/changelogs/unreleased/add-kas-api-url-config.yml
@@ -0,0 +1,5 @@
+---
+title: Add internal and external URL config for KAS
+merge_request: 54260
+author:
+type: added
diff --git a/changelogs/unreleased/add_role_and_rolebinding_for_cilium_network_policies.yml b/changelogs/unreleased/add_role_and_rolebinding_for_cilium_network_policies.yml
new file mode 100644
index 00000000000..a04cb215c1f
--- /dev/null
+++ b/changelogs/unreleased/add_role_and_rolebinding_for_cilium_network_policies.yml
@@ -0,0 +1,5 @@
+---
+title: Add Role and Rolebinding for CiliumNetworkPolicies
+merge_request: 54130
+author:
+type: changed
diff --git a/changelogs/unreleased/align-mr-conflict-center.yml b/changelogs/unreleased/align-mr-conflict-center.yml
new file mode 100644
index 00000000000..6dd58206b3c
--- /dev/null
+++ b/changelogs/unreleased/align-mr-conflict-center.yml
@@ -0,0 +1,5 @@
+---
+title: Align merge conflict warning text to center
+merge_request: 54145
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-confirm-subs-banner.yml b/changelogs/unreleased/btn-confirm-subs-banner.yml
new file mode 100644
index 00000000000..a5c3c233f31
--- /dev/null
+++ b/changelogs/unreleased/btn-confirm-subs-banner.yml
@@ -0,0 +1,5 @@
+---
+title: Update to btn-confirm and align subscription banner
+merge_request: 54137
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-default-admin-edit.yml b/changelogs/unreleased/btn-default-admin-edit.yml
new file mode 100644
index 00000000000..cc6e7c8898f
--- /dev/null
+++ b/changelogs/unreleased/btn-default-admin-edit.yml
@@ -0,0 +1,5 @@
+---
+title: Add btn-default class for edit buttons in admin projects and groups
+merge_request: 53453
+author:
+type: other
diff --git a/changelogs/unreleased/btn-icon-commit-action.yml b/changelogs/unreleased/btn-icon-commit-action.yml
new file mode 100644
index 00000000000..a6ffb73ffdb
--- /dev/null
+++ b/changelogs/unreleased/btn-icon-commit-action.yml
@@ -0,0 +1,5 @@
+---
+title: Add btn-icon class for commit action buttons
+merge_request: 54286
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/btn-icon-schedules.yml b/changelogs/unreleased/btn-icon-schedules.yml
new file mode 100644
index 00000000000..37ae9605975
--- /dev/null
+++ b/changelogs/unreleased/btn-icon-schedules.yml
@@ -0,0 +1,5 @@
+---
+title: Add btn-icon for buttons in pipeline schedules
+merge_request: 54426
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/bvl-fix-create-release-worker-is-not-cron.yml b/changelogs/unreleased/bvl-fix-create-release-worker-is-not-cron.yml
new file mode 100644
index 00000000000..9ab4bc33b92
--- /dev/null
+++ b/changelogs/unreleased/bvl-fix-create-release-worker-is-not-cron.yml
@@ -0,0 +1,5 @@
+---
+title: move create_release_evidence sidekiq queue out of the cronjob namespace
+merge_request: 54432
+author:
+type: fixed
diff --git a/changelogs/unreleased/cngo-convert-tab-to-gl-tab.yml b/changelogs/unreleased/cngo-convert-tab-to-gl-tab.yml
new file mode 100644
index 00000000000..f4a843ea6dc
--- /dev/null
+++ b/changelogs/unreleased/cngo-convert-tab-to-gl-tab.yml
@@ -0,0 +1,5 @@
+---
+title: Convert IDE nav form tab to GlTab
+merge_request: 54274
+author:
+type: changed
diff --git a/changelogs/unreleased/default-enabled-api_always_use_application_json.yml b/changelogs/unreleased/default-enabled-api_always_use_application_json.yml
new file mode 100644
index 00000000000..eabb936a32e
--- /dev/null
+++ b/changelogs/unreleased/default-enabled-api_always_use_application_json.yml
@@ -0,0 +1,5 @@
+---
+title: Change default API content_type to JSON
+merge_request: 54479
+author:
+type: changed
diff --git a/changelogs/unreleased/expose-failure-reasons-features.yml b/changelogs/unreleased/expose-failure-reasons-features.yml
new file mode 100644
index 00000000000..1fb7d63b911
--- /dev/null
+++ b/changelogs/unreleased/expose-failure-reasons-features.yml
@@ -0,0 +1,5 @@
+---
+title: Expose `failure_reasons` in `Build#features`
+merge_request: 53964
+author:
+type: added
diff --git a/changelogs/unreleased/feature-230726-repo-tabs.yml b/changelogs/unreleased/feature-230726-repo-tabs.yml
new file mode 100644
index 00000000000..7de7085fd04
--- /dev/null
+++ b/changelogs/unreleased/feature-230726-repo-tabs.yml
@@ -0,0 +1,5 @@
+---
+title: convert to GlTabs in app/assets/javascripts/ide/components/repo_tabs.vue
+merge_request: 42162
+author: Brandon Everett
+type: added
diff --git a/changelogs/unreleased/fix-email-participants-migration-version-number.yml b/changelogs/unreleased/fix-email-participants-migration-version-number.yml
new file mode 100644
index 00000000000..c0333716789
--- /dev/null
+++ b/changelogs/unreleased/fix-email-participants-migration-version-number.yml
@@ -0,0 +1,6 @@
+---
+title: Fix creating the idx_on_issues_where_service_desk_reply_to_is_not_null index
+ before the post migration
+merge_request: 54346
+author:
+type: other
diff --git a/changelogs/unreleased/fix-keep-artifacts-project-setting.yml b/changelogs/unreleased/fix-keep-artifacts-project-setting.yml
new file mode 100644
index 00000000000..dfff4cf73da
--- /dev/null
+++ b/changelogs/unreleased/fix-keep-artifacts-project-setting.yml
@@ -0,0 +1,5 @@
+---
+title: Fix keep latest artifacts checkbox being always disabled
+merge_request: 54669
+author:
+type: fixed
diff --git a/changelogs/unreleased/fix-overflowing-width-at-mention-selector.yml b/changelogs/unreleased/fix-overflowing-width-at-mention-selector.yml
new file mode 100644
index 00000000000..b28395fccca
--- /dev/null
+++ b/changelogs/unreleased/fix-overflowing-width-at-mention-selector.yml
@@ -0,0 +1,5 @@
+---
+title: Fix overflowing width - at mention container
+merge_request: 54377
+author:
+type: fixed
diff --git a/changelogs/unreleased/fix-project-import-visibility-error.yml b/changelogs/unreleased/fix-project-import-visibility-error.yml
new file mode 100644
index 00000000000..266ddce039d
--- /dev/null
+++ b/changelogs/unreleased/fix-project-import-visibility-error.yml
@@ -0,0 +1,5 @@
+---
+title: Fix project import error occurring due to default visibility
+merge_request: 53827
+author: Jonas Wälter @wwwjon
+type: fixed
diff --git a/changelogs/unreleased/gl-button-email-request.yml b/changelogs/unreleased/gl-button-email-request.yml
new file mode 100644
index 00000000000..d5c26d4e124
--- /dev/null
+++ b/changelogs/unreleased/gl-button-email-request.yml
@@ -0,0 +1,5 @@
+---
+title: Apply new GitLab UI for request email button
+merge_request: 53966
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/gl-button-time-tracking.yml b/changelogs/unreleased/gl-button-time-tracking.yml
new file mode 100644
index 00000000000..923cc3db7d8
--- /dev/null
+++ b/changelogs/unreleased/gl-button-time-tracking.yml
@@ -0,0 +1,5 @@
+---
+title: Apply new GitLab UI for learn more button in time tracking
+merge_request: 54142
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/jira-connect-app-style-cleanup.yml b/changelogs/unreleased/jira-connect-app-style-cleanup.yml
new file mode 100644
index 00000000000..1f28ebb276b
--- /dev/null
+++ b/changelogs/unreleased/jira-connect-app-style-cleanup.yml
@@ -0,0 +1,5 @@
+---
+title: Improve Jira connect app styling and i18n
+merge_request: 53441
+author:
+type: changed
diff --git a/changelogs/unreleased/john_long-composer-package-relative-url.yml b/changelogs/unreleased/john_long-composer-package-relative-url.yml
new file mode 100644
index 00000000000..d1938a72a9b
--- /dev/null
+++ b/changelogs/unreleased/john_long-composer-package-relative-url.yml
@@ -0,0 +1,5 @@
+---
+title: Fix relative URL with composer package
+merge_request: 53918
+author:
+type: fixed
diff --git a/changelogs/unreleased/kassio-bulkimports-filter-group-labels.yml b/changelogs/unreleased/kassio-bulkimports-filter-group-labels.yml
new file mode 100644
index 00000000000..19248571a01
--- /dev/null
+++ b/changelogs/unreleased/kassio-bulkimports-filter-group-labels.yml
@@ -0,0 +1,5 @@
+---
+title: 'BulkImports: Avoid import ProjectLabels in the Group import level'
+merge_request: 54580
+author:
+type: changed
diff --git a/changelogs/unreleased/kassio-bulkimports-import-group-label-timestamps.yml b/changelogs/unreleased/kassio-bulkimports-import-group-label-timestamps.yml
new file mode 100644
index 00000000000..6abf01ddfeb
--- /dev/null
+++ b/changelogs/unreleased/kassio-bulkimports-import-group-label-timestamps.yml
@@ -0,0 +1,5 @@
+---
+title: 'BulkImports: Import Label timestamps'
+merge_request: 54678
+author:
+type: changed
diff --git a/changelogs/unreleased/kassio-graphql-expose-label-create-at-updated-at.yml b/changelogs/unreleased/kassio-graphql-expose-label-create-at-updated-at.yml
new file mode 100644
index 00000000000..134b0090146
--- /dev/null
+++ b/changelogs/unreleased/kassio-graphql-expose-label-create-at-updated-at.yml
@@ -0,0 +1,5 @@
+---
+title: 'GraphQL: Expose Label "created_at" and "updated_at"'
+merge_request: 54487
+author:
+type: changed
diff --git a/changelogs/unreleased/ld-handle-gids-for-unknown-objects.yml b/changelogs/unreleased/ld-handle-gids-for-unknown-objects.yml
new file mode 100644
index 00000000000..1b4cdc859ce
--- /dev/null
+++ b/changelogs/unreleased/ld-handle-gids-for-unknown-objects.yml
@@ -0,0 +1,5 @@
+---
+title: Handle GlobalIDs with invalid resource names
+merge_request: 54290
+author:
+type: fixed
diff --git a/changelogs/unreleased/lm-fix-authorization-lint.yml b/changelogs/unreleased/lm-fix-authorization-lint.yml
new file mode 100644
index 00000000000..cca59b7b43e
--- /dev/null
+++ b/changelogs/unreleased/lm-fix-authorization-lint.yml
@@ -0,0 +1,5 @@
+---
+title: Updates authorization for linting endpoint
+merge_request: 54492
+author:
+type: changed
diff --git a/changelogs/unreleased/mg-fix-firefox-textarea-styling.yml b/changelogs/unreleased/mg-fix-firefox-textarea-styling.yml
new file mode 100644
index 00000000000..6830be548f5
--- /dev/null
+++ b/changelogs/unreleased/mg-fix-firefox-textarea-styling.yml
@@ -0,0 +1,5 @@
+---
+title: Fix style issue with "reply" placeholder textarea in firefox
+merge_request: 54592
+author:
+type: fixed
diff --git a/changelogs/unreleased/mwps-settings.yml b/changelogs/unreleased/mwps-settings.yml
new file mode 100644
index 00000000000..cf4c4c7be6c
--- /dev/null
+++ b/changelogs/unreleased/mwps-settings.yml
@@ -0,0 +1,5 @@
+---
+title: Add setting to control merge when pipeline succeeds notification
+merge_request: 37880
+author: Ravishankar
+type: added
diff --git a/changelogs/unreleased/psi-board-scroll.yml b/changelogs/unreleased/psi-board-scroll.yml
new file mode 100644
index 00000000000..3d68933b6f8
--- /dev/null
+++ b/changelogs/unreleased/psi-board-scroll.yml
@@ -0,0 +1,5 @@
+---
+title: Restore missing horizontal scrollbar on issue boards
+merge_request: 54634
+author:
+type: fixed
diff --git a/changelogs/unreleased/puma_sigint.yml b/changelogs/unreleased/puma_sigint.yml
new file mode 100644
index 00000000000..9bc6fd856f1
--- /dev/null
+++ b/changelogs/unreleased/puma_sigint.yml
@@ -0,0 +1,5 @@
+---
+title: Send SIGINT instead of SIGQUIT to puma
+merge_request: 54446
+author: Jörg Behrmann @behrmann
+type: fixed
diff --git a/changelogs/unreleased/reenable-sentry-pipeline-graph-only.yml b/changelogs/unreleased/reenable-sentry-pipeline-graph-only.yml
new file mode 100644
index 00000000000..47711e6da82
--- /dev/null
+++ b/changelogs/unreleased/reenable-sentry-pipeline-graph-only.yml
@@ -0,0 +1,5 @@
+---
+title: Restore Sentry functionaly to the frontend
+merge_request: 54441
+author:
+type: changed
diff --git a/changelogs/unreleased/remove-ci_jwt_include_environment-feature-flag.yml b/changelogs/unreleased/remove-ci_jwt_include_environment-feature-flag.yml
new file mode 100644
index 00000000000..459c1f69d32
--- /dev/null
+++ b/changelogs/unreleased/remove-ci_jwt_include_environment-feature-flag.yml
@@ -0,0 +1,5 @@
+---
+title: Add environment to custom CI_JOB_JWT claims
+merge_request: 54168
+author:
+type: added
diff --git a/changelogs/unreleased/remove-commit-paginate-ff.yml b/changelogs/unreleased/remove-commit-paginate-ff.yml
new file mode 100644
index 00000000000..7f511ce2eeb
--- /dev/null
+++ b/changelogs/unreleased/remove-commit-paginate-ff.yml
@@ -0,0 +1,5 @@
+---
+title: Add pagination of file diffs when viewing a large commit
+merge_request: 54236
+author:
+type: added
diff --git a/changelogs/unreleased/remove-margin-status.yml b/changelogs/unreleased/remove-margin-status.yml
new file mode 100644
index 00000000000..dc8db7e5785
--- /dev/null
+++ b/changelogs/unreleased/remove-margin-status.yml
@@ -0,0 +1,5 @@
+---
+title: Add btn-default and remove extra right margin
+merge_request: 54134
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/reset_template_cache_key.yml b/changelogs/unreleased/reset_template_cache_key.yml
new file mode 100644
index 00000000000..7ee55542bae
--- /dev/null
+++ b/changelogs/unreleased/reset_template_cache_key.yml
@@ -0,0 +1,5 @@
+---
+title: Reset description template names cache key to reload an updated templates structure
+merge_request: 54614
+author:
+type: fixed
diff --git a/changelogs/unreleased/sh-azure-ad-v2-omniauth.yml b/changelogs/unreleased/sh-azure-ad-v2-omniauth.yml
new file mode 100644
index 00000000000..cb11aa97920
--- /dev/null
+++ b/changelogs/unreleased/sh-azure-ad-v2-omniauth.yml
@@ -0,0 +1,5 @@
+---
+title: Add Azure ActiveDirectory v2 OmniAuth provider
+merge_request: 54265
+author:
+type: added
diff --git a/changelogs/unreleased/sh-fix-export-csv-service-nplusone.yml b/changelogs/unreleased/sh-fix-export-csv-service-nplusone.yml
new file mode 100644
index 00000000000..f1da7ec9682
--- /dev/null
+++ b/changelogs/unreleased/sh-fix-export-csv-service-nplusone.yml
@@ -0,0 +1,5 @@
+---
+title: Fix N+1 SQL regression in exporting issues to CSV
+merge_request: 54287
+author:
+type: performance
diff --git a/changelogs/unreleased/sh-update-batchloader-2-0-0.yml b/changelogs/unreleased/sh-update-batchloader-2-0-0.yml
new file mode 100644
index 00000000000..aca22a38803
--- /dev/null
+++ b/changelogs/unreleased/sh-update-batchloader-2-0-0.yml
@@ -0,0 +1,5 @@
+---
+title: Update batch_loader gem to v2.0.0
+merge_request: 54639
+author:
+type: fixed
diff --git a/changelogs/unreleased/sidebar-user-avatar.yml b/changelogs/unreleased/sidebar-user-avatar.yml
new file mode 100644
index 00000000000..ea5aa910a46
--- /dev/null
+++ b/changelogs/unreleased/sidebar-user-avatar.yml
@@ -0,0 +1,5 @@
+---
+title: Update user avatar in sidebar realtime
+merge_request: 54135
+author: Yogi (@yo)
+type: changed
diff --git a/changelogs/unreleased/ssarka-master-patch-39936.yml b/changelogs/unreleased/ssarka-master-patch-39936.yml
new file mode 100644
index 00000000000..8edd44d9f45
--- /dev/null
+++ b/changelogs/unreleased/ssarka-master-patch-39936.yml
@@ -0,0 +1,5 @@
+---
+title: Set MobSF version to 3.2.9 in SAST template
+merge_request: 53545
+author:
+type: other
diff --git a/changelogs/unreleased/tc-add-custom-emoji-creator.yml b/changelogs/unreleased/tc-add-custom-emoji-creator.yml
new file mode 100644
index 00000000000..da4d33f674b
--- /dev/null
+++ b/changelogs/unreleased/tc-add-custom-emoji-creator.yml
@@ -0,0 +1,5 @@
+---
+title: Add creator to custom emoji
+merge_request: 53879
+author:
+type: changed
diff --git a/changelogs/unreleased/test_update_merge_request_worker_performance_3.yml b/changelogs/unreleased/test_update_merge_request_worker_performance_3.yml
new file mode 100644
index 00000000000..df116e54f2d
--- /dev/null
+++ b/changelogs/unreleased/test_update_merge_request_worker_performance_3.yml
@@ -0,0 +1,5 @@
+---
+title: Preload certain data used in the updating of a merge request
+merge_request: 53802
+author:
+type: performance
diff --git a/changelogs/unreleased/tor-defect-missing-popovers-from-async-DOM.yml b/changelogs/unreleased/tor-defect-missing-popovers-from-async-DOM.yml
new file mode 100644
index 00000000000..139f6aedf6b
--- /dev/null
+++ b/changelogs/unreleased/tor-defect-missing-popovers-from-async-DOM.yml
@@ -0,0 +1,6 @@
+---
+title: React to new DOM nodes being added to the page to bind the user information
+ popover to them
+merge_request: 54411
+author:
+type: fixed
diff --git a/changelogs/unreleased/update_latex_template.yml b/changelogs/unreleased/update_latex_template.yml
new file mode 100644
index 00000000000..33213112768
--- /dev/null
+++ b/changelogs/unreleased/update_latex_template.yml
@@ -0,0 +1,5 @@
+---
+title: Update LaTeX Docker image in CI Templates to TexLive 2020
+merge_request: 52043
+author: Michael Schmitt @schmitmd
+type: changed
diff --git a/changelogs/unreleased/vs-break-long-code-line-in-markdown.yml b/changelogs/unreleased/vs-break-long-code-line-in-markdown.yml
new file mode 100644
index 00000000000..5ebf0cad97a
--- /dev/null
+++ b/changelogs/unreleased/vs-break-long-code-line-in-markdown.yml
@@ -0,0 +1,5 @@
+---
+title: Wrap long code lines in markdown
+merge_request: 54540
+author:
+type: fixed
diff --git a/changelogs/unreleased/vs-enable-gitlab-stylelint-config.yml b/changelogs/unreleased/vs-enable-gitlab-stylelint-config.yml
new file mode 100644
index 00000000000..4373b67bbe7
--- /dev/null
+++ b/changelogs/unreleased/vs-enable-gitlab-stylelint-config.yml
@@ -0,0 +1,5 @@
+---
+title: Replace scss with stylelint in documentation
+merge_request: 53700
+author:
+type: added
diff --git a/changelogs/unreleased/xanf-allow-top-level-bulk-imports.yml b/changelogs/unreleased/xanf-allow-top-level-bulk-imports.yml
new file mode 100644
index 00000000000..9a02ec07ef7
--- /dev/null
+++ b/changelogs/unreleased/xanf-allow-top-level-bulk-imports.yml
@@ -0,0 +1,5 @@
+---
+title: Allow importing groups as new top-level groups
+merge_request: 54323
+author:
+type: changed
diff --git a/config/application.rb b/config/application.rb
index 7e15d02a6da..7860c999b65 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -184,7 +184,6 @@ module Gitlab
config.assets.precompile << "page_bundles/build.css"
config.assets.precompile << "page_bundles/ci_status.css"
config.assets.precompile << "page_bundles/cycle_analytics.css"
- config.assets.precompile << "page_bundles/security_discover.css"
config.assets.precompile << "page_bundles/dev_ops_report.css"
config.assets.precompile << "page_bundles/environments.css"
config.assets.precompile << "page_bundles/epics.css"
@@ -194,6 +193,7 @@ module Gitlab
config.assets.precompile << "page_bundles/import.css"
config.assets.precompile << "page_bundles/incident_management_list.css"
config.assets.precompile << "page_bundles/issues_list.css"
+ config.assets.precompile << "page_bundles/iterations.css"
config.assets.precompile << "page_bundles/jira_connect.css"
config.assets.precompile << "page_bundles/jira_connect_users.css"
config.assets.precompile << "page_bundles/merge_conflicts.css"
@@ -208,6 +208,7 @@ module Gitlab
config.assets.precompile << "page_bundles/reports.css"
config.assets.precompile << "page_bundles/roadmap.css"
config.assets.precompile << "page_bundles/security_dashboard.css"
+ config.assets.precompile << "page_bundles/security_discover.css"
config.assets.precompile << "page_bundles/signup.css"
config.assets.precompile << "page_bundles/terminal.css"
config.assets.precompile << "page_bundles/todos.css"
diff --git a/config/feature_flags/development/api_always_use_application_json.yml b/config/feature_flags/development/api_always_use_application_json.yml
index 4405ef64012..daa8b15c25f 100644
--- a/config/feature_flags/development/api_always_use_application_json.yml
+++ b/config/feature_flags/development/api_always_use_application_json.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/270067
milestone: '13.6'
type: development
group: group::ecosystem
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/application_settings_tokens_optional_encryption.yml b/config/feature_flags/development/application_settings_tokens_optional_encryption.yml
index 08814f31159..c3619dbe2d0 100644
--- a/config/feature_flags/development/application_settings_tokens_optional_encryption.yml
+++ b/config/feature_flags/development/application_settings_tokens_optional_encryption.yml
@@ -1,8 +1,8 @@
---
name: application_settings_tokens_optional_encryption
-introduced_by_url:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/25532
rollout_issue_url:
-milestone:
+milestone: '11.9'
type: development
-group:
+group: group::runner
default_enabled: false
diff --git a/config/feature_flags/development/auto_devops_banner_disabled.yml b/config/feature_flags/development/auto_devops_banner_disabled.yml
index cb9566c3de3..700560d5738 100644
--- a/config/feature_flags/development/auto_devops_banner_disabled.yml
+++ b/config/feature_flags/development/auto_devops_banner_disabled.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/14
rollout_issue_url:
milestone: '10.0'
type: development
-group:
+group: group::continuous integration
default_enabled: false
diff --git a/config/feature_flags/development/chatops.yml b/config/feature_flags/development/chatops.yml
index 2ce01c26cb8..74cabe995e5 100644
--- a/config/feature_flags/development/chatops.yml
+++ b/config/feature_flags/development/chatops.yml
@@ -1,8 +1,8 @@
---
name: chatops
-introduced_by_url:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24780
rollout_issue_url:
-milestone:
+milestone: '11.9'
type: development
-group:
+group: group::configure
default_enabled: true
diff --git a/config/feature_flags/development/ci_trigger_payload_into_pipeline.yml b/config/feature_flags/development/ci_trigger_payload_into_pipeline.yml
index 93dd7113f2a..2130c6151e8 100644
--- a/config/feature_flags/development/ci_trigger_payload_into_pipeline.yml
+++ b/config/feature_flags/development/ci_trigger_payload_into_pipeline.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321027
milestone: '13.9'
type: development
group: group::pipeline authoring
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/instance_statistics.yml b/config/feature_flags/development/customize_homepage.yml
index 3caddad8b69..2be1d5ff8e3 100644
--- a/config/feature_flags/development/instance_statistics.yml
+++ b/config/feature_flags/development/customize_homepage.yml
@@ -1,8 +1,8 @@
---
-name: instance_statistics
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40583
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/241711
-milestone: '13.4'
+name: customize_homepage
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54357
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/299895
+milestone: '13.10'
type: development
-group: group::optimize
+group: group::expansion
default_enabled: true
diff --git a/config/feature_flags/development/groups_tokens_optional_encryption.yml b/config/feature_flags/development/groups_tokens_optional_encryption.yml
index 2b36b0d7c10..25c172422f6 100644
--- a/config/feature_flags/development/groups_tokens_optional_encryption.yml
+++ b/config/feature_flags/development/groups_tokens_optional_encryption.yml
@@ -1,8 +1,8 @@
---
name: groups_tokens_optional_encryption
-introduced_by_url:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/25532
rollout_issue_url:
-milestone:
+milestone: '11.9'
type: development
-group:
+group: group::runner
default_enabled: true
diff --git a/config/feature_flags/development/ci_jwt_include_environment.yml b/config/feature_flags/development/inherited_issuable_templates.yml
index ea55ce0c569..fb322e9468a 100644
--- a/config/feature_flags/development/ci_jwt_include_environment.yml
+++ b/config/feature_flags/development/inherited_issuable_templates.yml
@@ -1,8 +1,8 @@
---
-name: ci_jwt_include_environment
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53431
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321206
+name: inherited_issuable_templates
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52360
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321247
milestone: '13.9'
type: development
-group: group::configure
+group: group::project management
default_enabled: false
diff --git a/config/feature_flags/development/json_wrapper_legacy_mode.yml b/config/feature_flags/development/json_wrapper_legacy_mode.yml
index d255bf35889..13a4bb30d09 100644
--- a/config/feature_flags/development/json_wrapper_legacy_mode.yml
+++ b/config/feature_flags/development/json_wrapper_legacy_mode.yml
@@ -1,8 +1,8 @@
---
name: json_wrapper_legacy_mode
-introduced_by_url:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30849
rollout_issue_url:
-milestone:
+milestone: '13.0'
type: development
-group:
+group: group::source code
default_enabled: true
diff --git a/config/feature_flags/development/notes_create_service_tracking.yml b/config/feature_flags/development/notes_create_service_tracking.yml
index ae9d4ce09c5..5601088b25f 100644
--- a/config/feature_flags/development/notes_create_service_tracking.yml
+++ b/config/feature_flags/development/notes_create_service_tracking.yml
@@ -1,8 +1,8 @@
---
name: notes_create_service_tracking
-introduced_by_url:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18890
rollout_issue_url:
-milestone:
+milestone: '12.5'
type: development
-group:
+group: group::testing
default_enabled: false
diff --git a/config/feature_flags/development/pages_serve_with_zip_file_protocol.yml b/config/feature_flags/development/pages_serve_with_zip_file_protocol.yml
index 836702debba..153b0d5915c 100644
--- a/config/feature_flags/development/pages_serve_with_zip_file_protocol.yml
+++ b/config/feature_flags/development/pages_serve_with_zip_file_protocol.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321677
milestone: '13.6'
type: development
group: group::release
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/pages_use_legacy_storage_lease.yml b/config/feature_flags/development/pipeline_status_for_pipeline_editor.yml
index 548a3ecd589..886f8f0f7e6 100644
--- a/config/feature_flags/development/pages_use_legacy_storage_lease.yml
+++ b/config/feature_flags/development/pipeline_status_for_pipeline_editor.yml
@@ -1,8 +1,8 @@
---
-name: pages_use_legacy_storage_lease
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48349
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/282464
-milestone: '13.7'
+name: pipeline_status_for_pipeline_editor
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53797
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321518
+milestone: '13.10'
type: development
-group: group::release
-default_enabled: true
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/pipelines_security_report_summary.yml b/config/feature_flags/development/pipelines_security_report_summary.yml
index 7b67212269c..d01d08c9042 100644
--- a/config/feature_flags/development/pipelines_security_report_summary.yml
+++ b/config/feature_flags/development/pipelines_security_report_summary.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/235943
milestone: '13.0'
type: development
group: group::dynamic analysis
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/project_statistics_sync.yml b/config/feature_flags/development/project_statistics_sync.yml
index 188e953f780..6eb6f76ad26 100644
--- a/config/feature_flags/development/project_statistics_sync.yml
+++ b/config/feature_flags/development/project_statistics_sync.yml
@@ -1,8 +1,8 @@
---
name: project_statistics_sync
-introduced_by_url:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29636
rollout_issue_url:
-milestone:
+milestone: '12.10'
type: development
-group:
+group: group::source code
default_enabled: true
diff --git a/config/feature_flags/development/projects_tokens_optional_encryption.yml b/config/feature_flags/development/projects_tokens_optional_encryption.yml
index 3d6f7905ef9..c9af986b6b7 100644
--- a/config/feature_flags/development/projects_tokens_optional_encryption.yml
+++ b/config/feature_flags/development/projects_tokens_optional_encryption.yml
@@ -1,8 +1,8 @@
---
name: projects_tokens_optional_encryption
-introduced_by_url:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/25532
rollout_issue_url:
-milestone:
+milestone: '11.9'
type: development
-group:
+group: group::runner
default_enabled: true
diff --git a/config/feature_flags/development/security_orchestration_policies_configuration.yml b/config/feature_flags/development/security_orchestration_policies_configuration.yml
new file mode 100644
index 00000000000..442a87017dd
--- /dev/null
+++ b/config/feature_flags/development/security_orchestration_policies_configuration.yml
@@ -0,0 +1,8 @@
+---
+name: security_orchestration_policies_configuration
+introduced_by_url:
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321258
+milestone: '13.9'
+type: development
+group: group::container security
+default_enabled: false
diff --git a/config/feature_flags/development/skip_dag_manual_and_delayed_jobs.yml b/config/feature_flags/development/skip_dag_manual_and_delayed_jobs.yml
index 678a52ee613..640be201868 100644
--- a/config/feature_flags/development/skip_dag_manual_and_delayed_jobs.yml
+++ b/config/feature_flags/development/skip_dag_manual_and_delayed_jobs.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/297240
milestone: '13.8'
type: development
group: group::pipeline authoring
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/usage_data_code_review_aggregation.yml b/config/feature_flags/development/usage_data_code_review_aggregation.yml
new file mode 100644
index 00000000000..a41fd11dac3
--- /dev/null
+++ b/config/feature_flags/development/usage_data_code_review_aggregation.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_code_review_aggregation
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53553
+rollout_issue_url:
+milestone: '13.9'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/usage_data_i_analytics_cohorts.yml b/config/feature_flags/development/usage_data_i_analytics_cohorts.yml
new file mode 100644
index 00000000000..b9c401b7e27
--- /dev/null
+++ b/config/feature_flags/development/usage_data_i_analytics_cohorts.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_i_analytics_cohorts
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54329
+rollout_issue_url:
+milestone: '13.9'
+type: development
+group: group::optimize
+default_enabled: true
diff --git a/config/feature_flags/development/usage_data_track_quickactions.yml b/config/feature_flags/development/usage_data_track_quickactions.yml
index 57f698f7031..3e2a2fe8927 100644
--- a/config/feature_flags/development/usage_data_track_quickactions.yml
+++ b/config/feature_flags/development/usage_data_track_quickactions.yml
@@ -1,8 +1,8 @@
---
name: usage_data_track_quickactions
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52398
-rollout_issue_url:
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321054
milestone: '13.9'
type: development
group: group::project management
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/experiment/ci_syntax_templates_experiment_percentage.yml b/config/feature_flags/experiment/ci_syntax_templates_b_experiment_percentage.yml
index 3ed457acce8..0bad0bbb1c0 100644
--- a/config/feature_flags/experiment/ci_syntax_templates_experiment_percentage.yml
+++ b/config/feature_flags/experiment/ci_syntax_templates_b_experiment_percentage.yml
@@ -1,8 +1,8 @@
---
-name: ci_syntax_templates_experiment_percentage
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48141
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/281057
-milestone: '13.8'
+name: ci_syntax_templates_b_experiment_percentage
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53479
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/300993
+milestone: "13.9"
type: experiment
group: group::activation
default_enabled: false
diff --git a/config/feature_flags/experiment/customize_homepage_experiment_percentage.yml b/config/feature_flags/experiment/customize_homepage_experiment_percentage.yml
deleted file mode 100644
index eff0d2785eb..00000000000
--- a/config/feature_flags/experiment/customize_homepage_experiment_percentage.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: customize_homepage_experiment_percentage
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39348
-rollout_issue_url: https://gitlab.com/gitlab-org/growth/team-tasks/-/issues/187
-milestone: '13.4'
-type: experiment
-group: group::expansion
-default_enabled: false
diff --git a/config/feature_flags/development/paginate_commit_view.yml b/config/feature_flags/experiment/empty_repo_upload.yml
index ee89788a219..9655a4d3cb4 100644
--- a/config/feature_flags/development/paginate_commit_view.yml
+++ b/config/feature_flags/experiment/empty_repo_upload.yml
@@ -1,8 +1,8 @@
---
-name: paginate_commit_view
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52819
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/300540
+name: empty_repo_upload
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52755
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/285296
milestone: '13.9'
-type: development
-group: group::source code
+type: experiment
+group: group::adoption
default_enabled: false
diff --git a/config/feature_flags/ops/marginalia.yml b/config/feature_flags/ops/marginalia.yml
deleted file mode 100644
index fb82f274eb2..00000000000
--- a/config/feature_flags/ops/marginalia.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: marginalia
-introduced_by_url:
-rollout_issue_url:
-milestone:
-type: ops
-group:
-default_enabled: false
diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example
index 65627b0e166..76eef1a81d3 100644
--- a/config/gitlab.yml.example
+++ b/config/gitlab.yml.example
@@ -1159,10 +1159,17 @@ production: &base
# secret_file: /home/git/gitlab/.gitlab_workhorse_secret
gitlab_kas:
+ # enabled: true
# File that contains the secret key for verifying access for gitlab-kas.
# Default is '.gitlab_kas_secret' relative to Rails.root (i.e. root of the GitLab app).
# secret_file: /home/git/gitlab/.gitlab_kas_secret
+ # The URL to the external KAS API (used by the Kubernetes agents)
+ # external_url: wss://kas.example.com
+
+ # The URL to the internal KAS API (used by the GitLab backend)
+ # internal_url: grpc://localhost:8153
+
## GitLab Elasticsearch settings
elasticsearch:
indexer_path: /home/git/gitlab-elasticsearch-indexer/
diff --git a/config/initializers/0_marginalia.rb b/config/initializers/0_marginalia.rb
index 952dd75886d..05893f29de9 100644
--- a/config/initializers/0_marginalia.rb
+++ b/config/initializers/0_marginalia.rb
@@ -4,11 +4,6 @@ require 'marginalia'
::Marginalia::Comment.extend(::Gitlab::Marginalia::Comment)
-# Patch to modify 'Marginalia::ActiveRecordInstrumentation.annotate_sql' method with feature check.
-# Orignal Marginalia::ActiveRecordInstrumentation is included to ActiveRecord::ConnectionAdapters::PostgreSQLAdapter in the Marginalia Railtie.
-# Refer: https://github.com/basecamp/marginalia/blob/v1.8.0/lib/marginalia/railtie.rb#L67
-ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(Gitlab::Marginalia::ActiveRecordInstrumentation)
-
# By default, PostgreSQL only tracks the first 1024 bytes of a SQL
# query. Prepending the comment allows us to trace the source of the
# query without having to increase the `track_activity_query_size`
@@ -25,5 +20,3 @@ Marginalia::Comment.components << :line if Rails.env.development?
Gitlab::Marginalia.set_application_name
Gitlab::Marginalia.enable_sidekiq_instrumentation
-
-Gitlab::Marginalia.set_enabled_from_feature_flag
diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index c478123f4eb..ba44b900dbb 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -544,9 +544,9 @@ Settings.cron_jobs['postgres_dynamic_partitions_creator']['job_class'] ||= 'Part
Settings.cron_jobs['ci_platform_metrics_update_cron_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['ci_platform_metrics_update_cron_worker']['cron'] ||= '47 9 * * *'
Settings.cron_jobs['ci_platform_metrics_update_cron_worker']['job_class'] = 'CiPlatformMetricsUpdateCronWorker'
-Settings.cron_jobs['analytics_instance_statistics_count_job_trigger_worker'] ||= Settingslogic.new({})
-Settings.cron_jobs['analytics_instance_statistics_count_job_trigger_worker']['cron'] ||= '50 23 */1 * *'
-Settings.cron_jobs['analytics_instance_statistics_count_job_trigger_worker']['job_class'] ||= 'Analytics::InstanceStatistics::CountJobTriggerWorker'
+Settings.cron_jobs['analytics_usage_trends_count_job_trigger_worker'] ||= Settingslogic.new({})
+Settings.cron_jobs['analytics_usage_trends_count_job_trigger_worker']['cron'] ||= '50 23 */1 * *'
+Settings.cron_jobs['analytics_usage_trends_count_job_trigger_worker']['job_class'] ||= 'Analytics::UsageTrends::CountJobTriggerWorker'
Settings.cron_jobs['member_invitation_reminder_emails_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['member_invitation_reminder_emails_worker']['cron'] ||= '0 0 * * *'
Settings.cron_jobs['member_invitation_reminder_emails_worker']['job_class'] = 'MemberInvitationReminderEmailsWorker'
@@ -710,7 +710,10 @@ Settings.workhorse['secret_file'] ||= Rails.root.join('.gitlab_workhorse_secret'
# GitLab KAS
#
Settings['gitlab_kas'] ||= Settingslogic.new({})
+Settings.gitlab_kas['enabled'] ||= false
Settings.gitlab_kas['secret_file'] ||= Rails.root.join('.gitlab_kas_secret')
+Settings.gitlab_kas['external_url'] ||= 'wss://kas.example.com'
+Settings.gitlab_kas['internal_url'] ||= 'grpc://localhost:8153'
#
# Repositories
diff --git a/config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml b/config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml
new file mode 100644
index 00000000000..d589814b7af
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.analytics_unique_visits_for_any_target_monthly
+description: Visits to any of the pages listed above per month
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174914_g_analytics_contribution_monthly.yml b/config/metrics/counts_28d/20210216174914_g_analytics_contribution_monthly.yml
new file mode 100644
index 00000000000..ea3094527db
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174914_g_analytics_contribution_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.g_analytics_contribution_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174918_g_analytics_insights_monthly.yml b/config/metrics/counts_28d/20210216174918_g_analytics_insights_monthly.yml
new file mode 100644
index 00000000000..cb792aae308
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174918_g_analytics_insights_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.g_analytics_insights_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174921_g_analytics_issues_monthly.yml b/config/metrics/counts_28d/20210216174921_g_analytics_issues_monthly.yml
new file mode 100644
index 00000000000..9fc7894d399
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174921_g_analytics_issues_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.g_analytics_issues_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174926_g_analytics_productivity_monthly.yml b/config/metrics/counts_28d/20210216174926_g_analytics_productivity_monthly.yml
new file mode 100644
index 00000000000..2ae3c3626d1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174926_g_analytics_productivity_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.g_analytics_productivity_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174929_g_analytics_valuestream_monthly.yml b/config/metrics/counts_28d/20210216174929_g_analytics_valuestream_monthly.yml
new file mode 100644
index 00000000000..86d84193265
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174929_g_analytics_valuestream_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.g_analytics_valuestream_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml b/config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml
new file mode 100644
index 00000000000..ba5c4d27d25
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_pipelines_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174937_p_analytics_code_reviews_monthly.yml b/config/metrics/counts_28d/20210216174937_p_analytics_code_reviews_monthly.yml
new file mode 100644
index 00000000000..e4c15360b52
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174937_p_analytics_code_reviews_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_code_reviews_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml b/config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml
new file mode 100644
index 00000000000..da07cbee741
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_valuestream_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174945_p_analytics_insights_monthly.yml b/config/metrics/counts_28d/20210216174945_p_analytics_insights_monthly.yml
new file mode 100644
index 00000000000..afe6c79e885
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174945_p_analytics_insights_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_insights_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174949_p_analytics_issues_monthly.yml b/config/metrics/counts_28d/20210216174949_p_analytics_issues_monthly.yml
new file mode 100644
index 00000000000..4ee8afd234b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174949_p_analytics_issues_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_issues_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174953_p_analytics_repo_monthly.yml b/config/metrics/counts_28d/20210216174953_p_analytics_repo_monthly.yml
new file mode 100644
index 00000000000..c41b84dbcd0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174953_p_analytics_repo_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_repo_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml b/config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml
new file mode 100644
index 00000000000..843d3717ba7
--- /dev/null
+++ b/config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.i_analytics_cohorts_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml b/config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml
new file mode 100644
index 00000000000..77b6068fb8d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.i_analytics_dev_ops_score_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml b/config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml
new file mode 100644
index 00000000000..d7af387f862
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.g_analytics_merge_request_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175008_p_analytics_merge_request_monthly.yml b/config/metrics/counts_28d/20210216175008_p_analytics_merge_request_monthly.yml
new file mode 100644
index 00000000000..f3f7da5ee38
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175008_p_analytics_merge_request_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.p_analytics_merge_request_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml b/config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml
new file mode 100644
index 00000000000..d7071bf4a79
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.i_analytics_instance_statistics_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..d173a922f5d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.analytics.analytics_total_unique_counts_monthly
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175055_merge_requests.yml b/config/metrics/counts_28d/20210216175055_merge_requests.yml
new file mode 100644
index 00000000000..048ea4fd917
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175055_merge_requests.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.merge_requests
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml b/config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml
new file mode 100644
index 00000000000..7e9186a3a82
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage_monthly.create.projects_with_disable_overriding_approvers_per_merge_request
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml b/config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml
new file mode 100644
index 00000000000..56107e921f2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage_monthly.create.projects_without_disable_overriding_approvers_per_merge_request
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175101_merge_requests_users.yml b/config/metrics/counts_28d/20210216175101_merge_requests_users.yml
new file mode 100644
index 00000000000..563a56c2a0f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175101_merge_requests_users.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.merge_requests_users
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175109_suggestions.yml b/config/metrics/counts_28d/20210216175109_suggestions.yml
new file mode 100644
index 00000000000..74e388fd07d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175109_suggestions.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.suggestions
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml b/config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml
new file mode 100644
index 00000000000..de3049f76fa
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.source_code.merge_request_action_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml b/config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml
new file mode 100644
index 00000000000..4f409dbf8c5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.source_code.i_source_code_code_intelligence_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml b/config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml
new file mode 100644
index 00000000000..a23aed69c72
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_mr_diffs_monthly
+description: Count of unique merge requests per week|month with diffs viewed
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml b/config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml
new file mode 100644
index 00000000000..dd315b5634d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_single_file_diffs_monthly
+description: Count of unique users per week|month with diffs viewed file by file
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml b/config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml
new file mode 100644
index 00000000000..82d1c86d146
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml
@@ -0,0 +1,17 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_mr_single_file_diffs_monthly
+description: Count of unique merge requests per week|month with diffs viewed file
+ by file
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml b/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml
new file mode 100644
index 00000000000..28d4477c037
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_create_mr_monthly
+description: Count of unique users per week|month who created a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml b/config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml
new file mode 100644
index 00000000000..c73a5da2585
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_close_mr_monthly
+description: Count of unique users per week|month who closed a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml b/config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml
new file mode 100644
index 00000000000..173ff6a995e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_reopen_mr_monthly
+description: Count of unique users per week|month who reopened a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml b/config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml
new file mode 100644
index 00000000000..0c126afeb64
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_merge_mr_monthly
+description: Count of unique users per week|month who merged a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml
new file mode 100644
index 00000000000..1c3801e77bc
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_create_mr_comment_monthly
+description: Count of unique users per week|month who commented on a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml
new file mode 100644
index 00000000000..5a0bf9346a0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_edit_mr_comment_monthly
+description: Count of unique users per week|month who edited a comment on a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml
new file mode 100644
index 00000000000..9e8f191d7e5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_remove_mr_comment_monthly
+description: Count of unique users per week|month who removed a comment on a MR
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml b/config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml
new file mode 100644
index 00000000000..9b3c359b6f0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_add_suggestion_monthly
+description: Count of unique users per month who added a suggestion
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml b/config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml
new file mode 100644
index 00000000000..be38418982d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_apply_suggestion_monthly
+description: Count of unique users per month who applied a suggestion
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml b/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml
new file mode 100644
index 00000000000..43f967d5e92
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_applications_cert_managers
+description: Total GitLab Managed clusters with Cert Manager enabled
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml b/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml
new file mode 100644
index 00000000000..5aeea54a4a8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_applications_helm
+description: Total GitLab Managed clusters with Helm enabled
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml b/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml
new file mode 100644
index 00000000000..9d2da437f7a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_applications_ingress
+description: Total GitLab Managed clusters with Ingress enabled
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml b/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml
new file mode 100644
index 00000000000..6a1bfaf23d9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_applications_knative
+description: Total GitLab Managed clusters with Knative enabled
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175413_clusters_management_project.yml b/config/metrics/counts_28d/20210216175413_clusters_management_project.yml
new file mode 100644
index 00000000000..6763750f777
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175413_clusters_management_project.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_management_project
+description: Total GitLab Managed clusters with defined cluster management project
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175415_clusters_disabled.yml b/config/metrics/counts_28d/20210216175415_clusters_disabled.yml
new file mode 100644
index 00000000000..cd23c062279
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175415_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_disabled
+description: Total GitLab Managed disabled clusters
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175417_clusters_enabled.yml b/config/metrics/counts_28d/20210216175417_clusters_enabled.yml
new file mode 100644
index 00000000000..559067cb044
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175417_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_enabled
+description: Total GitLab Managed clusters currently enabled
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml b/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml
new file mode 100644
index 00000000000..a4b3eafb813
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_platforms_gke
+description: Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml b/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml
new file mode 100644
index 00000000000..c329736221f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_platforms_eks
+description: Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml b/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml
new file mode 100644
index 00000000000..c1ae40b9533
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.clusters_platforms_user
+description: Total GitLab Managed clusters that are user provisioned
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml b/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml
new file mode 100644
index 00000000000..b28301a9ff0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.instance_clusters_disabled
+description: Total GitLab Managed disabled clusters attached to the instance
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml b/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml
new file mode 100644
index 00000000000..182cbcdea07
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.instance_clusters_enabled
+description: Total GitLab Managed enabled clusters attached to the instance
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml b/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml
new file mode 100644
index 00000000000..7dd10ffcc1a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.group_clusters_disabled
+description: Total GitLab Managed disabled clusters attached to groups
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml b/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml
new file mode 100644
index 00000000000..b49046220a2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.group_clusters_enabled
+description: Total GitLab Managed enabled clusters attached to groups
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml b/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml
new file mode 100644
index 00000000000..65cfbc57e82
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.project_clusters_disabled
+description: Total GitLab Managed disabled clusters attached to projects
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml b/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml
new file mode 100644
index 00000000000..dd17be3d69a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.project_clusters_enabled
+description: Total GitLab Managed enabled clusters attached to projects
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175542_ci_builds.yml b/config/metrics/counts_28d/20210216175542_ci_builds.yml
new file mode 100644
index 00000000000..016d6c75cce
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175542_ci_builds.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.ci_builds
+description: Unique builds in project
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml b/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml
new file mode 100644
index 00000000000..f67fb96b9ee
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.ci_external_pipelines
+description: Total pipelines in external repositories
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml b/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml
new file mode 100644
index 00000000000..66456d42ffe
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.ci_internal_pipelines
+description: Total pipelines in GitLab repositories
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml b/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml
new file mode 100644
index 00000000000..7720ca5d26a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.ci_pipeline_config_auto_devops
+description: Total pipelines from an Auto DevOps template
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml b/config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml
new file mode 100644
index 00000000000..8c125a51f89
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.ci_pipeline_config_repository
+description: Total Pipelines from templates in repository
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml b/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml
new file mode 100644
index 00000000000..7464f28fc68
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.ci_pipeline_schedules
+description: Pipeline schedules in GitLab
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175554_ci_pipelines.yml b/config/metrics/counts_28d/20210216175554_ci_pipelines.yml
new file mode 100644
index 00000000000..b818e52ecb5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175554_ci_pipelines.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.ci_pipelines
+description: " Distinct users triggering pipelines in a month"
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175556_ci_triggers.yml b/config/metrics/counts_28d/20210216175556_ci_triggers.yml
new file mode 100644
index 00000000000..f409434feb0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175556_ci_triggers.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.ci_triggers
+description: Total configured Triggers in project
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175616_user_dast_jobs.yml b/config/metrics/counts_28d/20210216175616_user_dast_jobs.yml
new file mode 100644
index 00000000000..a8b2cbc40dc
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175616_user_dast_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.user_dast_jobs
+description: Users who run a DAST job
+product_section: sec
+product_stage: secure
+product_group: group::dynamic analysis
+product_category: dynamic_application_security_testing
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216175618_dast_pipeline.yml b/config/metrics/counts_28d/20210216175618_dast_pipeline.yml
new file mode 100644
index 00000000000..f4a110f8ca4
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175618_dast_pipeline.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.dast_pipeline
+description: Count of pipelines that have at least 1 DAST job
+product_section: sec
+product_stage: secure
+product_group: group::dynamic analysis
+product_category: dynamic_application_security_testing
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180308_personal_snippets.yml b/config/metrics/counts_28d/20210216180308_personal_snippets.yml
new file mode 100644
index 00000000000..691907be1d6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180308_personal_snippets.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts_monthly.personal_snippets
+description: Monthly count of Personal Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180310_project_snippets.yml b/config/metrics/counts_28d/20210216180310_project_snippets.yml
new file mode 100644
index 00000000000..5703fb29678
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180310_project_snippets.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts_monthly.project_snippets
+description: Monthly count of Project Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180312_snippets.yml b/config/metrics/counts_28d/20210216180312_snippets.yml
new file mode 100644
index 00000000000..b132575dad7
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180312_snippets.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts_monthly.snippets
+description: Monthly count of All Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180317_snippets.yml b/config/metrics/counts_28d/20210216180317_snippets.yml
new file mode 100644
index 00000000000..fc2ba339313
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180317_snippets.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.create.snippets
+description: Monthly Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml b/config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml
new file mode 100644
index 00000000000..3a7b7f71051
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_web_ide_edit
+description: Count unique edit actions using the web IDE
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml b/config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml
new file mode 100644
index 00000000000..6a0fd1da84c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_sfe_edit
+description: Count unique edit actions using the single file editor
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml b/config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml
new file mode 100644
index 00000000000..11ab783f52a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_snippet_editor_edit
+description: Count unique edit actions using the snippet editor
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml b/config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml
new file mode 100644
index 00000000000..3d7c3cb4066
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_sse_edit
+description: Count unique edit actions using the static site editor
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml b/config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml
new file mode 100644
index 00000000000..e31bf71d455
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_ide_edit
+description: Count unique edit actions when users used an IDE, no matter which one
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml b/config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml
new file mode 100644
index 00000000000..f94ff9f026e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ide_edit.g_edit_by_web_ide_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml b/config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml
new file mode 100644
index 00000000000..fca08b9f093
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ide_edit.g_edit_by_sfe_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml b/config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml
new file mode 100644
index 00000000000..2cad76aa04c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ide_edit.g_edit_by_snippet_ide_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..aba5f8bc39a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ide_edit.ide_edit_total_unique_counts_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180355_user_api_fuzzing_jobs.yml b/config/metrics/counts_28d/20210216180355_user_api_fuzzing_jobs.yml
new file mode 100644
index 00000000000..ce748ad1967
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180355_user_api_fuzzing_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.user_api_fuzzing_jobs
+description: Count of API Fuzzing jobs by job name
+product_section: sec
+product_stage: secure
+product_group: group::fuzz testing
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180357_user_api_fuzzing_dnd_jobs.yml b/config/metrics/counts_28d/20210216180357_user_api_fuzzing_dnd_jobs.yml
new file mode 100644
index 00000000000..59dfb493448
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180357_user_api_fuzzing_dnd_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.user_api_fuzzing_dnd_jobs
+description: Count of API Fuzzing `docker-in-docker` jobs by job names
+product_section: sec
+product_stage: secure
+product_group: group::fuzz testing
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml b/config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml
new file mode 100644
index 00000000000..a50b42d1dba
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml
@@ -0,0 +1,18 @@
+---
+key_path: redis_hll_counters.search.i_search_total_monthly
+description: Calculated unique users to perform Basic or Advanced searches by month
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..fe328b771f6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml
@@ -0,0 +1,18 @@
+---
+key_path: redis_hll_counters.search.search_total_unique_counts_monthly
+description: Total unique users for i_search_total, i_search_advanced, i_search_paid for recent 28 days. This metric is redundant because advanced will be a subset of paid and paid will be a subset of total. i_search_total is more appropriate if you just want the total
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml b/config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml
new file mode 100644
index 00000000000..23c3f0fcb3f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.aggregated_metrics.incident_management_alerts_total_unique_counts
+description: Count of unique users per month to take an action on an alert
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml b/config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml
new file mode 100644
index 00000000000..9d935a654e3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.aggregated_metrics.incident_management_incidents_total_unique_counts
+description: Count of unique users per month to take an action on an incident
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml b/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml
new file mode 100644
index 00000000000..8ad00f8c06e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.projects_with_incidents
+description: 'Count of unique projects with an incident created in the last month '
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml b/config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml
new file mode 100644
index 00000000000..2ea8eb63889
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.projects_with_alert_incidents
+description: 'Count of unique projects with an incident from an alert created in the
+ last month '
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml b/config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml
new file mode 100644
index 00000000000..8100c8f6d86
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_alert_status_changed_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml b/config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml
new file mode 100644
index 00000000000..abd26612688
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_alert_assigned_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml b/config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml
new file mode 100644
index 00000000000..a7f176028fa
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_alert_todo_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml b/config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml
new file mode 100644
index 00000000000..4a130cab39c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_created_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml b/config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml
new file mode 100644
index 00000000000..5509c6b492f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_reopened_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml b/config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml
new file mode 100644
index 00000000000..5475fc5c2b6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_closed_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml b/config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml
new file mode 100644
index 00000000000..74566b19180
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_assigned_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml b/config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml
new file mode 100644
index 00000000000..62614850622
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_todo_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml b/config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml
new file mode 100644
index 00000000000..fe3e71ddea2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_comment_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml b/config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml
new file mode 100644
index 00000000000..3cd2c435074
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_published_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml b/config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml
new file mode 100644
index 00000000000..b8b765b5790
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_relate_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml b/config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml
new file mode 100644
index 00000000000..e1a52b294fc
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_unrelate_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml b/config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml
new file mode 100644
index 00000000000..04fe154338d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_incident_change_confidential_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..7cdeaa76e49
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.incident_management.incident_management_total_unique_counts_monthly
+description:
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml b/config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml
new file mode 100644
index 00000000000..9dd091b74ea
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml
@@ -0,0 +1,17 @@
+---
+key_path: redis_hll_counters.incident_management_alerts.incident_management_alert_create_incident_monthly
+description: Count of unique users per month to create an incident corresponding to
+ an alert
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml b/config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml
new file mode 100644
index 00000000000..93f07c24057
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.projects_imported_from_github
+description:
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml b/config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml
new file mode 100644
index 00000000000..e4af1478c64
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_design_management
+description:
+product_section: dev
+product_stage: create
+product_group: group::knowledge
+product_category: design_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml b/config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml
new file mode 100644
index 00000000000..125c1de4714
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_wiki_repo
+description:
+product_section: dev
+product_stage: create
+product_group: group::knowledge
+product_category: wiki
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180814_events.yml b/config/metrics/counts_28d/20210216180814_events.yml
new file mode 100644
index 00000000000..a1d95f73716
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180814_events.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.events
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180816_groups.yml b/config/metrics/counts_28d/20210216180816_groups.yml
new file mode 100644
index 00000000000..90723ed78ab
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180816_groups.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.groups
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180818_users_created.yml b/config/metrics/counts_28d/20210216180818_users_created.yml
new file mode 100644
index 00000000000..81ed776a3c4
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180818_users_created.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.users_created
+description: Number of users created in the month
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180820_ldap_keys.yml b/config/metrics/counts_28d/20210216180820_ldap_keys.yml
new file mode 100644
index 00000000000..0f64752fe96
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180820_ldap_keys.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.ldap_keys
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180822_ldap_users.yml b/config/metrics/counts_28d/20210216180822_ldap_users.yml
new file mode 100644
index 00000000000..6145b32959f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180822_ldap_users.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.ldap_users
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml b/config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml
new file mode 100644
index 00000000000..754da9e0006
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.configure.projects_with_prometheus_alerts
+description: Projects with Prometheus alerting enabled
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180956_clusters.yml b/config/metrics/counts_28d/20210216180956_clusters.yml
new file mode 100644
index 00000000000..eb5d60f8a61
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180956_clusters.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.clusters
+description: Total GitLab Managed clusters both enabled and disabled
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml b/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml
new file mode 100644
index 00000000000..97fb359c657
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.clusters_applications_prometheus
+description: Total GitLab Managed clusters with Prometheus enabled
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml b/config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml
new file mode 100644
index 00000000000..96d737d9d14
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.operations_dashboard_default_dashboard
+description: Active users with enabled operations dashboard
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml b/config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml
new file mode 100644
index 00000000000..6a559c1460f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.projects_with_tracing_enabled
+description: Projects with tracing enabled
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml b/config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml
new file mode 100644
index 00000000000..caba12d3d44
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.projects_with_error_tracking_enabled
+description:
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml b/config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml
new file mode 100644
index 00000000000..2533117f03b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.operations_dashboard_users_with_projects_added
+description: Active users with projects on operations dashboard
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181050_packages.yml b/config/metrics/counts_28d/20210216181050_packages.yml
new file mode 100644
index 00000000000..4c6edc118aa
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181050_packages.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.packages
+description: Monthly count of Packages
+product_section: ops
+product_stage:
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181057_projects_with_packages.yml b/config/metrics/counts_28d/20210216181057_projects_with_packages.yml
new file mode 100644
index 00000000000..3fe9c7fde65
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181057_projects_with_packages.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.package.projects_with_packages
+description: Incident confidential status changed event
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181139_issues.yml b/config/metrics/counts_28d/20210216181139_issues.yml
new file mode 100644
index 00000000000..6412720342f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181139_issues.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.issues
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181141_notes.yml b/config/metrics/counts_28d/20210216181141_notes.yml
new file mode 100644
index 00000000000..d33a4c6ef9c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181141_notes.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.notes
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181143_projects.yml b/config/metrics/counts_28d/20210216181143_projects.yml
new file mode 100644
index 00000000000..36da5428dce
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181143_projects.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.projects
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181145_todos.yml b/config/metrics/counts_28d/20210216181145_todos.yml
new file mode 100644
index 00000000000..224711942e8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181145_todos.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.todos
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml b/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml
new file mode 100644
index 00000000000..9532586e2fe
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.service_desk_enabled_projects
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181148_service_desk_issues.yml b/config/metrics/counts_28d/20210216181148_service_desk_issues.yml
new file mode 100644
index 00000000000..fb8c998e3a1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181148_service_desk_issues.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.service_desk_issues
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181150_projects_jira_active.yml b/config/metrics/counts_28d/20210216181150_projects_jira_active.yml
new file mode 100644
index 00000000000..d7851c9a134
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181150_projects_jira_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.projects_jira_active
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml b/config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml
new file mode 100644
index 00000000000..2fc84e2cefd
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.projects_jira_dvcs_cloud_active
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml b/config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml
new file mode 100644
index 00000000000..d341a41fc6e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.projects_jira_dvcs_server_active
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181158_epics.yml b/config/metrics/counts_28d/20210216181158_epics.yml
new file mode 100644
index 00000000000..d0b71aa11d1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181158_epics.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.epics
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181200_label_lists.yml b/config/metrics/counts_28d/20210216181200_label_lists.yml
new file mode 100644
index 00000000000..1c2ad77bdbb
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181200_label_lists.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.label_lists
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181201_milestone_lists.yml b/config/metrics/counts_28d/20210216181201_milestone_lists.yml
new file mode 100644
index 00000000000..8a83f9c8930
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181201_milestone_lists.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.plan.milestone_lists
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml b/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml
new file mode 100644
index 00000000000..f7216281bf3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_title_changed_monthly
+description: Count of MAU editing an issue title
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml b/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml
new file mode 100644
index 00000000000..a5bc2a9dad6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_description_changed_monthly
+description: Count of MAU editing an issue description
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml b/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml
new file mode 100644
index 00000000000..0f5ab506a14
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_made_confidential_monthly
+description: Count of MAU making an issue confidential
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml b/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml
new file mode 100644
index 00000000000..21170e50629
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_made_visible_monthly
+description: Count of MAU making an issue not confidential
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml b/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml
new file mode 100644
index 00000000000..9236d49731d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_created_monthly
+description: Count of MAU creating new issues
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml b/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml
new file mode 100644
index 00000000000..01f3cadf87a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_closed_monthly
+description: Count of MAU closing an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml b/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml
new file mode 100644
index 00000000000..0234b46775b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_reopened_monthly
+description: Count of MAU re-opening a closed issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml b/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml
new file mode 100644
index 00000000000..d72fa3135bd
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_label_changed_monthly
+description: Count of MAU changing an issue's label
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml b/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml
new file mode 100644
index 00000000000..85e66885ef5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_milestone_changed_monthly
+description: Count of MAU changing an issue's milestone
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181341_g_project_management_issue_iteration_changed_monthly.yml b/config/metrics/counts_28d/20210216181341_g_project_management_issue_iteration_changed_monthly.yml
new file mode 100644
index 00000000000..1a0600278a5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181341_g_project_management_issue_iteration_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_iteration_changed_monthly
+description: Count of MAU changing an issue's iteration
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181345_g_project_management_issue_weight_changed_monthly.yml b/config/metrics/counts_28d/20210216181345_g_project_management_issue_weight_changed_monthly.yml
new file mode 100644
index 00000000000..6d94de26e26
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181345_g_project_management_issue_weight_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_weight_changed_monthly
+description: Count of MAU changing an issue's weight
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml b/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml
new file mode 100644
index 00000000000..1f28ae1b252
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_cross_referenced_monthly
+description: Count of MAU referencing an issue from somewhere else
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml b/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml
new file mode 100644
index 00000000000..a8e6e0e75a1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_moved_monthly
+description: Count of MAU moving an issue to another project
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml b/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml
new file mode 100644
index 00000000000..89f74760440
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_related_monthly
+description: Count of MAU relating an issue to another issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml b/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml
new file mode 100644
index 00000000000..6700f5d2763
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_unrelated_monthly
+description: Count of MAU unrelating an issue to another issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml b/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml
new file mode 100644
index 00000000000..2023d5900c1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_marked_as_duplicate_monthly
+description: Count of MAU marking an issue as a duplicate
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml b/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml
new file mode 100644
index 00000000000..41b7b6b1737
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_locked_monthly
+description: Count of MAU locking an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml b/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml
new file mode 100644
index 00000000000..7be27b6fa65
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_unlocked_monthly
+description: Count of MAU marking an issue as blocked or blocked by
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181414_g_project_management_issue_added_to_epic_monthly.yml b/config/metrics/counts_28d/20210216181414_g_project_management_issue_added_to_epic_monthly.yml
new file mode 100644
index 00000000000..8a69fafc2b2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181414_g_project_management_issue_added_to_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_added_to_epic_monthly
+description: Count of MAU adding an issue to an epic
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181416_g_project_management_issue_removed_from_epic_monthly.yml b/config/metrics/counts_28d/20210216181416_g_project_management_issue_removed_from_epic_monthly.yml
new file mode 100644
index 00000000000..4ae21d8852e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181416_g_project_management_issue_removed_from_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_removed_from_epic_monthly
+description: Count of MAU removing an issue from an epic
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181420_g_project_management_issue_changed_epic_monthly.yml b/config/metrics/counts_28d/20210216181420_g_project_management_issue_changed_epic_monthly.yml
new file mode 100644
index 00000000000..a269681d4dd
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181420_g_project_management_issue_changed_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_changed_epic_monthly
+description: Count of MAU changing the epic on an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml b/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml
new file mode 100644
index 00000000000..29c0f3ef7d8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_added_monthly
+description: Count of MAU adding a design to an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml b/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml
new file mode 100644
index 00000000000..30925229543
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_modified_monthly
+description: Count of MAU modifying a design on an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml b/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml
new file mode 100644
index 00000000000..cd346847a02
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_removed_monthly
+description: Count of MAU removing a design from an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml b/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml
new file mode 100644
index 00000000000..0b0a7dc3b8b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_due_date_changed_monthly
+description: Count of MAU changing an issue due date
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml b/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml
new file mode 100644
index 00000000000..ee67b5db3c1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_time_estimate_changed_monthly
+description: Count of MAU changing an issue time estimate
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml b/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml
new file mode 100644
index 00000000000..fa356f4e3d6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_time_spent_changed_monthly
+description: Count of MAU recording time spent on an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml b/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml
new file mode 100644
index 00000000000..6c1d26be10f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_added_monthly
+description: Count of MAU commenting on an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml b/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml
new file mode 100644
index 00000000000..390401de267
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_edited_monthly
+description: Count of MAU editing a comment on an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml b/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml
new file mode 100644
index 00000000000..78f08de6f22
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_removed_monthly
+description: Count of MAU deleting a comment from an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181457_g_project_management_issue_health_status_changed_monthly.yml b/config/metrics/counts_28d/20210216181457_g_project_management_issue_health_status_changed_monthly.yml
new file mode 100644
index 00000000000..c2c986ca5ef
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181457_g_project_management_issue_health_status_changed_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_health_status_changed_monthly
+description: Count of MAU changing the health status on an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml b/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml
new file mode 100644
index 00000000000..5e2ddaa0ec3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.g_project_management_issue_cloned_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..cbb391035c3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.issues_edit.issues_edit_total_unique_counts_monthly
+description: Count of MAU taking an action related to an issue
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml b/config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml
new file mode 100644
index 00000000000..8115da08fd6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_approve_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml b/config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml
new file mode 100644
index 00000000000..ad94a07ca5b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_assign_single_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181516_i_quickactions_assign_multiple_monthly.yml b/config/metrics/counts_28d/20210216181516_i_quickactions_assign_multiple_monthly.yml
new file mode 100644
index 00000000000..8db1e881bd4
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181516_i_quickactions_assign_multiple_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_assign_multiple_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml b/config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml
new file mode 100644
index 00000000000..378a22daa87
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_assign_self_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml b/config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml
new file mode 100644
index 00000000000..39142f74dc1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_assign_reviewer_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml b/config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml
new file mode 100644
index 00000000000..7d728bbc794
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_award_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml b/config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml
new file mode 100644
index 00000000000..141ba7237d8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_board_move_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181534_i_quickactions_child_epic_monthly.yml b/config/metrics/counts_28d/20210216181534_i_quickactions_child_epic_monthly.yml
new file mode 100644
index 00000000000..5adcb8b0f27
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181534_i_quickactions_child_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_child_epic_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181538_i_quickactions_clear_weight_monthly.yml b/config/metrics/counts_28d/20210216181538_i_quickactions_clear_weight_monthly.yml
new file mode 100644
index 00000000000..a13f3d322ff
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181538_i_quickactions_clear_weight_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_clear_weight_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml b/config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml
new file mode 100644
index 00000000000..ca22455151e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_clone_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml b/config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml
new file mode 100644
index 00000000000..c10b3fe8107
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_close_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml b/config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml
new file mode 100644
index 00000000000..d3bc2162c89
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_confidential_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml b/config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml
new file mode 100644
index 00000000000..a2d6b975753
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_copy_metadata_merge_request_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml b/config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml
new file mode 100644
index 00000000000..23adb6a769c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_copy_metadata_issue_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml b/config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml
new file mode 100644
index 00000000000..43b4cff5c11
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_create_merge_request_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml b/config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml
new file mode 100644
index 00000000000..b7ac9de7655
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_done_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml b/config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml
new file mode 100644
index 00000000000..4d88092cd72
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_draft_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml b/config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml
new file mode 100644
index 00000000000..0fd293e1bb9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_due_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml b/config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml
new file mode 100644
index 00000000000..1d5750e5b43
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_duplicate_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181618_i_quickactions_epic_monthly.yml b/config/metrics/counts_28d/20210216181618_i_quickactions_epic_monthly.yml
new file mode 100644
index 00000000000..0b448b0d3a1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181618_i_quickactions_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_epic_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml b/config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml
new file mode 100644
index 00000000000..b509c7ed358
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_estimate_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181626_i_quickactions_iteration_monthly.yml b/config/metrics/counts_28d/20210216181626_i_quickactions_iteration_monthly.yml
new file mode 100644
index 00000000000..5759c131771
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181626_i_quickactions_iteration_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_iteration_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml b/config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml
new file mode 100644
index 00000000000..52d99012a45
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_label_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml b/config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml
new file mode 100644
index 00000000000..552748c4f2c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_lock_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml b/config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml
new file mode 100644
index 00000000000..71488207321
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_merge_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml b/config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml
new file mode 100644
index 00000000000..65a466c4bf9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_milestone_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml b/config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml
new file mode 100644
index 00000000000..df657e463ba
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_move_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181648_i_quickactions_parent_epic_monthly.yml b/config/metrics/counts_28d/20210216181648_i_quickactions_parent_epic_monthly.yml
new file mode 100644
index 00000000000..2dbd62415f2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181648_i_quickactions_parent_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_parent_epic_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181652_i_quickactions_promote_monthly.yml b/config/metrics/counts_28d/20210216181652_i_quickactions_promote_monthly.yml
new file mode 100644
index 00000000000..b4fe23e7d95
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181652_i_quickactions_promote_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_promote_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181655_i_quickactions_publish_monthly.yml b/config/metrics/counts_28d/20210216181655_i_quickactions_publish_monthly.yml
new file mode 100644
index 00000000000..c4d79fc2e11
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181655_i_quickactions_publish_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_publish_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml b/config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml
new file mode 100644
index 00000000000..1043901a415
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_reassign_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml b/config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml
new file mode 100644
index 00000000000..23041ca9a37
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_reassign_reviewer_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml b/config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml
new file mode 100644
index 00000000000..fcdf21bf28e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_rebase_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml b/config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml
new file mode 100644
index 00000000000..f285b5fc3f6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_relabel_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml b/config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml
new file mode 100644
index 00000000000..afc8fc3e800
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_relate_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181718_i_quickactions_remove_child_epic_monthly.yml b/config/metrics/counts_28d/20210216181718_i_quickactions_remove_child_epic_monthly.yml
new file mode 100644
index 00000000000..ad161fd2516
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181718_i_quickactions_remove_child_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_child_epic_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml b/config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml
new file mode 100644
index 00000000000..5a75d6b7a24
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_due_date_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181725_i_quickactions_remove_epic_monthly.yml b/config/metrics/counts_28d/20210216181725_i_quickactions_remove_epic_monthly.yml
new file mode 100644
index 00000000000..377f5e63c9b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181725_i_quickactions_remove_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_epic_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml b/config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml
new file mode 100644
index 00000000000..6b3ff3b44e4
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_estimate_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181732_i_quickactions_remove_iteration_monthly.yml b/config/metrics/counts_28d/20210216181732_i_quickactions_remove_iteration_monthly.yml
new file mode 100644
index 00000000000..073539710e3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181732_i_quickactions_remove_iteration_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_iteration_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml b/config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml
new file mode 100644
index 00000000000..2ee78d245f9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_milestone_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181740_i_quickactions_remove_parent_epic_monthly.yml b/config/metrics/counts_28d/20210216181740_i_quickactions_remove_parent_epic_monthly.yml
new file mode 100644
index 00000000000..fffcbc6807d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181740_i_quickactions_remove_parent_epic_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_parent_epic_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml b/config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml
new file mode 100644
index 00000000000..3ecaaa970f0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_time_spent_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml b/config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml
new file mode 100644
index 00000000000..bb42563e34c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_remove_zoom_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml b/config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml
new file mode 100644
index 00000000000..eea7e3672ea
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_reopen_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml b/config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml
new file mode 100644
index 00000000000..302cad17efd
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_shrug_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml b/config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml
new file mode 100644
index 00000000000..01d87e2e8fb
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_spend_subtract_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml b/config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml
new file mode 100644
index 00000000000..e80f988cf7a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_spend_add_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml b/config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml
new file mode 100644
index 00000000000..61077b79a6f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_submit_review_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml b/config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml
new file mode 100644
index 00000000000..20934358839
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_subscribe_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml b/config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml
new file mode 100644
index 00000000000..a390fb11746
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_tableflip_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml b/config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml
new file mode 100644
index 00000000000..f8f078f5f27
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_tag_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml b/config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml
new file mode 100644
index 00000000000..dd730656292
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_target_branch_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml b/config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml
new file mode 100644
index 00000000000..ea3e2179ba6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_title_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml b/config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml
new file mode 100644
index 00000000000..f50c85bcb2d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_todo_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml b/config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml
new file mode 100644
index 00000000000..c17a807aaee
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_unassign_specific_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml b/config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml
new file mode 100644
index 00000000000..294dd992bf0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_unassign_all_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml b/config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml
new file mode 100644
index 00000000000..a264457a478
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_unassign_reviewer_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml b/config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml
new file mode 100644
index 00000000000..c4c9dc56cfd
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_unlabel_specific_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml b/config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml
new file mode 100644
index 00000000000..45c44218cbd
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_unlabel_all_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml b/config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml
new file mode 100644
index 00000000000..b9edfa92c20
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_unlock_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml b/config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml
new file mode 100644
index 00000000000..d54e8a4ab85
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_unsubscribe_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181857_i_quickactions_weight_monthly.yml b/config/metrics/counts_28d/20210216181857_i_quickactions_weight_monthly.yml
new file mode 100644
index 00000000000..68caac40ead
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181857_i_quickactions_weight_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_weight_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml b/config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml
new file mode 100644
index 00000000000..419af8a68ee
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_wip_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml b/config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml
new file mode 100644
index 00000000000..0af363b6429
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.i_quickactions_zoom_monthly
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181923_successful_deployments.yml b/config/metrics/counts_28d/20210216181923_successful_deployments.yml
new file mode 100644
index 00000000000..76464e5dd27
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181923_successful_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.successful_deployments
+description: Total successful deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181924_failed_deployments.yml b/config/metrics/counts_28d/20210216181924_failed_deployments.yml
new file mode 100644
index 00000000000..e1d7f0b9762
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181924_failed_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.failed_deployments
+description: Total failed deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181935_deployments.yml b/config/metrics/counts_28d/20210216181935_deployments.yml
new file mode 100644
index 00000000000..e8a4ee547e8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181935_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.release.deployments
+description: Unique users triggering deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181937_failed_deployments.yml b/config/metrics/counts_28d/20210216181937_failed_deployments.yml
new file mode 100644
index 00000000000..2a14b42d03d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181937_failed_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.release.failed_deployments
+description: Total failed deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181939_releases.yml b/config/metrics/counts_28d/20210216181939_releases.yml
new file mode 100644
index 00000000000..bd76a32c973
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181939_releases.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.release.releases
+description: Unique users creating release tags
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181941_successful_deployments.yml b/config/metrics/counts_28d/20210216181941_successful_deployments.yml
new file mode 100644
index 00000000000..b2052281d6e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181941_successful_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.release.successful_deployments
+description: Total successful deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181943_projects_mirrored_with_pipelines_enabled.yml b/config/metrics/counts_28d/20210216181943_projects_mirrored_with_pipelines_enabled.yml
new file mode 100644
index 00000000000..c05835b2100
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181943_projects_mirrored_with_pipelines_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.release.projects_mirrored_with_pipelines_enabled
+description: Projects with repository mirroring enabled
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml b/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml
new file mode 100644
index 00000000000..a4047f8eabe
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.verify.clusters_applications_runner
+description: Total GitLab Managed clusters with Runner enabled
+product_section: ops
+product_stage: verify
+product_group: group::runner
+product_category: runner
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216181956_user_unique_users_all_secure_scanners.yml b/config/metrics/counts_28d/20210216181956_user_unique_users_all_secure_scanners.yml
new file mode 100644
index 00000000000..c676e83f2d9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216181956_user_unique_users_all_secure_scanners.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.user_unique_users_all_secure_scanners
+description:
+product_section: sec
+product_stage:
+product_group: group::secure
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182034_deploy_keys.yml b/config/metrics/counts_28d/20210216182034_deploy_keys.yml
new file mode 100644
index 00000000000..80f50c7d1a5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182034_deploy_keys.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.deploy_keys
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182036_keys.yml b/config/metrics/counts_28d/20210216182036_keys.yml
new file mode 100644
index 00000000000..d1299065115
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182036_keys.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.keys
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182038_remote_mirrors.yml b/config/metrics/counts_28d/20210216182038_remote_mirrors.yml
new file mode 100644
index 00000000000..6b42f18e664
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182038_remote_mirrors.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.remote_mirrors
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml b/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml
new file mode 100644
index 00000000000..c75efaf0a80
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_project_repo
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml b/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml
new file mode 100644
index 00000000000..25405624b03
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_git_write
+description: Aggregated value for wiki, design and project repo actions
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml b/config/metrics/counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml
new file mode 100644
index 00000000000..c47fa49fe06
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.projects_enforcing_code_owner_approval
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml b/config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml
new file mode 100644
index 00000000000..dfacce63f05
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.projects_with_sectional_code_owner_rules
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml b/config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml
new file mode 100644
index 00000000000..d87b910d239
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.projects_with_repositories_enabled
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182051_protected_branches.yml b/config/metrics/counts_28d/20210216182051_protected_branches.yml
new file mode 100644
index 00000000000..81d23653307
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182051_protected_branches.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.protected_branches
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml b/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml
new file mode 100644
index 00000000000..af59d1a1235
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.source_code.wiki_action_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182106_design_action_monthly.yml b/config/metrics/counts_28d/20210216182106_design_action_monthly.yml
new file mode 100644
index 00000000000..8feb369d0fa
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182106_design_action_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.source_code.design_action_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182109_project_action_monthly.yml b/config/metrics/counts_28d/20210216182109_project_action_monthly.yml
new file mode 100644
index 00000000000..6047e6b6059
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182109_project_action_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.source_code.project_action_monthly
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182125_user_sast_jobs.yml b/config/metrics/counts_28d/20210216182125_user_sast_jobs.yml
new file mode 100644
index 00000000000..629b346a6aa
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182125_user_sast_jobs.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.user_sast_jobs
+description: Users who run a SAST job
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: static_application_security_testing
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182127_user_secret_detection_jobs.yml b/config/metrics/counts_28d/20210216182127_user_secret_detection_jobs.yml
new file mode 100644
index 00000000000..0502b28213e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182127_user_secret_detection_jobs.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.user_secret_detection_jobs
+description: Users who run a Secret Detection job
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: secret_detection
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182129_sast_pipeline.yml b/config/metrics/counts_28d/20210216182129_sast_pipeline.yml
new file mode 100644
index 00000000000..f655c4368ad
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182129_sast_pipeline.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.sast_pipeline
+description: Counts of Pipelines that have at least 1 SAST job
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: static_application_security_testing
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml b/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml
new file mode 100644
index 00000000000..14985c91f86
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.secret_detection_pipeline
+description: Counts of Pipelines that have at least 1 Secret Detection job
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: secret_detection
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml b/config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml
new file mode 100644
index 00000000000..15369757cb8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.testing.i_testing_test_case_parsed_monthly
+description: Internal Tracking to count number of unit tests parsed for planning of
+ future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+product_section: ops
+product_stage: verify
+product_group: group::testing
+product_category: code_testing
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182200_i_testing_metrics_report_artifact_uploaders_monthly.yml b/config/metrics/counts_28d/20210216182200_i_testing_metrics_report_artifact_uploaders_monthly.yml
new file mode 100644
index 00000000000..1a475b19f01
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182200_i_testing_metrics_report_artifact_uploaders_monthly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.testing.i_testing_metrics_report_artifact_uploaders_monthly
+description: Internal Tracking to count number of unit tests parsed for planning of
+ future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+product_section: ops
+product_stage: verify
+product_group: group::testing
+product_category: code_testing
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182209_user_preferences_group_overview_security_dashboard.yml b/config/metrics/counts_28d/20210216182209_user_preferences_group_overview_security_dashboard.yml
new file mode 100644
index 00000000000..bf1315b9e50
--- /dev/null
+++ b/config/metrics/counts_28d/20210216182209_user_preferences_group_overview_security_dashboard.yml
@@ -0,0 +1,18 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.user_preferences_group_overview_security_dashboard
+description: Users who set personal preference to see Security Dashboard on Group
+ overview page
+product_section: sec
+product_stage: secure
+product_group: group::threat insights
+product_category: vulnerability_management
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml b/config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml
new file mode 100644
index 00000000000..a9049c00aa5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.projects_with_alerts_created
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml b/config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml
new file mode 100644
index 00000000000..a0f14b7a760
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.aggregated_metrics.compliance_features_track_unique_visits_union
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml b/config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml
new file mode 100644
index 00000000000..f4723c2b5a1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.aggregated_metrics.product_analytics_test_metrics_union
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml b/config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml
new file mode 100644
index 00000000000..fe8073f3f33
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.aggregated_metrics.product_analytics_test_metrics_intersection
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183209_i_testing_paid_monthly_active_user_total.yml b/config/metrics/counts_28d/20210216183209_i_testing_paid_monthly_active_user_total.yml
new file mode 100644
index 00000000000..367cfb77c09
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183209_i_testing_paid_monthly_active_user_total.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts_monthly.aggregated_metrics.i_testing_paid_monthly_active_user_total
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml b/config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml
new file mode 100644
index 00000000000..e3980a944c6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.total_number_of_path_locks
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml b/config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml
new file mode 100644
index 00000000000..3808a2f2dcb
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.total_number_of_locked_files
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183618_approval_project_rules_with_more_approvers_than_required.yml b/config/metrics/counts_28d/20210216183618_approval_project_rules_with_more_approvers_than_required.yml
new file mode 100644
index 00000000000..85ea922568e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183618_approval_project_rules_with_more_approvers_than_required.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.approval_project_rules_with_more_approvers_than_required
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183620_approval_project_rules_with_less_approvers_than_required.yml b/config/metrics/counts_28d/20210216183620_approval_project_rules_with_less_approvers_than_required.yml
new file mode 100644
index 00000000000..36a3dccbc95
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183620_approval_project_rules_with_less_approvers_than_required.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.approval_project_rules_with_less_approvers_than_required
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183622_approval_project_rules_with_exact_required_approvers.yml b/config/metrics/counts_28d/20210216183622_approval_project_rules_with_exact_required_approvers.yml
new file mode 100644
index 00000000000..a4f7695c505
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183622_approval_project_rules_with_exact_required_approvers.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.create.approval_project_rules_with_exact_required_approvers
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183627_omniauth_providers.yml b/config/metrics/counts_28d/20210216183627_omniauth_providers.yml
new file mode 100644
index 00000000000..74f20cbe5c4
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183627_omniauth_providers.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.omniauth_providers
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183629_two-factor.yml b/config/metrics/counts_28d/20210216183629_two-factor.yml
new file mode 100644
index 00000000000..3b15b3e0eb7
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183629_two-factor.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183631_two-factor-via-u2f-device.yml b/config/metrics/counts_28d/20210216183631_two-factor-via-u2f-device.yml
new file mode 100644
index 00000000000..08cbb3437d1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183631_two-factor-via-u2f-device.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor-via-u2f-device
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183633_two-factor-via-webauthn-device.yml b/config/metrics/counts_28d/20210216183633_two-factor-via-webauthn-device.yml
new file mode 100644
index 00000000000..1a9251bcf16
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183633_two-factor-via-webauthn-device.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor-via-webauthn-device
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183634_standard.yml b/config/metrics/counts_28d/20210216183634_standard.yml
new file mode 100644
index 00000000000..8afb1b2321b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183634_standard.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.user_auth_by_provider.standard
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183636_google_oauth2.yml b/config/metrics/counts_28d/20210216183636_google_oauth2.yml
new file mode 100644
index 00000000000..1ee1a70aaac
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183636_google_oauth2.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.user_auth_by_provider.google_oauth2
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml b/config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml
new file mode 100644
index 00000000000..6651dfa0146
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.unique_users_all_imports
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183640_gitlab.yml b/config/metrics/counts_28d/20210216183640_gitlab.yml
new file mode 100644
index 00000000000..d0977a24aee
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183640_gitlab.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.bulk_imports.gitlab
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183642_gitlab_v1.yml b/config/metrics/counts_28d/20210216183642_gitlab_v1.yml
new file mode 100644
index 00000000000..ee61abedd8a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183642_gitlab_v1.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.bulk_imports.gitlab_v1
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183644_gitlab_project.yml b/config/metrics/counts_28d/20210216183644_gitlab_project.yml
new file mode 100644
index 00000000000..166be23baac
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183644_gitlab_project.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.gitlab_project
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183646_gitlab.yml b/config/metrics/counts_28d/20210216183646_gitlab.yml
new file mode 100644
index 00000000000..25bb788cc4f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183646_gitlab.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.gitlab
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183648_github.yml b/config/metrics/counts_28d/20210216183648_github.yml
new file mode 100644
index 00000000000..6f79b49a37f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183648_github.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.github
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183650_bitbucket.yml b/config/metrics/counts_28d/20210216183650_bitbucket.yml
new file mode 100644
index 00000000000..fc31e325278
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183650_bitbucket.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.bitbucket
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183652_bitbucket_server.yml b/config/metrics/counts_28d/20210216183652_bitbucket_server.yml
new file mode 100644
index 00000000000..fd0b64933b1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183652_bitbucket_server.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.bitbucket_server
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183653_gitea.yml b/config/metrics/counts_28d/20210216183653_gitea.yml
new file mode 100644
index 00000000000..a09fdc9d610
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183653_gitea.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.gitea
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183655_git.yml b/config/metrics/counts_28d/20210216183655_git.yml
new file mode 100644
index 00000000000..b17900f534d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183655_git.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.git
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183657_manifest.yml b/config/metrics/counts_28d/20210216183657_manifest.yml
new file mode 100644
index 00000000000..49fcefb3a45
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183657_manifest.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.manifest
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183659_gitlab_migration.yml b/config/metrics/counts_28d/20210216183659_gitlab_migration.yml
new file mode 100644
index 00000000000..700fe4b4881
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183659_gitlab_migration.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.project_imports.gitlab_migration
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183701_jira.yml b/config/metrics/counts_28d/20210216183701_jira.yml
new file mode 100644
index 00000000000..1ce602b4bd1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183701_jira.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.issue_imports.jira
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183703_fogbugz.yml b/config/metrics/counts_28d/20210216183703_fogbugz.yml
new file mode 100644
index 00000000000..3595c0ffdce
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183703_fogbugz.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.issue_imports.fogbugz
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183705_phabricator.yml b/config/metrics/counts_28d/20210216183705_phabricator.yml
new file mode 100644
index 00000000000..5be1c6263aa
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183705_phabricator.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.issue_imports.phabricator
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183707_csv.yml b/config/metrics/counts_28d/20210216183707_csv.yml
new file mode 100644
index 00000000000..398d740d78d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183707_csv.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.issue_imports.csv
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183709_group_import.yml b/config/metrics/counts_28d/20210216183709_group_import.yml
new file mode 100644
index 00000000000..9116a242811
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183709_group_import.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.group_imports.group_import
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183711_gitlab_migration.yml b/config/metrics/counts_28d/20210216183711_gitlab_migration.yml
new file mode 100644
index 00000000000..1399e4ebe6d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183711_gitlab_migration.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.group_imports.gitlab_migration
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183712_total.yml b/config/metrics/counts_28d/20210216183712_total.yml
new file mode 100644
index 00000000000..1b524c91a20
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183712_total.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.total
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183714_gitlab_project.yml b/config/metrics/counts_28d/20210216183714_gitlab_project.yml
new file mode 100644
index 00000000000..16fc5757546
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183714_gitlab_project.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.gitlab_project
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183716_gitlab.yml b/config/metrics/counts_28d/20210216183716_gitlab.yml
new file mode 100644
index 00000000000..bd69b4a9ec3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183716_gitlab.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.gitlab
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183718_github.yml b/config/metrics/counts_28d/20210216183718_github.yml
new file mode 100644
index 00000000000..7e67e2d0b84
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183718_github.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.github
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183720_bitbucket.yml b/config/metrics/counts_28d/20210216183720_bitbucket.yml
new file mode 100644
index 00000000000..0ca34450fbc
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183720_bitbucket.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.bitbucket
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183722_bitbucket_server.yml b/config/metrics/counts_28d/20210216183722_bitbucket_server.yml
new file mode 100644
index 00000000000..7f2ea025d80
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183722_bitbucket_server.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.bitbucket_server
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183724_gitea.yml b/config/metrics/counts_28d/20210216183724_gitea.yml
new file mode 100644
index 00000000000..d4834863316
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183724_gitea.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.gitea
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183726_git.yml b/config/metrics/counts_28d/20210216183726_git.yml
new file mode 100644
index 00000000000..f844b90426c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183726_git.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.git
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183728_manifest.yml b/config/metrics/counts_28d/20210216183728_manifest.yml
new file mode 100644
index 00000000000..997db699083
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183728_manifest.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.projects_imported.manifest
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183730_jira.yml b/config/metrics/counts_28d/20210216183730_jira.yml
new file mode 100644
index 00000000000..70223435940
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183730_jira.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.issues_imported.jira
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183731_fogbugz.yml b/config/metrics/counts_28d/20210216183731_fogbugz.yml
new file mode 100644
index 00000000000..e8e8a618077
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183731_fogbugz.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.issues_imported.fogbugz
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183733_phabricator.yml b/config/metrics/counts_28d/20210216183733_phabricator.yml
new file mode 100644
index 00000000000..bf9f52055f2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183733_phabricator.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.issues_imported.phabricator
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183735_csv.yml b/config/metrics/counts_28d/20210216183735_csv.yml
new file mode 100644
index 00000000000..c4267bda332
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183735_csv.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.issues_imported.csv
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183737_groups_imported.yml b/config/metrics/counts_28d/20210216183737_groups_imported.yml
new file mode 100644
index 00000000000..8e49b36a9a2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183737_groups_imported.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.manage.groups_imported
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183753_projects_incident_sla_enabled.yml b/config/metrics/counts_28d/20210216183753_projects_incident_sla_enabled.yml
new file mode 100644
index 00000000000..660a1b1583b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183753_projects_incident_sla_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.monitor.projects_incident_sla_enabled
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183817_user_coverage_fuzzing_jobs.yml b/config/metrics/counts_28d/20210216183817_user_coverage_fuzzing_jobs.yml
new file mode 100644
index 00000000000..c93f4bfbe85
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183817_user_coverage_fuzzing_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.user_coverage_fuzzing_jobs
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183826_sast_scans.yml b/config/metrics/counts_28d/20210216183826_sast_scans.yml
new file mode 100644
index 00000000000..81824a66f09
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183826_sast_scans.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.sast_scans
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183828_dependency_scanning_scans.yml b/config/metrics/counts_28d/20210216183828_dependency_scanning_scans.yml
new file mode 100644
index 00000000000..f4eb1e39947
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183828_dependency_scanning_scans.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.dependency_scanning_scans
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183830_container_scanning_scans.yml b/config/metrics/counts_28d/20210216183830_container_scanning_scans.yml
new file mode 100644
index 00000000000..f05361d80bc
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183830_container_scanning_scans.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.container_scanning_scans
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183832_dast_scans.yml b/config/metrics/counts_28d/20210216183832_dast_scans.yml
new file mode 100644
index 00000000000..daa8db24b65
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183832_dast_scans.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.dast_scans
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183834_secret_detection_scans.yml b/config/metrics/counts_28d/20210216183834_secret_detection_scans.yml
new file mode 100644
index 00000000000..dfab9034bd0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183834_secret_detection_scans.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.secret_detection_scans
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183836_coverage_fuzzing_scans.yml b/config/metrics/counts_28d/20210216183836_coverage_fuzzing_scans.yml
new file mode 100644
index 00000000000..9e3248c7211
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183836_coverage_fuzzing_scans.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.coverage_fuzzing_scans
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183838_api_fuzzing_scans.yml b/config/metrics/counts_28d/20210216183838_api_fuzzing_scans.yml
new file mode 100644
index 00000000000..db92fcddb74
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183838_api_fuzzing_scans.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage_monthly.secure.api_fuzzing_scans
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml b/config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml
new file mode 100644
index 00000000000..a95d2ba6e89
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: compliance_unique_visits.compliance_unique_visits_for_any_target_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml b/config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml
new file mode 100644
index 00000000000..3f503247aa5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: search_unique_visits.search_unique_visits_for_any_target_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml b/config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml
new file mode 100644
index 00000000000..be1f63fad18
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.compliance.g_compliance_dashboard_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml b/config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml
new file mode 100644
index 00000000000..d3262c4d9ca
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.compliance.g_compliance_audit_events_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml b/config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml
new file mode 100644
index 00000000000..fb8284bcf31
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.compliance.i_compliance_audit_events_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml b/config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml
new file mode 100644
index 00000000000..f05fedf23c9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.compliance.i_compliance_credential_inventory_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml b/config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml
new file mode 100644
index 00000000000..ba9bcfba41e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.compliance.a_compliance_audit_events_api_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..63131ea83e2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.compliance.compliance_total_unique_counts_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml b/config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml
new file mode 100644
index 00000000000..ee06f117ff8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ide_edit.g_edit_by_sse_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184035_i_search_paid_monthly.yml b/config/metrics/counts_28d/20210216184035_i_search_paid_monthly.yml
new file mode 100644
index 00000000000..18e435b1677
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184035_i_search_paid_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.search.i_search_paid_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml b/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml
new file mode 100644
index 00000000000..eb0ffa26d2a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.source_code.git_write_action_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..12d51d8d560
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.testing.testing_total_unique_counts_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184251_i_ci_secrets_management_vault_build_created_monthly.yml b/config/metrics/counts_28d/20210216184251_i_ci_secrets_management_vault_build_created_monthly.yml
new file mode 100644
index 00000000000..124f322132f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184251_i_ci_secrets_management_vault_build_created_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_secrets_management.i_ci_secrets_management_vault_build_created_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml b/config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml
new file mode 100644
index 00000000000..e9d67155907
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.snippets.i_snippets_show_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml b/config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml
new file mode 100644
index 00000000000..7d981f850e2
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.terraform.p_terraform_state_api_unique_users_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml b/config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml
new file mode 100644
index 00000000000..b649192d659
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml b/config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml
new file mode 100644
index 00000000000..12d7e8ab749
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_toggled_task_item_status_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml b/config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml
new file mode 100644
index 00000000000..1df3325b027
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_approve_mr_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml b/config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml
new file mode 100644
index 00000000000..527105a58fe
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_unapprove_mr_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml b/config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml
new file mode 100644
index 00000000000..cdf2d1135aa
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_resolve_thread_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml b/config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml
new file mode 100644
index 00000000000..d4a27feb8f3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_unresolve_thread_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml b/config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml
new file mode 100644
index 00000000000..27899299abb
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_edit_mr_title_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml b/config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml
new file mode 100644
index 00000000000..ad564e57ab7
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_edit_mr_desc_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml b/config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml
new file mode 100644
index 00000000000..10c13e8796f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_create_review_note_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml b/config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml
new file mode 100644
index 00000000000..a6bac39ace0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_publish_review_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml
new file mode 100644
index 00000000000..937e17e3daf
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_create_multiline_mr_comment_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml
new file mode 100644
index 00000000000..c88078ffa2b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_edit_multiline_mr_comment_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml
new file mode 100644
index 00000000000..1bd3172b9f6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_remove_multiline_mr_comment_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml b/config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml
new file mode 100644
index 00000000000..594393e33d6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_assigned_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml b/config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml
new file mode 100644
index 00000000000..8bbaa0dc420
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_marked_as_draft_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml b/config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml
new file mode 100644
index 00000000000..f294f887c99
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_unmarked_as_draft_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml b/config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml
new file mode 100644
index 00000000000..d3c4647abbb
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_review_requested_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml b/config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml
new file mode 100644
index 00000000000..afbf5e0f3f5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_approval_rule_added_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml b/config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml
new file mode 100644
index 00000000000..565e1346a62
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_approval_rule_deleted_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml b/config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml
new file mode 100644
index 00000000000..c21e94ab4ab
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_approval_rule_edited_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml b/config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml
new file mode 100644
index 00000000000..c1f06831606
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_vs_code_api_request_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml b/config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml
new file mode 100644
index 00000000000..a985393fa6b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_create_mr_from_issue_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..72590d59bd1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.code_review.code_review_total_unique_counts_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml b/config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml
new file mode 100644
index 00000000000..e5931e25cdd
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml b/config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml
new file mode 100644
index 00000000000..7d52a2807e6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_build_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml b/config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml
new file mode 100644
index 00000000000..1f753124f46
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_deploy_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml b/config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml
new file mode 100644
index 00000000000..5bb03d5c1c9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml b/config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml
new file mode 100644
index 00000000000..d519411c9f8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_security_secret_detection_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml b/config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml
new file mode 100644
index 00000000000..62ee737153d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_5_min_production_app_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml b/config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml
new file mode 100644
index 00000000000..55f938dfce1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml b/config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml
new file mode 100644
index 00000000000..0f94788b355
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_aws_cf_deploy_ec2_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml b/config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml
new file mode 100644
index 00000000000..2483245b23d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_aws_deploy_ecs_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml b/config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml
new file mode 100644
index 00000000000..7ce990172df
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_build_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml b/config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml
new file mode 100644
index 00000000000..a585ef5fbb9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml b/config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml
new file mode 100644
index 00000000000..2e5b87677e1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_latest_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml b/config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml
new file mode 100644
index 00000000000..e8907f63243
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_security_sast_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml b/config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml
new file mode 100644
index 00000000000..b97c4005529
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_security_secret_detection_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml b/config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml
new file mode 100644
index 00000000000..fac0fa40406
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_terraform_base_latest_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..541d619a6e7
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ci_templates.ci_templates_total_unique_counts_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..59771f0f021
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.quickactions.quickactions_total_unique_counts_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml
new file mode 100644
index 00000000000..5d25977e938
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_composer_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml
new file mode 100644
index 00000000000..5f86c64cda6
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_conan_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml
new file mode 100644
index 00000000000..6ba5297d60d
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_container_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml
new file mode 100644
index 00000000000..9fe96b21e7e
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_debian_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml
new file mode 100644
index 00000000000..982d765b5fa
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_generic_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml
new file mode 100644
index 00000000000..b5001143b05
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_golang_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml
new file mode 100644
index 00000000000..220fa24696b
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_maven_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml
new file mode 100644
index 00000000000..ba98e8363a0
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_npm_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml
new file mode 100644
index 00000000000..2fe6251f959
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_nuget_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml
new file mode 100644
index 00000000000..db8b894abf7
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_pypi_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml
new file mode 100644
index 00000000000..b69c4aa13d5
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.i_package_tag_deploy_token_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..b17e2a671b3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.deploy_token_packages.deploy_token_packages_total_unique_counts_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml b/config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml
new file mode 100644
index 00000000000..821a30c475f
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_composer_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml b/config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml
new file mode 100644
index 00000000000..34ca1cba1e8
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_conan_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml b/config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml
new file mode 100644
index 00000000000..dd916840cb1
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_container_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml b/config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml
new file mode 100644
index 00000000000..d72c6db17bb
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_debian_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml b/config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml
new file mode 100644
index 00000000000..af2d01d8320
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_generic_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml b/config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml
new file mode 100644
index 00000000000..031a6b51b04
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_golang_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml b/config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml
new file mode 100644
index 00000000000..4a4649cd38a
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_maven_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml b/config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml
new file mode 100644
index 00000000000..12dd245e7be
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_npm_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml b/config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml
new file mode 100644
index 00000000000..6035e571393
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_nuget_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml b/config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml
new file mode 100644
index 00000000000..eff9b749fb4
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_pypi_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml b/config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml
new file mode 100644
index 00000000000..15c078db1f9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.i_package_tag_user_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..c21e9bebd6c
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.user_packages.user_packages_total_unique_counts_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml b/config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml
new file mode 100644
index 00000000000..c5fa7e2dcf7
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_jira_service_close_issue_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml b/config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml
new file mode 100644
index 00000000000..f4469c41dd3
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_jira_service_cross_reference_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184949_i_ecosystem_jira_service_list_issues_monthly.yml b/config/metrics/counts_28d/20210216184949_i_ecosystem_jira_service_list_issues_monthly.yml
new file mode 100644
index 00000000000..dd114b37a99
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184949_i_ecosystem_jira_service_list_issues_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_jira_service_list_issues_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184953_i_ecosystem_jira_service_create_issue_monthly.yml b/config/metrics/counts_28d/20210216184953_i_ecosystem_jira_service_create_issue_monthly.yml
new file mode 100644
index 00000000000..04f33c6f333
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184953_i_ecosystem_jira_service_create_issue_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ecosystem.i_ecosystem_jira_service_create_issue_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml
new file mode 100644
index 00000000000..6c1d08964a9
--- /dev/null
+++ b/config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml
@@ -0,0 +1,16 @@
+---
+key_path: redis_hll_counters.ecosystem.ecosystem_total_unique_counts_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml b/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml
index 07b20fd2938..045855e6f2d 100644
--- a/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml
@@ -1,6 +1,7 @@
---
key_path: redis_hll_counters.issues_edit.g_project_management_issue_title_changed_weekly
-description: Distinct users count that changed issue title in a group for last recent week
+description: Distinct users count that changed issue title in a group for last recent
+ week
product_stage: plan
product_group: group::project management
product_category: issue_tracking
@@ -17,4 +18,3 @@ tier:
- free
- premium
- ultimate
-
diff --git a/config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml b/config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml
new file mode 100644
index 00000000000..7607950a441
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml
@@ -0,0 +1,18 @@
+---
+key_path: redis_hll_counters.search.i_search_total_weekly
+description: Calculated unique users to perform Basic or Advanced searches by week
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml
new file mode 100644
index 00000000000..530e1460300
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml
@@ -0,0 +1,18 @@
+---
+key_path: redis_hll_counters.search.search_total_unique_counts_weekly
+description: Calculated unique users to perform Basic or Advanced searches by week
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml b/config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml
new file mode 100644
index 00000000000..f6f2bb9ab74
--- /dev/null
+++ b/config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.testing.i_testing_test_case_parsed_weekly
+description: Internal Tracking to count number of unit tests parsed for planning of
+ future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+product_section: ops
+product_stage: verify
+product_group: group::testing
+product_category: code_testing
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_7d/20210216182158_i_testing_metrics_report_artifact_uploaders_weekly.yml b/config/metrics/counts_7d/20210216182158_i_testing_metrics_report_artifact_uploaders_weekly.yml
new file mode 100644
index 00000000000..f88b6539ceb
--- /dev/null
+++ b/config/metrics/counts_7d/20210216182158_i_testing_metrics_report_artifact_uploaders_weekly.yml
@@ -0,0 +1,20 @@
+---
+key_path: redis_hll_counters.testing.i_testing_metrics_report_artifact_uploaders_weekly
+description: Internal Tracking to count number of unit tests parsed for planning of
+ future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+product_section: ops
+product_stage: verify
+product_group: group::testing
+product_category: code_testing
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210204124930_servers.yml b/config/metrics/counts_all/20210204124930_servers.yml
index 3103797ccce..9732b34c771 100644
--- a/config/metrics/counts_all/20210204124930_servers.yml
+++ b/config/metrics/counts_all/20210204124930_servers.yml
@@ -9,6 +9,8 @@ value_type: number
status: data_available
time_frame: all
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/counts_all/20210204124932_clusters.yml b/config/metrics/counts_all/20210204124932_clusters.yml
index 1bb86905502..c1ada3babcd 100644
--- a/config/metrics/counts_all/20210204124932_clusters.yml
+++ b/config/metrics/counts_all/20210204124932_clusters.yml
@@ -9,6 +9,8 @@ value_type: number
status: data_available
time_frame: all
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/counts_all/20210216174826_ldap_users.yml b/config/metrics/counts_all/20210216174826_ldap_users.yml
new file mode 100644
index 00000000000..34892c7ce90
--- /dev/null
+++ b/config/metrics/counts_all/20210216174826_ldap_users.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.ldap_users
+description: Number of users that are linked to LDAP
+product_section: dev
+product_stage: manage
+product_group: group::access
+product_category: authentication_and_authorization
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174829_smtp_server.yml b/config/metrics/counts_all/20210216174829_smtp_server.yml
new file mode 100644
index 00000000000..b60db7728c4
--- /dev/null
+++ b/config/metrics/counts_all/20210216174829_smtp_server.yml
@@ -0,0 +1,19 @@
+---
+key_path: mail.smtp_server
+description: The value of the SMTP server that is used
+product_section: growth
+product_stage:
+product_group: group::acquisition
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml b/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml
new file mode 100644
index 00000000000..6885d8971d1
--- /dev/null
+++ b/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.cycle_analytics_views
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174834_productivity_analytics_views.yml b/config/metrics/counts_all/20210216174834_productivity_analytics_views.yml
new file mode 100644
index 00000000000..03271ea0f13
--- /dev/null
+++ b/config/metrics/counts_all/20210216174834_productivity_analytics_views.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.productivity_analytics_views
+description:
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174836_g_analytics_contribution.yml b/config/metrics/counts_all/20210216174836_g_analytics_contribution.yml
new file mode 100644
index 00000000000..a56358e7d13
--- /dev/null
+++ b/config/metrics/counts_all/20210216174836_g_analytics_contribution.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.g_analytics_contribution
+description: Visits to /groups/:group/-/contribution_analytics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174838_g_analytics_insights.yml b/config/metrics/counts_all/20210216174838_g_analytics_insights.yml
new file mode 100644
index 00000000000..72197fa6f29
--- /dev/null
+++ b/config/metrics/counts_all/20210216174838_g_analytics_insights.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.g_analytics_insights
+description: Visits to /groups/:group/-/insights
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174840_g_analytics_issues.yml b/config/metrics/counts_all/20210216174840_g_analytics_issues.yml
new file mode 100644
index 00000000000..dc042c141e3
--- /dev/null
+++ b/config/metrics/counts_all/20210216174840_g_analytics_issues.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.g_analytics_issues
+description: Visits to /groups/:group/-/issues_analytics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174842_g_analytics_productivity.yml b/config/metrics/counts_all/20210216174842_g_analytics_productivity.yml
new file mode 100644
index 00000000000..eeab6200458
--- /dev/null
+++ b/config/metrics/counts_all/20210216174842_g_analytics_productivity.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.g_analytics_productivity
+description: Visits to /groups/:group/-/analytics/productivity_analytics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174844_g_analytics_valuestream.yml b/config/metrics/counts_all/20210216174844_g_analytics_valuestream.yml
new file mode 100644
index 00000000000..92399204faa
--- /dev/null
+++ b/config/metrics/counts_all/20210216174844_g_analytics_valuestream.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.g_analytics_valuestream
+description: Visits to /groups/:group/-/analytics/value_stream_analytics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174846_p_analytics_pipelines.yml b/config/metrics/counts_all/20210216174846_p_analytics_pipelines.yml
new file mode 100644
index 00000000000..8138873e882
--- /dev/null
+++ b/config/metrics/counts_all/20210216174846_p_analytics_pipelines.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.p_analytics_pipelines
+description: Visits to /:group/:project/pipelines/charts
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174848_p_analytics_code_reviews.yml b/config/metrics/counts_all/20210216174848_p_analytics_code_reviews.yml
new file mode 100644
index 00000000000..ac00c26a5ee
--- /dev/null
+++ b/config/metrics/counts_all/20210216174848_p_analytics_code_reviews.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.p_analytics_code_reviews
+description: Visits to /:group/:project/-/analytics/code_reviews
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174850_p_analytics_valuestream.yml b/config/metrics/counts_all/20210216174850_p_analytics_valuestream.yml
new file mode 100644
index 00000000000..b2802ab9084
--- /dev/null
+++ b/config/metrics/counts_all/20210216174850_p_analytics_valuestream.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.p_analytics_valuestream
+description: Visits to /:group/:project/-/value_stream_analytics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174852_p_analytics_insights.yml b/config/metrics/counts_all/20210216174852_p_analytics_insights.yml
new file mode 100644
index 00000000000..48c7e333b2c
--- /dev/null
+++ b/config/metrics/counts_all/20210216174852_p_analytics_insights.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.p_analytics_insights
+description: Visits to /:group/:project/insights
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174854_p_analytics_issues.yml b/config/metrics/counts_all/20210216174854_p_analytics_issues.yml
new file mode 100644
index 00000000000..86f7634ea32
--- /dev/null
+++ b/config/metrics/counts_all/20210216174854_p_analytics_issues.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.p_analytics_issues
+description: Visits to /:group/:project/-/analytics/issues_analytics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174856_p_analytics_repo.yml b/config/metrics/counts_all/20210216174856_p_analytics_repo.yml
new file mode 100644
index 00000000000..275cdd1e45b
--- /dev/null
+++ b/config/metrics/counts_all/20210216174856_p_analytics_repo.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.p_analytics_repo
+description: Visits to /:group/:project/-/graphs/master/charts
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174858_i_analytics_cohorts.yml b/config/metrics/counts_all/20210216174858_i_analytics_cohorts.yml
new file mode 100644
index 00000000000..14ff37dd4ad
--- /dev/null
+++ b/config/metrics/counts_all/20210216174858_i_analytics_cohorts.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.i_analytics_cohorts
+description: Visits to /-/instance_statistics/cohorts
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174900_i_analytics_dev_ops_score.yml b/config/metrics/counts_all/20210216174900_i_analytics_dev_ops_score.yml
new file mode 100644
index 00000000000..586b9a15b70
--- /dev/null
+++ b/config/metrics/counts_all/20210216174900_i_analytics_dev_ops_score.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.i_analytics_dev_ops_score
+description: Visits to /-/instance_statistics/dev_ops_score
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174902_g_analytics_merge_request.yml b/config/metrics/counts_all/20210216174902_g_analytics_merge_request.yml
new file mode 100644
index 00000000000..537a1c5dae8
--- /dev/null
+++ b/config/metrics/counts_all/20210216174902_g_analytics_merge_request.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.g_analytics_merge_request
+description: Visits to /groups/:group/-/analytics/merge_request_analytics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174904_p_analytics_merge_request.yml b/config/metrics/counts_all/20210216174904_p_analytics_merge_request.yml
new file mode 100644
index 00000000000..f8d509c9130
--- /dev/null
+++ b/config/metrics/counts_all/20210216174904_p_analytics_merge_request.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.p_analytics_merge_request
+description: Visits to /:group/:project/-/analytics/merge_request_analytics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174906_i_analytics_instance_statistics.yml b/config/metrics/counts_all/20210216174906_i_analytics_instance_statistics.yml
new file mode 100644
index 00000000000..e834d6ae823
--- /dev/null
+++ b/config/metrics/counts_all/20210216174906_i_analytics_instance_statistics.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.i_analytics_instance_statistics
+description: Visit to /admin/instance_statistics
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216174908_analytics_unique_visits_for_any_target.yml b/config/metrics/counts_all/20210216174908_analytics_unique_visits_for_any_target.yml
new file mode 100644
index 00000000000..d4d010ab419
--- /dev/null
+++ b/config/metrics/counts_all/20210216174908_analytics_unique_visits_for_any_target.yml
@@ -0,0 +1,16 @@
+---
+key_path: analytics_unique_visits.analytics_unique_visits_for_any_target
+description: Visits to any of the pages listed above per week
+product_section: dev
+product_stage: manage
+product_group: group::analytics
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml b/config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml
new file mode 100644
index 00000000000..3b2561bae52
--- /dev/null
+++ b/config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_prometheus_alerts
+description: Projects with Prometheus alerting enabled
+product_section: ops
+product_stage: monitor
+product_group: group::apm
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml b/config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml
new file mode 100644
index 00000000000..ad9a52c7ee7
--- /dev/null
+++ b/config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.pod_logs_usages_total
+description: Count the total number of log views
+product_section: ops
+product_stage: monitor
+product_group: group::apm
+product_category: logging
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml b/config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml
new file mode 100644
index 00000000000..8e1129883ae
--- /dev/null
+++ b/config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml
@@ -0,0 +1,17 @@
+---
+key_path: counts.service_desk_enabled_projects
+description: Count of service desk enabled projects
+product_section: dev
+product_stage: plan
+product_group: group::certify
+product_category: service_desk
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175026_service_desk_issues.yml b/config/metrics/counts_all/20210216175026_service_desk_issues.yml
new file mode 100644
index 00000000000..b852ae8b62f
--- /dev/null
+++ b/config/metrics/counts_all/20210216175026_service_desk_issues.yml
@@ -0,0 +1,17 @@
+---
+key_path: counts.service_desk_issues
+description: Count of service desk issues
+product_section: dev
+product_stage: plan
+product_group: group::certify
+product_category: service_desk
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175028_requirements_created.yml b/config/metrics/counts_all/20210216175028_requirements_created.yml
new file mode 100644
index 00000000000..74780f43c5a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175028_requirements_created.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.requirements_created
+description: Count of requirements created
+product_section: dev
+product_stage: plan
+product_group: group::certify
+product_category: requirements_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175037_suggestions.yml b/config/metrics/counts_all/20210216175037_suggestions.yml
new file mode 100644
index 00000000000..98ec2bd6d7c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175037_suggestions.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.suggestions
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175039_merge_requests.yml b/config/metrics/counts_all/20210216175039_merge_requests.yml
new file mode 100644
index 00000000000..3c17daf2622
--- /dev/null
+++ b/config/metrics/counts_all/20210216175039_merge_requests.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.merge_requests
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175041_merge_request_comment.yml b/config/metrics/counts_all/20210216175041_merge_request_comment.yml
new file mode 100644
index 00000000000..382110c11db
--- /dev/null
+++ b/config/metrics/counts_all/20210216175041_merge_request_comment.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.merge_request_comment
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175043_merge_request_create.yml b/config/metrics/counts_all/20210216175043_merge_request_create.yml
new file mode 100644
index 00000000000..39ce0ef072a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175043_merge_request_create.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.merge_request_create
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175045_merge_requests.yml b/config/metrics/counts_all/20210216175045_merge_requests.yml
new file mode 100644
index 00000000000..47966f197e4
--- /dev/null
+++ b/config/metrics/counts_all/20210216175045_merge_requests.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.merge_requests
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175053_suggestions.yml b/config/metrics/counts_all/20210216175053_suggestions.yml
new file mode 100644
index 00000000000..15a846c49d8
--- /dev/null
+++ b/config/metrics/counts_all/20210216175053_suggestions.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.suggestions
+description:
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175206_merged_merge_requests_using_approval_rules.yml b/config/metrics/counts_all/20210216175206_merged_merge_requests_using_approval_rules.yml
new file mode 100644
index 00000000000..e0c55e89f30
--- /dev/null
+++ b/config/metrics/counts_all/20210216175206_merged_merge_requests_using_approval_rules.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.merged_merge_requests_using_approval_rules
+description: Count of merge requests merged using approval rules
+product_section: dev
+product_stage: manage
+product_group: group::compliance
+product_category: compliance_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml b/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml
new file mode 100644
index 00000000000..2f134ac7076
--- /dev/null
+++ b/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.auto_devops_enabled
+description: Projects with Auto DevOps template enabled
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: auto_devops
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml b/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml
new file mode 100644
index 00000000000..863ea73cbee
--- /dev/null
+++ b/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.auto_devops_disabled
+description: Projects with Auto DevOps template disabled
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: auto_devops
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175232_clusters.yml b/config/metrics/counts_all/20210216175232_clusters.yml
new file mode 100644
index 00000000000..2d3689a0e8b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175232_clusters.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters
+description: Total GitLab Managed clusters both enabled and disabled
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175234_clusters_enabled.yml b/config/metrics/counts_all/20210216175234_clusters_enabled.yml
new file mode 100644
index 00000000000..7aad6d73bff
--- /dev/null
+++ b/config/metrics/counts_all/20210216175234_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_enabled
+description: Total GitLab Managed clusters currently enabled
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml b/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml
new file mode 100644
index 00000000000..3e4d16b313e
--- /dev/null
+++ b/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.project_clusters_enabled
+description: Total GitLab Managed clusters attached to projects
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml b/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml
new file mode 100644
index 00000000000..ccb13f9cbd0
--- /dev/null
+++ b/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.group_clusters_enabled
+description: Total GitLab Managed clusters attached to groups
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml b/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml
new file mode 100644
index 00000000000..d73499479b1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instance_clusters_enabled
+description: Total GitLab Managed clusters attached to the instance
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175242_clusters_disabled.yml b/config/metrics/counts_all/20210216175242_clusters_disabled.yml
new file mode 100644
index 00000000000..d1a14f8f3a5
--- /dev/null
+++ b/config/metrics/counts_all/20210216175242_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_disabled
+description: Total GitLab Managed disabled clusters
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml b/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml
new file mode 100644
index 00000000000..6d83aa114c5
--- /dev/null
+++ b/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.project_clusters_disabled
+description: Total GitLab Managed disabled clusters previously attached to projects
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml b/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml
new file mode 100644
index 00000000000..696c3ef7703
--- /dev/null
+++ b/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.group_clusters_disabled
+description: Total GitLab Managed disabled clusters previously attached to groups
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml b/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml
new file mode 100644
index 00000000000..f138e81e8a1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instance_clusters_disabled
+description: Total GitLab Managed disabled clusters previously attached to the instance
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml b/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml
new file mode 100644
index 00000000000..3a876aace23
--- /dev/null
+++ b/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_platforms_eks
+description: Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml b/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml
new file mode 100644
index 00000000000..6c0d06f67a8
--- /dev/null
+++ b/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_platforms_gke
+description: Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml b/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml
new file mode 100644
index 00000000000..c0ec787ba32
--- /dev/null
+++ b/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_platforms_user
+description: Total GitLab Managed clusters that are user provisioned
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml b/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml
new file mode 100644
index 00000000000..df3791476a6
--- /dev/null
+++ b/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_helm
+description: Total GitLab Managed clusters with GitLab Managed App:Helm enabled
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml b/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml
new file mode 100644
index 00000000000..312b3a0959a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_ingress
+description: Total GitLab Managed clusters with GitLab Managed App:Ingress installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml b/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml
new file mode 100644
index 00000000000..2850bf19272
--- /dev/null
+++ b/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_cert_managers
+description: Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml b/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml
new file mode 100644
index 00000000000..9a51decb60e
--- /dev/null
+++ b/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_crossplane
+description: Total GitLab Managed clusters with GitLab Managed App:Crossplane installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml b/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml
new file mode 100644
index 00000000000..11acda094ea
--- /dev/null
+++ b/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_prometheus
+description: Total GitLab Managed clusters with GitLab Managed App:Prometheus installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml b/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml
new file mode 100644
index 00000000000..3bab0578a71
--- /dev/null
+++ b/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_runner
+description: Total GitLab Managed clusters with GitLab Managed App:Runner installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml b/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml
new file mode 100644
index 00000000000..b8fb5c94cef
--- /dev/null
+++ b/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_knative
+description: Total GitLab Managed clusters with GitLab Managed App:Knative installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml b/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml
new file mode 100644
index 00000000000..547631db2f1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_elastic_stack
+description: Total GitLab Managed clusters with GitLab Managed App:Elastic Stack installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml b/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml
new file mode 100644
index 00000000000..c7c7f8c9adb
--- /dev/null
+++ b/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_jupyter
+description: Total GitLab Managed clusters with GitLab Managed App:Jupyter installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml b/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml
new file mode 100644
index 00000000000..fc86315d645
--- /dev/null
+++ b/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_applications_cilium
+description: Total GitLab Managed clusters with GitLab Managed App:Cilium installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175314_clusters_management_project.yml b/config/metrics/counts_all/20210216175314_clusters_management_project.yml
new file mode 100644
index 00000000000..38e3c790cec
--- /dev/null
+++ b/config/metrics/counts_all/20210216175314_clusters_management_project.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.clusters_management_project
+description: Total GitLab Managed clusters with defined cluster management project
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml b/config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml
new file mode 100644
index 00000000000..8e48a723caa
--- /dev/null
+++ b/config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_terraform_reports
+description: Count of projects with Terraform MR reports
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: infrastructure_as_code
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml b/config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml
new file mode 100644
index 00000000000..9854006b1dc
--- /dev/null
+++ b/config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_terraform_states
+description: Count of projects with GitLab Managed Terraform State
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: infrastructure_as_code
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175324_terraform_reports.yml b/config/metrics/counts_all/20210216175324_terraform_reports.yml
new file mode 100644
index 00000000000..4b83d4c944c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175324_terraform_reports.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.terraform_reports
+description: Count of Terraform MR reports generated
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: infrastructure_as_code
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175326_terraform_states.yml b/config/metrics/counts_all/20210216175326_terraform_states.yml
new file mode 100644
index 00000000000..c9696eaf26e
--- /dev/null
+++ b/config/metrics/counts_all/20210216175326_terraform_states.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.terraform_states
+description: Count of GitLab Managed Terraform States used
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: infrastructure_as_code
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml b/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml
new file mode 100644
index 00000000000..c6057167283
--- /dev/null
+++ b/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_applications_cert_managers
+description: Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml b/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml
new file mode 100644
index 00000000000..3f7814f7fea
--- /dev/null
+++ b/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_applications_helm
+description: Total GitLab Managed clusters with GitLab Managed App:Helm enabled
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml b/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml
new file mode 100644
index 00000000000..fd0cd902e8c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_applications_ingress
+description: Total GitLab Managed clusters with GitLab Managed App:Ingress installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml b/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml
new file mode 100644
index 00000000000..8774a62b475
--- /dev/null
+++ b/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_applications_knative
+description: Total GitLab Managed clusters with GitLab Managed App:Knative installed
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175337_clusters_management_project.yml b/config/metrics/counts_all/20210216175337_clusters_management_project.yml
new file mode 100644
index 00000000000..ada40d5fcfa
--- /dev/null
+++ b/config/metrics/counts_all/20210216175337_clusters_management_project.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_management_project
+description: Total GitLab Managed clusters with defined cluster management project
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175339_clusters_disabled.yml b/config/metrics/counts_all/20210216175339_clusters_disabled.yml
new file mode 100644
index 00000000000..35e94edf509
--- /dev/null
+++ b/config/metrics/counts_all/20210216175339_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_disabled
+description: Total GitLab Managed disabled clusters
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175341_clusters_enabled.yml b/config/metrics/counts_all/20210216175341_clusters_enabled.yml
new file mode 100644
index 00000000000..c2a921eeb2b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175341_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_enabled
+description: Total GitLab Managed clusters currently enabled
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml b/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml
new file mode 100644
index 00000000000..ab180d2102d
--- /dev/null
+++ b/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_platforms_gke
+description: Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml b/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml
new file mode 100644
index 00000000000..354cacc46a9
--- /dev/null
+++ b/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_platforms_eks
+description: Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml b/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml
new file mode 100644
index 00000000000..2c5386ad7b5
--- /dev/null
+++ b/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.clusters_platforms_user
+description: Total GitLab Managed clusters that are user provisioned
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml b/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml
new file mode 100644
index 00000000000..6b215140597
--- /dev/null
+++ b/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.instance_clusters_disabled
+description: Total GitLab Managed disabled clusters attached to the instance
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml b/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml
new file mode 100644
index 00000000000..3b43c90e061
--- /dev/null
+++ b/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.instance_clusters_enabled
+description: Total GitLab Managed enabled clusters attached to the instance
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml b/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml
new file mode 100644
index 00000000000..7ee008a09bc
--- /dev/null
+++ b/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.group_clusters_disabled
+description: Total GitLab Managed disabled clusters attached to groups
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml b/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml
new file mode 100644
index 00000000000..8a251f40347
--- /dev/null
+++ b/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.group_clusters_enabled
+description: Total GitLab Managed enabled clusters attached to groups
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml b/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml
new file mode 100644
index 00000000000..3dcecf724d2
--- /dev/null
+++ b/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.project_clusters_disabled
+description: Total GitLab Managed disabled clusters attached to projects
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml b/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml
new file mode 100644
index 00000000000..4fec74ce9fa
--- /dev/null
+++ b/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.project_clusters_enabled
+description: Total GitLab Managed enabled clusters attached to projects
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml b/config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml
new file mode 100644
index 00000000000..ac4a31a5a08
--- /dev/null
+++ b/config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.configure.projects_with_prometheus_alerts
+description: Projects with Prometheus alerting enabled
+product_section: ops
+product_stage:
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml b/config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml
new file mode 100644
index 00000000000..7ef825975a2
--- /dev/null
+++ b/config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml
@@ -0,0 +1,20 @@
+---
+key_path: counts.ingress_modsecurity_packets_processed
+description: Cumulative count of packets processed by ModSecurity since Usage Ping
+ was last reported
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: web_firewall
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml b/config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml
new file mode 100644
index 00000000000..2aad13de693
--- /dev/null
+++ b/config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml
@@ -0,0 +1,20 @@
+---
+key_path: counts.ingress_modsecurity_packets_anomalous
+description: Cumulative count of packets identified as anomalous by ModSecurity since
+ Usage Ping was last reported
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: web_firewall
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175446_network_policy_forwards.yml b/config/metrics/counts_all/20210216175446_network_policy_forwards.yml
new file mode 100644
index 00000000000..f1330d775a8
--- /dev/null
+++ b/config/metrics/counts_all/20210216175446_network_policy_forwards.yml
@@ -0,0 +1,20 @@
+---
+key_path: counts.network_policy_forwards
+description: Cumulative count of packets forwarded by Cilium (Container Network Security)
+ since Usage Ping was last reported
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: container_network_security
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175448_network_policy_drops.yml b/config/metrics/counts_all/20210216175448_network_policy_drops.yml
new file mode 100644
index 00000000000..e76c53f7b95
--- /dev/null
+++ b/config/metrics/counts_all/20210216175448_network_policy_drops.yml
@@ -0,0 +1,20 @@
+---
+key_path: counts.network_policy_drops
+description: Cumulative count of packets dropped by Cilium (Container Network Security)
+ since Usage Ping was last reported
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: container_network_security
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml b/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml
new file mode 100644
index 00000000000..6fc4f6178bb
--- /dev/null
+++ b/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.ingress_modsecurity_logging
+description: Whether or not ModSecurity is set to logging mode
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: web_firewall
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml b/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml
new file mode 100644
index 00000000000..7f2e91c88eb
--- /dev/null
+++ b/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.ingress_modsecurity_blocking
+description: Whether or not ModSecurity is set to blocking mode
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: web_firewall
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml b/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml
new file mode 100644
index 00000000000..5c028ab30e1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.ingress_modsecurity_disabled
+description: Whether or not ModSecurity is disabled within Ingress
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: web_firewall
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml b/config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml
new file mode 100644
index 00000000000..e0c49c6b070
--- /dev/null
+++ b/config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.ingress_modsecurity_not_installed
+description: Whether or not ModSecurity has not been installed into the cluster
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: web_firewall
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175510_ci_builds.yml b/config/metrics/counts_all/20210216175510_ci_builds.yml
new file mode 100644
index 00000000000..a70878ce352
--- /dev/null
+++ b/config/metrics/counts_all/20210216175510_ci_builds.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.ci_builds
+description: Unique builds in project
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml b/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml
new file mode 100644
index 00000000000..425da65a0d5
--- /dev/null
+++ b/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.ci_internal_pipelines
+description: Total pipelines in GitLab repositories
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml b/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml
new file mode 100644
index 00000000000..bf62f8096df
--- /dev/null
+++ b/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.ci_external_pipelines
+description: Total pipelines in external repositories
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml b/config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml
new file mode 100644
index 00000000000..ac9ce910867
--- /dev/null
+++ b/config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.ci_pipeline_config_auto_devops
+description: Total pipelines from an Auto DevOps template
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml b/config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml
new file mode 100644
index 00000000000..dc796d25bb0
--- /dev/null
+++ b/config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.ci_pipeline_config_repository
+description: Total Pipelines from templates in repository
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175520_ci_runners.yml b/config/metrics/counts_all/20210216175520_ci_runners.yml
new file mode 100644
index 00000000000..4bac8d39737
--- /dev/null
+++ b/config/metrics/counts_all/20210216175520_ci_runners.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.ci_runners
+description: Total configured Runners in project
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175521_ci_triggers.yml b/config/metrics/counts_all/20210216175521_ci_triggers.yml
new file mode 100644
index 00000000000..5a2015d6fdf
--- /dev/null
+++ b/config/metrics/counts_all/20210216175521_ci_triggers.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.ci_triggers
+description: Total configured Triggers in project
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml b/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml
new file mode 100644
index 00000000000..330b0b64e26
--- /dev/null
+++ b/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.ci_pipeline_schedules
+description: Pipeline schedules in GitLab
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175525_ci_builds.yml b/config/metrics/counts_all/20210216175525_ci_builds.yml
new file mode 100644
index 00000000000..a9a5d9f6a88
--- /dev/null
+++ b/config/metrics/counts_all/20210216175525_ci_builds.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.verify.ci_builds
+description: Unique builds in project
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml b/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml
new file mode 100644
index 00000000000..bc29f8fd33c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.verify.ci_external_pipelines
+description: Total pipelines in external repositories
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml b/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml
new file mode 100644
index 00000000000..9eb1541828f
--- /dev/null
+++ b/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.verify.ci_internal_pipelines
+description: Total pipelines in GitLab repositories
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml b/config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml
new file mode 100644
index 00000000000..046f94261e1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.verify.ci_pipeline_config_auto_devops
+description: Total pipelines from an Auto DevOps template
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml b/config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml
new file mode 100644
index 00000000000..6daf1a8fbd6
--- /dev/null
+++ b/config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.verify.ci_pipeline_config_repository
+description: Total Pipelines from templates in repository
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml b/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml
new file mode 100644
index 00000000000..be012a5ff3e
--- /dev/null
+++ b/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.verify.ci_pipeline_schedules
+description: Pipeline schedules in GitLab
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175537_ci_pipelines.yml b/config/metrics/counts_all/20210216175537_ci_pipelines.yml
new file mode 100644
index 00000000000..e9394e70fd1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175537_ci_pipelines.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.verify.ci_pipelines
+description: Distinct Users triggering Total pipelines
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175539_ci_triggers.yml b/config/metrics/counts_all/20210216175539_ci_triggers.yml
new file mode 100644
index 00000000000..d284687894a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175539_ci_triggers.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.verify.ci_triggers
+description: Total configured Triggers in project
+product_section: ops
+product_stage: verify
+product_group: group::continuous integration
+product_category: continuous_integration
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175612_dast_jobs.yml b/config/metrics/counts_all/20210216175612_dast_jobs.yml
new file mode 100644
index 00000000000..8672e18dbfa
--- /dev/null
+++ b/config/metrics/counts_all/20210216175612_dast_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.dast_jobs
+description: Count of DAST jobs run
+product_section: sec
+product_stage: secure
+product_group: group::dynamic analysis
+product_category: dynamic_application_security_testing
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175614_user_dast_jobs.yml b/config/metrics/counts_all/20210216175614_user_dast_jobs.yml
new file mode 100644
index 00000000000..900cd5b37b7
--- /dev/null
+++ b/config/metrics/counts_all/20210216175614_user_dast_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.secure.user_dast_jobs
+description: Count of DAST jobs
+product_section: sec
+product_stage: secure
+product_group: group::dynamic analysis
+product_category: dynamic_application_security_testing
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175621_web_hooks.yml b/config/metrics/counts_all/20210216175621_web_hooks.yml
new file mode 100644
index 00000000000..ad7d9de8f12
--- /dev/null
+++ b/config/metrics/counts_all/20210216175621_web_hooks.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.web_hooks
+description:
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175623_projects_asana_active.yml b/config/metrics/counts_all/20210216175623_projects_asana_active.yml
new file mode 100644
index 00000000000..724a00f7c18
--- /dev/null
+++ b/config/metrics/counts_all/20210216175623_projects_asana_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_asana_active
+description: Count of projects with active integrations for Asana
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175625_groups_asana_active.yml b/config/metrics/counts_all/20210216175625_groups_asana_active.yml
new file mode 100644
index 00000000000..cdae2cdf020
--- /dev/null
+++ b/config/metrics/counts_all/20210216175625_groups_asana_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_asana_active
+description: Count of groups with active integrations for Asana
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175627_templates_asana_active.yml b/config/metrics/counts_all/20210216175627_templates_asana_active.yml
new file mode 100644
index 00000000000..df08683ab7a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175627_templates_asana_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_asana_active
+description: Count of active service templates for Asana
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175628_instances_asana_active.yml b/config/metrics/counts_all/20210216175628_instances_asana_active.yml
new file mode 100644
index 00000000000..afaaf7f3b8c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175628_instances_asana_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_asana_active
+description: Count of active instance-level integrations for Asana
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml b/config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml
new file mode 100644
index 00000000000..efcaabdb817
--- /dev/null
+++ b/config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_asana_active
+description: Count of active projects inheriting integrations for Asana
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml b/config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml
new file mode 100644
index 00000000000..4a8128f2600
--- /dev/null
+++ b/config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_asana_active
+description: Count of active groups inheriting integrations for Asana
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175634_projects_assembla_active.yml b/config/metrics/counts_all/20210216175634_projects_assembla_active.yml
new file mode 100644
index 00000000000..3a4e4c64c7a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175634_projects_assembla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_assembla_active
+description: Count of projects with active integrations for Assembla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175636_groups_assembla_active.yml b/config/metrics/counts_all/20210216175636_groups_assembla_active.yml
new file mode 100644
index 00000000000..100beb0991b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175636_groups_assembla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_assembla_active
+description: Count of groups with active integrations for Assembla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175638_templates_assembla_active.yml b/config/metrics/counts_all/20210216175638_templates_assembla_active.yml
new file mode 100644
index 00000000000..f1bc7d0b08f
--- /dev/null
+++ b/config/metrics/counts_all/20210216175638_templates_assembla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_assembla_active
+description: Count of active service templates for Assembla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175640_instances_assembla_active.yml b/config/metrics/counts_all/20210216175640_instances_assembla_active.yml
new file mode 100644
index 00000000000..049781d91f9
--- /dev/null
+++ b/config/metrics/counts_all/20210216175640_instances_assembla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_assembla_active
+description: Count of active instance-level integrations for Assembla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml b/config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml
new file mode 100644
index 00000000000..c71e2efec84
--- /dev/null
+++ b/config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_assembla_active
+description: Count of active projects inheriting integrations for Assembla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml b/config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml
new file mode 100644
index 00000000000..58f9e025ae6
--- /dev/null
+++ b/config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_assembla_active
+description: Count of active groups inheriting integrations for Assembla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml b/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml
new file mode 100644
index 00000000000..ffeccdddb5e
--- /dev/null
+++ b/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_bamboo_active
+description: Count of projects with active integrations for Bamboo CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml b/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml
new file mode 100644
index 00000000000..4a9a6d695e8
--- /dev/null
+++ b/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_bamboo_active
+description: Count of groups with active integrations for Bamboo CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml b/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml
new file mode 100644
index 00000000000..11d3abdc7f9
--- /dev/null
+++ b/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_bamboo_active
+description: Count of active service templates for Bamboo CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml b/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml
new file mode 100644
index 00000000000..ce27c004aaf
--- /dev/null
+++ b/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_bamboo_active
+description: Count of active instance-level integrations for Bamboo CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml b/config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml
new file mode 100644
index 00000000000..28bdc086a74
--- /dev/null
+++ b/config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_bamboo_active
+description: Count of active projects inheriting integrations for Bamboo CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml b/config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml
new file mode 100644
index 00000000000..74a4c3618d2
--- /dev/null
+++ b/config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_bamboo_active
+description: Count of active groups inheriting integrations for Bamboo CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml b/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml
new file mode 100644
index 00000000000..640aad49c0a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_bugzilla_active
+description: Count of projects with active integrations for Bugzilla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml b/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml
new file mode 100644
index 00000000000..2521b50e111
--- /dev/null
+++ b/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_bugzilla_active
+description: Count of groups with active integrations for Bugzilla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml b/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml
new file mode 100644
index 00000000000..977bc0be0cf
--- /dev/null
+++ b/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_bugzilla_active
+description: Count of active service templates for Bugzilla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml b/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml
new file mode 100644
index 00000000000..9a1714e918b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_bugzilla_active
+description: Count of active instance-level integrations for Bugzilla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml b/config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml
new file mode 100644
index 00000000000..f4dffa88821
--- /dev/null
+++ b/config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_bugzilla_active
+description: Count of active projects inheriting integrations for Bugzilla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml b/config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml
new file mode 100644
index 00000000000..c7c093d8ab7
--- /dev/null
+++ b/config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_bugzilla_active
+description: Count of active groups inheriting integrations for Bugzilla
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml b/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml
new file mode 100644
index 00000000000..debf9bb020f
--- /dev/null
+++ b/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_buildkite_active
+description: Count of projects with active integrations for Buildkite
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml b/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml
new file mode 100644
index 00000000000..2abea7b54d2
--- /dev/null
+++ b/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_buildkite_active
+description: Count of groups with active integrations for Buildkite
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml b/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml
new file mode 100644
index 00000000000..1520168a10a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_buildkite_active
+description: Count of active service templates for Buildkite
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml b/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml
new file mode 100644
index 00000000000..1ce0ad19f97
--- /dev/null
+++ b/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_buildkite_active
+description: Count of active instance-level integrations for Buildkite
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml b/config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml
new file mode 100644
index 00000000000..0073bdaf957
--- /dev/null
+++ b/config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_buildkite_active
+description: Count of active projects inheriting integrations for Buildkite
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml b/config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml
new file mode 100644
index 00000000000..f8e5bcab9fd
--- /dev/null
+++ b/config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_buildkite_active
+description: Count of active groups inheriting integrations for Buildkite
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175719_projects_campfire_active.yml b/config/metrics/counts_all/20210216175719_projects_campfire_active.yml
new file mode 100644
index 00000000000..15d2e40b4ca
--- /dev/null
+++ b/config/metrics/counts_all/20210216175719_projects_campfire_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_campfire_active
+description: Count of projects with active integrations for Campfire
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175721_groups_campfire_active.yml b/config/metrics/counts_all/20210216175721_groups_campfire_active.yml
new file mode 100644
index 00000000000..284b7bab518
--- /dev/null
+++ b/config/metrics/counts_all/20210216175721_groups_campfire_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_campfire_active
+description: Count of groups with active integrations for Campfire
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175723_templates_campfire_active.yml b/config/metrics/counts_all/20210216175723_templates_campfire_active.yml
new file mode 100644
index 00000000000..4a6df7ba877
--- /dev/null
+++ b/config/metrics/counts_all/20210216175723_templates_campfire_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_campfire_active
+description: Count of active service templates for Campfire
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175725_instances_campfire_active.yml b/config/metrics/counts_all/20210216175725_instances_campfire_active.yml
new file mode 100644
index 00000000000..5ab6dec5aa7
--- /dev/null
+++ b/config/metrics/counts_all/20210216175725_instances_campfire_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_campfire_active
+description: Count of active instance-level integrations for Campfire
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml b/config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml
new file mode 100644
index 00000000000..fb53c49929f
--- /dev/null
+++ b/config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_campfire_active
+description: Count of active projects inheriting integrations for Campfire
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml b/config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml
new file mode 100644
index 00000000000..9d974bf517b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_campfire_active
+description: Count of active groups inheriting integrations for Campfire
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175731_projects_confluence_active.yml b/config/metrics/counts_all/20210216175731_projects_confluence_active.yml
new file mode 100644
index 00000000000..075e56155fd
--- /dev/null
+++ b/config/metrics/counts_all/20210216175731_projects_confluence_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_confluence_active
+description: Count of projects with active integrations for Confluence
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175733_groups_confluence_active.yml b/config/metrics/counts_all/20210216175733_groups_confluence_active.yml
new file mode 100644
index 00000000000..de152ddeb7d
--- /dev/null
+++ b/config/metrics/counts_all/20210216175733_groups_confluence_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_confluence_active
+description: Count of groups with active integrations for Confluence
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175734_templates_confluence_active.yml b/config/metrics/counts_all/20210216175734_templates_confluence_active.yml
new file mode 100644
index 00000000000..ff059277577
--- /dev/null
+++ b/config/metrics/counts_all/20210216175734_templates_confluence_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_confluence_active
+description: Count of active service templates for Confluence
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175736_instances_confluence_active.yml b/config/metrics/counts_all/20210216175736_instances_confluence_active.yml
new file mode 100644
index 00000000000..a2e36f00a12
--- /dev/null
+++ b/config/metrics/counts_all/20210216175736_instances_confluence_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_confluence_active
+description: Count of active instance-level integrations for Confluence
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml b/config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml
new file mode 100644
index 00000000000..15a6ffd6025
--- /dev/null
+++ b/config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_confluence_active
+description: Count of active projects inheriting integrations for Confluence
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml b/config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml
new file mode 100644
index 00000000000..e7928fff1c5
--- /dev/null
+++ b/config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_confluence_active
+description: Count of active groups inheriting integrations for Confluence
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml
new file mode 100644
index 00000000000..0d0d2d86fdb
--- /dev/null
+++ b/config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_custom_issue_tracker_active
+description: Count of projects with active integrations for a Custom Issue Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml
new file mode 100644
index 00000000000..e8cae4d24d7
--- /dev/null
+++ b/config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_custom_issue_tracker_active
+description: Count of groups with active integrations for a Custom Issue Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml
new file mode 100644
index 00000000000..a67cd7c0435
--- /dev/null
+++ b/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_custom_issue_tracker_active
+description: Count of active service templates for a Custom Issue Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml
new file mode 100644
index 00000000000..00bf681c870
--- /dev/null
+++ b/config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_custom_issue_tracker_active
+description: Count of active instance-level integrations for a Custom Issue Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml
new file mode 100644
index 00000000000..ba732a12259
--- /dev/null
+++ b/config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_custom_issue_tracker_active
+description: Count of active projects inheriting integrations for a Custom Issue Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml
new file mode 100644
index 00000000000..294c557f9b1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_custom_issue_tracker_active
+description: Count of active groups inheriting integrations for a Custom Issue Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175753_projects_discord_active.yml b/config/metrics/counts_all/20210216175753_projects_discord_active.yml
new file mode 100644
index 00000000000..ab1e187d697
--- /dev/null
+++ b/config/metrics/counts_all/20210216175753_projects_discord_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_discord_active
+description: Count of projects with active integrations for Discord
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175755_groups_discord_active.yml b/config/metrics/counts_all/20210216175755_groups_discord_active.yml
new file mode 100644
index 00000000000..8684be04c4f
--- /dev/null
+++ b/config/metrics/counts_all/20210216175755_groups_discord_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_discord_active
+description: Count of groups with active integrations for Discord
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175756_templates_discord_active.yml b/config/metrics/counts_all/20210216175756_templates_discord_active.yml
new file mode 100644
index 00000000000..f66e3435221
--- /dev/null
+++ b/config/metrics/counts_all/20210216175756_templates_discord_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_discord_active
+description: Count of active service templates for Discord
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175758_instances_discord_active.yml b/config/metrics/counts_all/20210216175758_instances_discord_active.yml
new file mode 100644
index 00000000000..0dc37b7100c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175758_instances_discord_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_discord_active
+description: Count of active instance-level integrations for Discord
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml b/config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml
new file mode 100644
index 00000000000..b5ef624a9da
--- /dev/null
+++ b/config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_discord_active
+description: Count of active projects inheriting integrations for Discord
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml b/config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml
new file mode 100644
index 00000000000..a6d4c8385f3
--- /dev/null
+++ b/config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_discord_active
+description: Count of active groups inheriting integrations for Discord
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml b/config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml
new file mode 100644
index 00000000000..f8d53e6620e
--- /dev/null
+++ b/config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_drone_ci_active
+description: Count of projects with active integrations for Drone CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml b/config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml
new file mode 100644
index 00000000000..3dc182faa0c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_drone_ci_active
+description: Count of groups with active integrations for Drone CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml b/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml
new file mode 100644
index 00000000000..3a45cd3aba0
--- /dev/null
+++ b/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_drone_ci_active
+description: Count of active service templates for Drone CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml b/config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml
new file mode 100644
index 00000000000..fd6581bff6a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_drone_ci_active
+description: Count of active instance-level integrations for Drone CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml b/config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml
new file mode 100644
index 00000000000..f9d8ad12795
--- /dev/null
+++ b/config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_drone_ci_active
+description: Count of active projects inheriting integrations for Drone CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml b/config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml
new file mode 100644
index 00000000000..c876ef22570
--- /dev/null
+++ b/config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_drone_ci_active
+description: Count of active groups inheriting integrations for Drone CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml b/config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml
new file mode 100644
index 00000000000..5dea679b5b0
--- /dev/null
+++ b/config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_emails_on_push_active
+description: Count of projects with active integrations for Emails on Push
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml b/config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml
new file mode 100644
index 00000000000..4bfbefe0b7d
--- /dev/null
+++ b/config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_emails_on_push_active
+description: Count of groups with active integrations for Emails on Push
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml b/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml
new file mode 100644
index 00000000000..bc6764c1d17
--- /dev/null
+++ b/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_emails_on_push_active
+description: Count of active service templates for Emails on Push
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml b/config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml
new file mode 100644
index 00000000000..00c04e32b09
--- /dev/null
+++ b/config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_emails_on_push_active
+description: Count of active instance-level integrations for Emails on Push
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml b/config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml
new file mode 100644
index 00000000000..ca2e0062f75
--- /dev/null
+++ b/config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_emails_on_push_active
+description: Count of active projects inheriting integrations for Emails on Push
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml b/config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml
new file mode 100644
index 00000000000..7d2308cd39d
--- /dev/null
+++ b/config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_emails_on_push_active
+description: Count of active groups inheriting integrations for Emails on Push
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml b/config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml
new file mode 100644
index 00000000000..e570fdb964c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_external_wiki_active
+description: Count of projects with active integrations for External Wiki
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml b/config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml
new file mode 100644
index 00000000000..4d680edf42a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_external_wiki_active
+description: Count of groups with active integrations for External Wiki
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml b/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml
new file mode 100644
index 00000000000..4efd0be8673
--- /dev/null
+++ b/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_external_wiki_active
+description: Count of active service templates for External Wiki
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml b/config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml
new file mode 100644
index 00000000000..c435eed9dee
--- /dev/null
+++ b/config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_external_wiki_active
+description: Count of active instance-level integrations for External Wiki
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml b/config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml
new file mode 100644
index 00000000000..4c139e6ee8d
--- /dev/null
+++ b/config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_external_wiki_active
+description: Count of active projects inheriting integrations for External Wiki
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml b/config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml
new file mode 100644
index 00000000000..fe18e836df2
--- /dev/null
+++ b/config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_external_wiki_active
+description: Count of active groups inheriting integrations for External Wiki
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml b/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml
new file mode 100644
index 00000000000..e8d724b51b3
--- /dev/null
+++ b/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_flowdock_active
+description: Count of projects with active integrations for Flowdock
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml b/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml
new file mode 100644
index 00000000000..0d9f9a72cd3
--- /dev/null
+++ b/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_flowdock_active
+description: Count of groups with active integrations for Flowdock
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml b/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml
new file mode 100644
index 00000000000..f1715119217
--- /dev/null
+++ b/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_flowdock_active
+description: Count of active service templates for Flowdock
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml b/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml
new file mode 100644
index 00000000000..e62259c965c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_flowdock_active
+description: Count of active instance-level integrations for Flowdock
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml b/config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml
new file mode 100644
index 00000000000..53d09e2dab1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_flowdock_active
+description: Count of active projects inheriting integrations for Flowdock
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml b/config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml
new file mode 100644
index 00000000000..645d618705b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_flowdock_active
+description: Count of active groups inheriting integrations for Flowdock
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175848_projects_github_active.yml b/config/metrics/counts_all/20210216175848_projects_github_active.yml
new file mode 100644
index 00000000000..6145fc599b9
--- /dev/null
+++ b/config/metrics/counts_all/20210216175848_projects_github_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_github_active
+description: Count of projects with active integrations for GitHub
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175850_groups_github_active.yml b/config/metrics/counts_all/20210216175850_groups_github_active.yml
new file mode 100644
index 00000000000..9a43b772447
--- /dev/null
+++ b/config/metrics/counts_all/20210216175850_groups_github_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_github_active
+description: Count of groups with active integrations for GitHub
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175851_templates_github_active.yml b/config/metrics/counts_all/20210216175851_templates_github_active.yml
new file mode 100644
index 00000000000..f6ceed1233c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175851_templates_github_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_github_active
+description: Count of active service templates for GitHub
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175853_instances_github_active.yml b/config/metrics/counts_all/20210216175853_instances_github_active.yml
new file mode 100644
index 00000000000..8150c0ec5a1
--- /dev/null
+++ b/config/metrics/counts_all/20210216175853_instances_github_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_github_active
+description: Count of active instance-level integrations for GitHub
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175855_projects_inheriting_github_active.yml b/config/metrics/counts_all/20210216175855_projects_inheriting_github_active.yml
new file mode 100644
index 00000000000..6f5f366e72b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175855_projects_inheriting_github_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_github_active
+description: Count of active projects inheriting integrations for GitHub
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175857_groups_inheriting_github_active.yml b/config/metrics/counts_all/20210216175857_groups_inheriting_github_active.yml
new file mode 100644
index 00000000000..545fccc107e
--- /dev/null
+++ b/config/metrics/counts_all/20210216175857_groups_inheriting_github_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_github_active
+description: Count of active groups inheriting integrations for GitHub
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml
new file mode 100644
index 00000000000..d61e94c0df8
--- /dev/null
+++ b/config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_hangouts_chat_active
+description: Count of projects with active integrations for Hangouts Chat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml
new file mode 100644
index 00000000000..0a23a43cdf3
--- /dev/null
+++ b/config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_hangouts_chat_active
+description: Count of groups with active integrations for Hangouts Chat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml
new file mode 100644
index 00000000000..21cfa1ebf23
--- /dev/null
+++ b/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_hangouts_chat_active
+description: Count of active service templates for Hangouts Chat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml
new file mode 100644
index 00000000000..4a3febf985a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_hangouts_chat_active
+description: Count of active instance-level integrations for Hangouts Chat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml
new file mode 100644
index 00000000000..90773d663df
--- /dev/null
+++ b/config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_hangouts_chat_active
+description: Count of active projects inheriting integrations for Hangouts Chat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml
new file mode 100644
index 00000000000..eda424840eb
--- /dev/null
+++ b/config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_hangouts_chat_active
+description: Count of active groups inheriting integrations for Hangouts Chat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml b/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml
new file mode 100644
index 00000000000..cc49000a57f
--- /dev/null
+++ b/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_hipchat_active
+description: Count of projects with active integrations for HipChat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml b/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml
new file mode 100644
index 00000000000..1496bc21bcd
--- /dev/null
+++ b/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_hipchat_active
+description: Count of groups with active integrations for HipChat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml b/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml
new file mode 100644
index 00000000000..3f285fe0ed6
--- /dev/null
+++ b/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_hipchat_active
+description: Count of active service templates for HipChat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml b/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml
new file mode 100644
index 00000000000..0e2f5c5fe1b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_hipchat_active
+description: Count of active instance-level integrations for HipChat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml b/config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml
new file mode 100644
index 00000000000..0980e3b587c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_hipchat_active
+description: Count of active projects inheriting integrations for HipChat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml b/config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml
new file mode 100644
index 00000000000..63c4ee9771d
--- /dev/null
+++ b/config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_hipchat_active
+description: Count of active groups inheriting integrations for HipChat
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175921_projects_irker_active.yml b/config/metrics/counts_all/20210216175921_projects_irker_active.yml
new file mode 100644
index 00000000000..7933389ccc0
--- /dev/null
+++ b/config/metrics/counts_all/20210216175921_projects_irker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_irker_active
+description: Count of projects with active integrations for Irker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175923_groups_irker_active.yml b/config/metrics/counts_all/20210216175923_groups_irker_active.yml
new file mode 100644
index 00000000000..f845def2053
--- /dev/null
+++ b/config/metrics/counts_all/20210216175923_groups_irker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_irker_active
+description: Count of groups with active integrations for Irker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175924_templates_irker_active.yml b/config/metrics/counts_all/20210216175924_templates_irker_active.yml
new file mode 100644
index 00000000000..f40cf42f648
--- /dev/null
+++ b/config/metrics/counts_all/20210216175924_templates_irker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_irker_active
+description: Count of active service templates for Irker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175926_instances_irker_active.yml b/config/metrics/counts_all/20210216175926_instances_irker_active.yml
new file mode 100644
index 00000000000..d0f6475446b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175926_instances_irker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_irker_active
+description: Count of active instance-level integrations for Irker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml b/config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml
new file mode 100644
index 00000000000..b805ea65220
--- /dev/null
+++ b/config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_irker_active
+description: Count of active projects inheriting integrations for Irker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml b/config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml
new file mode 100644
index 00000000000..99e624a52e8
--- /dev/null
+++ b/config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_irker_active
+description: Count of active groups inheriting integrations for Irker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml b/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml
new file mode 100644
index 00000000000..e16691fa13b
--- /dev/null
+++ b/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_jenkins_active
+description: Count of projects with active integrations for Jenkins
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml b/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml
new file mode 100644
index 00000000000..ccbaa4f96b5
--- /dev/null
+++ b/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_jenkins_active
+description: Count of groups with active integrations for Jenkins
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml b/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml
new file mode 100644
index 00000000000..badea034cd9
--- /dev/null
+++ b/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_jenkins_active
+description: Count of active service templates for Jenkins
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml b/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml
new file mode 100644
index 00000000000..181155322a5
--- /dev/null
+++ b/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_jenkins_active
+description: Count of active instance-level integrations for Jenkins
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml b/config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml
new file mode 100644
index 00000000000..8dbdb6728bb
--- /dev/null
+++ b/config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_jenkins_active
+description: Count of active projects inheriting integrations for Jenkins
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml b/config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml
new file mode 100644
index 00000000000..7cacd4e5c9c
--- /dev/null
+++ b/config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_jenkins_active
+description: Count of active groups inheriting integrations for Jenkins
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175943_projects_jira_active.yml b/config/metrics/counts_all/20210216175943_projects_jira_active.yml
new file mode 100644
index 00000000000..90d645da327
--- /dev/null
+++ b/config/metrics/counts_all/20210216175943_projects_jira_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_jira_active
+description: Count of projects with active integrations for Jira
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175945_groups_jira_active.yml b/config/metrics/counts_all/20210216175945_groups_jira_active.yml
new file mode 100644
index 00000000000..c4fbc196733
--- /dev/null
+++ b/config/metrics/counts_all/20210216175945_groups_jira_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_jira_active
+description: Count of groups with active integrations for Jira
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175946_templates_jira_active.yml b/config/metrics/counts_all/20210216175946_templates_jira_active.yml
new file mode 100644
index 00000000000..861d83df3ec
--- /dev/null
+++ b/config/metrics/counts_all/20210216175946_templates_jira_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_jira_active
+description: Count of active service templates for Jira
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175948_instances_jira_active.yml b/config/metrics/counts_all/20210216175948_instances_jira_active.yml
new file mode 100644
index 00000000000..2d0a7ec85ed
--- /dev/null
+++ b/config/metrics/counts_all/20210216175948_instances_jira_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_jira_active
+description: Count of active instance-level integrations for Jira
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml b/config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml
new file mode 100644
index 00000000000..6cf7750a60a
--- /dev/null
+++ b/config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_jira_active
+description: Count of active projects inheriting integrations for Jira
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml b/config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml
new file mode 100644
index 00000000000..0f84ed3863e
--- /dev/null
+++ b/config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_jira_active
+description: Count of active groups inheriting integrations for Jira
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml b/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml
new file mode 100644
index 00000000000..67eca7e1fe9
--- /dev/null
+++ b/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_mattermost_active
+description: Count of projects with active integrations for Mattermost
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml b/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml
new file mode 100644
index 00000000000..30a60716409
--- /dev/null
+++ b/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_mattermost_active
+description: Count of groups with active integrations for Mattermost
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml b/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml
new file mode 100644
index 00000000000..e78f17d0547
--- /dev/null
+++ b/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_mattermost_active
+description: Count of active service templates for Mattermost
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml b/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml
new file mode 100644
index 00000000000..8bf633cb085
--- /dev/null
+++ b/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_mattermost_active
+description: Count of active instance-level integrations for Mattermost
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml b/config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml
new file mode 100644
index 00000000000..bca2354131d
--- /dev/null
+++ b/config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_mattermost_active
+description: Count of active projects inheriting integrations for Mattermost
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml b/config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml
new file mode 100644
index 00000000000..df15e6db792
--- /dev/null
+++ b/config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_mattermost_active
+description: Count of active groups inheriting integrations for Mattermost
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml
new file mode 100644
index 00000000000..e0956199e13
--- /dev/null
+++ b/config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_mattermost_slash_commands_active
+description: Count of projects with active integrations for Mattermost (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml
new file mode 100644
index 00000000000..c5f7385d1b8
--- /dev/null
+++ b/config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_mattermost_slash_commands_active
+description: Count of groups with active integrations for Mattermost (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml
new file mode 100644
index 00000000000..504e9d39ee6
--- /dev/null
+++ b/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_mattermost_slash_commands_active
+description: Count of active service templates for Mattermost (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml
new file mode 100644
index 00000000000..2ccd3bfecc4
--- /dev/null
+++ b/config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_mattermost_slash_commands_active
+description: Count of active instance-level integrations for Mattermost (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml
new file mode 100644
index 00000000000..271614cff68
--- /dev/null
+++ b/config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml
@@ -0,0 +1,20 @@
+---
+key_path: counts.projects_inheriting_mattermost_slash_commands_active
+description: Count of active projects inheriting integrations for Mattermost (slash
+ commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml
new file mode 100644
index 00000000000..df3b7e0175f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml
@@ -0,0 +1,20 @@
+---
+key_path: counts.groups_inheriting_mattermost_slash_commands_active
+description: Count of active groups inheriting integrations for Mattermost (slash
+ commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml
new file mode 100644
index 00000000000..7f25eb0c4fe
--- /dev/null
+++ b/config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_microsoft_teams_active
+description: Count of projects with active integrations for Microsoft Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml
new file mode 100644
index 00000000000..5f23d34dadd
--- /dev/null
+++ b/config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_microsoft_teams_active
+description: Count of groups with active integrations for Microsoft Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml
new file mode 100644
index 00000000000..fc5b0a2fbbe
--- /dev/null
+++ b/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_microsoft_teams_active
+description: Count of active service templates for Microsoft Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml
new file mode 100644
index 00000000000..840e4c21ebb
--- /dev/null
+++ b/config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_microsoft_teams_active
+description: Count of active instance-level integrations for Microsoft Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml
new file mode 100644
index 00000000000..52ee7de311b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_microsoft_teams_active
+description: Count of active projects inheriting integrations for Microsoft Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml
new file mode 100644
index 00000000000..9f91b7119e1
--- /dev/null
+++ b/config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_microsoft_teams_active
+description: Count of active groups inheriting integrations for Microsoft Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180027_projects_packagist_active.yml b/config/metrics/counts_all/20210216180027_projects_packagist_active.yml
new file mode 100644
index 00000000000..80ed0d39f9f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180027_projects_packagist_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_packagist_active
+description: Count of projects with active integrations for Packagist
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180029_groups_packagist_active.yml b/config/metrics/counts_all/20210216180029_groups_packagist_active.yml
new file mode 100644
index 00000000000..464d1b4faed
--- /dev/null
+++ b/config/metrics/counts_all/20210216180029_groups_packagist_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_packagist_active
+description: Count of groups with active integrations for Packagist
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180030_templates_packagist_active.yml b/config/metrics/counts_all/20210216180030_templates_packagist_active.yml
new file mode 100644
index 00000000000..a9b8fee8b7a
--- /dev/null
+++ b/config/metrics/counts_all/20210216180030_templates_packagist_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_packagist_active
+description: Count of active service templates for Packagist
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180032_instances_packagist_active.yml b/config/metrics/counts_all/20210216180032_instances_packagist_active.yml
new file mode 100644
index 00000000000..e651adc3e37
--- /dev/null
+++ b/config/metrics/counts_all/20210216180032_instances_packagist_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_packagist_active
+description: Count of active instance-level integrations for Packagist
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml b/config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml
new file mode 100644
index 00000000000..0e9ccdbb907
--- /dev/null
+++ b/config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_packagist_active
+description: Count of active projects inheriting integrations for Packagist
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml b/config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml
new file mode 100644
index 00000000000..bd1a7750028
--- /dev/null
+++ b/config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_packagist_active
+description: Count of active groups inheriting integrations for Packagist
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml b/config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml
new file mode 100644
index 00000000000..98cd4f28a6c
--- /dev/null
+++ b/config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_pipelines_email_active
+description: Count of projects with active integrations for Pipeline Emails
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml b/config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml
new file mode 100644
index 00000000000..e781c6a743e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_pipelines_email_active
+description: Count of groups with active integrations for Pipeline Emails
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml b/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml
new file mode 100644
index 00000000000..982e0fe8b37
--- /dev/null
+++ b/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_pipelines_email_active
+description: Count of active service templates for Pipeline Emails
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml b/config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml
new file mode 100644
index 00000000000..86640daf752
--- /dev/null
+++ b/config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_pipelines_email_active
+description: Count of active instance-level integrations for Pipeline Emails
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml b/config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml
new file mode 100644
index 00000000000..42f4638f79e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_pipelines_email_active
+description: Count of active projects inheriting integrations for Pipeline Emails
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml b/config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml
new file mode 100644
index 00000000000..c1c05c29637
--- /dev/null
+++ b/config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_pipelines_email_active
+description: Count of active groups inheriting integrations for Pipeline Emails
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml
new file mode 100644
index 00000000000..cc55d603e97
--- /dev/null
+++ b/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_pivotaltracker_active
+description: Count of projects with active integrations for Pivotal Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml
new file mode 100644
index 00000000000..170951d9295
--- /dev/null
+++ b/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_pivotaltracker_active
+description: Count of groups with active integrations for Pivotal Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml
new file mode 100644
index 00000000000..9786b72a10f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_pivotaltracker_active
+description: Count of active service templates for Pivotal Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml
new file mode 100644
index 00000000000..6988d6ebdd4
--- /dev/null
+++ b/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_pivotaltracker_active
+description: Count of active instance-level integrations for Pivotal Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml
new file mode 100644
index 00000000000..8bd473a7615
--- /dev/null
+++ b/config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_pivotaltracker_active
+description: Count of active projects inheriting integrations for Pivotal Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml
new file mode 100644
index 00000000000..682ae485610
--- /dev/null
+++ b/config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_pivotaltracker_active
+description: Count of active groups inheriting integrations for Pivotal Tracker
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180100_projects_pushover_active.yml b/config/metrics/counts_all/20210216180100_projects_pushover_active.yml
new file mode 100644
index 00000000000..89584d140db
--- /dev/null
+++ b/config/metrics/counts_all/20210216180100_projects_pushover_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_pushover_active
+description: Count of projects with active integrations for Pushover
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180102_groups_pushover_active.yml b/config/metrics/counts_all/20210216180102_groups_pushover_active.yml
new file mode 100644
index 00000000000..d5502041537
--- /dev/null
+++ b/config/metrics/counts_all/20210216180102_groups_pushover_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_pushover_active
+description: Count of groups with active integrations for Pushover
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180104_templates_pushover_active.yml b/config/metrics/counts_all/20210216180104_templates_pushover_active.yml
new file mode 100644
index 00000000000..598129d3ef6
--- /dev/null
+++ b/config/metrics/counts_all/20210216180104_templates_pushover_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_pushover_active
+description: Count of active service templates for Pushover
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180105_instances_pushover_active.yml b/config/metrics/counts_all/20210216180105_instances_pushover_active.yml
new file mode 100644
index 00000000000..105fd4ff93a
--- /dev/null
+++ b/config/metrics/counts_all/20210216180105_instances_pushover_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_pushover_active
+description: Count of active instance-level integrations for Pushover
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml b/config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml
new file mode 100644
index 00000000000..40b3e92c29e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_pushover_active
+description: Count of active projects inheriting integrations for Pushover
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml b/config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml
new file mode 100644
index 00000000000..f99265b4c85
--- /dev/null
+++ b/config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_pushover_active
+description: Count of active groups inheriting integrations for Pushover
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180111_projects_redmine_active.yml b/config/metrics/counts_all/20210216180111_projects_redmine_active.yml
new file mode 100644
index 00000000000..d2b34fd0143
--- /dev/null
+++ b/config/metrics/counts_all/20210216180111_projects_redmine_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_redmine_active
+description: Count of projects with active integrations for Redmine
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180113_groups_redmine_active.yml b/config/metrics/counts_all/20210216180113_groups_redmine_active.yml
new file mode 100644
index 00000000000..a3e68fd6d1a
--- /dev/null
+++ b/config/metrics/counts_all/20210216180113_groups_redmine_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_redmine_active
+description: Count of groups with active integrations for Redmine
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180115_templates_redmine_active.yml b/config/metrics/counts_all/20210216180115_templates_redmine_active.yml
new file mode 100644
index 00000000000..b0000ba32df
--- /dev/null
+++ b/config/metrics/counts_all/20210216180115_templates_redmine_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_redmine_active
+description: Count of active service templates for Redmine
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180116_instances_redmine_active.yml b/config/metrics/counts_all/20210216180116_instances_redmine_active.yml
new file mode 100644
index 00000000000..c3c0012e205
--- /dev/null
+++ b/config/metrics/counts_all/20210216180116_instances_redmine_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_redmine_active
+description: Count of active instance-level integrations for Redmine
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml b/config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml
new file mode 100644
index 00000000000..85ecfafcc70
--- /dev/null
+++ b/config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_redmine_active
+description: Count of active projects inheriting integrations for Redmine
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml b/config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml
new file mode 100644
index 00000000000..a929408e5da
--- /dev/null
+++ b/config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_redmine_active
+description: Count of active groups inheriting integrations for Redmine
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180122_projects_slack_active.yml b/config/metrics/counts_all/20210216180122_projects_slack_active.yml
new file mode 100644
index 00000000000..2b6b06e97d9
--- /dev/null
+++ b/config/metrics/counts_all/20210216180122_projects_slack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_slack_active
+description: Count of projects with active integrations for Slack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180124_groups_slack_active.yml b/config/metrics/counts_all/20210216180124_groups_slack_active.yml
new file mode 100644
index 00000000000..60175f2861f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180124_groups_slack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_slack_active
+description: Count of groups with active integrations for Slack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180126_templates_slack_active.yml b/config/metrics/counts_all/20210216180126_templates_slack_active.yml
new file mode 100644
index 00000000000..3fe78e3b847
--- /dev/null
+++ b/config/metrics/counts_all/20210216180126_templates_slack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_slack_active
+description: Count of active service templates for Slack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180127_instances_slack_active.yml b/config/metrics/counts_all/20210216180127_instances_slack_active.yml
new file mode 100644
index 00000000000..cb98faf7494
--- /dev/null
+++ b/config/metrics/counts_all/20210216180127_instances_slack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_slack_active
+description: Count of active instance-level integrations for Slack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml b/config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml
new file mode 100644
index 00000000000..4f5613fb904
--- /dev/null
+++ b/config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_slack_active
+description: Count of active projects inheriting integrations for Slack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml b/config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml
new file mode 100644
index 00000000000..780104bd60e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_slack_active
+description: Count of active groups inheriting integrations for Slack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml
new file mode 100644
index 00000000000..e2ae91c83ce
--- /dev/null
+++ b/config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_slack_slash_commands_active
+description: Count of projects with active integrations for Slack (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml
new file mode 100644
index 00000000000..0850c45bcc1
--- /dev/null
+++ b/config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_slack_slash_commands_active
+description: Count of groups with active integrations for Slack (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml
new file mode 100644
index 00000000000..b68cee5b004
--- /dev/null
+++ b/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_slack_slash_commands_active
+description: Count of active service templates for Slack (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml
new file mode 100644
index 00000000000..c629bbe7b81
--- /dev/null
+++ b/config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_slack_slash_commands_active
+description: Count of active instance-level integrations for Slack (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml
new file mode 100644
index 00000000000..5fbba405579
--- /dev/null
+++ b/config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_slack_slash_commands_active
+description: Count of active projects inheriting integrations for Slack (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml
new file mode 100644
index 00000000000..96cc7b0bcaa
--- /dev/null
+++ b/config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_slack_slash_commands_active
+description: Count of active groups inheriting integrations for Slack (slash commands)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml b/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml
new file mode 100644
index 00000000000..482360e0c87
--- /dev/null
+++ b/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_teamcity_active
+description: Count of projects with active integrations for Teamcity CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml b/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml
new file mode 100644
index 00000000000..efaf3b72f08
--- /dev/null
+++ b/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_teamcity_active
+description: Count of groups with active integrations for Teamcity CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml b/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml
new file mode 100644
index 00000000000..8fe6f5997f3
--- /dev/null
+++ b/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_teamcity_active
+description: Count of active service templates for Teamcity CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml b/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml
new file mode 100644
index 00000000000..52f6d89497d
--- /dev/null
+++ b/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_teamcity_active
+description: Count of active instance-level integrations for Teamcity CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml b/config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml
new file mode 100644
index 00000000000..e8ea1ffb556
--- /dev/null
+++ b/config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_teamcity_active
+description: Count of active projects inheriting integrations for Teamcity CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml b/config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml
new file mode 100644
index 00000000000..4656bda6da0
--- /dev/null
+++ b/config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_teamcity_active
+description: Count of active groups inheriting integrations for Teamcity CI
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml b/config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml
new file mode 100644
index 00000000000..4d783cd061f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_unify_circuit_active
+description: Count of projects with active integrations for Unifiy Circuit
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml b/config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml
new file mode 100644
index 00000000000..074ab951200
--- /dev/null
+++ b/config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_unify_circuit_active
+description: Count of groups with active integrations for Unifiy Circuit
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml b/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml
new file mode 100644
index 00000000000..99f54dfa276
--- /dev/null
+++ b/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_unify_circuit_active
+description: Count of active service templates for Unifiy Circuit
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml b/config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml
new file mode 100644
index 00000000000..0ca2893868c
--- /dev/null
+++ b/config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_unify_circuit_active
+description: Count of active instance-level integrations for Unifiy Circuit
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml b/config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml
new file mode 100644
index 00000000000..30172dcac3f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_unify_circuit_active
+description: Count of active projects inheriting integrations for Unifiy Circuit
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml b/config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml
new file mode 100644
index 00000000000..4334a352566
--- /dev/null
+++ b/config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_unify_circuit_active
+description: Count of active groups inheriting integrations for Unifiy Circuit
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml b/config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml
new file mode 100644
index 00000000000..7590bf98d81
--- /dev/null
+++ b/config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_webex_teams_active
+description: Count of projects with active integrations for Webex Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml b/config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml
new file mode 100644
index 00000000000..15f4ccda503
--- /dev/null
+++ b/config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_webex_teams_active
+description: Count of groups with active integrations for Webex Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml b/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml
new file mode 100644
index 00000000000..36d21424329
--- /dev/null
+++ b/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_webex_teams_active
+description: Count of active service templates for Webex Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml b/config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml
new file mode 100644
index 00000000000..0b66249713b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_webex_teams_active
+description: Count of active instance-level integrations for Webex Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml b/config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml
new file mode 100644
index 00000000000..b1b91278215
--- /dev/null
+++ b/config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_webex_teams_active
+description: Count of active projects inheriting integrations for Webex Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml b/config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml
new file mode 100644
index 00000000000..bd1986796d7
--- /dev/null
+++ b/config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_webex_teams_active
+description: Count of active groups inheriting integrations for Webex Teams
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml b/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml
new file mode 100644
index 00000000000..1225d494f77
--- /dev/null
+++ b/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_youtrack_active
+description: Count of projects with active integrations for YouTrack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml b/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml
new file mode 100644
index 00000000000..47389011bcf
--- /dev/null
+++ b/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_youtrack_active
+description: Count of groups with active integrations for YouTrack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml b/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml
new file mode 100644
index 00000000000..c89c8602877
--- /dev/null
+++ b/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_youtrack_active
+description: Count of active service templates for YouTrack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml b/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml
new file mode 100644
index 00000000000..a5316c15120
--- /dev/null
+++ b/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_youtrack_active
+description: Count of active instance-level integrations for YouTrack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml b/config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml
new file mode 100644
index 00000000000..982ad4dfdad
--- /dev/null
+++ b/config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_youtrack_active
+description: Count of active projects inheriting integrations for YouTrack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml b/config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml
new file mode 100644
index 00000000000..2a86d74ebf3
--- /dev/null
+++ b/config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_youtrack_active
+description: Count of active groups inheriting integrations for YouTrack
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180228_projects_jira_server_active.yml b/config/metrics/counts_all/20210216180228_projects_jira_server_active.yml
new file mode 100644
index 00000000000..88d0d954780
--- /dev/null
+++ b/config/metrics/counts_all/20210216180228_projects_jira_server_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_jira_server_active
+description: Count of active integrations with Jira Software (server)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml b/config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml
new file mode 100644
index 00000000000..d2a5cfc062c
--- /dev/null
+++ b/config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_jira_cloud_active
+description: Count of active integrations with Jira Cloud (Saas)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml b/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml
new file mode 100644
index 00000000000..aa362c989de
--- /dev/null
+++ b/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_jira_dvcs_cloud_active
+description: Count of active integrations with Jira Cloud (DVCS Connector)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml b/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml
new file mode 100644
index 00000000000..fb3df0de122
--- /dev/null
+++ b/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_jira_dvcs_server_active
+description: Count of active integrations with Jira Software (DVCS connector)
+product_section: dev
+product_stage: create
+product_group: group::ecosystem
+product_category: integrations
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180239_personal_snippets.yml b/config/metrics/counts_all/20210216180239_personal_snippets.yml
new file mode 100644
index 00000000000..1578c3264f3
--- /dev/null
+++ b/config/metrics/counts_all/20210216180239_personal_snippets.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.personal_snippets
+description: Count of Personal Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180241_project_snippets.yml b/config/metrics/counts_all/20210216180241_project_snippets.yml
new file mode 100644
index 00000000000..f30757e4137
--- /dev/null
+++ b/config/metrics/counts_all/20210216180241_project_snippets.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.project_snippets
+description: Count of Project Snippetss
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180242_web_ide_commits.yml b/config/metrics/counts_all/20210216180242_web_ide_commits.yml
new file mode 100644
index 00000000000..33566cf602f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180242_web_ide_commits.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.web_ide_commits
+description: Count of Commits made from Web IDE
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180244_web_ide_views.yml b/config/metrics/counts_all/20210216180244_web_ide_views.yml
new file mode 100644
index 00000000000..5f94d706cdd
--- /dev/null
+++ b/config/metrics/counts_all/20210216180244_web_ide_views.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.web_ide_views
+description: Count of Views of the Web IDE
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml b/config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml
new file mode 100644
index 00000000000..2df821ee8ad
--- /dev/null
+++ b/config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.web_ide_merge_requests
+description: Count of Merge Requests created from Web IDE
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180248_web_ide_previews.yml b/config/metrics/counts_all/20210216180248_web_ide_previews.yml
new file mode 100644
index 00000000000..854fe84155e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180248_web_ide_previews.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.web_ide_previews
+description: Count of Live Preview tab views in Web IDE
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180250_web_ide_terminals.yml b/config/metrics/counts_all/20210216180250_web_ide_terminals.yml
new file mode 100644
index 00000000000..8860a73c262
--- /dev/null
+++ b/config/metrics/counts_all/20210216180250_web_ide_terminals.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.web_ide_terminals
+description: Count of Web Terminal Tab views in Web IDE
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml b/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml
new file mode 100644
index 00000000000..229a4000fde
--- /dev/null
+++ b/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.web_ide_pipelines
+description: Count of Pipeline tab views in Web IDE
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180253_snippet_comment.yml b/config/metrics/counts_all/20210216180253_snippet_comment.yml
new file mode 100644
index 00000000000..86353b84645
--- /dev/null
+++ b/config/metrics/counts_all/20210216180253_snippet_comment.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.snippet_comment
+description: Count of comments on Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180255_snippet_create.yml b/config/metrics/counts_all/20210216180255_snippet_create.yml
new file mode 100644
index 00000000000..5b527992d12
--- /dev/null
+++ b/config/metrics/counts_all/20210216180255_snippet_create.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.snippet_create
+description: Count of newly created Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180257_snippet_update.yml b/config/metrics/counts_all/20210216180257_snippet_update.yml
new file mode 100644
index 00000000000..2c909d8a9fc
--- /dev/null
+++ b/config/metrics/counts_all/20210216180257_snippet_update.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.snippet_update
+description: Count of updates to existing Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180259_static_site_editor_views.yml b/config/metrics/counts_all/20210216180259_static_site_editor_views.yml
new file mode 100644
index 00000000000..e5836202a74
--- /dev/null
+++ b/config/metrics/counts_all/20210216180259_static_site_editor_views.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.static_site_editor_views
+description:
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: static_site_editor
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180301_static_site_editor_commits.yml b/config/metrics/counts_all/20210216180301_static_site_editor_commits.yml
new file mode 100644
index 00000000000..5dc21447e37
--- /dev/null
+++ b/config/metrics/counts_all/20210216180301_static_site_editor_commits.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.static_site_editor_commits
+description: Count of commits created via Static Site Editor
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: static_site_editor
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml b/config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml
new file mode 100644
index 00000000000..3e38b9f8f7b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.static_site_editor_merge_requests
+description: Count of merge requests created via Static Site Editor
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: static_site_editor
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml b/config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml
new file mode 100644
index 00000000000..2223e4b2e46
--- /dev/null
+++ b/config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.user_preferences_user_gitpod_enabled
+description: Count all users with their GitPod setting enabled
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: editor_extension
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180306_snippets.yml b/config/metrics/counts_all/20210216180306_snippets.yml
new file mode 100644
index 00000000000..213e61e2d0f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180306_snippets.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.snippets
+description: Count of all Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180316_snippets.yml b/config/metrics/counts_all/20210216180316_snippets.yml
new file mode 100644
index 00000000000..8c829055aa0
--- /dev/null
+++ b/config/metrics/counts_all/20210216180316_snippets.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.create.snippets
+description: Snippets
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: snippets
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180344_api_fuzzing_jobs.yml b/config/metrics/counts_all/20210216180344_api_fuzzing_jobs.yml
new file mode 100644
index 00000000000..31d9650c54e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180344_api_fuzzing_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.api_fuzzing_jobs
+description: Count of API Fuzzing jobs run by job name
+product_section: sec
+product_stage: secure
+product_group: group::fuzz testing
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180346_api_fuzzing_dnd_jobs.yml b/config/metrics/counts_all/20210216180346_api_fuzzing_dnd_jobs.yml
new file mode 100644
index 00000000000..deef6c0f6d4
--- /dev/null
+++ b/config/metrics/counts_all/20210216180346_api_fuzzing_dnd_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.api_fuzzing_dnd_jobs
+description: Count of API Fuzzing `docker-in-docker` jobs run by job name
+product_section: sec
+product_stage: secure
+product_group: group::fuzz testing
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180348_user_api_fuzzing_jobs.yml b/config/metrics/counts_all/20210216180348_user_api_fuzzing_jobs.yml
new file mode 100644
index 00000000000..ab35c608bcb
--- /dev/null
+++ b/config/metrics/counts_all/20210216180348_user_api_fuzzing_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.secure.user_api_fuzzing_jobs
+description: Count of API Fuzzing jobs by job name
+product_section: sec
+product_stage: secure
+product_group: group::fuzz testing
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180350_user_api_fuzzing_dnd_jobs.yml b/config/metrics/counts_all/20210216180350_user_api_fuzzing_dnd_jobs.yml
new file mode 100644
index 00000000000..04b1177dacf
--- /dev/null
+++ b/config/metrics/counts_all/20210216180350_user_api_fuzzing_dnd_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.secure.user_api_fuzzing_dnd_jobs
+description: Count of API Fuzzing `docker-in-docker` jobs by job name
+product_section: sec
+product_stage: secure
+product_group: group::fuzz testing
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180410_pool_repositories.yml b/config/metrics/counts_all/20210216180410_pool_repositories.yml
new file mode 100644
index 00000000000..57922524ccf
--- /dev/null
+++ b/config/metrics/counts_all/20210216180410_pool_repositories.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.pool_repositories
+description: Count of unique object pool repositories for fork deduplication
+product_section: dev
+product_stage: create
+product_group: group::gitaly
+product_category: gitaly
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180413_all_searches.yml b/config/metrics/counts_all/20210216180413_all_searches.yml
new file mode 100644
index 00000000000..6248b096663
--- /dev/null
+++ b/config/metrics/counts_all/20210216180413_all_searches.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.all_searches
+description: Total Searches for All Basic Search and Advanced Search in self-managed
+ and SaaS
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+value_type: number
+status: data_available
+time_frame: all
+data_source: redis
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216180414_navbar_searches.yml b/config/metrics/counts_all/20210216180414_navbar_searches.yml
new file mode 100644
index 00000000000..1eb21d02f9d
--- /dev/null
+++ b/config/metrics/counts_all/20210216180414_navbar_searches.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.navbar_searches
+description: Total Searches using the navbar for All Basic Search and Advanced Search in self-managed
+ and SaaS
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+value_type: number
+status: data_available
+time_frame: all
+data_source: redis
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216180416_i_search_total.yml b/config/metrics/counts_all/20210216180416_i_search_total.yml
new file mode 100644
index 00000000000..2c59b083293
--- /dev/null
+++ b/config/metrics/counts_all/20210216180416_i_search_total.yml
@@ -0,0 +1,18 @@
+---
+key_path: search_unique_visits.i_search_total
+description: Calculated unique users to perform Basic or Advanced searches by week
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+value_type: number
+status: data_available
+time_frame: all
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216180420_i_search_paid.yml b/config/metrics/counts_all/20210216180420_i_search_paid.yml
new file mode 100644
index 00000000000..96917c0539b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180420_i_search_paid.yml
@@ -0,0 +1,18 @@
+---
+key_path: search_unique_visits.i_search_paid
+description: Calculated unique users to perform a search with a paid license enabled by week
+product_section: enablement
+product_stage: enablement
+product_group: group::global search
+product_category: global_search
+value_type: number
+status: data_available
+time_frame: all
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml b/config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml
new file mode 100644
index 00000000000..a8e4acaae15
--- /dev/null
+++ b/config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.issues_created_from_gitlab_error_tracking_ui
+description: Count of issues manually created from the GitLab UI on Sentry errors
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: error_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml b/config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml
new file mode 100644
index 00000000000..f1ab4c0cec1
--- /dev/null
+++ b/config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.issues_with_associated_zoom_link
+description: Count of issues where a user has linked a Zoom meeting
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml b/config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml
new file mode 100644
index 00000000000..403cd2ecbcb
--- /dev/null
+++ b/config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml
@@ -0,0 +1,20 @@
+---
+key_path: counts.issues_using_zoom_quick_actions
+description: Count of issues where a user have added AND removed a zoom meeting using
+ slash commands
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml b/config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml
new file mode 100644
index 00000000000..3dcf3754cd8
--- /dev/null
+++ b/config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.issues_with_embedded_grafana_charts_approx
+description: Count of issues where a user has embedded a Grafana chart
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml b/config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml
new file mode 100644
index 00000000000..a032f8a2a33
--- /dev/null
+++ b/config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.issues_created_from_alerts
+description: Count of issues created automatically on alerts from GitLab-Managed Prometheus
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml b/config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml
new file mode 100644
index 00000000000..ca9cfc92d0e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.issues_created_gitlab_alerts
+description: Count of all issues created from GitLab alerts (bot and non-bot)
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml b/config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml
new file mode 100644
index 00000000000..02ca2d6499e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.issues_created_manually_from_alerts
+description: Count of issues created manually by non-bot users from GitLab alerts
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180447_incident_issues.yml b/config/metrics/counts_all/20210216180447_incident_issues.yml
new file mode 100644
index 00000000000..9d348fc5a3d
--- /dev/null
+++ b/config/metrics/counts_all/20210216180447_incident_issues.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.incident_issues
+description: Count of incidents (issues where issue_type=incident)
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml b/config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml
new file mode 100644
index 00000000000..e7b7e2c801b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.alert_bot_incident_issues
+description: Count of issues created by the alert bot automatically
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml b/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml
new file mode 100644
index 00000000000..4db557d00c4
--- /dev/null
+++ b/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.incident_labeled_issues
+description: Count of all issues with the label=incident
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml b/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml
new file mode 100644
index 00000000000..3fbbbdece3d
--- /dev/null
+++ b/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_creating_incidents
+description: Counts of Projects that have created incidents
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml b/config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml
new file mode 100644
index 00000000000..4bdec4be171
--- /dev/null
+++ b/config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_with_error_tracking_enabled
+description: Count of projects that have enabled Error tracking via Sentry
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: error_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml b/config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml
new file mode 100644
index 00000000000..7f7c3b4d91a
--- /dev/null
+++ b/config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_with_alerts_service_enabled
+description: Count of projects that have enabled the Alerts service
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml b/config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml
new file mode 100644
index 00000000000..4fe6799d027
--- /dev/null
+++ b/config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_alerts_created
+description: Count of projects with alerts created in given time period
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: alert_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml b/config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml
new file mode 100644
index 00000000000..e850bb6c2a8
--- /dev/null
+++ b/config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_enabled_alert_integrations
+description: Count of projects with at least 1 enabled integration
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml b/config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml
new file mode 100644
index 00000000000..e1c1bfafe31
--- /dev/null
+++ b/config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.status_page_incident_publishes
+description: Cumulative count of usages of publish operation
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml b/config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml
new file mode 100644
index 00000000000..db3e1c12b7b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.status_page_incident_unpublishes
+description: Cumulative count of usages of unpublish operation
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180506_status_page_projects.yml b/config/metrics/counts_all/20210216180506_status_page_projects.yml
new file mode 100644
index 00000000000..5ff16f3dd47
--- /dev/null
+++ b/config/metrics/counts_all/20210216180506_status_page_projects.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.status_page_projects
+description: Projects with status page enabled
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180507_status_page_issues.yml b/config/metrics/counts_all/20210216180507_status_page_issues.yml
new file mode 100644
index 00000000000..5db63243d35
--- /dev/null
+++ b/config/metrics/counts_all/20210216180507_status_page_issues.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.status_page_issues
+description: Issues published to a Status Page
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml b/config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml
new file mode 100644
index 00000000000..c064e33f30a
--- /dev/null
+++ b/config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.projects_with_error_tracking_enabled
+description: Projects where error tracking is enabled
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: error_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180518_projects_with_incidents.yml b/config/metrics/counts_all/20210216180518_projects_with_incidents.yml
new file mode 100644
index 00000000000..bbedec31c43
--- /dev/null
+++ b/config/metrics/counts_all/20210216180518_projects_with_incidents.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.projects_with_incidents
+description: Count of unique projects with an incident
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml b/config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml
new file mode 100644
index 00000000000..87e013bdcb5
--- /dev/null
+++ b/config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.projects_with_alert_incidents
+description: Count of unique projects with an incident from an alert
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml b/config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml
new file mode 100644
index 00000000000..84a828a467b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.projects_incident_sla_enabled
+description: Projects where Incident SLA is enabled
+product_section: ops
+product_stage: monitor
+product_group: group::health
+product_category: error_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180628_projects_imported_from_github.yml b/config/metrics/counts_all/20210216180628_projects_imported_from_github.yml
new file mode 100644
index 00000000000..47c20ec6cfb
--- /dev/null
+++ b/config/metrics/counts_all/20210216180628_projects_imported_from_github.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_imported_from_github
+description:
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180630_projects_imported_from_github.yml b/config/metrics/counts_all/20210216180630_projects_imported_from_github.yml
new file mode 100644
index 00000000000..893b92b1f12
--- /dev/null
+++ b/config/metrics/counts_all/20210216180630_projects_imported_from_github.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.projects_imported_from_github
+description:
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180632_unique_users_all_imports.yml b/config/metrics/counts_all/20210216180632_unique_users_all_imports.yml
new file mode 100644
index 00000000000..f8629496cb6
--- /dev/null
+++ b/config/metrics/counts_all/20210216180632_unique_users_all_imports.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.unique_users_all_imports
+description: Distinct count of users that triggered any kind of import
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180634_gitlab.yml b/config/metrics/counts_all/20210216180634_gitlab.yml
new file mode 100644
index 00000000000..b4a2e2454d0
--- /dev/null
+++ b/config/metrics/counts_all/20210216180634_gitlab.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.manage.bulk_imports.gitlab
+description: Distinct count of users that triggered an import using the Group Migration
+ tool
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180636_gitlab_v1.yml b/config/metrics/counts_all/20210216180636_gitlab_v1.yml
new file mode 100644
index 00000000000..1c4fa2c62fe
--- /dev/null
+++ b/config/metrics/counts_all/20210216180636_gitlab_v1.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.bulk_imports.gitlab_v1
+description: Count of imports using GitLab Migration
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180638_gitlab_project.yml b/config/metrics/counts_all/20210216180638_gitlab_project.yml
new file mode 100644
index 00000000000..a9d167f7363
--- /dev/null
+++ b/config/metrics/counts_all/20210216180638_gitlab_project.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.gitlab_project
+description: Count of projects imported using Project Import/Export
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180639_gitlab.yml b/config/metrics/counts_all/20210216180639_gitlab.yml
new file mode 100644
index 00000000000..3fef2ce3b85
--- /dev/null
+++ b/config/metrics/counts_all/20210216180639_gitlab.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.gitlab
+description: Count of projects imported from GitLab.com
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180641_github.yml b/config/metrics/counts_all/20210216180641_github.yml
new file mode 100644
index 00000000000..530e9b05e14
--- /dev/null
+++ b/config/metrics/counts_all/20210216180641_github.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.github
+description: Count of projects imported from GitHub
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180643_bitbucket.yml b/config/metrics/counts_all/20210216180643_bitbucket.yml
new file mode 100644
index 00000000000..6490c8ffb55
--- /dev/null
+++ b/config/metrics/counts_all/20210216180643_bitbucket.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.bitbucket
+description: Count of projects imported from Bitbucket
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180645_bitbucket_server.yml b/config/metrics/counts_all/20210216180645_bitbucket_server.yml
new file mode 100644
index 00000000000..bfbee0b3433
--- /dev/null
+++ b/config/metrics/counts_all/20210216180645_bitbucket_server.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.bitbucket_server
+description: Count of projects imported from Bitbucket Server
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180647_gitea.yml b/config/metrics/counts_all/20210216180647_gitea.yml
new file mode 100644
index 00000000000..74b4fd36714
--- /dev/null
+++ b/config/metrics/counts_all/20210216180647_gitea.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.gitea
+description: Count of projects imported from Gitea
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180649_git.yml b/config/metrics/counts_all/20210216180649_git.yml
new file mode 100644
index 00000000000..b7dd7ca8d7e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180649_git.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.git
+description: Count of projects imported by URL
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180650_manifest.yml b/config/metrics/counts_all/20210216180650_manifest.yml
new file mode 100644
index 00000000000..4ef7823ee67
--- /dev/null
+++ b/config/metrics/counts_all/20210216180650_manifest.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.manifest
+description: Count of projects imported using manifst file
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180652_gitlab_migration.yml b/config/metrics/counts_all/20210216180652_gitlab_migration.yml
new file mode 100644
index 00000000000..3df4472c9a7
--- /dev/null
+++ b/config/metrics/counts_all/20210216180652_gitlab_migration.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.project_imports.gitlab_migration
+description: Count of projects imported using GitLab Migration
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180654_jira.yml b/config/metrics/counts_all/20210216180654_jira.yml
new file mode 100644
index 00000000000..6e72bc630bd
--- /dev/null
+++ b/config/metrics/counts_all/20210216180654_jira.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.issue_imports.jira
+description: Count of projects imported from Jira
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180656_fogbugz.yml b/config/metrics/counts_all/20210216180656_fogbugz.yml
new file mode 100644
index 00000000000..8a52d04b615
--- /dev/null
+++ b/config/metrics/counts_all/20210216180656_fogbugz.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.issue_imports.fogbugz
+description: Count of projects imported from fogbugz
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180658_phabricator.yml b/config/metrics/counts_all/20210216180658_phabricator.yml
new file mode 100644
index 00000000000..51559f87ae2
--- /dev/null
+++ b/config/metrics/counts_all/20210216180658_phabricator.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.issue_imports.phabricator
+description: Count of projects imported from phabricator
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180700_csv.yml b/config/metrics/counts_all/20210216180700_csv.yml
new file mode 100644
index 00000000000..bed309794eb
--- /dev/null
+++ b/config/metrics/counts_all/20210216180700_csv.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.issue_imports.csv
+description: Count of (attempted) imports from csv files
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180702_group_import.yml b/config/metrics/counts_all/20210216180702_group_import.yml
new file mode 100644
index 00000000000..109a722738e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180702_group_import.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.group_imports.group_import
+description: Count of group imports using Group Import/Export
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180703_gitlab_migration.yml b/config/metrics/counts_all/20210216180703_gitlab_migration.yml
new file mode 100644
index 00000000000..74c7e66adfc
--- /dev/null
+++ b/config/metrics/counts_all/20210216180703_gitlab_migration.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.group_imports.gitlab_migration
+description: Count of groups imported using GitLab Migration
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180705_total.yml b/config/metrics/counts_all/20210216180705_total.yml
new file mode 100644
index 00000000000..9e6c83593d5
--- /dev/null
+++ b/config/metrics/counts_all/20210216180705_total.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.total
+description: Total count of all projects imported with import_source NOT NULL
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180707_gitlab_project.yml b/config/metrics/counts_all/20210216180707_gitlab_project.yml
new file mode 100644
index 00000000000..173e20245ae
--- /dev/null
+++ b/config/metrics/counts_all/20210216180707_gitlab_project.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.gitlab_project
+description: 'Distinct count of users that imported projects using Project Import/Export '
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180709_gitlab.yml b/config/metrics/counts_all/20210216180709_gitlab.yml
new file mode 100644
index 00000000000..fee163d2728
--- /dev/null
+++ b/config/metrics/counts_all/20210216180709_gitlab.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.gitlab
+description: 'Distinct count of users that imported projects from GitLab.com '
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180711_github.yml b/config/metrics/counts_all/20210216180711_github.yml
new file mode 100644
index 00000000000..9e701f04fe3
--- /dev/null
+++ b/config/metrics/counts_all/20210216180711_github.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.github
+description: Distinct count of users that imported projects from GitHub
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180713_bitbucket.yml b/config/metrics/counts_all/20210216180713_bitbucket.yml
new file mode 100644
index 00000000000..f9aea1fd773
--- /dev/null
+++ b/config/metrics/counts_all/20210216180713_bitbucket.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.bitbucket
+description: 'Distinct count of users that imported projects from Bitbucket Cloud '
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180715_bitbucket_server.yml b/config/metrics/counts_all/20210216180715_bitbucket_server.yml
new file mode 100644
index 00000000000..e9f46e2af33
--- /dev/null
+++ b/config/metrics/counts_all/20210216180715_bitbucket_server.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.bitbucket_server
+description: 'Distinct count of users that imported projects from Bitbucket Server '
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180716_gitea.yml b/config/metrics/counts_all/20210216180716_gitea.yml
new file mode 100644
index 00000000000..4ff1f0c2aef
--- /dev/null
+++ b/config/metrics/counts_all/20210216180716_gitea.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.gitea
+description: 'Distinct count of users that imported projects from Gitea '
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180718_git.yml b/config/metrics/counts_all/20210216180718_git.yml
new file mode 100644
index 00000000000..c36d2ce4d42
--- /dev/null
+++ b/config/metrics/counts_all/20210216180718_git.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.git
+description: 'Distinct count of users that imported projects using Import by URL '
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180720_manifest.yml b/config/metrics/counts_all/20210216180720_manifest.yml
new file mode 100644
index 00000000000..c5d35a9707b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180720_manifest.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.projects_imported.manifest
+description: 'Distinct count of users that imported projects using Manifest file '
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180722_jira.yml b/config/metrics/counts_all/20210216180722_jira.yml
new file mode 100644
index 00000000000..ac462893331
--- /dev/null
+++ b/config/metrics/counts_all/20210216180722_jira.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.issues_imported.jira
+description: Distinct count of users that imported issues into projects using Jira
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180724_fogbugz.yml b/config/metrics/counts_all/20210216180724_fogbugz.yml
new file mode 100644
index 00000000000..2224b5dd717
--- /dev/null
+++ b/config/metrics/counts_all/20210216180724_fogbugz.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.issues_imported.fogbugz
+description: 'Distinct count of users that imported issues into projects using FogBugz '
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180726_phabricator.yml b/config/metrics/counts_all/20210216180726_phabricator.yml
new file mode 100644
index 00000000000..a735d6f5cdb
--- /dev/null
+++ b/config/metrics/counts_all/20210216180726_phabricator.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.issues_imported.phabricator
+description: Distinct count of users that imported issues into projects using Phabricator
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180727_csv.yml b/config/metrics/counts_all/20210216180727_csv.yml
new file mode 100644
index 00000000000..5a06c5e8238
--- /dev/null
+++ b/config/metrics/counts_all/20210216180727_csv.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.manage.issues_imported.csv
+description: Distinct count of users that imported issues into projects using CSV
+ upload
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180729_groups_imported.yml b/config/metrics/counts_all/20210216180729_groups_imported.yml
new file mode 100644
index 00000000000..2d0e40959b1
--- /dev/null
+++ b/config/metrics/counts_all/20210216180729_groups_imported.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.groups_imported
+description: Distinct count of users that imported groups using Group Import
+product_section: dev
+product_stage: manage
+product_group: group::import
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180734_wiki_pages_create.yml b/config/metrics/counts_all/20210216180734_wiki_pages_create.yml
new file mode 100644
index 00000000000..cd69803d569
--- /dev/null
+++ b/config/metrics/counts_all/20210216180734_wiki_pages_create.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.wiki_pages_create
+description:
+product_section: dev
+product_stage: create
+product_group: group::knowledge
+product_category: wiki
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180736_wiki_pages_update.yml b/config/metrics/counts_all/20210216180736_wiki_pages_update.yml
new file mode 100644
index 00000000000..ee44817090a
--- /dev/null
+++ b/config/metrics/counts_all/20210216180736_wiki_pages_update.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.wiki_pages_update
+description:
+product_section: dev
+product_stage: create
+product_group: group::knowledge
+product_category: wiki
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml b/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml
new file mode 100644
index 00000000000..a7670d1578b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.wiki_pages_delete
+description:
+product_section: dev
+product_stage: create
+product_group: group::knowledge
+product_category: wiki
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180740_design_management_designs_create.yml b/config/metrics/counts_all/20210216180740_design_management_designs_create.yml
new file mode 100644
index 00000000000..1968f26c08e
--- /dev/null
+++ b/config/metrics/counts_all/20210216180740_design_management_designs_create.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.design_management_designs_create
+description:
+product_section: dev
+product_stage: create
+product_group: group::knowledge
+product_category: design_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180741_design_management_designs_update.yml b/config/metrics/counts_all/20210216180741_design_management_designs_update.yml
new file mode 100644
index 00000000000..087afae23ad
--- /dev/null
+++ b/config/metrics/counts_all/20210216180741_design_management_designs_update.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.design_management_designs_update
+description:
+product_section: dev
+product_stage: create
+product_group: group::knowledge
+product_category: design_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180743_design_management_designs_delete.yml b/config/metrics/counts_all/20210216180743_design_management_designs_delete.yml
new file mode 100644
index 00000000000..874e5a60243
--- /dev/null
+++ b/config/metrics/counts_all/20210216180743_design_management_designs_delete.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.design_management_designs_delete
+description:
+product_section: dev
+product_stage: create
+product_group: group::knowledge
+product_category: design_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180750_groups.yml b/config/metrics/counts_all/20210216180750_groups.yml
new file mode 100644
index 00000000000..e236c4b89a8
--- /dev/null
+++ b/config/metrics/counts_all/20210216180750_groups.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups
+description: Total count of groups as of usage ping snapshot
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category: subgroups
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180752_keys.yml b/config/metrics/counts_all/20210216180752_keys.yml
new file mode 100644
index 00000000000..4374ebcb9c1
--- /dev/null
+++ b/config/metrics/counts_all/20210216180752_keys.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.keys
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category: authentication_and_authorization
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180754_events.yml b/config/metrics/counts_all/20210216180754_events.yml
new file mode 100644
index 00000000000..e580df4d511
--- /dev/null
+++ b/config/metrics/counts_all/20210216180754_events.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.manage.events
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180756_groups.yml b/config/metrics/counts_all/20210216180756_groups.yml
new file mode 100644
index 00000000000..e789713fc31
--- /dev/null
+++ b/config/metrics/counts_all/20210216180756_groups.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.groups
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180758_users_created.yml b/config/metrics/counts_all/20210216180758_users_created.yml
new file mode 100644
index 00000000000..1e722716546
--- /dev/null
+++ b/config/metrics/counts_all/20210216180758_users_created.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.users_created
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180800_ldap_keys.yml b/config/metrics/counts_all/20210216180800_ldap_keys.yml
new file mode 100644
index 00000000000..b3c97800b9b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180800_ldap_keys.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.ldap_keys
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180801_ldap_users.yml b/config/metrics/counts_all/20210216180801_ldap_users.yml
new file mode 100644
index 00000000000..075189ba9b7
--- /dev/null
+++ b/config/metrics/counts_all/20210216180801_ldap_users.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.ldap_users
+description:
+product_section: dev
+product_stage:
+product_group: group::manage
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180843_provider.yml b/config/metrics/counts_all/20210216180843_provider.yml
new file mode 100644
index 00000000000..002fb0e7186
--- /dev/null
+++ b/config/metrics/counts_all/20210216180843_provider.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.artifacts.object_store.provider
+description: What Object Storage provider has been configured for Artifacts
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180852_provider.yml b/config/metrics/counts_all/20210216180852_provider.yml
new file mode 100644
index 00000000000..0b22e1ce412
--- /dev/null
+++ b/config/metrics/counts_all/20210216180852_provider.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.external_diffs.object_store.provider
+description: What Object Storage provider has been configured for External Diffs
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180902_provider.yml b/config/metrics/counts_all/20210216180902_provider.yml
new file mode 100644
index 00000000000..e5752e274b7
--- /dev/null
+++ b/config/metrics/counts_all/20210216180902_provider.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.lfs.object_store.provider
+description: What Object Storage provider has been configured for LFS
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180903_enabled.yml b/config/metrics/counts_all/20210216180903_enabled.yml
new file mode 100644
index 00000000000..cc97f1fbacc
--- /dev/null
+++ b/config/metrics/counts_all/20210216180903_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.uploads.enabled
+description: Whether Object Storage is enabled for Uploads
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180911_provider.yml b/config/metrics/counts_all/20210216180911_provider.yml
new file mode 100644
index 00000000000..53286df6724
--- /dev/null
+++ b/config/metrics/counts_all/20210216180911_provider.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.uploads.object_store.provider
+description: What Object Storage provider has been configured for Uploads
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180920_provider.yml b/config/metrics/counts_all/20210216180920_provider.yml
new file mode 100644
index 00000000000..133b65f6d51
--- /dev/null
+++ b/config/metrics/counts_all/20210216180920_provider.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.packages.object_store.provider
+description: What Object Storage provider has been configured for Packages
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180922_duration_s.yml b/config/metrics/counts_all/20210216180922_duration_s.yml
new file mode 100644
index 00000000000..2ddbd1f25e8
--- /dev/null
+++ b/config/metrics/counts_all/20210216180922_duration_s.yml
@@ -0,0 +1,19 @@
+---
+key_path: topology.duration_s
+description: Time it took to collect topology data
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: prometheus
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180924_failures.yml b/config/metrics/counts_all/20210216180924_failures.yml
new file mode 100644
index 00000000000..0706ffc7e7f
--- /dev/null
+++ b/config/metrics/counts_all/20210216180924_failures.yml
@@ -0,0 +1,19 @@
+---
+key_path: topology.failures
+description: Contains information about failed queries
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: prometheus
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml b/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml
new file mode 100644
index 00000000000..09816e1b0f1
--- /dev/null
+++ b/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.grafana_integrated_projects
+description:
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml b/config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml
new file mode 100644
index 00000000000..6ce96c5750d
--- /dev/null
+++ b/config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_tracing_enabled
+description: Projects with tracing enabled
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: tracing
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml b/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml
new file mode 100644
index 00000000000..f2a3e296e8b
--- /dev/null
+++ b/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_prometheus_active
+description: Count of projects with active integrations for Prometheus
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml b/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml
new file mode 100644
index 00000000000..446e8904be8
--- /dev/null
+++ b/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_prometheus_active
+description: Count of groups with active integrations for Prometheus
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml b/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml
new file mode 100644
index 00000000000..519fc355a44
--- /dev/null
+++ b/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.templates_prometheus_active
+description: Count of active service templates for Prometheus
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml b/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml
new file mode 100644
index 00000000000..7536c43b9f1
--- /dev/null
+++ b/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.instances_prometheus_active
+description: Count of active instance-level integrations for Prometheus
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml b/config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml
new file mode 100644
index 00000000000..38e002e0a2a
--- /dev/null
+++ b/config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.projects_inheriting_prometheus_active
+description: Count of active projects inheriting integrations for Prometheus
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml b/config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml
new file mode 100644
index 00000000000..c430b253199
--- /dev/null
+++ b/config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.groups_inheriting_prometheus_active
+description: Count of active groups inheriting integrations for Prometheus
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml b/config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml
new file mode 100644
index 00000000000..0460ddd1ca4
--- /dev/null
+++ b/config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.operations_dashboard_default_dashboard
+description: Active users with enabled operations dashboard
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml b/config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml
new file mode 100644
index 00000000000..3c1bb134c17
--- /dev/null
+++ b/config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.operations_dashboard_users_with_projects_added
+description: Active users with projects on operations dashboard
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180945_clusters.yml b/config/metrics/counts_all/20210216180945_clusters.yml
new file mode 100644
index 00000000000..25a52cf9ffa
--- /dev/null
+++ b/config/metrics/counts_all/20210216180945_clusters.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.clusters
+description: Total GitLab Managed clusters both enabled and disabled
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml b/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml
new file mode 100644
index 00000000000..cc15b3563b5
--- /dev/null
+++ b/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.clusters_applications_prometheus
+description: Total GitLab Managed clusters with Prometheus enabled
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml b/config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml
new file mode 100644
index 00000000000..f037d7ea5c2
--- /dev/null
+++ b/config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.operations_dashboard_default_dashboard
+description: Active users with enabled operations dashboard
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml b/config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml
new file mode 100644
index 00000000000..fc362feda69
--- /dev/null
+++ b/config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.projects_with_tracing_enabled
+description: Projects with tracing enabled
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category: tracing
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml b/config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml
new file mode 100644
index 00000000000..6f6f4b00d1a
--- /dev/null
+++ b/config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.monitor.operations_dashboard_users_with_projects_added
+description: Active users with projects on operations dashboard
+product_section: ops
+product_stage:
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181009_lfs_objects.yml b/config/metrics/counts_all/20210216181009_lfs_objects.yml
new file mode 100644
index 00000000000..fe221ae2c47
--- /dev/null
+++ b/config/metrics/counts_all/20210216181009_lfs_objects.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.lfs_objects
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181011_projects_with_packages.yml b/config/metrics/counts_all/20210216181011_projects_with_packages.yml
new file mode 100644
index 00000000000..2dee15b9438
--- /dev/null
+++ b/config/metrics/counts_all/20210216181011_projects_with_packages.yml
@@ -0,0 +1,17 @@
+---
+key_path: counts.projects_with_packages
+description: Projects with package registry configured
+product_section: ops
+product_stage:
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181012_packages.yml b/config/metrics/counts_all/20210216181012_packages.yml
new file mode 100644
index 00000000000..2843f223d9e
--- /dev/null
+++ b/config/metrics/counts_all/20210216181012_packages.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.packages
+description: Number of packages
+product_section: ops
+product_stage:
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml b/config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml
new file mode 100644
index 00000000000..69b893251ac
--- /dev/null
+++ b/config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_disabled
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml b/config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml
new file mode 100644
index 00000000000..9e06674dc61
--- /dev/null
+++ b/config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml b/config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml
new file mode 100644
index 00000000000..907fa82882c
--- /dev/null
+++ b/config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1d
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml b/config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml
new file mode 100644
index 00000000000..55ae6fc7a24
--- /dev/null
+++ b/config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_7d
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml b/config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml
new file mode 100644
index 00000000000..2e0bb6e06f5
--- /dev/null
+++ b/config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_14d
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml b/config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml
new file mode 100644
index 00000000000..5b6ec558b76
--- /dev/null
+++ b/config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1month
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml b/config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml
new file mode 100644
index 00000000000..6028972324d
--- /dev/null
+++ b/config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_3month
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml b/config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml
new file mode 100644
index 00000000000..c1bd230ec5b
--- /dev/null
+++ b/config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_older_than_set_to_7d
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml b/config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml
new file mode 100644
index 00000000000..fc2e647a05e
--- /dev/null
+++ b/config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_older_than_set_to_14d
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml b/config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml
new file mode 100644
index 00000000000..e8816d6f4f2
--- /dev/null
+++ b/config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_older_than_set_to_30d
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml b/config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml
new file mode 100644
index 00000000000..367eae45062
--- /dev/null
+++ b/config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_older_than_set_to_90d
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml b/config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml
new file mode 100644
index 00000000000..f89b6ef698e
--- /dev/null
+++ b/config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_expiration_policy_enabled_with_older_than_unset
+description:
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181051_vendor.yml b/config/metrics/counts_all/20210216181051_vendor.yml
new file mode 100644
index 00000000000..1233659fa5c
--- /dev/null
+++ b/config/metrics/counts_all/20210216181051_vendor.yml
@@ -0,0 +1,17 @@
+---
+key_path: container_registry_server.vendor
+description: Identifies if a user is using an external container registry and what
+ type
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181055_projects_with_packages.yml b/config/metrics/counts_all/20210216181055_projects_with_packages.yml
new file mode 100644
index 00000000000..55ea64a66a8
--- /dev/null
+++ b/config/metrics/counts_all/20210216181055_projects_with_packages.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.package.projects_with_packages
+description: Projects with package registry configured
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181102_issues.yml b/config/metrics/counts_all/20210216181102_issues.yml
new file mode 100644
index 00000000000..2898486642e
--- /dev/null
+++ b/config/metrics/counts_all/20210216181102_issues.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.issues
+description: Count of Issues created
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181104_label_lists.yml b/config/metrics/counts_all/20210216181104_label_lists.yml
new file mode 100644
index 00000000000..e064fe310b5
--- /dev/null
+++ b/config/metrics/counts_all/20210216181104_label_lists.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.label_lists
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181106_milestone_lists.yml b/config/metrics/counts_all/20210216181106_milestone_lists.yml
new file mode 100644
index 00000000000..138ad791d5a
--- /dev/null
+++ b/config/metrics/counts_all/20210216181106_milestone_lists.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.milestone_lists
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181108_milestones.yml b/config/metrics/counts_all/20210216181108_milestones.yml
new file mode 100644
index 00000000000..d0be9293cfc
--- /dev/null
+++ b/config/metrics/counts_all/20210216181108_milestones.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.milestones
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181109_uploads.yml b/config/metrics/counts_all/20210216181109_uploads.yml
new file mode 100644
index 00000000000..0035b499326
--- /dev/null
+++ b/config/metrics/counts_all/20210216181109_uploads.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.uploads
+description: Count of Uploads via Notes and Descriptions
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181111_labels.yml b/config/metrics/counts_all/20210216181111_labels.yml
new file mode 100644
index 00000000000..cce534d49e7
--- /dev/null
+++ b/config/metrics/counts_all/20210216181111_labels.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.labels
+description: Count of Labels
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181113_notes.yml b/config/metrics/counts_all/20210216181113_notes.yml
new file mode 100644
index 00000000000..b019e9b9023
--- /dev/null
+++ b/config/metrics/counts_all/20210216181113_notes.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.notes
+description: Count of Notes across all objects that use them
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181115_issues.yml b/config/metrics/counts_all/20210216181115_issues.yml
new file mode 100644
index 00000000000..2f751d47d2c
--- /dev/null
+++ b/config/metrics/counts_all/20210216181115_issues.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.issues
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181117_notes.yml b/config/metrics/counts_all/20210216181117_notes.yml
new file mode 100644
index 00000000000..a948750b747
--- /dev/null
+++ b/config/metrics/counts_all/20210216181117_notes.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.notes
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181119_projects.yml b/config/metrics/counts_all/20210216181119_projects.yml
new file mode 100644
index 00000000000..807d2851393
--- /dev/null
+++ b/config/metrics/counts_all/20210216181119_projects.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.projects
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181121_todos.yml b/config/metrics/counts_all/20210216181121_todos.yml
new file mode 100644
index 00000000000..2869e59033e
--- /dev/null
+++ b/config/metrics/counts_all/20210216181121_todos.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.todos
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml b/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml
new file mode 100644
index 00000000000..867a772eb23
--- /dev/null
+++ b/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.plan.service_desk_enabled_projects
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181124_service_desk_issues.yml b/config/metrics/counts_all/20210216181124_service_desk_issues.yml
new file mode 100644
index 00000000000..47e80110c66
--- /dev/null
+++ b/config/metrics/counts_all/20210216181124_service_desk_issues.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.plan.service_desk_issues
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181126_projects_jira_active.yml b/config/metrics/counts_all/20210216181126_projects_jira_active.yml
new file mode 100644
index 00000000000..f0a5f3f711a
--- /dev/null
+++ b/config/metrics/counts_all/20210216181126_projects_jira_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.projects_jira_active
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml b/config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml
new file mode 100644
index 00000000000..cb5f0a0f5ba
--- /dev/null
+++ b/config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.projects_jira_dvcs_cloud_active
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml b/config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml
new file mode 100644
index 00000000000..aae3322de19
--- /dev/null
+++ b/config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.projects_jira_dvcs_server_active
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181134_epics.yml b/config/metrics/counts_all/20210216181134_epics.yml
new file mode 100644
index 00000000000..5d6825f0830
--- /dev/null
+++ b/config/metrics/counts_all/20210216181134_epics.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.epics
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181135_label_lists.yml b/config/metrics/counts_all/20210216181135_label_lists.yml
new file mode 100644
index 00000000000..4cd9374cdbb
--- /dev/null
+++ b/config/metrics/counts_all/20210216181135_label_lists.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.label_lists
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181137_milestone_lists.yml b/config/metrics/counts_all/20210216181137_milestone_lists.yml
new file mode 100644
index 00000000000..d0741ebd0b3
--- /dev/null
+++ b/config/metrics/counts_all/20210216181137_milestone_lists.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.plan.milestone_lists
+description:
+product_section: dev
+product_stage:
+product_group: group::plan
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181205_confidential_epics.yml b/config/metrics/counts_all/20210216181205_confidential_epics.yml
new file mode 100644
index 00000000000..f2941af6bd2
--- /dev/null
+++ b/config/metrics/counts_all/20210216181205_confidential_epics.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.confidential_epics
+description:
+product_section: dev
+product_stage: plan
+product_group: group::portfolio management
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181206_epics.yml b/config/metrics/counts_all/20210216181206_epics.yml
new file mode 100644
index 00000000000..97452db6f85
--- /dev/null
+++ b/config/metrics/counts_all/20210216181206_epics.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.epics
+description:
+product_section: dev
+product_stage: plan
+product_group: group::portfolio management
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181210_issues_with_health_status.yml b/config/metrics/counts_all/20210216181210_issues_with_health_status.yml
new file mode 100644
index 00000000000..1df3a5d1a38
--- /dev/null
+++ b/config/metrics/counts_all/20210216181210_issues_with_health_status.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.issues_with_health_status
+description:
+product_section: dev
+product_stage: plan
+product_group: group::portfolio management
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181249_feature_flags.yml b/config/metrics/counts_all/20210216181249_feature_flags.yml
new file mode 100644
index 00000000000..9ff71ff0e3b
--- /dev/null
+++ b/config/metrics/counts_all/20210216181249_feature_flags.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.feature_flags
+description: Number of feature flag toggles
+product_section: ops
+product_stage: release
+product_group: group::progressive delivery
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181252_boards.yml b/config/metrics/counts_all/20210216181252_boards.yml
new file mode 100644
index 00000000000..9316320129f
--- /dev/null
+++ b/config/metrics/counts_all/20210216181252_boards.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.boards
+description:
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181254_projects.yml b/config/metrics/counts_all/20210216181254_projects.yml
new file mode 100644
index 00000000000..b2cd3039fcb
--- /dev/null
+++ b/config/metrics/counts_all/20210216181254_projects.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects
+description: Count of Projects
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: projects
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181256_todos.yml b/config/metrics/counts_all/20210216181256_todos.yml
new file mode 100644
index 00000000000..7ffddb73f38
--- /dev/null
+++ b/config/metrics/counts_all/20210216181256_todos.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.todos
+description: Count of ToDos
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: issue_tracking
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml b/config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml
new file mode 100644
index 00000000000..b51a38a4f3c
--- /dev/null
+++ b/config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.jira_imports_total_imported_count
+description: Count of Issues imported from Jira
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: jira_importer
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml b/config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml
new file mode 100644
index 00000000000..c1f8e312021
--- /dev/null
+++ b/config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.jira_imports_projects_count
+description: Count of Projects that imported Issues from Jira
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: jira_importer
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml b/config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml
new file mode 100644
index 00000000000..9ab377e5e04
--- /dev/null
+++ b/config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.jira_imports_total_imported_issues_count
+description: Count of Jira imports run
+product_section: dev
+product_stage: plan
+product_group: group::project management
+product_category: jira_importer
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181908_deploy_keys.yml b/config/metrics/counts_all/20210216181908_deploy_keys.yml
new file mode 100644
index 00000000000..ce4034aca60
--- /dev/null
+++ b/config/metrics/counts_all/20210216181908_deploy_keys.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.deploy_keys
+description:
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181911_successful_deployments.yml b/config/metrics/counts_all/20210216181911_successful_deployments.yml
new file mode 100644
index 00000000000..2eedd96e4b6
--- /dev/null
+++ b/config/metrics/counts_all/20210216181911_successful_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.successful_deployments
+description: Total successful deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181912_failed_deployments.yml b/config/metrics/counts_all/20210216181912_failed_deployments.yml
new file mode 100644
index 00000000000..3ef38fff2d3
--- /dev/null
+++ b/config/metrics/counts_all/20210216181912_failed_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.failed_deployments
+description: Total failed deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181914_environments.yml b/config/metrics/counts_all/20210216181914_environments.yml
new file mode 100644
index 00000000000..cae8fb0d85b
--- /dev/null
+++ b/config/metrics/counts_all/20210216181914_environments.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.environments
+description: Total available and stopped environments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181916_in_review_folder.yml b/config/metrics/counts_all/20210216181916_in_review_folder.yml
new file mode 100644
index 00000000000..8890c0af74e
--- /dev/null
+++ b/config/metrics/counts_all/20210216181916_in_review_folder.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.in_review_folder
+description:
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181918_releases.yml b/config/metrics/counts_all/20210216181918_releases.yml
new file mode 100644
index 00000000000..190a2ae92bc
--- /dev/null
+++ b/config/metrics/counts_all/20210216181918_releases.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.releases
+description: Unique release tags
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181920_projects_mirrored_with_pipelines_enabled.yml b/config/metrics/counts_all/20210216181920_projects_mirrored_with_pipelines_enabled.yml
new file mode 100644
index 00000000000..c0748285bf9
--- /dev/null
+++ b/config/metrics/counts_all/20210216181920_projects_mirrored_with_pipelines_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_mirrored_with_pipelines_enabled
+description: Projects with repository mirroring enabled
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181926_deployments.yml b/config/metrics/counts_all/20210216181926_deployments.yml
new file mode 100644
index 00000000000..626b9b0b29b
--- /dev/null
+++ b/config/metrics/counts_all/20210216181926_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.release.deployments
+description: Unique users triggering deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181928_failed_deployments.yml b/config/metrics/counts_all/20210216181928_failed_deployments.yml
new file mode 100644
index 00000000000..eec1fafa71c
--- /dev/null
+++ b/config/metrics/counts_all/20210216181928_failed_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.release.failed_deployments
+description: Total failed deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181930_releases.yml b/config/metrics/counts_all/20210216181930_releases.yml
new file mode 100644
index 00000000000..9beda5cb6db
--- /dev/null
+++ b/config/metrics/counts_all/20210216181930_releases.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.release.releases
+description: Unique users creating release tags
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181932_successful_deployments.yml b/config/metrics/counts_all/20210216181932_successful_deployments.yml
new file mode 100644
index 00000000000..48103574cfd
--- /dev/null
+++ b/config/metrics/counts_all/20210216181932_successful_deployments.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.release.successful_deployments
+description: Total successful deployments
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181934_projects_mirrored_with_pipelines_enabled.yml b/config/metrics/counts_all/20210216181934_projects_mirrored_with_pipelines_enabled.yml
new file mode 100644
index 00000000000..ce760884642
--- /dev/null
+++ b/config/metrics/counts_all/20210216181934_projects_mirrored_with_pipelines_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.release.projects_mirrored_with_pipelines_enabled
+description: Projects with repository mirroring enabled
+product_section: ops
+product_stage:
+product_group: group::release
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181946_pages_domains.yml b/config/metrics/counts_all/20210216181946_pages_domains.yml
new file mode 100644
index 00000000000..7640b27eb46
--- /dev/null
+++ b/config/metrics/counts_all/20210216181946_pages_domains.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.pages_domains
+description: Total GitLab Pages domains
+product_section: ops
+product_stage: release
+product_group: group::release management
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml b/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml
new file mode 100644
index 00000000000..3b36b410b3a
--- /dev/null
+++ b/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.verify.clusters_applications_runner
+description: Total GitLab Managed clusters with Runner enabled
+product_section: ops
+product_stage: verify
+product_group: group::runner
+product_category: runner
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181954_user_unique_users_all_secure_scanners.yml b/config/metrics/counts_all/20210216181954_user_unique_users_all_secure_scanners.yml
new file mode 100644
index 00000000000..4d520d3430f
--- /dev/null
+++ b/config/metrics/counts_all/20210216181954_user_unique_users_all_secure_scanners.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.secure.user_unique_users_all_secure_scanners
+description:
+product_section: sec
+product_stage:
+product_group: group::secure
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml b/config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml
new file mode 100644
index 00000000000..926ed501639
--- /dev/null
+++ b/config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_with_repositories_enabled
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category:
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182001_protected_branches.yml b/config/metrics/counts_all/20210216182001_protected_branches.yml
new file mode 100644
index 00000000000..cbd378bd93a
--- /dev/null
+++ b/config/metrics/counts_all/20210216182001_protected_branches.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.protected_branches
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182002_remote_mirrors.yml b/config/metrics/counts_all/20210216182002_remote_mirrors.yml
new file mode 100644
index 00000000000..f344a7c1640
--- /dev/null
+++ b/config/metrics/counts_all/20210216182002_remote_mirrors.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.remote_mirrors
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182004_commit_comment.yml b/config/metrics/counts_all/20210216182004_commit_comment.yml
new file mode 100644
index 00000000000..2e427d14acd
--- /dev/null
+++ b/config/metrics/counts_all/20210216182004_commit_comment.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.commit_comment
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: code_review
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182006_source_code_pushes.yml b/config/metrics/counts_all/20210216182006_source_code_pushes.yml
new file mode 100644
index 00000000000..824761adaee
--- /dev/null
+++ b/config/metrics/counts_all/20210216182006_source_code_pushes.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.source_code_pushes
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182008_template_repositories.yml b/config/metrics/counts_all/20210216182008_template_repositories.yml
new file mode 100644
index 00000000000..888f5d96ab6
--- /dev/null
+++ b/config/metrics/counts_all/20210216182008_template_repositories.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.template_repositories
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182010_deploy_keys.yml b/config/metrics/counts_all/20210216182010_deploy_keys.yml
new file mode 100644
index 00000000000..2ddc48c2e0a
--- /dev/null
+++ b/config/metrics/counts_all/20210216182010_deploy_keys.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.deploy_keys
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182012_keys.yml b/config/metrics/counts_all/20210216182012_keys.yml
new file mode 100644
index 00000000000..1872abc6776
--- /dev/null
+++ b/config/metrics/counts_all/20210216182012_keys.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.keys
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml b/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml
new file mode 100644
index 00000000000..62883077ad5
--- /dev/null
+++ b/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.create.projects_with_disable_overriding_approvers_per_merge_request
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml b/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml
new file mode 100644
index 00000000000..8518e3700bb
--- /dev/null
+++ b/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.create.projects_without_disable_overriding_approvers_per_merge_request
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182017_remote_mirrors.yml b/config/metrics/counts_all/20210216182017_remote_mirrors.yml
new file mode 100644
index 00000000000..f9edec7260b
--- /dev/null
+++ b/config/metrics/counts_all/20210216182017_remote_mirrors.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.remote_mirrors
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml b/config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml
new file mode 100644
index 00000000000..3ccbc99a4f1
--- /dev/null
+++ b/config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.projects_enforcing_code_owner_approval
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml b/config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml
new file mode 100644
index 00000000000..fcba0993477
--- /dev/null
+++ b/config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.projects_with_sectional_code_owner_rules
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml b/config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml
new file mode 100644
index 00000000000..a850295aea6
--- /dev/null
+++ b/config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.projects_with_repositories_enabled
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182025_protected_branches.yml b/config/metrics/counts_all/20210216182025_protected_branches.yml
new file mode 100644
index 00000000000..f914c5dae6c
--- /dev/null
+++ b/config/metrics/counts_all/20210216182025_protected_branches.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.protected_branches
+description:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml b/config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml
new file mode 100644
index 00000000000..9ce0b935888
--- /dev/null
+++ b/config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.total_number_of_path_locks
+description: The total number of default branch locks done through the GitLab UI
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml b/config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml
new file mode 100644
index 00000000000..136472a59e4
--- /dev/null
+++ b/config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.total_number_of_locked_files
+description: The total number of exclusive file locks (through the CLI)
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182112_sast_jobs.yml b/config/metrics/counts_all/20210216182112_sast_jobs.yml
new file mode 100644
index 00000000000..aaf41b37c2b
--- /dev/null
+++ b/config/metrics/counts_all/20210216182112_sast_jobs.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.sast_jobs
+description: Count of SAST CI jobs for the month. Job names ending in '-sast'
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: static_application_security_testing
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml b/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml
new file mode 100644
index 00000000000..9f56f021bf3
--- /dev/null
+++ b/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml
@@ -0,0 +1,19 @@
+---
+key_path: counts.secret_detection_jobs
+description: Count of 'secret-detection' CI jobs fro the month.
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: secret_detection
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182116_user_sast_jobs.yml b/config/metrics/counts_all/20210216182116_user_sast_jobs.yml
new file mode 100644
index 00000000000..829d35a6e10
--- /dev/null
+++ b/config/metrics/counts_all/20210216182116_user_sast_jobs.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.secure.user_sast_jobs
+description: Count of SAST jobs
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: static_application_security_testing
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml b/config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml
new file mode 100644
index 00000000000..2559a67f4ad
--- /dev/null
+++ b/config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml
@@ -0,0 +1,19 @@
+---
+key_path: usage_activity_by_stage.secure.user_secret_detection_jobs
+description: Count of Secret Detection Jobs
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: secret_detection
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182203_user_preferences_group_overview_details.yml b/config/metrics/counts_all/20210216182203_user_preferences_group_overview_details.yml
new file mode 100644
index 00000000000..5f06bcf1607
--- /dev/null
+++ b/config/metrics/counts_all/20210216182203_user_preferences_group_overview_details.yml
@@ -0,0 +1,18 @@
+---
+key_path: counts.user_preferences_group_overview_details
+description: Count of users who set personal preference to see Details on Group overview
+ page
+product_section: sec
+product_stage: secure
+product_group: group::threat insights
+product_category: vulnerability_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182205_user_preferences_group_overview_security_dashboard.yml b/config/metrics/counts_all/20210216182205_user_preferences_group_overview_security_dashboard.yml
new file mode 100644
index 00000000000..688720eebb9
--- /dev/null
+++ b/config/metrics/counts_all/20210216182205_user_preferences_group_overview_security_dashboard.yml
@@ -0,0 +1,18 @@
+---
+key_path: counts.user_preferences_group_overview_security_dashboard
+description: Count of users who set personal preference to see Security Dashboard
+ on Group overview page
+product_section: sec
+product_stage: secure
+product_group: group::threat insights
+product_category: vulnerability_management
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182207_user_preferences_group_overview_security_dashboard.yml b/config/metrics/counts_all/20210216182207_user_preferences_group_overview_security_dashboard.yml
new file mode 100644
index 00000000000..7337c457249
--- /dev/null
+++ b/config/metrics/counts_all/20210216182207_user_preferences_group_overview_security_dashboard.yml
@@ -0,0 +1,17 @@
+---
+key_path: usage_activity_by_stage.secure.user_preferences_group_overview_security_dashboard
+description: Users who set personal preference to see Details on Group overview page
+product_section: sec
+product_stage: secure
+product_group: group::threat insights
+product_category: vulnerability_management
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- ultimate
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml b/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml
new file mode 100644
index 00000000000..66f616f16ee
--- /dev/null
+++ b/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.protected_branches_except_default
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182547_projects_datadog_active.yml b/config/metrics/counts_all/20210216182547_projects_datadog_active.yml
new file mode 100644
index 00000000000..a96a88e9dab
--- /dev/null
+++ b/config/metrics/counts_all/20210216182547_projects_datadog_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_datadog_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182549_groups_datadog_active.yml b/config/metrics/counts_all/20210216182549_groups_datadog_active.yml
new file mode 100644
index 00000000000..caf9633e57f
--- /dev/null
+++ b/config/metrics/counts_all/20210216182549_groups_datadog_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.groups_datadog_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182551_templates_datadog_active.yml b/config/metrics/counts_all/20210216182551_templates_datadog_active.yml
new file mode 100644
index 00000000000..9d911c6becf
--- /dev/null
+++ b/config/metrics/counts_all/20210216182551_templates_datadog_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.templates_datadog_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182553_instances_datadog_active.yml b/config/metrics/counts_all/20210216182553_instances_datadog_active.yml
new file mode 100644
index 00000000000..25f6a6468d7
--- /dev/null
+++ b/config/metrics/counts_all/20210216182553_instances_datadog_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.instances_datadog_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml b/config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml
new file mode 100644
index 00000000000..97bfc3d2301
--- /dev/null
+++ b/config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_inheriting_datadog_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml b/config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml
new file mode 100644
index 00000000000..6cbbcadbe04
--- /dev/null
+++ b/config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.groups_inheriting_datadog_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182614_projects_ewm_active.yml b/config/metrics/counts_all/20210216182614_projects_ewm_active.yml
new file mode 100644
index 00000000000..a0c8d827951
--- /dev/null
+++ b/config/metrics/counts_all/20210216182614_projects_ewm_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_ewm_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182616_groups_ewm_active.yml b/config/metrics/counts_all/20210216182616_groups_ewm_active.yml
new file mode 100644
index 00000000000..d41905af3b6
--- /dev/null
+++ b/config/metrics/counts_all/20210216182616_groups_ewm_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.groups_ewm_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182618_templates_ewm_active.yml b/config/metrics/counts_all/20210216182618_templates_ewm_active.yml
new file mode 100644
index 00000000000..0ef26b5b144
--- /dev/null
+++ b/config/metrics/counts_all/20210216182618_templates_ewm_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.templates_ewm_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182620_instances_ewm_active.yml b/config/metrics/counts_all/20210216182620_instances_ewm_active.yml
new file mode 100644
index 00000000000..29d73ebb943
--- /dev/null
+++ b/config/metrics/counts_all/20210216182620_instances_ewm_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.instances_ewm_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml b/config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml
new file mode 100644
index 00000000000..8b6da149dfa
--- /dev/null
+++ b/config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_inheriting_ewm_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml b/config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml
new file mode 100644
index 00000000000..995849e5945
--- /dev/null
+++ b/config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.groups_inheriting_ewm_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml b/config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml
new file mode 100644
index 00000000000..1e7377ed707
--- /dev/null
+++ b/config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_mock_ci_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml b/config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml
new file mode 100644
index 00000000000..adf7175c7c6
--- /dev/null
+++ b/config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.groups_mock_ci_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml b/config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml
new file mode 100644
index 00000000000..654ffad1ba6
--- /dev/null
+++ b/config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.templates_mock_ci_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml b/config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml
new file mode 100644
index 00000000000..41958f501b7
--- /dev/null
+++ b/config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.instances_mock_ci_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml b/config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml
new file mode 100644
index 00000000000..63bafcd95d7
--- /dev/null
+++ b/config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_inheriting_mock_ci_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml b/config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml
new file mode 100644
index 00000000000..994e9665ff1
--- /dev/null
+++ b/config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.groups_inheriting_mock_ci_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml
new file mode 100644
index 00000000000..c12bcfc76ae
--- /dev/null
+++ b/config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_mock_monitoring_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml
new file mode 100644
index 00000000000..414d3723f9b
--- /dev/null
+++ b/config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.groups_mock_monitoring_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml
new file mode 100644
index 00000000000..48397435310
--- /dev/null
+++ b/config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.templates_mock_monitoring_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml
new file mode 100644
index 00000000000..671c0574892
--- /dev/null
+++ b/config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.instances_mock_monitoring_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml
new file mode 100644
index 00000000000..895e0f03505
--- /dev/null
+++ b/config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.projects_inheriting_mock_monitoring_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml
new file mode 100644
index 00000000000..27206fb724f
--- /dev/null
+++ b/config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.groups_inheriting_mock_monitoring_active
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml b/config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml
new file mode 100644
index 00000000000..fb26328eb81
--- /dev/null
+++ b/config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_composer_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml b/config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml
new file mode 100644
index 00000000000..010067763b5
--- /dev/null
+++ b/config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_composer_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml b/config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml
new file mode 100644
index 00000000000..11ccbf3b27e
--- /dev/null
+++ b/config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_composer_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml b/config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml
new file mode 100644
index 00000000000..9091fc299ee
--- /dev/null
+++ b/config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_conan_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml b/config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml
new file mode 100644
index 00000000000..91cea7e5f4f
--- /dev/null
+++ b/config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_conan_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml b/config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml
new file mode 100644
index 00000000000..4b4e08c0631
--- /dev/null
+++ b/config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_conan_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml b/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml
new file mode 100644
index 00000000000..b87bc78265c
--- /dev/null
+++ b/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_container_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml b/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml
new file mode 100644
index 00000000000..4ca264fc57f
--- /dev/null
+++ b/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_container_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml b/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml
new file mode 100644
index 00000000000..ea30df537f2
--- /dev/null
+++ b/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_container_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml b/config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml
new file mode 100644
index 00000000000..e05cbbdc3a9
--- /dev/null
+++ b/config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_debian_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml b/config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml
new file mode 100644
index 00000000000..6e0635e7108
--- /dev/null
+++ b/config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_debian_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml b/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml
new file mode 100644
index 00000000000..818d32cf911
--- /dev/null
+++ b/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_debian_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml b/config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml
new file mode 100644
index 00000000000..3bec73ead90
--- /dev/null
+++ b/config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml b/config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml
new file mode 100644
index 00000000000..4ac31ac255b
--- /dev/null
+++ b/config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_delete_package_by_deploy_token
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml b/config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml
new file mode 100644
index 00000000000..8a3cb104b6a
--- /dev/null
+++ b/config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_delete_package_by_guest
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml b/config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml
new file mode 100644
index 00000000000..c0bf7f79ebc
--- /dev/null
+++ b/config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_delete_package_by_user
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml b/config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml
new file mode 100644
index 00000000000..e38a6a4910e
--- /dev/null
+++ b/config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_generic_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml b/config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml
new file mode 100644
index 00000000000..29e08dd04fe
--- /dev/null
+++ b/config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_generic_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml b/config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml
new file mode 100644
index 00000000000..9dbd7572df6
--- /dev/null
+++ b/config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_generic_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml b/config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml
new file mode 100644
index 00000000000..9dda1569073
--- /dev/null
+++ b/config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_golang_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml b/config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml
new file mode 100644
index 00000000000..8a0399ca1be
--- /dev/null
+++ b/config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_golang_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml b/config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml
new file mode 100644
index 00000000000..5c83f5533d0
--- /dev/null
+++ b/config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_golang_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml b/config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml
new file mode 100644
index 00000000000..5ebdc064a11
--- /dev/null
+++ b/config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_maven_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml b/config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml
new file mode 100644
index 00000000000..6749fba2c3b
--- /dev/null
+++ b/config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_maven_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml b/config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml
new file mode 100644
index 00000000000..f329104f2b2
--- /dev/null
+++ b/config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_maven_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml b/config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml
new file mode 100644
index 00000000000..b8653d5a27e
--- /dev/null
+++ b/config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_npm_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml b/config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml
new file mode 100644
index 00000000000..54799778680
--- /dev/null
+++ b/config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_npm_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml b/config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml
new file mode 100644
index 00000000000..c9c5f43627a
--- /dev/null
+++ b/config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_npm_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml b/config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml
new file mode 100644
index 00000000000..1f410f5ae95
--- /dev/null
+++ b/config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_nuget_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml b/config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml
new file mode 100644
index 00000000000..4b7abb5af70
--- /dev/null
+++ b/config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_nuget_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml b/config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml
new file mode 100644
index 00000000000..3812514b79d
--- /dev/null
+++ b/config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_nuget_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml b/config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml
new file mode 100644
index 00000000000..dd3c335235b
--- /dev/null
+++ b/config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml b/config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml
new file mode 100644
index 00000000000..1114eb321ca
--- /dev/null
+++ b/config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_pull_package_by_deploy_token
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml b/config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml
new file mode 100644
index 00000000000..f76cac6886b
--- /dev/null
+++ b/config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_pull_package_by_guest
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml b/config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml
new file mode 100644
index 00000000000..fa4ee39ed81
--- /dev/null
+++ b/config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_pull_package_by_user
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml b/config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml
new file mode 100644
index 00000000000..2905f0fa31a
--- /dev/null
+++ b/config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml b/config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml
new file mode 100644
index 00000000000..920875186bd
--- /dev/null
+++ b/config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_push_package_by_deploy_token
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml b/config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml
new file mode 100644
index 00000000000..a360e34eaec
--- /dev/null
+++ b/config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_push_package_by_guest
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml b/config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml
new file mode 100644
index 00000000000..5fd7d2b3ee3
--- /dev/null
+++ b/config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_push_package_by_user
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml b/config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml
new file mode 100644
index 00000000000..a943cce5ecb
--- /dev/null
+++ b/config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_pypi_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml b/config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml
new file mode 100644
index 00000000000..a15794a05f1
--- /dev/null
+++ b/config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_pypi_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml b/config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml
new file mode 100644
index 00000000000..ea0c217997a
--- /dev/null
+++ b/config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_pypi_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml b/config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml
new file mode 100644
index 00000000000..c35c455e5d7
--- /dev/null
+++ b/config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_tag_delete_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml b/config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml
new file mode 100644
index 00000000000..7b2f0fcca5b
--- /dev/null
+++ b/config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_tag_pull_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml b/config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml
new file mode 100644
index 00000000000..6f5a0bc7a8b
--- /dev/null
+++ b/config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.package_events_i_package_tag_push_package
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183023_wiki_pages_view.yml b/config/metrics/counts_all/20210216183023_wiki_pages_view.yml
new file mode 100644
index 00000000000..f9d6124b57a
--- /dev/null
+++ b/config/metrics/counts_all/20210216183023_wiki_pages_view.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.wiki_pages_view
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183146_coverage_fuzzing_jobs.yml b/config/metrics/counts_all/20210216183146_coverage_fuzzing_jobs.yml
new file mode 100644
index 00000000000..77fe44a1836
--- /dev/null
+++ b/config/metrics/counts_all/20210216183146_coverage_fuzzing_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.coverage_fuzzing_jobs
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183149_dast_on_demand_pipelines.yml b/config/metrics/counts_all/20210216183149_dast_on_demand_pipelines.yml
new file mode 100644
index 00000000000..fc0ed6e5429
--- /dev/null
+++ b/config/metrics/counts_all/20210216183149_dast_on_demand_pipelines.yml
@@ -0,0 +1,16 @@
+---
+key_path: counts.dast_on_demand_pipelines
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source: database
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183241_filesystems.yml b/config/metrics/counts_all/20210216183241_filesystems.yml
new file mode 100644
index 00000000000..ffb3f0d5cca
--- /dev/null
+++ b/config/metrics/counts_all/20210216183241_filesystems.yml
@@ -0,0 +1,16 @@
+---
+key_path: gitaly.filesystems
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183248_pg_system_id.yml b/config/metrics/counts_all/20210216183248_pg_system_id.yml
new file mode 100644
index 00000000000..72d97c5db54
--- /dev/null
+++ b/config/metrics/counts_all/20210216183248_pg_system_id.yml
@@ -0,0 +1,16 @@
+---
+key_path: database.pg_system_id
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183339_merge_requests_with_overridden_project_rules.yml b/config/metrics/counts_all/20210216183339_merge_requests_with_overridden_project_rules.yml
new file mode 100644
index 00000000000..a2f3c2a6002
--- /dev/null
+++ b/config/metrics/counts_all/20210216183339_merge_requests_with_overridden_project_rules.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.merge_requests_with_overridden_project_rules
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183344_users_using_path_locks.yml b/config/metrics/counts_all/20210216183344_users_using_path_locks.yml
new file mode 100644
index 00000000000..f75db6ede2e
--- /dev/null
+++ b/config/metrics/counts_all/20210216183344_users_using_path_locks.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.users_using_path_locks
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml b/config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml
new file mode 100644
index 00000000000..b232c6bbb41
--- /dev/null
+++ b/config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.users_using_lfs_locks
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183352_approval_project_rules_with_more_approvers_than_required.yml b/config/metrics/counts_all/20210216183352_approval_project_rules_with_more_approvers_than_required.yml
new file mode 100644
index 00000000000..4afb690ddc4
--- /dev/null
+++ b/config/metrics/counts_all/20210216183352_approval_project_rules_with_more_approvers_than_required.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.approval_project_rules_with_more_approvers_than_required
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183354_approval_project_rules_with_less_approvers_than_required.yml b/config/metrics/counts_all/20210216183354_approval_project_rules_with_less_approvers_than_required.yml
new file mode 100644
index 00000000000..3ef906e10da
--- /dev/null
+++ b/config/metrics/counts_all/20210216183354_approval_project_rules_with_less_approvers_than_required.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.approval_project_rules_with_less_approvers_than_required
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183355_approval_project_rules_with_exact_required_approvers.yml b/config/metrics/counts_all/20210216183355_approval_project_rules_with_exact_required_approvers.yml
new file mode 100644
index 00000000000..1397b1b57e2
--- /dev/null
+++ b/config/metrics/counts_all/20210216183355_approval_project_rules_with_exact_required_approvers.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.create.approval_project_rules_with_exact_required_approvers
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183400_omniauth_providers.yml b/config/metrics/counts_all/20210216183400_omniauth_providers.yml
new file mode 100644
index 00000000000..ab73b3fca22
--- /dev/null
+++ b/config/metrics/counts_all/20210216183400_omniauth_providers.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.omniauth_providers
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183402_two-factor.yml b/config/metrics/counts_all/20210216183402_two-factor.yml
new file mode 100644
index 00000000000..777d4d1cdef
--- /dev/null
+++ b/config/metrics/counts_all/20210216183402_two-factor.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.user_auth_by_provider.two-factor
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183404_two-factor-via-u2f-device.yml b/config/metrics/counts_all/20210216183404_two-factor-via-u2f-device.yml
new file mode 100644
index 00000000000..99c1f289658
--- /dev/null
+++ b/config/metrics/counts_all/20210216183404_two-factor-via-u2f-device.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.user_auth_by_provider.two-factor-via-u2f-device
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183406_two-factor-via-webauthn-device.yml b/config/metrics/counts_all/20210216183406_two-factor-via-webauthn-device.yml
new file mode 100644
index 00000000000..1ea27e42ed0
--- /dev/null
+++ b/config/metrics/counts_all/20210216183406_two-factor-via-webauthn-device.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.user_auth_by_provider.two-factor-via-webauthn-device
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183408_standard.yml b/config/metrics/counts_all/20210216183408_standard.yml
new file mode 100644
index 00000000000..55b4a984ae2
--- /dev/null
+++ b/config/metrics/counts_all/20210216183408_standard.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.user_auth_by_provider.standard
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183410_google_oauth2.yml b/config/metrics/counts_all/20210216183410_google_oauth2.yml
new file mode 100644
index 00000000000..c2fd5fad5ff
--- /dev/null
+++ b/config/metrics/counts_all/20210216183410_google_oauth2.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.manage.user_auth_by_provider.google_oauth2
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183514_user_coverage_fuzzing_jobs.yml b/config/metrics/counts_all/20210216183514_user_coverage_fuzzing_jobs.yml
new file mode 100644
index 00000000000..b7f7eea5f71
--- /dev/null
+++ b/config/metrics/counts_all/20210216183514_user_coverage_fuzzing_jobs.yml
@@ -0,0 +1,16 @@
+---
+key_path: usage_activity_by_stage.secure.user_coverage_fuzzing_jobs
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml b/config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml
new file mode 100644
index 00000000000..03e450d3438
--- /dev/null
+++ b/config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml
@@ -0,0 +1,16 @@
+---
+key_path: compliance_unique_visits.g_compliance_dashboard
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml b/config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml
new file mode 100644
index 00000000000..bd4ef926805
--- /dev/null
+++ b/config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml
@@ -0,0 +1,16 @@
+---
+key_path: compliance_unique_visits.g_compliance_audit_events
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml b/config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml
new file mode 100644
index 00000000000..c7581cc01dc
--- /dev/null
+++ b/config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml
@@ -0,0 +1,16 @@
+---
+key_path: compliance_unique_visits.i_compliance_audit_events
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml b/config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml
new file mode 100644
index 00000000000..af0d8417863
--- /dev/null
+++ b/config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml
@@ -0,0 +1,16 @@
+---
+key_path: compliance_unique_visits.i_compliance_credential_inventory
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml b/config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml
new file mode 100644
index 00000000000..caf8da049d5
--- /dev/null
+++ b/config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml
@@ -0,0 +1,16 @@
+---
+key_path: compliance_unique_visits.a_compliance_audit_events_api
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml b/config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml
new file mode 100644
index 00000000000..fb67caaa03e
--- /dev/null
+++ b/config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml
@@ -0,0 +1,16 @@
+---
+key_path: compliance_unique_visits.compliance_unique_visits_for_any_target
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: data_available
+time_frame: all
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/license/20210204124854_license_management_jobs.yml b/config/metrics/license/20210204124854_license_management_jobs.yml
index f89df165662..81e3e17e24b 100644
--- a/config/metrics/license/20210204124854_license_management_jobs.yml
+++ b/config/metrics/license/20210204124854_license_management_jobs.yml
@@ -9,7 +9,8 @@ value_type: number
status: data_available
time_frame: none
data_source: database
-distribution: []
+distribution:
+- ce
tier:
- premium
- ultimate
diff --git a/config/metrics/license/20210204124926_license_trial_ends_on.yml b/config/metrics/license/20210204124926_license_trial_ends_on.yml
index 6e78c6239e9..e3c3303975f 100644
--- a/config/metrics/license/20210204124926_license_trial_ends_on.yml
+++ b/config/metrics/license/20210204124926_license_trial_ends_on.yml
@@ -9,6 +9,8 @@ value_type: string
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/license/20210204124928_version.yml b/config/metrics/license/20210204124928_version.yml
index a5e8acb1eaa..b39552b220e 100644
--- a/config/metrics/license/20210204124928_version.yml
+++ b/config/metrics/license/20210204124928_version.yml
@@ -9,6 +9,8 @@ value_type: string
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/license/20210204124936_version.yml b/config/metrics/license/20210204124936_version.yml
index f9c28d40d3d..2d161e15fd0 100644
--- a/config/metrics/license/20210204124936_version.yml
+++ b/config/metrics/license/20210204124936_version.yml
@@ -9,6 +9,8 @@ value_type: string
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/license/20210204124938_recording_ce_finished_at.yml b/config/metrics/license/20210204124938_recording_ce_finished_at.yml
index bc8a3e57b45..8afcd1bab02 100644
--- a/config/metrics/license/20210204124938_recording_ce_finished_at.yml
+++ b/config/metrics/license/20210204124938_recording_ce_finished_at.yml
@@ -12,5 +12,6 @@ data_source:
distribution:
- ce
- ee
-tier: []
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/license/20210216175601_version.yml b/config/metrics/license/20210216175601_version.yml
new file mode 100644
index 00000000000..b3099eb76bd
--- /dev/null
+++ b/config/metrics/license/20210216175601_version.yml
@@ -0,0 +1,19 @@
+---
+key_path: version
+description: Version of GitLab instance
+product_section: enablement
+product_stage: enablement
+product_group: group::distribution
+product_category: collection
+value_type: string
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/license/20210216175602_installation_type.yml b/config/metrics/license/20210216175602_installation_type.yml
new file mode 100644
index 00000000000..577d0d502b3
--- /dev/null
+++ b/config/metrics/license/20210216175602_installation_type.yml
@@ -0,0 +1,19 @@
+---
+key_path: installation_type
+description: The installation method used to install GitLab (Omnibus, Helm, etc)
+product_section: enablement
+product_stage: enablement
+product_group: group::distribution
+product_category: collection
+value_type: string
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/license/20210216175604_edition.yml b/config/metrics/license/20210216175604_edition.yml
new file mode 100644
index 00000000000..6257c7e76c0
--- /dev/null
+++ b/config/metrics/license/20210216175604_edition.yml
@@ -0,0 +1,19 @@
+---
+key_path: edition
+description: Edition of GitLab such as EE, CE, Bronze, Silver, Gold
+product_section: enablement
+product_stage: enablement
+product_group: group::distribution
+product_category: collection
+value_type: string
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/license/20210216175609_version.yml b/config/metrics/license/20210216175609_version.yml
new file mode 100644
index 00000000000..fd707691e6d
--- /dev/null
+++ b/config/metrics/license/20210216175609_version.yml
@@ -0,0 +1,16 @@
+---
+key_path: database.version
+description: The version of the PostgreSQL database.
+product_section: enablement
+product_stage: enablement
+product_group: group::distribution
+product_category: collection
+value_type: string
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/license/20210216181053_version.yml b/config/metrics/license/20210216181053_version.yml
new file mode 100644
index 00000000000..3570a041b8f
--- /dev/null
+++ b/config/metrics/license/20210216181053_version.yml
@@ -0,0 +1,16 @@
+---
+key_path: container_registry_server.version
+description: Identifies the version of the external registry being used
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category:
+value_type: string
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/license/20210216183237_version.yml b/config/metrics/license/20210216183237_version.yml
new file mode 100644
index 00000000000..4f74963801a
--- /dev/null
+++ b/config/metrics/license/20210216183237_version.yml
@@ -0,0 +1,16 @@
+---
+key_path: git.version
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: string
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+tier:
+- free
+skip_validation: true
diff --git a/config/metrics/schema.json b/config/metrics/schema.json
index d71eddab469..53e52c21545 100644
--- a/config/metrics/schema.json
+++ b/config/metrics/schema.json
@@ -22,7 +22,7 @@
},
"value_type": {
"type": "string",
- "enum": ["integer", "string", "number", "boolean"]
+ "enum": ["string", "number", "boolean"]
},
"status": {
"type": ["string"],
diff --git a/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml b/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml
index 41f6d432b78..6f05eacbe5a 100644
--- a/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml
+++ b/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124858_container_registry_enabled.yml b/config/metrics/settings/20210204124858_container_registry_enabled.yml
index 53567998a76..6c50cb9144e 100644
--- a/config/metrics/settings/20210204124858_container_registry_enabled.yml
+++ b/config/metrics/settings/20210204124858_container_registry_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml b/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml
index cecb9035dc6..01feb7157d9 100644
--- a/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml
+++ b/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml b/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml
index 5cdb62237e4..ed9491959ae 100644
--- a/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml
+++ b/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124904_gravatar_enabled.yml b/config/metrics/settings/20210204124904_gravatar_enabled.yml
index 7102c96332a..21758753b35 100644
--- a/config/metrics/settings/20210204124904_gravatar_enabled.yml
+++ b/config/metrics/settings/20210204124904_gravatar_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124906_ldap_enabled.yml b/config/metrics/settings/20210204124906_ldap_enabled.yml
index b0bdeded7d9..6dc1a62d337 100644
--- a/config/metrics/settings/20210204124906_ldap_enabled.yml
+++ b/config/metrics/settings/20210204124906_ldap_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124908_mattermost_enabled.yml b/config/metrics/settings/20210204124908_mattermost_enabled.yml
index 7082b6c4ec5..425f3c44511 100644
--- a/config/metrics/settings/20210204124908_mattermost_enabled.yml
+++ b/config/metrics/settings/20210204124908_mattermost_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124910_omniauth_enabled.yml b/config/metrics/settings/20210204124910_omniauth_enabled.yml
index 10483bd977b..f9e691b0516 100644
--- a/config/metrics/settings/20210204124910_omniauth_enabled.yml
+++ b/config/metrics/settings/20210204124910_omniauth_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124912_prometheus_enabled.yml b/config/metrics/settings/20210204124912_prometheus_enabled.yml
index 0e6199e9976..ca829933eda 100644
--- a/config/metrics/settings/20210204124912_prometheus_enabled.yml
+++ b/config/metrics/settings/20210204124912_prometheus_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml b/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml
index 50b08c15919..f9566076c9e 100644
--- a/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml
+++ b/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124916_reply_by_email_enabled.yml b/config/metrics/settings/20210204124916_reply_by_email_enabled.yml
index 82defcf4014..f2fb58e33ec 100644
--- a/config/metrics/settings/20210204124916_reply_by_email_enabled.yml
+++ b/config/metrics/settings/20210204124916_reply_by_email_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124918_signup_enabled.yml b/config/metrics/settings/20210204124918_signup_enabled.yml
index 49d997bd2a8..051d3933316 100644
--- a/config/metrics/settings/20210204124918_signup_enabled.yml
+++ b/config/metrics/settings/20210204124918_signup_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml b/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml
index d3eb20e93fd..4f21c0f2f18 100644
--- a/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml
+++ b/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124922_grafana_link_enabled.yml b/config/metrics/settings/20210204124922_grafana_link_enabled.yml
index a78936d3324..596ae1384ca 100644
--- a/config/metrics/settings/20210204124922_grafana_link_enabled.yml
+++ b/config/metrics/settings/20210204124922_grafana_link_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124924_elasticsearch_enabled.yml b/config/metrics/settings/20210204124924_elasticsearch_enabled.yml
index 4b7d560b4ef..a9d1646d8d8 100644
--- a/config/metrics/settings/20210204124924_elasticsearch_enabled.yml
+++ b/config/metrics/settings/20210204124924_elasticsearch_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210204124934_enabled.yml b/config/metrics/settings/20210204124934_enabled.yml
index 3f4c8653dd1..2f2586ad8f4 100644
--- a/config/metrics/settings/20210204124934_enabled.yml
+++ b/config/metrics/settings/20210204124934_enabled.yml
@@ -9,6 +9,8 @@ value_type: boolean
status: data_available
time_frame: none
data_source:
-distribution: []
-tier: []
+distribution:
+- ce
+tier:
+- free
skip_validation: true
diff --git a/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml b/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml
new file mode 100644
index 00000000000..6bb5795c971
--- /dev/null
+++ b/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: ingress_modsecurity_enabled
+description: Whether or not ModSecurity is enabled within Ingress
+product_section: sec
+product_stage: protect
+product_group: group::container security
+product_category: web_firewall
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml b/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml
new file mode 100644
index 00000000000..1828d18b794
--- /dev/null
+++ b/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: settings.ldap_encrypted_secrets_enabled
+description: Is encrypted LDAP secrets configured?
+product_section: enablement
+product_stage: enablement
+product_group: group::distribution
+product_category: global_search
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180314_gitpod_enabled.yml b/config/metrics/settings/20210216180314_gitpod_enabled.yml
new file mode 100644
index 00000000000..f716f3985f6
--- /dev/null
+++ b/config/metrics/settings/20210216180314_gitpod_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: gitpod_enabled
+description: Whether gitpod is enabled in the instance
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: integrations
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180836_enabled.yml b/config/metrics/settings/20210216180836_enabled.yml
new file mode 100644
index 00000000000..1e7e5a226c2
--- /dev/null
+++ b/config/metrics/settings/20210216180836_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.artifacts.enabled
+description: Whether Object Storage is enabled for Artifacts
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180838_enabled.yml b/config/metrics/settings/20210216180838_enabled.yml
new file mode 100644
index 00000000000..8524f525917
--- /dev/null
+++ b/config/metrics/settings/20210216180838_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.artifacts.object_store.enabled
+description: Whether Object Storage is enabled for Artifacts
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180840_direct_upload.yml b/config/metrics/settings/20210216180840_direct_upload.yml
new file mode 100644
index 00000000000..08ef5e1ece1
--- /dev/null
+++ b/config/metrics/settings/20210216180840_direct_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.artifacts.object_store.direct_upload
+description: Whether Direct Upload for Object Storage is enabled for Artifacts
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180841_background_upload.yml b/config/metrics/settings/20210216180841_background_upload.yml
new file mode 100644
index 00000000000..c7b943be3b8
--- /dev/null
+++ b/config/metrics/settings/20210216180841_background_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.artifacts.object_store.background_upload
+description: Whether Background Upload for Object Storage is enabled for Artifacts
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180845_enabled.yml b/config/metrics/settings/20210216180845_enabled.yml
new file mode 100644
index 00000000000..45148c406dc
--- /dev/null
+++ b/config/metrics/settings/20210216180845_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.external_diffs.enabled
+description: Whether Object Storage is enabled for External Diffs
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180847_enabled.yml b/config/metrics/settings/20210216180847_enabled.yml
new file mode 100644
index 00000000000..8323bd9f5ab
--- /dev/null
+++ b/config/metrics/settings/20210216180847_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.external_diffs.object_store.enabled
+description: Whether Object Storage is enabled for External Diffs
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180849_direct_upload.yml b/config/metrics/settings/20210216180849_direct_upload.yml
new file mode 100644
index 00000000000..e67b87e0bce
--- /dev/null
+++ b/config/metrics/settings/20210216180849_direct_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.external_diffs.object_store.direct_upload
+description: Whether Direct Upload for Object Storage is enabled for External Diffs
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180851_background_upload.yml b/config/metrics/settings/20210216180851_background_upload.yml
new file mode 100644
index 00000000000..058c80a536d
--- /dev/null
+++ b/config/metrics/settings/20210216180851_background_upload.yml
@@ -0,0 +1,20 @@
+---
+key_path: object_store.external_diffs.object_store.background_upload
+description: Whether Background Upload for Object Storage is enabled for External
+ Diffs
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180854_enabled.yml b/config/metrics/settings/20210216180854_enabled.yml
new file mode 100644
index 00000000000..40be02cb34a
--- /dev/null
+++ b/config/metrics/settings/20210216180854_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.lfs.enabled
+description: Whether Object Storage is enabled for LFS
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180856_enabled.yml b/config/metrics/settings/20210216180856_enabled.yml
new file mode 100644
index 00000000000..0646a211e31
--- /dev/null
+++ b/config/metrics/settings/20210216180856_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.lfs.object_store.enabled
+description: Whether Object Storage is enabled for LFS
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180858_direct_upload.yml b/config/metrics/settings/20210216180858_direct_upload.yml
new file mode 100644
index 00000000000..d4f14bc35fc
--- /dev/null
+++ b/config/metrics/settings/20210216180858_direct_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.lfs.object_store.direct_upload
+description: Whether Direct Upload for Object Storage is enabled for LFS
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180900_background_upload.yml b/config/metrics/settings/20210216180900_background_upload.yml
new file mode 100644
index 00000000000..850c7ae04e2
--- /dev/null
+++ b/config/metrics/settings/20210216180900_background_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.lfs.object_store.background_upload
+description: Whether Background Upload for Object Storage is enabled for LFS
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180905_enabled.yml b/config/metrics/settings/20210216180905_enabled.yml
new file mode 100644
index 00000000000..ef22d960a95
--- /dev/null
+++ b/config/metrics/settings/20210216180905_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.uploads.object_store.enabled
+description: Whether Object Storage is enabled for Uploads
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180907_direct_upload.yml b/config/metrics/settings/20210216180907_direct_upload.yml
new file mode 100644
index 00000000000..b34ab887fc6
--- /dev/null
+++ b/config/metrics/settings/20210216180907_direct_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.uploads.object_store.direct_upload
+description: Whether Direct Upload for Object Storage is enabled for Uploads
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180909_background_upload.yml b/config/metrics/settings/20210216180909_background_upload.yml
new file mode 100644
index 00000000000..497f7ef7926
--- /dev/null
+++ b/config/metrics/settings/20210216180909_background_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.uploads.object_store.background_upload
+description: Whether Background Upload for Object Storage is enabled for Uploads
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180913_enabled.yml b/config/metrics/settings/20210216180913_enabled.yml
new file mode 100644
index 00000000000..732a6364a3a
--- /dev/null
+++ b/config/metrics/settings/20210216180913_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.packages.enabled
+description: Whether Object Storage is enabled for Uploads
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180915_enabled.yml b/config/metrics/settings/20210216180915_enabled.yml
new file mode 100644
index 00000000000..eb78ef5f9e9
--- /dev/null
+++ b/config/metrics/settings/20210216180915_enabled.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.packages.object_store.enabled
+description: Whether Object Storage is enabled for Packages
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180916_direct_upload.yml b/config/metrics/settings/20210216180916_direct_upload.yml
new file mode 100644
index 00000000000..20785f2f8d7
--- /dev/null
+++ b/config/metrics/settings/20210216180916_direct_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.packages.object_store.direct_upload
+description: Whether Direct Upload for Object Storage is enabled for Packages
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/metrics/settings/20210216180918_background_upload.yml b/config/metrics/settings/20210216180918_background_upload.yml
new file mode 100644
index 00000000000..3ef8daaa685
--- /dev/null
+++ b/config/metrics/settings/20210216180918_background_upload.yml
@@ -0,0 +1,19 @@
+---
+key_path: object_store.packages.object_store.background_upload
+description: Whether Background Upload for Object Storage is enabled for Packages
+product_section: enablement
+product_stage: enablement
+product_group: group::memory
+product_category: operational_metrics
+value_type: boolean
+status: data_available
+time_frame: none
+data_source:
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+skip_validation: true
diff --git a/config/routes/admin.rb b/config/routes/admin.rb
index 3e04f0d97cb..39d639a70cc 100644
--- a/config/routes/admin.rb
+++ b/config/routes/admin.rb
@@ -95,7 +95,8 @@ namespace :admin do
resources :projects, only: [:index]
- resources :instance_statistics, only: :index
+ get '/instance_statistics', to: redirect('admin/usage_trends')
+ resources :usage_trends, only: :index
resource :dev_ops_report, controller: 'dev_ops_report', only: :show
resources :cohorts, only: :index
diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml
index 678b585e6d7..8fb44e63a77 100644
--- a/config/sidekiq_queues.yml
+++ b/config/sidekiq_queues.yml
@@ -34,6 +34,8 @@
- 1
- - analytics_instance_statistics_counter_job
- 1
+- - analytics_usage_trends_counter_job
+ - 1
- - approve_blocked_pending_approval_users
- 1
- - authorized_keys
@@ -300,6 +302,8 @@
- 2
- - refresh_license_compliance_checks
- 2
+- - releases_create_evidence
+ - 1
- - remote_mirror_notification
- 2
- - repository_check
diff --git a/config/webpack.config.js b/config/webpack.config.js
index 19059c35c46..e43fc3ed21c 100644
--- a/config/webpack.config.js
+++ b/config/webpack.config.js
@@ -101,7 +101,7 @@ function generateEntries() {
const manualEntries = {
default: defaultEntries,
- // sentry: './sentry/index.js', Temporarily commented out to investigate performance: https://gitlab.com/gitlab-org/gitlab/-/issues/251179
+ sentry: './sentry/index.js',
performance_bar: './performance_bar/index.js',
chrome_84_icon_fix: './lib/chrome_84_icon_fix.js',
jira_connect_app: './jira_connect/index.js',
diff --git a/danger/changes_size/Dangerfile b/danger/changes_size/Dangerfile
index f37632ced33..52e6cb65d04 100644
--- a/danger/changes_size/Dangerfile
+++ b/danger/changes_size/Dangerfile
@@ -13,7 +13,7 @@
# end
if git.lines_of_code > 2_000
- warn "This merge request is definitely too big (more than #{git.lines_of_code} lines changed), please split it into multiple merge requests."
+ warn "This merge request is definitely too big (#{git.lines_of_code} lines changed), please split it into multiple merge requests."
elsif git.lines_of_code > 500
- warn "This merge request is quite big (more than #{git.lines_of_code} lines changed), please consider splitting it into multiple merge requests."
+ warn "This merge request is quite big (#{git.lines_of_code} lines changed), please consider splitting it into multiple merge requests."
end
diff --git a/danger/product_intelligence/Dangerfile b/danger/product_intelligence/Dangerfile
index 5fd5b962993..057d3a6b909 100644
--- a/danger/product_intelligence/Dangerfile
+++ b/danger/product_intelligence/Dangerfile
@@ -45,8 +45,23 @@ usage_data_changed_files = all_changed_files.grep(%r{(usage_data)})
metrics_changed_files = all_changed_files.grep(%r{((ee/)?config/metrics/.*\.yml)})
dictionary_changed_file = all_changed_files.grep(%r{(doc/development/usage_ping/dictionary.md)})
+def matching_files?(file, extension:, pattern:)
+ return unless file.end_with?(extension)
+
+ helper.changed_lines(file).grep(pattern).any?
+end
+
+js_patterns = Regexp.union(
+ 'Tracking.event',
+ /\btrack\(/,
+ 'data-track-event'
+)
+
snowplow_changed_files = all_changed_files.select do |file|
- helper.changed_lines(file).grep(%r{Gitlab::Tracking\.event}).any?
+ matching_files?(file, extension: '.rb', pattern: %r{Gitlab::Tracking\.event}) ||
+ matching_files?(file, extension: '.js', pattern: js_patterns) ||
+ matching_files?(file, extension: '.vue', pattern: js_patterns) ||
+ matching_files?(file, extension: '.haml', pattern: %r{data: \{ track})
end
matching_changed_files = usage_data_changed_files + tracking_changed_files + metrics_changed_files + dictionary_changed_file + snowplow_changed_files
diff --git a/db/fixtures/development/26_packages.rb b/db/fixtures/development/26_packages.rb
index 2a7f80c18a3..c09d3f1fef9 100644
--- a/db/fixtures/development/26_packages.rb
+++ b/db/fixtures/development/26_packages.rb
@@ -103,8 +103,10 @@ class Gitlab::Seeder::Packages
name = "MyNugetApp.Package#{i}"
version = "4.2.#{i}"
- pkg = ::Packages::Nuget::CreatePackageService.new(project, project.creator, {}).execute
- # when using ::Packages::Nuget::CreatePackageService, packages have a fixed name and a fixed version.
+ pkg = ::Packages::CreateTemporaryPackageService.new(
+ project, project.creator, {}
+ ).execute(:nuget, name: Packages::Nuget::TEMPORARY_PACKAGE_NAME)
+ # when using ::Packages::CreateTemporaryPackageService, packages have a fixed name and a fixed version.
pkg.update!(name: name, version: version)
filename = 'package.nupkg'
diff --git a/db/fixtures/development/29_instance_statistics.rb b/db/fixtures/development/29_usage_trends.rb
index 02afdc61339..88f2ff210dd 100644
--- a/db/fixtures/development/29_instance_statistics.rb
+++ b/db/fixtures/development/29_usage_trends.rb
@@ -7,7 +7,7 @@ Gitlab::Seeder.quiet do
max_increase = 10000
max_decrease = 1000
- model_class = Analytics::InstanceStatistics::Measurement
+ model_class = Analytics::UsageTrends::Measurement
measurements = model_class.identifiers.flat_map do |_, id|
recorded_at = 60.days.ago
diff --git a/db/migrate/20201128210000_add_service_desk_reply_to_is_not_null_index_on_issues_fix.rb b/db/migrate/20201128210000_add_service_desk_reply_to_is_not_null_index_on_issues_fix.rb
new file mode 100644
index 00000000000..52d24de60d5
--- /dev/null
+++ b/db/migrate/20201128210000_add_service_desk_reply_to_is_not_null_index_on_issues_fix.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddServiceDeskReplyToIsNotNullIndexOnIssuesFix < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ INDEX_NAME = 'idx_on_issues_where_service_desk_reply_to_is_not_null'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index(:issues, [:id], name: INDEX_NAME, where: 'service_desk_reply_to IS NOT NULL')
+ end
+
+ def down
+ remove_concurrent_index_by_name(:issues, INDEX_NAME)
+ end
+end
diff --git a/db/migrate/20201221225303_add_service_desk_reply_to_is_not_null_index_on_issues.rb b/db/migrate/20201221225303_add_service_desk_reply_to_is_not_null_index_on_issues.rb
index fb5429af458..7643fc107aa 100644
--- a/db/migrate/20201221225303_add_service_desk_reply_to_is_not_null_index_on_issues.rb
+++ b/db/migrate/20201221225303_add_service_desk_reply_to_is_not_null_index_on_issues.rb
@@ -1,18 +1,11 @@
# frozen_string_literal: true
class AddServiceDeskReplyToIsNotNullIndexOnIssues < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
DOWNTIME = false
- INDEX_NAME = 'idx_on_issues_where_service_desk_reply_to_is_not_null'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(:issues, [:id], name: INDEX_NAME, where: 'service_desk_reply_to IS NOT NULL')
- end
- def down
- remove_concurrent_index_by_name(:issues, INDEX_NAME)
+ def change
+ # no-op, the migration's version number was lowered to be executed earlier than db/post_migrate/20201128210234_schedule_populate_issue_email_participants.rb
+ #
+ # The new migration is located here: db/migrate/20201128210000_add_service_desk_reply_to_is_not_null_index_on_issues_fix.rb
end
end
diff --git a/db/migrate/20201228110136_create_iterations_cadence.rb b/db/migrate/20201228110136_create_iterations_cadence.rb
new file mode 100644
index 00000000000..95601ab4b29
--- /dev/null
+++ b/db/migrate/20201228110136_create_iterations_cadence.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class CreateIterationsCadence < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ create_table_with_constraints :iterations_cadences do |t|
+ t.references :group, null: false, foreign_key: { to_table: :namespaces, on_delete: :cascade }
+ t.timestamps_with_timezone null: false
+ t.date :start_date, null: false
+ t.date :last_run_date
+ t.integer :duration_in_weeks
+ t.integer :iterations_in_advance
+ t.boolean :active, default: true, null: false
+ t.boolean :automatic, default: true, null: false
+ t.text :title, null: false
+
+ t.text_limit :title, 255
+ end
+ end
+
+ def down
+ drop_table :iterations_cadences if table_exists?(:iterations_cadences)
+ end
+end
diff --git a/db/migrate/20201228110238_add_iterations_cadence_to_sprints.rb b/db/migrate/20201228110238_add_iterations_cadence_to_sprints.rb
new file mode 100644
index 00000000000..9d9026a265b
--- /dev/null
+++ b/db/migrate/20201228110238_add_iterations_cadence_to_sprints.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class AddIterationsCadenceToSprints < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_sprints_iterations_cadence_id'
+
+ def up
+ add_column :sprints, :iterations_cadence_id, :integer unless column_exists?(:sprints, :iterations_cadence_id)
+
+ add_concurrent_index :sprints, :iterations_cadence_id, name: INDEX_NAME
+ add_concurrent_foreign_key :sprints, :iterations_cadences, column: :iterations_cadence_id, on_delete: :cascade
+ end
+
+ def down
+ remove_column :sprints, :iterations_cadence_id if column_exists?(:sprints, :iterations_cadence_id)
+ end
+end
diff --git a/db/migrate/20210106191305_rename_indexes_on_git_lab_com.rb b/db/migrate/20210106191305_rename_indexes_on_git_lab_com.rb
new file mode 100644
index 00000000000..5238192e1d1
--- /dev/null
+++ b/db/migrate/20210106191305_rename_indexes_on_git_lab_com.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+# This migration aligns an existing database schema with what we actually expect
+# and fixes inconsistencies with index names and similar issues.
+#
+# This is intended for GitLab.com, but can be run on any instance.
+class RenameIndexesOnGitLabCom < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ rename_index_if_exists :ldap_group_links, 'ldap_groups_pkey', 'ldap_group_links_pkey'
+
+ # Removes unique constraint, add unique index instead
+ replace_unique_constraint_with_index :emails, :email, 'emails_email_key', 'index_emails_on_email'
+ replace_unique_constraint_with_index :users, :confirmation_token, 'users_confirmation_token_key', 'index_users_on_confirmation_token'
+ replace_unique_constraint_with_index :users, :reset_password_token, 'users_reset_password_token_key', 'index_users_on_reset_password_token'
+ replace_unique_constraint_with_index :users, :email, 'users_email_key', 'index_users_on_email'
+
+ upgrade_to_primary_key(:schema_migrations, :version, 'schema_migrations_version_key', 'schema_migrations_pkey')
+ end
+
+ def down
+ # no-op
+ end
+
+ private
+
+ def replace_unique_constraint_with_index(table, columns, old_name, new_name)
+ return unless index_exists_by_name?(table, old_name)
+
+ add_concurrent_index table, columns, unique: true, name: new_name
+ execute "ALTER TABLE #{quote_table_name(table)} DROP CONSTRAINT #{quote_table_name(old_name)}"
+ end
+
+ def rename_index_if_exists(table, old_name, new_name)
+ return unless index_exists_by_name?(table, old_name)
+ return if index_exists_by_name?(table, new_name)
+
+ with_lock_retries do
+ rename_index table, old_name, new_name
+ end
+ end
+
+ def upgrade_to_primary_key(table, column, old_name, new_name)
+ return unless index_exists_by_name?(table, old_name)
+ return if index_exists_by_name?(table, new_name)
+
+ return if primary_key(table)
+
+ execute "ALTER TABLE #{quote_table_name(table)} ADD CONSTRAINT #{new_name} PRIMARY KEY (#{column})"
+ execute "ALTER TABLE #{quote_table_name(table)} DROP CONSTRAINT #{old_name}"
+ end
+end
diff --git a/db/migrate/20210205134213_add_creator_id_to_custom_emoji.rb b/db/migrate/20210205134213_add_creator_id_to_custom_emoji.rb
new file mode 100644
index 00000000000..c01335767a8
--- /dev/null
+++ b/db/migrate/20210205134213_add_creator_id_to_custom_emoji.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class AddCreatorIdToCustomEmoji < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def up
+ # Custom Emoji is at the moment behind a default-disabled feature flag. It
+ # will be unlikely there are any records in this table, but to able to
+ # ensure a not-null constraint delete any existing rows.
+ # Roll-out issue: https://gitlab.com/gitlab-org/gitlab/-/issues/231317
+ execute 'DELETE FROM custom_emoji'
+
+ add_reference :custom_emoji, # rubocop:disable Migration/AddReference
+ :creator,
+ index: true,
+ null: false, # rubocop:disable Rails/NotNullColumn
+ foreign_key: false # FK is added in 20210219100137
+ end
+
+ def down
+ remove_reference :custom_emoji, :creator
+ end
+end
diff --git a/db/migrate/20210212163231_add_merge_when_pipeline_succeeds_to_notification_settings.rb b/db/migrate/20210212163231_add_merge_when_pipeline_succeeds_to_notification_settings.rb
new file mode 100644
index 00000000000..08d0a99436e
--- /dev/null
+++ b/db/migrate/20210212163231_add_merge_when_pipeline_succeeds_to_notification_settings.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+# See https://docs.gitlab.com/ee/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class AddMergeWhenPipelineSucceedsToNotificationSettings < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ add_column :notification_settings, :merge_when_pipeline_succeeds, :boolean, default: false, null: false
+ end
+end
diff --git a/db/migrate/20210216193620_add_description_to_cluster_token.rb b/db/migrate/20210216193620_add_description_to_cluster_token.rb
new file mode 100644
index 00000000000..67f7c6bd522
--- /dev/null
+++ b/db/migrate/20210216193620_add_description_to_cluster_token.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class AddDescriptionToClusterToken < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ unless column_exists?(:cluster_agent_tokens, :description)
+ add_column :cluster_agent_tokens, :description, :text
+ end
+
+ add_text_limit :cluster_agent_tokens, :description, 1024
+ end
+
+ def down
+ remove_column :cluster_agent_tokens, :description
+ end
+end
diff --git a/db/migrate/20210219100137_add_creator_foreign_key_to_custom_emoji.rb b/db/migrate/20210219100137_add_creator_foreign_key_to_custom_emoji.rb
new file mode 100644
index 00000000000..a954ba5ba3b
--- /dev/null
+++ b/db/migrate/20210219100137_add_creator_foreign_key_to_custom_emoji.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class AddCreatorForeignKeyToCustomEmoji < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ FK_NAME = 'fk_custom_emoji_creator_id'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :custom_emoji, :users,
+ on_delete: :cascade,
+ column: :creator_id,
+ name: FK_NAME
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :custom_emoji, name: FK_NAME
+ end
+ end
+end
diff --git a/db/post_migrate/20201231133921_schedule_set_default_iteration_cadences.rb b/db/post_migrate/20201231133921_schedule_set_default_iteration_cadences.rb
new file mode 100644
index 00000000000..2de47915a2f
--- /dev/null
+++ b/db/post_migrate/20201231133921_schedule_set_default_iteration_cadences.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class ScheduleSetDefaultIterationCadences < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ BATCH_SIZE = 1_000
+ DELAY_INTERVAL = 2.minutes.to_i
+ MIGRATION_CLASS = 'SetDefaultIterationCadences'
+
+ class Iteration < ActiveRecord::Base # rubocop:disable Style/Documentation
+ include EachBatch
+
+ self.table_name = 'sprints'
+ end
+
+ disable_ddl_transaction!
+
+ def up
+ Iteration.select(:group_id).distinct.each_batch(of: BATCH_SIZE, column: :group_id) do |batch, index|
+ group_ids = batch.pluck(:group_id)
+
+ migrate_in(index * DELAY_INTERVAL, MIGRATION_CLASS, group_ids)
+ end
+ end
+
+ def down
+ # Not needed
+ end
+end
diff --git a/db/post_migrate/20210215144909_migrate_usage_trends_sidekiq_queue.rb b/db/post_migrate/20210215144909_migrate_usage_trends_sidekiq_queue.rb
new file mode 100644
index 00000000000..3e6eabfba97
--- /dev/null
+++ b/db/post_migrate/20210215144909_migrate_usage_trends_sidekiq_queue.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class MigrateUsageTrendsSidekiqQueue < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ sidekiq_queue_migrate 'cronjob:analytics_instance_statistics_count_job_trigger', to: 'cronjob:analytics_usage_trends_count_job_trigger'
+ sidekiq_queue_migrate 'analytics_instance_statistics_counter_job', to: 'analytics_usage_trends_counter_job'
+ end
+
+ def down
+ sidekiq_queue_migrate 'cronjob:analytics_usage_trends_count_job_trigger', to: 'cronjob:analytics_instance_statistics_count_job_trigger'
+ sidekiq_queue_migrate 'analytics_usage_trends_counter_job', to: 'analytics_instance_statistics_counter_job'
+ end
+end
diff --git a/db/post_migrate/20210217100728_move_create_release_evidence_queue_out_of_cronjob_namespace.rb b/db/post_migrate/20210217100728_move_create_release_evidence_queue_out_of_cronjob_namespace.rb
new file mode 100644
index 00000000000..22bead87dc1
--- /dev/null
+++ b/db/post_migrate/20210217100728_move_create_release_evidence_queue_out_of_cronjob_namespace.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class MoveCreateReleaseEvidenceQueueOutOfCronjobNamespace < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ # Set this constant to true if this migration requires downtime.
+ DOWNTIME = false
+
+ def up
+ sidekiq_queue_migrate 'cronjob:releases_create_evidence', to: 'releases_create_evidence'
+ end
+
+ def down
+ sidekiq_queue_migrate 'releases_create_evidence', to: 'cronjob:releases_create_evidence'
+ end
+end
diff --git a/db/schema_migrations/20201128210000 b/db/schema_migrations/20201128210000
new file mode 100644
index 00000000000..9ce8d37ff37
--- /dev/null
+++ b/db/schema_migrations/20201128210000
@@ -0,0 +1 @@
+2f7415e3e3e66f326f2f65c38406c2103d5075493c86a836497c3541655f4e86 \ No newline at end of file
diff --git a/db/schema_migrations/20201228110136 b/db/schema_migrations/20201228110136
new file mode 100644
index 00000000000..51496856ff9
--- /dev/null
+++ b/db/schema_migrations/20201228110136
@@ -0,0 +1 @@
+6488e3542276042f302d79533e3e84c43a4ef471535137bcef11e73a0e4d961f \ No newline at end of file
diff --git a/db/schema_migrations/20201228110238 b/db/schema_migrations/20201228110238
new file mode 100644
index 00000000000..300b53bacee
--- /dev/null
+++ b/db/schema_migrations/20201228110238
@@ -0,0 +1 @@
+7be98c4f62df9fd837f7a547916dd5481c0b4da2d4fc6680b104b2a998be1eed \ No newline at end of file
diff --git a/db/schema_migrations/20201231133921 b/db/schema_migrations/20201231133921
new file mode 100644
index 00000000000..40f792eac8f
--- /dev/null
+++ b/db/schema_migrations/20201231133921
@@ -0,0 +1 @@
+26bf4abb73a53f71fbcb8b5cd1ae1e1539ec59e7052b3bbed95ab1de3fda3de7 \ No newline at end of file
diff --git a/db/schema_migrations/20210106191305 b/db/schema_migrations/20210106191305
new file mode 100644
index 00000000000..5fd79e227e6
--- /dev/null
+++ b/db/schema_migrations/20210106191305
@@ -0,0 +1 @@
+938977d6379e484a53857304c339a024c32d8b71c2175574a72314e461d67e3b \ No newline at end of file
diff --git a/db/schema_migrations/20210205134213 b/db/schema_migrations/20210205134213
new file mode 100644
index 00000000000..bc2525e85cd
--- /dev/null
+++ b/db/schema_migrations/20210205134213
@@ -0,0 +1 @@
+7c368cad497ccfd86c6a92e2edfec1d2a16879eb749184b1d20c5ab4c702b974 \ No newline at end of file
diff --git a/db/schema_migrations/20210212163231 b/db/schema_migrations/20210212163231
new file mode 100644
index 00000000000..e0ba3d83bf5
--- /dev/null
+++ b/db/schema_migrations/20210212163231
@@ -0,0 +1 @@
+4c6061f6ab1cb9e070a3ae87d44caf12d2c110a6033f0b33898b4b7ea7e37055 \ No newline at end of file
diff --git a/db/schema_migrations/20210215144909 b/db/schema_migrations/20210215144909
new file mode 100644
index 00000000000..02939e3dba5
--- /dev/null
+++ b/db/schema_migrations/20210215144909
@@ -0,0 +1 @@
+2965d990ec9cf2edd610b063686f9a1d9de4c38bcba3c8439a18159812d529d4 \ No newline at end of file
diff --git a/db/schema_migrations/20210216193620 b/db/schema_migrations/20210216193620
new file mode 100644
index 00000000000..6c8e8d4c1c4
--- /dev/null
+++ b/db/schema_migrations/20210216193620
@@ -0,0 +1 @@
+3587ba61d003385ea63ce900c1dd1c2bd1f2386abd921615b50421f1b798f553 \ No newline at end of file
diff --git a/db/schema_migrations/20210217100728 b/db/schema_migrations/20210217100728
new file mode 100644
index 00000000000..6027a27f8c2
--- /dev/null
+++ b/db/schema_migrations/20210217100728
@@ -0,0 +1 @@
+281ea05a95785b7f1d2d805bf8fe071c0fa59425eb01b46eeb69ad21f5650e29 \ No newline at end of file
diff --git a/db/schema_migrations/20210219100137 b/db/schema_migrations/20210219100137
new file mode 100644
index 00000000000..c573c4fde5f
--- /dev/null
+++ b/db/schema_migrations/20210219100137
@@ -0,0 +1 @@
+be2ddc15e16d7d59bd050a60faaa0b6941d94ba7c47a88be473bcf3a17bb2763 \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 97a2850fd5c..5e1fc008256 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -11026,6 +11026,8 @@ CREATE TABLE cluster_agent_tokens (
agent_id bigint NOT NULL,
token_encrypted text NOT NULL,
created_by_user_id bigint,
+ description text,
+ CONSTRAINT check_4e4ec5070a CHECK ((char_length(description) <= 1024)),
CONSTRAINT check_c60daed227 CHECK ((char_length(token_encrypted) <= 255))
);
@@ -11607,6 +11609,7 @@ CREATE TABLE custom_emoji (
name text NOT NULL,
file text NOT NULL,
external boolean DEFAULT true NOT NULL,
+ creator_id bigint NOT NULL,
CONSTRAINT check_8c586dd507 CHECK ((char_length(name) <= 36)),
CONSTRAINT check_dd5d60f1fb CHECK ((char_length(file) <= 255))
);
@@ -13544,6 +13547,30 @@ CREATE TABLE issues_self_managed_prometheus_alert_events (
updated_at timestamp with time zone NOT NULL
);
+CREATE TABLE iterations_cadences (
+ id bigint NOT NULL,
+ group_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ start_date date NOT NULL,
+ last_run_date date,
+ duration_in_weeks integer,
+ iterations_in_advance integer,
+ active boolean DEFAULT true NOT NULL,
+ automatic boolean DEFAULT true NOT NULL,
+ title text NOT NULL,
+ CONSTRAINT check_fedff82d3b CHECK ((char_length(title) <= 255))
+);
+
+CREATE SEQUENCE iterations_cadences_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE iterations_cadences_id_seq OWNED BY iterations_cadences.id;
+
CREATE TABLE jira_connect_installations (
id bigint NOT NULL,
client_key character varying,
@@ -14506,7 +14533,8 @@ CREATE TABLE notification_settings (
fixed_pipeline boolean,
new_release boolean,
moved_project boolean DEFAULT true NOT NULL,
- change_reviewer_merge_request boolean
+ change_reviewer_merge_request boolean,
+ merge_when_pipeline_succeeds boolean DEFAULT false NOT NULL
);
CREATE SEQUENCE notification_settings_id_seq
@@ -17357,6 +17385,7 @@ CREATE TABLE sprints (
description text,
description_html text,
state_enum smallint DEFAULT 1 NOT NULL,
+ iterations_cadence_id integer,
CONSTRAINT sprints_must_belong_to_project_or_group CHECK ((((project_id <> NULL::bigint) AND (group_id IS NULL)) OR ((group_id <> NULL::bigint) AND (project_id IS NULL)))),
CONSTRAINT sprints_title CHECK ((char_length(title) <= 255))
);
@@ -19068,6 +19097,8 @@ ALTER TABLE ONLY issue_user_mentions ALTER COLUMN id SET DEFAULT nextval('issue_
ALTER TABLE ONLY issues ALTER COLUMN id SET DEFAULT nextval('issues_id_seq'::regclass);
+ALTER TABLE ONLY iterations_cadences ALTER COLUMN id SET DEFAULT nextval('iterations_cadences_id_seq'::regclass);
+
ALTER TABLE ONLY jira_connect_installations ALTER COLUMN id SET DEFAULT nextval('jira_connect_installations_id_seq'::regclass);
ALTER TABLE ONLY jira_connect_subscriptions ALTER COLUMN id SET DEFAULT nextval('jira_connect_subscriptions_id_seq'::regclass);
@@ -20368,6 +20399,9 @@ ALTER TABLE ONLY sprints
ALTER TABLE ONLY sprints
ADD CONSTRAINT iteration_start_and_due_daterange_project_id_constraint EXCLUDE USING gist (project_id WITH =, daterange(start_date, due_date, '[]'::text) WITH &&) WHERE ((project_id IS NOT NULL));
+ALTER TABLE ONLY iterations_cadences
+ ADD CONSTRAINT iterations_cadences_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY jira_connect_installations
ADD CONSTRAINT jira_connect_installations_pkey PRIMARY KEY (id);
@@ -21937,6 +21971,8 @@ CREATE INDEX index_csv_issue_imports_on_project_id ON csv_issue_imports USING bt
CREATE INDEX index_csv_issue_imports_on_user_id ON csv_issue_imports USING btree (user_id);
+CREATE INDEX index_custom_emoji_on_creator_id ON custom_emoji USING btree (creator_id);
+
CREATE UNIQUE INDEX index_custom_emoji_on_namespace_id_and_name ON custom_emoji USING btree (namespace_id, name);
CREATE UNIQUE INDEX index_daily_build_group_report_results_unique_columns ON ci_daily_build_group_report_results USING btree (project_id, ref_path, date, group_name);
@@ -22441,6 +22477,8 @@ CREATE INDEX index_issues_on_updated_at ON issues USING btree (updated_at);
CREATE INDEX index_issues_on_updated_by_id ON issues USING btree (updated_by_id) WHERE (updated_by_id IS NOT NULL);
+CREATE INDEX index_iterations_cadences_on_group_id ON iterations_cadences USING btree (group_id);
+
CREATE UNIQUE INDEX index_jira_connect_installations_on_client_key ON jira_connect_installations USING btree (client_key);
CREATE INDEX index_jira_connect_subscriptions_on_namespace_id ON jira_connect_subscriptions USING btree (namespace_id);
@@ -23431,6 +23469,8 @@ CREATE UNIQUE INDEX index_sop_configs_on_project_id ON security_orchestration_po
CREATE UNIQUE INDEX index_sop_configs_on_security_policy_management_project_id ON security_orchestration_policy_configurations USING btree (security_policy_management_project_id);
+CREATE INDEX index_sprints_iterations_cadence_id ON sprints USING btree (iterations_cadence_id);
+
CREATE INDEX index_sprints_on_description_trigram ON sprints USING gin (description gin_trgm_ops);
CREATE INDEX index_sprints_on_due_date ON sprints USING btree (due_date);
@@ -24268,6 +24308,9 @@ ALTER TABLE ONLY namespaces
ALTER TABLE ONLY epics
ADD CONSTRAINT fk_3654b61b03 FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE;
+ALTER TABLE ONLY sprints
+ ADD CONSTRAINT fk_365d1db505 FOREIGN KEY (iterations_cadence_id) REFERENCES iterations_cadences(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY push_event_payloads
ADD CONSTRAINT fk_36c74129da FOREIGN KEY (event_id) REFERENCES events(id) ON DELETE CASCADE;
@@ -24649,6 +24692,9 @@ ALTER TABLE ONLY todos
ALTER TABLE ONLY geo_event_log
ADD CONSTRAINT fk_cff7185ad2 FOREIGN KEY (reset_checksum_event_id) REFERENCES geo_reset_checksum_events(id) ON DELETE CASCADE;
+ALTER TABLE ONLY custom_emoji
+ ADD CONSTRAINT fk_custom_emoji_creator_id FOREIGN KEY (creator_id) REFERENCES users(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY bulk_import_entities
ADD CONSTRAINT fk_d06d023c30 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -26143,6 +26189,9 @@ ALTER TABLE ONLY alert_management_alert_user_mentions
ALTER TABLE ONLY snippet_statistics
ADD CONSTRAINT fk_rails_ebc283ccf1 FOREIGN KEY (snippet_id) REFERENCES snippets(id) ON DELETE CASCADE;
+ALTER TABLE ONLY iterations_cadences
+ ADD CONSTRAINT fk_rails_ece400c55a FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY dast_profiles
ADD CONSTRAINT fk_rails_ed1e66fbbf FOREIGN KEY (dast_site_profile_id) REFERENCES dast_site_profiles(id) ON DELETE CASCADE;
diff --git a/doc/.vale/gitlab/spelling-exceptions.txt b/doc/.vale/gitlab/spelling-exceptions.txt
index 375cecfdee4..88d1d2555f1 100644
--- a/doc/.vale/gitlab/spelling-exceptions.txt
+++ b/doc/.vale/gitlab/spelling-exceptions.txt
@@ -41,6 +41,7 @@ autoscales
autoscaling
awardable
awardables
+Ayoa
Axios
Azure
B-tree
@@ -56,6 +57,7 @@ backtracing
badging
Bamboo
Bazel
+Bhyve
Bitbucket
blockquote
blockquoted
@@ -89,6 +91,7 @@ Certbot
changeset
changesets
chai
+ChaosKube
chatbot
chatbots
ChatOps
@@ -111,6 +114,8 @@ Contentful
Corosync
Coursier
cron
+cronjob
+cronjobs
crons
crontab
crontabs
@@ -122,6 +127,8 @@ CrowdIn
CSV
cybersecurity
Dangerfile
+datasource
+datasources
datetime
Debian
Decompressor
@@ -280,6 +287,7 @@ kaniko
Karma
Kerberos
keyset
+keyspace
keytab
keytabs
Kibana
@@ -350,6 +358,7 @@ mixins
mockup
mockups
ModSecurity
+Monokai
monorepo
monorepos
multiline
@@ -373,6 +382,7 @@ nullable
Nurtch
nyc
OAuth
+Octokit
offboarded
offboarding
offboards
@@ -404,9 +414,11 @@ Poedit
polyfill
polyfills
pooler
+postfixed
postgres.ai
PostgreSQL
precompile
+precompiled
preconfigure
preconfigured
preconfigures
@@ -421,6 +433,7 @@ prepend
prepended
prepending
prepends
+prepopulated
Prettifier
Pritaly
Priyanka
@@ -443,6 +456,7 @@ queryable
Quicktime
Rackspace
Raspbian
+rbtrace
Rdoc
reachability
Realplayer
@@ -477,6 +491,7 @@ reinitialize
reinitializing
relicensing
remediations
+replicables
repmgr
repmgrd
repurposing
@@ -519,10 +534,12 @@ Salesforce
sandboxing
sanitization
sbt
+scalers
scatterplot
scatterplots
Schemastore
scrollable
+Semgrep
Sendmail
Sentry
serializer
@@ -538,11 +555,13 @@ Sidekiq
Silverlight
Sisense
Sitespeed
+skippable
Slack
Slackbot
Slony
smartcard
smartcards
+snapshotting
Sobelow
Solarized
Sourcegraph
@@ -561,6 +580,9 @@ strace
strikethrough
strikethroughs
stunnel
+stylelint
+subchart
+subcharts
subfolder
subfolders
subgraph
@@ -620,12 +642,14 @@ todos
tokenizer
Tokenizers
tokenizing
+tolerations
toolchain
toolchains
toolkit
toolkits
tooltip
tooltips
+transactionally
transpile
transpiled
transpiles
@@ -634,6 +658,7 @@ Trello
triaged
triages
triaging
+Trivy
truthy
Truststore
Twilio
@@ -665,6 +690,9 @@ unencoded
unencoder
unencodes
unencrypted
+unfollow
+unfollowed
+unfollows
Unicorn
unindexed
unlink
@@ -703,6 +731,7 @@ unreplicated
unresolve
unresolved
unresolving
+unreviewed
unsanitized
unschedule
unscoped
@@ -720,6 +749,7 @@ unstash
unstashed
unstashing
unsynced
+unsynchronized
untarred
untracked
untrusted
@@ -772,3 +802,4 @@ Yubico
Zeitwerk
Zendesk
zsh
+Zstandard
diff --git a/doc/README.md b/doc/README.md
index 4c4b0cd3a15..8dd6354b388 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -67,7 +67,7 @@ We have the following documentation to rapidly uplift your GitLab knowledge:
| Topic | Description |
|:--------------------------------------------------------------------------------------------------|:------------|
| [GitLab basics guides](gitlab-basics/index.md) | Start working on the command line and with GitLab. |
-| [GitLab workflow overview](https://about.gitlab.com/blog/2016/10/25/gitlab-workflow-an-overview/) | Enhance your workflow with the best of GitLab Workflow. |
+| [GitLab workflow overview](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/) | Enhance your workflow with the best of GitLab Workflow. |
| [Get started with GitLab CI/CD](ci/quick_start/index.md) | Quickly implement GitLab CI/CD. |
| [Auto DevOps](topics/autodevops/index.md) | Learn more about Auto DevOps in GitLab. |
| [GitLab Markdown](user/markdown.md) | Advanced formatting system (GitLab Flavored Markdown). |
diff --git a/doc/administration/auth/ldap/index.md b/doc/administration/auth/ldap/index.md
index 466ae8e108c..4180c57e3c7 100644
--- a/doc/administration/auth/ldap/index.md
+++ b/doc/administration/auth/ldap/index.md
@@ -180,9 +180,16 @@ production:
| `allow_username_or_email_login` | If enabled, GitLab ignores everything after the first `@` in the LDAP username submitted by the user on sign-in. If you are using `uid: 'userPrincipalName'` on ActiveDirectory you need to disable this setting, because the userPrincipalName contains an `@`. | no | boolean |
| `block_auto_created_users` | To maintain tight control over the number of billable users on your GitLab installation, enable this setting to keep new users blocked until they have been cleared by an administrator (default: false). | no | boolean |
| `base` | Base where we can search for users. | yes | `'ou=people,dc=gitlab,dc=example'` or `'DC=mydomain,DC=com'` |
-| `user_filter` | Filter LDAP users. Format: [RFC 4515](https://tools.ietf.org/search/rfc4515) Note: GitLab does not support `omniauth-ldap`'s custom filter syntax. | no | `'(employeeType=developer)'` or `'(&(objectclass=user)(|(samaccountname=momo)(samaccountname=toto)))'` |
+| `user_filter` | Filter LDAP users. Format: [RFC 4515](https://tools.ietf.org/search/rfc4515) Note: GitLab does not support `omniauth-ldap`'s custom filter syntax. | no | For examples, read [Examples of user filters](#examples-of-user-filters). |
| `lowercase_usernames` | If lowercase_usernames is enabled, GitLab converts the name to lower case. | no | boolean |
+#### Examples of user filters
+
+Some examples of the `user_filter` field syntax:
+
+- `'(employeeType=developer)'`
+- `'(&(objectclass=user)(|(samaccountname=momo)(samaccountname=toto)))'`
+
### SSL Configuration Settings **(FREE SELF)**
| Setting | Description | Required | Examples |
diff --git a/doc/administration/consul.md b/doc/administration/consul.md
index dfc859e30c2..926267a414a 100644
--- a/doc/administration/consul.md
+++ b/doc/administration/consul.md
@@ -146,7 +146,7 @@ sudo gitlab-ctl restart consul
### Consul nodes unable to communicate
By default, Consul will attempt to
-[bind](https://www.consul.io/docs/agent/options.html#_bind) to `0.0.0.0`, but
+[bind](https://www.consul.io/docs/agent/options#_bind) to `0.0.0.0`, but
it will advertise the first private IP address on the node for other Consul nodes
to communicate with it. If the other nodes cannot communicate with a node on
this address, then the cluster will have a failed status.
diff --git a/doc/administration/gitaly/index.md b/doc/administration/gitaly/index.md
index f02b9b8fc1a..7bb99bd1018 100644
--- a/doc/administration/gitaly/index.md
+++ b/doc/administration/gitaly/index.md
@@ -816,7 +816,7 @@ exceed 1, and the concurrency limiter has no effect.
## Background Repository Optimization
-Empty directories and unneeded config settings may accumulate in a repository and
+Empty directories and unneeded configuration settings may accumulate in a repository and
slow down Git operations. Gitaly can schedule a daily background task with a maximum duration
to clean up these items and improve performance.
diff --git a/doc/administration/integration/plantuml.md b/doc/administration/integration/plantuml.md
index dbbe17cccc8..834f4047fdd 100644
--- a/doc/administration/integration/plantuml.md
+++ b/doc/administration/integration/plantuml.md
@@ -5,22 +5,94 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference, howto
---
-# PlantUML & GitLab **(FREE)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/8537) in GitLab 8.16.
+# PlantUML and GitLab **(FREE)**
When [PlantUML](https://plantuml.com) integration is enabled and configured in
-GitLab you can create diagrams in AsciiDoc and Markdown documents
-created in snippets, wikis, and repositories.
+GitLab, you can create diagrams in snippets, wikis, and repositories. To set up
+the integration, you must:
+
+1. [Configure your PlantUML server](#configure-your-plantuml-server).
+1. [Configure local PlantUML access](#configure-local-plantuml-access).
+1. [Configure PlantUML security](#configure-plantuml-security).
+1. [Enable the integration](#enable-plantuml-integration).
+
+After completing the integration, PlantUML converts `plantuml`
+blocks to an HTML image tag, with the source pointing to the PlantUML instance. The PlantUML
+diagram delimiters `@startuml`/`@enduml` aren't required, as these are replaced
+by the `plantuml` block:
+
+- **Markdown**
+
+ ````markdown
+ ```plantuml
+ Bob -> Alice : hello
+ Alice -> Bob : hi
+ ```
+ ````
+
+- **AsciiDoc**
+
+ ```plaintext
+ [plantuml, format="png", id="myDiagram", width="200px"]
+ ----
+ Bob->Alice : hello
+ Alice -> Bob : hi
+ ----
+ ```
+
+- **reStructuredText**
-## PlantUML Server
+ ```plaintext
+ .. plantuml::
+ :caption: Caption with **bold** and *italic*
+
+ Bob -> Alice: hello
+ Alice -> Bob: hi
+ ```
-Before you can enable PlantUML in GitLab; set up your own PlantUML
-server to generate the diagrams.
+ Although you can use the `uml::` directive for compatibility with
+ [`sphinxcontrib-plantuml`](https://pypi.org/project/sphinxcontrib-plantuml/),
+ GitLab supports only the `caption` option.
+
+If the PlantUML server is correctly configured, these examples should render a
+diagram instead of the code block:
+
+```plantuml
+Bob -> Alice : hello
+Alice -> Bob : hi
+```
+
+Inside the block you can add any of the diagrams PlantUML supports, such as:
+
+- [Activity](https://plantuml.com/activity-diagram-legacy)
+- [Class](https://plantuml.com/class-diagram)
+- [Component](https://plantuml.com/component-diagram)
+- [Object](https://plantuml.com/object-diagram)
+- [Sequence](https://plantuml.com/sequence-diagram)
+- [State](https://plantuml.com/state-diagram)
+- [Use Case](https://plantuml.com/use-case-diagram)
+
+You can add parameters to block definitions:
+
+- `format`: Can be either `png` (default) or `svg`. Use `svg` with care, as it's
+ not supported by all browsers, and isn't supported by Markdown.
+- `id`: A CSS ID added to the diagram HTML tag.
+- `width`: Width attribute added to the image tag.
+- `height`: Height attribute added to the image tag.
+
+Markdown does not support any parameters, and always uses PNG format.
+
+## Configure your PlantUML server
+
+Before you can enable PlantUML in GitLab, set up your own PlantUML
+server to generate the diagrams:
+
+- [In Docker](#docker).
+- [In Debian/Ubuntu](#debianubuntu).
### Docker
-With Docker, you can just run a container like this:
+To run a PlantUML container in Docker, run this command:
```shell
docker run -d --name plantuml -p 8080:8080 plantuml/plantuml-server:tomcat
@@ -29,8 +101,9 @@ docker run -d --name plantuml -p 8080:8080 plantuml/plantuml-server:tomcat
The **PlantUML URL** is the hostname of the server running the container.
When running GitLab in Docker, it must have access to the PlantUML container.
-You can achieve that by using [Docker Compose](https://docs.docker.com/compose/).
-A basic `docker-compose.yml` file could contain:
+To achieve that, use [Docker Compose](https://docs.docker.com/compose/).
+In this basic `docker-compose.yml` file, PlantUML is accessible to GitLab at the URL
+`http://plantuml:8080/`:
```yaml
version: "3"
@@ -46,37 +119,32 @@ services:
container_name: plantuml
```
-In this scenario, PlantUML is accessible to GitLab at the URL
-`http://plantuml:8080/`.
-
### Debian/Ubuntu
-You can also install and configure a PlantUML server in Debian/Ubuntu distributions using Tomcat.
+You can install and configure a PlantUML server in Debian/Ubuntu distributions
+using Tomcat:
-First you need to create a `plantuml.war` file from the source code:
+1. Run these commands to create a `plantuml.war` file from the source code:
-```shell
-sudo apt-get install graphviz openjdk-8-jdk git-core maven
-git clone https://github.com/plantuml/plantuml-server.git
-cd plantuml-server
-mvn package
-```
+ ```shell
+ sudo apt-get install graphviz openjdk-8-jdk git-core maven
+ git clone https://github.com/plantuml/plantuml-server.git
+ cd plantuml-server
+ mvn package
+ ```
-The above sequence of commands generates a `.war` file you can deploy with Tomcat:
+1. Deploy the `.war` file from the previous step with these commands:
-```shell
-sudo apt-get install tomcat8
-sudo cp target/plantuml.war /var/lib/tomcat8/webapps/plantuml.war
-sudo chown tomcat8:tomcat8 /var/lib/tomcat8/webapps/plantuml.war
-sudo service tomcat8 restart
-```
+ ```shell
+ sudo apt-get install tomcat8
+ sudo cp target/plantuml.war /var/lib/tomcat8/webapps/plantuml.war
+ sudo chown tomcat8:tomcat8 /var/lib/tomcat8/webapps/plantuml.war
+ sudo service tomcat8 restart
+ ```
-After the Tomcat service restarts, the PlantUML service is ready and
-listening for requests on port 8080:
-
-```plaintext
-http://localhost:8080/plantuml
-```
+The Tomcat service should restart. After the restart is complete, the
+PlantUML service is ready and listening for requests on port 8080:
+`http://localhost:8080/plantuml`
To change these defaults, edit the `/etc/tomcat8/server.xml` file.
@@ -85,40 +153,44 @@ The default URL is different when using this approach. The Docker-based image
makes the service available at the root URL, with no relative path. Adjust
the configuration below accordingly.
-### Making local PlantUML accessible using custom GitLab setup
+## Configure local PlantUML access
-The PlantUML server runs locally on your server, so it is not accessible
-externally by default. As such, it is necessary to catch external PlantUML
-calls and redirect them to the local server.
+The PlantUML server runs locally on your server, so it can't be accessed
+externally by default. Your server must catch external PlantUML
+calls to `https://gitlab.example.com/-/plantuml/` and redirect them to the
+local PlantUML server. Depending on your setup, the URL is either of the
+following:
-The idea is to redirect each call to `https://gitlab.example.com/-/plantuml/`
-to the local PlantUML server `http://plantuml:8080/` or `http://localhost:8080/plantuml/`, depending on your setup.
+- `http://plantuml:8080/`
+- `http://localhost:8080/plantuml/`
-To enable the redirection, add the following line in `/etc/gitlab/gitlab.rb`:
+If you're running [GitLab with TLS](https://docs.gitlab.com/omnibus/settings/ssl.html)
+you must configure this redirection, because PlantUML uses the insecure HTTP protocol.
+Newer browsers such as [Google Chrome 86+](https://www.chromestatus.com/feature/4926989725073408)
+don't load insecure HTTP resources on pages served over HTTPS.
-```ruby
-# Docker deployment
-nginx['custom_gitlab_server_config'] = "location /-/plantuml/ { \n proxy_cache off; \n proxy_pass http://plantuml:8080/; \n}\n"
+To enable this redirection:
-# Built from source
-nginx['custom_gitlab_server_config'] = "location /-/plantuml { \n rewrite ^/-/(plantuml.*) /$1 break;\n proxy_cache off; \n proxy_pass http://localhost:8080/plantuml; \n}\n"
-```
+1. Add the following line in `/etc/gitlab/gitlab.rb`, depending on your setup method:
-To activate the changes, run the following command:
+ ```ruby
+ # Docker deployment
+ nginx['custom_gitlab_server_config'] = "location /-/plantuml/ { \n proxy_cache off; \n proxy_pass http://plantuml:8080/; \n}\n"
-```shell
-sudo gitlab-ctl reconfigure
-```
+ # Built from source
+ nginx['custom_gitlab_server_config'] = "location /-/plantuml { \n rewrite ^/-/(plantuml.*) /$1 break;\n proxy_cache off; \n proxy_pass http://localhost:8080/plantuml; \n}\n"
+ ```
-Note that the redirection through GitLab must be configured
-when running [GitLab with TLS](https://docs.gitlab.com/omnibus/settings/ssl.html)
-due to PlantUML's use of the insecure HTTP protocol. Newer browsers such
-as [Google Chrome 86+](https://www.chromestatus.com/feature/4926989725073408)
-do not load insecure HTTP resources on a page served over HTTPS.
+1. To activate the changes, run the following command:
-### Security
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
-PlantUML has features that allow fetching network resources.
+### Configure PlantUML security
+
+PlantUML has features that allow fetching network resources. If you self-host the
+PlantUML server, put network controls in place to isolate it.
```plaintext
@startuml
@@ -129,98 +201,29 @@ stop;
@enduml
```
-**If you self-host the PlantUML server, network controls should be put in place to isolate it.**
-
-## GitLab
+## Enable PlantUML integration
-You need to enable PlantUML integration from Settings under Admin Area. To do
-that, sign in with an Administrator account, and then do following:
+After configuring your local PlantUML server, you're ready to enable the PlantUML integration:
-1. In GitLab, go to **Admin Area > Settings > General**.
-1. Expand the **PlantUML** section.
+1. Sign in to GitLab as an [Administrator](../../user/permissions.md) user.
+1. In the top menu, click **{admin}** **Admin Area**.
+1. In the left sidebar, go to **Settings > General** and expand the **PlantUML** section.
1. Select the **Enable PlantUML** check box.
-1. Set the PlantUML instance as `https://gitlab.example.com/-/plantuml/`.
-
-NOTE:
-If you are using a PlantUML server running v1.2020.9 and
-above (for example, [plantuml.com](https://plantuml.com)), set the `PLANTUML_ENCODING`
-environment variable to enable the `deflate` compression. On Omnibus GitLab,
-this can be set in `/etc/gitlab.rb`:
-
-```ruby
-gitlab_rails['env'] = { 'PLANTUML_ENCODING' => 'deflate' }
-```
-
-From GitLab 13.1 and later, PlantUML integration now
-[requires a header prefix in the URL](https://github.com/plantuml/plantuml/issues/117#issuecomment-6235450160)
-to distinguish different encoding types.
-
-## Creating Diagrams
-
-With PlantUML integration enabled and configured, we can start adding diagrams to
-our AsciiDoc snippets, wikis, and repositories using delimited blocks:
-
-- **Markdown**
-
- ````markdown
- ```plantuml
- Bob -> Alice : hello
- Alice -> Bob : hi
- ```
- ````
-
-- **AsciiDoc**
-
- ```plaintext
- [plantuml, format="png", id="myDiagram", width="200px"]
- ----
- Bob->Alice : hello
- Alice -> Bob : hi
- ----
- ```
-
-- **reStructuredText**
-
- ```plaintext
- .. plantuml::
- :caption: Caption with **bold** and *italic*
-
- Bob -> Alice: hello
- Alice -> Bob: hi
- ```
+1. Set the PlantUML instance as `https://gitlab.example.com/-/plantuml/`,
+ and click **Save changes**.
- You can also use the `uml::` directive for compatibility with
- [`sphinxcontrib-plantuml`](https://pypi.org/project/sphinxcontrib-plantuml/),
- but GitLab only supports the `caption` option.
+Depending on your PlantUML and GitLab version numbers, you may also need to take
+these steps:
-The above blocks are converted to an HTML image tag with source pointing to the
-PlantUML instance. If the PlantUML server is correctly configured, this should
-render a nice diagram instead of the block:
+- For PlantUML servers running v1.2020.9 and above, such as [plantuml.com](https://plantuml.com),
+ you must set the `PLANTUML_ENCODING` environment variable to enable the `deflate`
+ compression. In Omnibus GitLab, you can set this value in `/etc/gitlab.rb` with
+ this command:
-```plantuml
-Bob -> Alice : hello
-Alice -> Bob : hi
-```
-
-Inside the block you can add any of the diagrams PlantUML supports, such as:
-
-- [Sequence](https://plantuml.com/sequence-diagram)
-- [Use Case](https://plantuml.com/use-case-diagram)
-- [Class](https://plantuml.com/class-diagram)
-- [Activity](https://plantuml.com/activity-diagram-legacy)
-- [Component](https://plantuml.com/component-diagram)
-- [State](https://plantuml.com/state-diagram),
-- [Object](https://plantuml.com/object-diagram)
-
-You do not need to use the PlantUML
-diagram delimiters `@startuml`/`@enduml`, as these are replaced by the AsciiDoc `plantuml` block.
-
-Some parameters can be added to the AsciiDoc block definition:
-
-- `format`: Can be either `png` or `svg`. Note that `svg` is not supported by
- all browsers so use with care. The default is `png`.
-- `id`: A CSS ID added to the diagram HTML tag.
-- `width`: Width attribute added to the image tag.
-- `height`: Height attribute added to the image tag.
+ ```ruby
+ gitlab_rails['env'] = { 'PLANTUML_ENCODING' => 'deflate' }
+ ```
-Markdown does not support any parameters and always uses PNG format.
+- For GitLab versions 13.1 and later, PlantUML integration now
+ [requires a header prefix in the URL](https://github.com/plantuml/plantuml/issues/117#issuecomment-6235450160)
+ to distinguish different encoding types.
diff --git a/doc/administration/integration/terminal.md b/doc/administration/integration/terminal.md
index 0f26eb83d17..644e2d905ae 100644
--- a/doc/administration/integration/terminal.md
+++ b/doc/administration/integration/terminal.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Web terminals
+# Web terminals **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7690) in GitLab 8.15.
diff --git a/doc/administration/invalidate_markdown_cache.md b/doc/administration/invalidate_markdown_cache.md
index 211316534ee..7a880c81843 100644
--- a/doc/administration/invalidate_markdown_cache.md
+++ b/doc/administration/invalidate_markdown_cache.md
@@ -1,6 +1,6 @@
---
-stage: Create
-group: Source Code
+stage: Plan
+group: Project Management
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
type: reference
---
diff --git a/doc/administration/issue_closing_pattern.md b/doc/administration/issue_closing_pattern.md
index 32d367bb15e..6b1922fe142 100644
--- a/doc/administration/issue_closing_pattern.md
+++ b/doc/administration/issue_closing_pattern.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
type: reference
---
diff --git a/doc/administration/monitoring/index.md b/doc/administration/monitoring/index.md
index ac09acf2d2e..d2e5f40b171 100644
--- a/doc/administration/monitoring/index.md
+++ b/doc/administration/monitoring/index.md
@@ -11,9 +11,19 @@ Explore our features to monitor your GitLab instance:
- [GitLab self-monitoring](gitlab_self_monitoring_project/index.md): The
GitLab instance administration project helps to monitor the GitLab instance and
take action on alerts.
-- [Performance monitoring](performance/index.md): GitLab Performance Monitoring makes it possible to measure a wide variety of statistics of your instance.
-- [Prometheus](prometheus/index.md): Prometheus is a powerful time-series monitoring service, providing a flexible platform for monitoring GitLab and other software products.
-- [GitHub imports](github_imports.md): Monitor the health and progress of the GitHub importer with various Prometheus metrics.
-- [Monitoring uptime](../../user/admin_area/monitoring/health_check.md): Check the server status using the health check endpoint.
- - [IP whitelists](ip_whitelist.md): Configure GitLab for monitoring endpoints that provide health check information when probed.
-- [`nginx_status`](https://docs.gitlab.com/omnibus/settings/nginx.html#enablingdisabling-nginx_status): Monitor your NGINX server status
+- [Performance monitoring](performance/index.md): GitLab Performance Monitoring
+ makes it possible to measure a wide variety of statistics of your instance.
+- [Prometheus](prometheus/index.md): Prometheus is a powerful time-series monitoring
+ service, providing a flexible platform for monitoring GitLab and other software
+ products.
+- [GitHub imports](github_imports.md): Monitor the health and progress of the GitHub
+ importer with various Prometheus metrics.
+- [Monitoring uptime](../../user/admin_area/monitoring/health_check.md): Check the
+ server status using the health check endpoint.
+ - [IP whitelists](ip_whitelist.md): Configure GitLab for monitoring endpoints that
+ provide health check information when probed.
+- [`nginx_status`](https://docs.gitlab.com/omnibus/settings/nginx.html#enablingdisabling-nginx_status):
+ Monitor your NGINX server status.
+- [Auto Monitoring](../../topics/autodevops/stages.md#auto-monitoring): Automated
+ monitoring for your application’s server and response metrics, provided by
+ [Auto DevOps](../../topics/autodevops/index.md).
diff --git a/doc/administration/monitoring/performance/performance_bar.md b/doc/administration/monitoring/performance/performance_bar.md
index 0516cbc2f8b..ff1bdbe3bd8 100644
--- a/doc/administration/monitoring/performance/performance_bar.md
+++ b/doc/administration/monitoring/performance/performance_bar.md
@@ -6,6 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Performance Bar **(FREE SELF)**
+> The **Stats** field [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/271551) in GitLab SaaS 13.9.
+
You can display the GitLab Performance Bar to see statistics for the performance
of a page. When activated, it looks as follows:
@@ -53,6 +55,8 @@ From left to right, it displays:
- **Request Selector**: a select box displayed on the right-hand side of the
Performance Bar which enables you to view these metrics for any requests made while
the current page was open. Only the first two requests per unique URL are captured.
+- **Stats** (optional): if the `GITLAB_PERFORMANCE_BAR_STATS_URL` environment variable is set,
+ this URL is displayed in the bar. In GitLab 13.9 and later, used only in GitLab SaaS.
## Request warnings
diff --git a/doc/administration/object_storage.md b/doc/administration/object_storage.md
index 3cad18dc497..a14f902db91 100644
--- a/doc/administration/object_storage.md
+++ b/doc/administration/object_storage.md
@@ -570,13 +570,15 @@ See the following additional guides:
## Warnings, limitations, and known issues
-### Separate buckets required when using Helm
+### Use separate buckets
-Generally, using the same bucket for your Object Storage is fine to do
-for convenience.
+Using separate buckets for each data type is the recommended approach for GitLab.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
-However, if you're using or planning to use Helm, separate buckets will
-be required as there is a [known limitation with restorations of Helm chart backups](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer).
+Helm-based installs require separate buckets to
+[handle backup restorations](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
### S3 API compatibility issues
diff --git a/doc/administration/packages/dependency_proxy.md b/doc/administration/packages/dependency_proxy.md
index 16cfdc8c784..720734bf344 100644
--- a/doc/administration/packages/dependency_proxy.md
+++ b/doc/administration/packages/dependency_proxy.md
@@ -47,6 +47,10 @@ To enable the dependency proxy feature:
Since Puma is already the default web server for installations from source as of GitLab 12.9,
no further changes are needed.
+**Multi-node GitLab installations**
+
+Follow the steps for **Omnibus GitLab installation** for each Web and Sidekiq nodes.
+
## Changing the storage path
By default, the dependency proxy files are stored locally, but you can change the default
diff --git a/doc/administration/packages/index.md b/doc/administration/packages/index.md
index b1d2a82e31a..012afd6a419 100644
--- a/doc/administration/packages/index.md
+++ b/doc/administration/packages/index.md
@@ -43,14 +43,14 @@ guides you through the process.
| CocoaPods | [#36890](https://gitlab.com/gitlab-org/gitlab/-/issues/36890) |
| Conda | [#36891](https://gitlab.com/gitlab-org/gitlab/-/issues/36891) |
| CRAN | [#36892](https://gitlab.com/gitlab-org/gitlab/-/issues/36892) |
-| Debian | [WIP: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44746) |
+| Debian | [Draft: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50438) |
| Opkg | [#36894](https://gitlab.com/gitlab-org/gitlab/-/issues/36894) |
| P2 | [#36895](https://gitlab.com/gitlab-org/gitlab/-/issues/36895) |
| Puppet | [#36897](https://gitlab.com/gitlab-org/gitlab/-/issues/36897) |
| RPM | [#5932](https://gitlab.com/gitlab-org/gitlab/-/issues/5932) |
| RubyGems | [#803](https://gitlab.com/gitlab-org/gitlab/-/issues/803) |
| SBT | [#36898](https://gitlab.com/gitlab-org/gitlab/-/issues/36898) |
-| Terraform | [WIP: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18834) |
+| Terraform | [Draft: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18834) |
| Vagrant | [#36899](https://gitlab.com/gitlab-org/gitlab/-/issues/36899) |
<!-- vale gitlab.Spelling = YES -->
diff --git a/doc/administration/pages/index.md b/doc/administration/pages/index.md
index 655e35c3e60..4febd8648d1 100644
--- a/doc/administration/pages/index.md
+++ b/doc/administration/pages/index.md
@@ -178,13 +178,16 @@ outside world.
pages_external_url 'https://example.io'
pages_nginx['redirect_http_to_https'] = true
+ ```
+
+1. If you haven’t named your certificate and key `example.io.crt` and `example.io.key`
+then you'll need to also add the full paths as shown below:
+
+ ```ruby
pages_nginx['ssl_certificate'] = "/etc/gitlab/ssl/pages-nginx.crt"
pages_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/pages-nginx.key"
```
- where `pages-nginx.crt` and `pages-nginx.key` are the SSL cert and key,
- respectively.
-
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
### Additional configuration for Docker container
@@ -720,7 +723,7 @@ preferred source is `gitlab`, which uses [API-based configuration](#gitlab-api-b
For more details see this [blog post](https://about.gitlab.com/blog/2020/08/03/how-gitlab-pages-uses-the-gitlab-api-to-serve-content/).
-### Deprecated domain_config_source
+### Deprecated `domain_config_source`
WARNING:
The flag `gitlab_pages['domain_config_source']` is deprecated for use in [GitLab 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/217913),
diff --git a/doc/administration/raketasks/github_import.md b/doc/administration/raketasks/github_import.md
index c29865be56c..0338732e886 100644
--- a/doc/administration/raketasks/github_import.md
+++ b/doc/administration/raketasks/github_import.md
@@ -19,8 +19,8 @@ before/after the brackets. Also, some shells (for example, `zsh`) can interpret
## Caveats
-If the GitHub [rate limit](https://docs.github.com/v3/#rate-limiting) is reached while importing,
-the importing process waits (`sleep()`) until it can continue importing.
+If the GitHub [rate limit](https://docs.github.com/en/rest/reference/rate-limit) is reached while
+importing, the importing process waits (`sleep()`) until it can continue importing.
## Importing multiple projects
diff --git a/doc/administration/reference_architectures/10k_users.md b/doc/administration/reference_architectures/10k_users.md
index d4d522ab1b8..d6a38e1b713 100644
--- a/doc/administration/reference_architectures/10k_users.md
+++ b/doc/administration/reference_architectures/10k_users.md
@@ -17,23 +17,23 @@ full list of reference architectures, see
| Service | Nodes | Configuration | GCP | AWS | Azure |
|--------------------------------------------|-------------|-------------------------|-----------------|-------------|----------|
-| External load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
-| Consul | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
-| PostgreSQL | 3 | 8 vCPU, 30 GB memory | n1-standard-8 | m5.2xlarge | D8s v3 |
-| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
-| Internal load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
-| Redis - Cache | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
-| Redis - Queues / Shared State | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
-| Redis Sentinel - Cache | 3 | 1 vCPU, 1.7 GB memory | g1-small | t3.small | B1MS |
-| Redis Sentinel - Queues / Shared State | 3 | 1 vCPU, 1.7 GB memory | g1-small | t3.small | B1MS |
-| Gitaly Cluster | 3 | 16 vCPU, 60 GB memory | n1-standard-16 | m5.4xlarge | D16s v3 |
-| Praefect | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
-| Praefect PostgreSQL | 1+* | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | c5.large | F2s v2 |
-| Sidekiq | 4 | 4 vCPU, 15 GB memory | n1-standard-4 | m5.xlarge | D4s v3 |
-| GitLab Rails | 3 | 32 vCPU, 28.8 GB memory | n1-highcpu-32 | c5.9xlarge | F32s v2 |
-| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+| External load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
+| Consul | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
+| PostgreSQL | 3 | 8 vCPU, 30 GB memory | n1-standard-8 | `m5.2xlarge` | D8s v3 |
+| PgBouncer | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
+| Internal load balancing node | 1 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
+| Redis - Cache | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
+| Redis - Queues / Shared State | 3 | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
+| Redis Sentinel - Cache | 3 | 1 vCPU, 1.7 GB memory | g1-small | `t3.small` | B1MS |
+| Redis Sentinel - Queues / Shared State | 3 | 1 vCPU, 1.7 GB memory | g1-small | `t3.small` | B1MS |
+| Gitaly Cluster | 3 | 16 vCPU, 60 GB memory | n1-standard-16 | `m5.4xlarge` | D16s v3 |
+| Praefect | 3 | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
+| Praefect PostgreSQL | 1+* | 2 vCPU, 1.8 GB memory | n1-highcpu-2 | `c5.large` | F2s v2 |
+| Sidekiq | 4 | 4 vCPU, 15 GB memory | n1-standard-4 | `m5.xlarge` | D4s v3 |
+| GitLab Rails | 3 | 32 vCPU, 28.8 GB memory | n1-highcpu-32 | `c5.9xlarge` | F32s v2 |
+| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
| Object storage | n/a | n/a | n/a | n/a | n/a |
-| NFS server | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | c5.xlarge | F4s v2 |
+| NFS server | 1 | 4 vCPU, 3.6 GB memory | n1-highcpu-4 | `c5.xlarge` | F4s v2 |
```plantuml
@startuml 10k
@@ -1508,7 +1508,7 @@ Praefect requires several secret tokens to secure communications across the Clus
Gitaly Cluster nodes are configured in Praefect via a `virtual storage`. Each storage contains
the details of each Gitaly node that makes up the cluster. Each storage is also given a name
-and this name is used in several areas of the config. In this guide, the name of the storage will be
+and this name is used in several areas of the configuration. In this guide, the name of the storage will be
`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
to use Gitaly Cluster, you may need to use a different name.
Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more info.
@@ -1756,7 +1756,7 @@ Note the following:
necessary.
- The Internal Load Balancer will also access to the certificates and need to be configured
- to allow for TLS passthrough.
+ to allow for TLS pass-through.
Refer to the load balancers documentation on how to configure this.
To configure Praefect with TLS:
@@ -1940,13 +1940,13 @@ To configure the Sidekiq nodes, on each one:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and replace
@@ -2069,13 +2069,13 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
@@ -2303,20 +2303,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is separately configured.
-[We have an issue for improving this](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-and easily using one bucket with separate folders is one improvement that this might bring.
-
-There is at least one specific issue with using the same bucket:
-when GitLab is deployed with the Helm chart restore from backup
-[will not properly function](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
-unless separate buckets are used.
-
-One risk of using a single bucket would be if your organization decided to
-migrate GitLab to the Helm deployment in the future. GitLab would run, but the situation with
-backups might not be realized until the organization had a critical requirement for the backups to
-work.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
diff --git a/doc/administration/reference_architectures/25k_users.md b/doc/administration/reference_architectures/25k_users.md
index 48c72bb930d..d02f7ea66ac 100644
--- a/doc/administration/reference_architectures/25k_users.md
+++ b/doc/administration/reference_architectures/25k_users.md
@@ -1637,13 +1637,13 @@ To configure the Sidekiq nodes, on each one:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and replace
@@ -1769,13 +1769,13 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
@@ -2002,20 +2002,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is separately configured.
-[We have an issue for improving this](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-and easily using one bucket with separate folders is one improvement that this might bring.
-
-There is at least one specific issue with using the same bucket:
-when GitLab is deployed with the Helm chart restore from backup
-[will not properly function](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
-unless separate buckets are used.
-
-One risk of using a single bucket would be if your organization decided to
-migrate GitLab to the Helm deployment in the future. GitLab would run, but the situation with
-backups might not be realized until the organization had a critical requirement for the backups to
-work.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
diff --git a/doc/administration/reference_architectures/2k_users.md b/doc/administration/reference_architectures/2k_users.md
index 9ad6054104a..62f0c993213 100644
--- a/doc/administration/reference_architectures/2k_users.md
+++ b/doc/administration/reference_architectures/2k_users.md
@@ -668,13 +668,13 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
## Uncomment and edit the following options if you have set up NFS
##
@@ -920,18 +920,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is
-separately configured. We have an [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-for improving this, which would allow for one bucket with separate folders.
-
-Using a single bucket when GitLab is deployed with the Helm chart causes
-restoring from a backup to
-[not function properly](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer).
-Although you may not be using a Helm deployment right now, if you migrate
-GitLab to a Helm deployment later, GitLab would still work, but you may not
-realize backups aren't working correctly until a critical requirement for
-functioning backups is encountered.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
diff --git a/doc/administration/reference_architectures/3k_users.md b/doc/administration/reference_architectures/3k_users.md
index 175c4318d78..593bfaf7282 100644
--- a/doc/administration/reference_architectures/3k_users.md
+++ b/doc/administration/reference_architectures/3k_users.md
@@ -1322,13 +1322,14 @@ To configure the Sidekiq nodes, one each one:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
+
```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
@@ -1489,13 +1490,13 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. If you're using [Gitaly with TLS support](#gitaly-tls-support), make sure the
@@ -1697,20 +1698,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is separately configured.
-[We have an issue for improving this](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-and easily using one bucket with separate folders is one improvement that this might bring.
-
-There is at least one specific issue with using the same bucket:
-when GitLab is deployed with the Helm chart restore from backup
-[will not properly function](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
-unless separate buckets are used.
-
-One risk of using a single bucket would be if your organization decided to
-migrate GitLab to the Helm deployment in the future. GitLab would run, but the situation with
-backups might not be realized until the organization had a critical requirement for the backups to
-work.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
diff --git a/doc/administration/reference_architectures/50k_users.md b/doc/administration/reference_architectures/50k_users.md
index 0b22a2d3602..04ce39046d8 100644
--- a/doc/administration/reference_architectures/50k_users.md
+++ b/doc/administration/reference_architectures/50k_users.md
@@ -1637,13 +1637,13 @@ To configure the Sidekiq nodes, on each one:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from your Consul server, and replace
@@ -1769,13 +1769,13 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
@@ -2002,20 +2002,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is separately configured.
-[We have an issue for improving this](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-and easily using one bucket with separate folders is one improvement that this might bring.
-
-There is at least one specific issue with using the same bucket:
-when GitLab is deployed with the Helm chart restore from backup
-[will not properly function](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
-unless separate buckets are used.
-
-One risk of using a single bucket would be if your organization decided to
-migrate GitLab to the Helm deployment in the future. GitLab would run, but the situation with
-backups might not be realized until the organization had a critical requirement for the backups to
-work.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
diff --git a/doc/administration/reference_architectures/5k_users.md b/doc/administration/reference_architectures/5k_users.md
index 37d35c299fa..37e67b0ab73 100644
--- a/doc/administration/reference_architectures/5k_users.md
+++ b/doc/administration/reference_architectures/5k_users.md
@@ -1319,13 +1319,13 @@ To configure the Sidekiq nodes, one each one:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
```
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
@@ -1471,13 +1471,13 @@ On each node perform the following:
'google_project' => '<gcp-project-name>',
'google_json_key_location' => '<path-to-gcp-service-account-key>'
}
- gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-bucket-name>"
- gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-bucket-name>"
+ gitlab_rails['object_store']['objects']['artifacts']['bucket'] = "<gcp-artifacts-bucket-name>"
+ gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = "<gcp-external-diffs-bucket-name>"
+ gitlab_rails['object_store']['objects']['lfs']['bucket'] = "<gcp-lfs-bucket-name>"
+ gitlab_rails['object_store']['objects']['uploads']['bucket'] = "<gcp-uploads-bucket-name>"
+ gitlab_rails['object_store']['objects']['packages']['bucket'] = "<gcp-packages-bucket-name>"
+ gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = "<gcp-dependency-proxy-bucket-name>"
+ gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = "<gcp-terraform-state-bucket-name>"
## Uncomment and edit the following options if you have set up NFS
##
@@ -1694,20 +1694,9 @@ on what features you intend to use:
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
Using separate buckets for each data type is the recommended approach for GitLab.
-
-A limitation of our configuration is that each use of object storage is separately configured.
-[We have an issue for improving this](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)
-and easily using one bucket with separate folders is one improvement that this might bring.
-
-There is at least one specific issue with using the same bucket:
-when GitLab is deployed with the Helm chart restore from backup
-[will not properly function](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
-unless separate buckets are used.
-
-One risk of using a single bucket would be if your organization decided to
-migrate GitLab to the Helm deployment in the future. GitLab would run, but the situation with
-backups might not be realized until the organization had a critical requirement for the backups to
-work.
+This ensures there are no collisions across the various types of data GitLab stores.
+There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958)
+in the future.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
diff --git a/doc/administration/repository_checks.md b/doc/administration/repository_checks.md
index 404a7bd77c1..059acbd12f8 100644
--- a/doc/administration/repository_checks.md
+++ b/doc/administration/repository_checks.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference
---
-# Repository checks
+# Repository checks **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/3232) in GitLab 8.7.
diff --git a/doc/administration/repository_storage_paths.md b/doc/administration/repository_storage_paths.md
index 5884a8b3283..6f373089bf2 100644
--- a/doc/administration/repository_storage_paths.md
+++ b/doc/administration/repository_storage_paths.md
@@ -23,7 +23,7 @@ several mount points. For example:
```ruby
git_data_dirs({
'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
- 'storage1' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
+ 'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
})
```
@@ -31,18 +31,23 @@ several mount points. For example:
```plaintext
default:
- path: /mnt/git-storage-1
+ gitaly_address: tcp://gitaly1.example:8075
storage2:
- path: /mnt/git-storage-2
+ gitaly_address: tcp://gitaly2.example:8075
```
-For more information on
+For more information on:
- Configuring Gitaly, see [Configure Gitaly](gitaly/index.md#configure-gitaly).
- Configuring direct repository access, see the following section below.
## Configure repository storage paths
+WARNING:
+The following information is for configuring GitLab to directly access repositories. This
+configuration option is deprecated in favor of using [Gitaly](gitaly/index.md) and is scheduled to
+[be removed in GitLab 14.0](https://gitlab.com/gitlab-org/gitaly/-/issues/1690).
+
To configure repository storage paths:
1. Edit the necessary configuration files:
@@ -96,10 +101,6 @@ For compatibility reasons `gitlab.yml` has a different structure than Omnibus Gi
example. Then Omnibus GitLab creates a `repositories` directory under that path to use with
`gitlab.yml`.
-NOTE:
-This example uses NFS. We do not recommend using EFS for storage as it may impact GitLab performance.
-Read the [relevant documentation](nfs.md#avoid-using-awss-elastic-file-system-efs) for more details.
-
**For installations from source**
1. Edit `gitlab.yml` and add the storage paths:
@@ -111,10 +112,10 @@ Read the [relevant documentation](nfs.md#avoid-using-awss-elastic-file-system-ef
storages: # You must have at least a 'default' repository storage path.
default:
path: /home/git/repositories
- nfs_1:
- path: /mnt/nfs1/repositories
- nfs_2:
- path: /mnt/nfs2/repositories
+ storage1:
+ path: /mnt/storage1/repositories
+ storage2:
+ path: /mnt/storage2/repositories
```
1. [Restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect.
@@ -126,8 +127,8 @@ Edit `/etc/gitlab/gitlab.rb` by appending the rest of the paths to the default o
```ruby
git_data_dirs({
"default" => { "path" => "/var/opt/gitlab/git-data" },
- "nfs_1" => { "path" => "/mnt/nfs1/git-data" },
- "nfs_2" => { "path" => "/mnt/nfs2/git-data" }
+ "storage1" => { "path" => "/mnt/storage1/git-data" },
+ "storage2" => { "path" => "/mnt/storage2/git-data" }
})
```
diff --git a/doc/administration/static_objects_external_storage.md b/doc/administration/static_objects_external_storage.md
index 0f3dab743e9..5d26ff7cad6 100644
--- a/doc/administration/static_objects_external_storage.md
+++ b/doc/administration/static_objects_external_storage.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference
---
-# Static objects external storage
+# Static objects external storage **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31025) in GitLab 12.3.
diff --git a/doc/api/README.md b/doc/api/README.md
index d6119fbfa43..cf21a4888ad 100644
--- a/doc/api/README.md
+++ b/doc/api/README.md
@@ -750,7 +750,7 @@ specifically used by GitLab.com, see
The GitLab API supports the `application/json` content type by default, though
some API endpoints also support `text/plain`.
-In [GitLab 13.9 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/250342),
+In [GitLab 13.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/250342),
API endpoints do not support `text/plain` by default, unless it's explicitly documented.
This change is deployed behind the `:api_always_use_application_json` [feature flag](../user/feature_flags.md),
diff --git a/doc/api/graphql/index.md b/doc/api/graphql/index.md
index 7a68b1cdf16..726c448c33b 100644
--- a/doc/api/graphql/index.md
+++ b/doc/api/graphql/index.md
@@ -160,11 +160,6 @@ The GitLab GraphQL reference [is available](reference/index.md).
It is automatically generated from the GitLab GraphQL schema and embedded in a Markdown file.
-Machine-readable versions are also available:
-
-- [JSON format](reference/gitlab_schema.json)
-- [IDL format](reference/gitlab_schema.graphql)
-
## Generate updates for documentation
If you've changed the GraphQL schema, you should set up an MR to gain approval of your changes.
diff --git a/doc/api/graphql/reference/gitlab_schema.graphql b/doc/api/graphql/reference/gitlab_schema.graphql
deleted file mode 100644
index 4e89f663efc..00000000000
--- a/doc/api/graphql/reference/gitlab_schema.graphql
+++ /dev/null
@@ -1,29539 +0,0 @@
-"""
-Represents the access level of a relationship between a User and object that it is related to
-"""
-type AccessLevel {
- """
- Integer representation of access level.
- """
- integerValue: Int
-
- """
- String representation of access level.
- """
- stringValue: AccessLevelEnum
-}
-
-"""
-Access level to a resource
-"""
-enum AccessLevelEnum {
- DEVELOPER
- GUEST
- MAINTAINER
- NO_ACCESS
- OWNER
- REPORTER
-}
-
-"""
-Autogenerated input type of AddAwardEmoji
-"""
-input AddAwardEmojiInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of AddAwardEmoji
-"""
-type AddAwardEmojiPayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of AddProjectToSecurityDashboard
-"""
-input AddProjectToSecurityDashboardInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the project to be added to Instance Security Dashboard.
- """
- id: ProjectID!
-}
-
-"""
-Autogenerated return type of AddProjectToSecurityDashboard
-"""
-type AddProjectToSecurityDashboardPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Project that was added to the Instance Security Dashboard.
- """
- project: Project
-}
-
-"""
-Autogenerated input type of AdminSidekiqQueuesDeleteJobs
-"""
-input AdminSidekiqQueuesDeleteJobsInput {
- """
- Delete jobs matching caller_id in the context metadata
- """
- callerId: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Delete jobs matching feature_category in the context metadata
- """
- featureCategory: String
-
- """
- Delete jobs matching project in the context metadata
- """
- project: String
-
- """
- The name of the queue to delete jobs from.
- """
- queueName: String!
-
- """
- Delete jobs matching related_class in the context metadata
- """
- relatedClass: String
-
- """
- Delete jobs matching remote_ip in the context metadata
- """
- remoteIp: String
-
- """
- Delete jobs matching root_namespace in the context metadata
- """
- rootNamespace: String
-
- """
- Delete jobs matching subscription_plan in the context metadata
- """
- subscriptionPlan: String
-
- """
- Delete jobs matching user in the context metadata
- """
- user: String
-}
-
-"""
-Autogenerated return type of AdminSidekiqQueuesDeleteJobs
-"""
-type AdminSidekiqQueuesDeleteJobsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Information about the status of the deletion request.
- """
- result: DeleteJobsResponse
-}
-
-"""
-Describes an alert from the project's Alert Management
-"""
-type AlertManagementAlert implements Noteable {
- """
- Assignees of the alert.
- """
- assignees(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Timestamp the alert was created.
- """
- createdAt: Time
-
- """
- Description of the alert.
- """
- description: String
-
- """
- Alert details.
- """
- details: JSON
-
- """
- The URL of the alert detail page.
- """
- detailsUrl: String!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Timestamp the alert ended.
- """
- endedAt: Time
-
- """
- Environment for the alert.
- """
- environment: Environment
-
- """
- Number of events of this alert.
- """
- eventCount: Int
-
- """
- List of hosts the alert came from.
- """
- hosts: [String!]
-
- """
- Internal ID of the alert.
- """
- iid: ID!
-
- """
- Internal ID of the GitLab issue attached to the alert.
- """
- issueIid: ID
-
- """
- URL for metrics embed for the alert.
- """
- metricsDashboardUrl: String
-
- """
- Monitoring tool the alert came from.
- """
- monitoringTool: String
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- The alert condition for Prometheus.
- """
- prometheusAlert: PrometheusAlert
-
- """
- Runbook for the alert as defined in alert details.
- """
- runbook: String
-
- """
- Service the alert came from.
- """
- service: String
-
- """
- Severity of the alert.
- """
- severity: AlertManagementSeverity
-
- """
- Timestamp the alert was raised.
- """
- startedAt: Time
-
- """
- Status of the alert.
- """
- status: AlertManagementStatus
-
- """
- Title of the alert.
- """
- title: String
-
- """
- To-do items of the current user for the alert.
- """
- todos(
- """
- The action to be filtered.
- """
- action: [TodoActionEnum!]
-
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- The ID of an author.
- """
- authorId: [ID!]
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- The ID of a group.
- """
- groupId: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The ID of a project.
- """
- projectId: [ID!]
-
- """
- The state of the todo.
- """
- state: [TodoStateEnum!]
-
- """
- The type of the todo.
- """
- type: [TodoTargetEnum!]
- ): TodoConnection
-
- """
- Timestamp the alert was last updated.
- """
- updatedAt: Time
-}
-
-"""
-The connection type for AlertManagementAlert.
-"""
-type AlertManagementAlertConnection {
- """
- A list of edges.
- """
- edges: [AlertManagementAlertEdge]
-
- """
- A list of nodes.
- """
- nodes: [AlertManagementAlert]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type AlertManagementAlertEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: AlertManagementAlert
-}
-
-"""
-Values for sorting alerts
-"""
-enum AlertManagementAlertSort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Created time by ascending order
- """
- CREATED_TIME_ASC
-
- """
- Created time by descending order
- """
- CREATED_TIME_DESC
-
- """
- End time by ascending order
- """
- ENDED_AT_ASC
-
- """
- End time by descending order
- """
- ENDED_AT_DESC
-
- """
- Events count by ascending order
- """
- EVENT_COUNT_ASC
-
- """
- Events count by descending order
- """
- EVENT_COUNT_DESC
-
- """
- Severity from less critical to more critical
- """
- SEVERITY_ASC
-
- """
- Severity from more critical to less critical
- """
- SEVERITY_DESC
-
- """
- Start time by ascending order
- """
- STARTED_AT_ASC
-
- """
- Start time by descending order
- """
- STARTED_AT_DESC
-
- """
- Status by order: Ignored > Resolved > Acknowledged > Triggered
- """
- STATUS_ASC
-
- """
- Status by order: Triggered > Acknowledged > Resolved > Ignored
- """
- STATUS_DESC
-
- """
- Updated at ascending order
- """
- UPDATED_ASC
-
- """
- Updated at descending order
- """
- UPDATED_DESC
-
- """
- Created time by ascending order
- """
- UPDATED_TIME_ASC
-
- """
- Created time by descending order
- """
- UPDATED_TIME_DESC
-
- """
- Created at ascending order
- """
- created_asc @deprecated(reason: "Use CREATED_ASC. Deprecated in 13.5.")
-
- """
- Created at descending order
- """
- created_desc @deprecated(reason: "Use CREATED_DESC. Deprecated in 13.5.")
-
- """
- Updated at ascending order
- """
- updated_asc @deprecated(reason: "Use UPDATED_ASC. Deprecated in 13.5.")
-
- """
- Updated at descending order
- """
- updated_desc @deprecated(reason: "Use UPDATED_DESC. Deprecated in 13.5.")
-}
-
-"""
-Represents total number of alerts for the represented categories
-"""
-type AlertManagementAlertStatusCountsType {
- """
- Number of alerts with status ACKNOWLEDGED for the project
- """
- acknowledged: Int
-
- """
- Total number of alerts for the project.
- """
- all: Int
-
- """
- Number of alerts with status IGNORED for the project
- """
- ignored: Int
-
- """
- Number of alerts with status TRIGGERED or ACKNOWLEDGED for the project.
- """
- open: Int
-
- """
- Number of alerts with status RESOLVED for the project
- """
- resolved: Int
-
- """
- Number of alerts with status TRIGGERED for the project
- """
- triggered: Int
-}
-
-"""
-Filters the alerts based on given domain
-"""
-enum AlertManagementDomainFilter {
- """
- Alerts for operations domain
- """
- operations
-
- """
- Alerts for threat monitoring domain
- """
- threat_monitoring
-}
-
-"""
-An endpoint and credentials used to accept alerts for a project
-"""
-type AlertManagementHttpIntegration implements AlertManagementIntegration {
- """
- Whether the endpoint is currently accepting alerts.
- """
- active: Boolean
-
- """
- URL at which Prometheus metrics can be queried to populate the metrics dashboard.
- """
- apiUrl: String
-
- """
- ID of the integration.
- """
- id: ID!
-
- """
- Name of the integration.
- """
- name: String
-
- """
- Token used to authenticate alert notification requests.
- """
- token: String
-
- """
- Type of integration.
- """
- type: AlertManagementIntegrationType!
-
- """
- Endpoint which accepts alert notifications.
- """
- url: String
-}
-
-"""
-Identifier of AlertManagement::HttpIntegration.
-"""
-scalar AlertManagementHttpIntegrationID
-
-interface AlertManagementIntegration {
- """
- Whether the endpoint is currently accepting alerts.
- """
- active: Boolean
-
- """
- URL at which Prometheus metrics can be queried to populate the metrics dashboard.
- """
- apiUrl: String
-
- """
- ID of the integration.
- """
- id: ID!
-
- """
- Name of the integration.
- """
- name: String
-
- """
- Token used to authenticate alert notification requests.
- """
- token: String
-
- """
- Type of integration.
- """
- type: AlertManagementIntegrationType!
-
- """
- Endpoint which accepts alert notifications.
- """
- url: String
-}
-
-"""
-The connection type for AlertManagementIntegration.
-"""
-type AlertManagementIntegrationConnection {
- """
- A list of edges.
- """
- edges: [AlertManagementIntegrationEdge]
-
- """
- A list of nodes.
- """
- nodes: [AlertManagementIntegration]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type AlertManagementIntegrationEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: AlertManagementIntegration
-}
-
-"""
-Values of types of integrations
-"""
-enum AlertManagementIntegrationType {
- """
- Integration with any monitoring tool
- """
- HTTP
-
- """
- Prometheus integration
- """
- PROMETHEUS
-}
-
-"""
-Parsed field from an alert used for custom mappings
-"""
-type AlertManagementPayloadAlertField {
- """
- Human-readable label of the payload path.
- """
- label: String
-
- """
- Path to value inside payload JSON.
- """
- path: [String!]
-
- """
- Type of the parsed value.
- """
- type: AlertManagementPayloadAlertFieldType
-}
-
-"""
-Field that are available while modifying the custom mapping attributes for an HTTP integration
-"""
-input AlertManagementPayloadAlertFieldInput {
- """
- A GitLab alert field name.
- """
- fieldName: AlertManagementPayloadAlertFieldName!
-
- """
- Human-readable label of the payload path.
- """
- label: String
-
- """
- Path to value inside payload JSON.
- """
- path: [String!]!
-
- """
- Type of the parsed value.
- """
- type: AlertManagementPayloadAlertFieldType!
-}
-
-"""
-Values for alert field names used in the custom mapping
-"""
-enum AlertManagementPayloadAlertFieldName {
- """
- A high-level summary of the problem.
- """
- DESCRIPTION
-
- """
- The resolved time of the incident.
- """
- END_TIME
-
- """
- The unique identifier of the alert. This can be used to group occurrences of the same alert.
- """
- FINGERPRINT
-
- """
- The name of the associated GitLab environment.
- """
- GITLAB_ENVIRONMENT_NAME
-
- """
- One or more hosts, as to where this incident occurred.
- """
- HOSTS
-
- """
- The name of the associated monitoring tool.
- """
- MONITORING_TOOL
-
- """
- The affected service.
- """
- SERVICE
-
- """
- The severity of the alert.
- """
- SEVERITY
-
- """
- The time of the incident.
- """
- START_TIME
-
- """
- The title of the incident.
- """
- TITLE
-}
-
-"""
-Values for alert field types used in the custom mapping
-"""
-enum AlertManagementPayloadAlertFieldType {
- """
- Array field type
- """
- ARRAY
-
- """
- DateTime field type
- """
- DATETIME
-
- """
- String field type
- """
- STRING
-}
-
-"""
-An endpoint and credentials used to accept Prometheus alerts for a project
-"""
-type AlertManagementPrometheusIntegration implements AlertManagementIntegration {
- """
- Whether the endpoint is currently accepting alerts.
- """
- active: Boolean
-
- """
- URL at which Prometheus metrics can be queried to populate the metrics dashboard.
- """
- apiUrl: String
-
- """
- ID of the integration.
- """
- id: ID!
-
- """
- Name of the integration.
- """
- name: String
-
- """
- Token used to authenticate alert notification requests.
- """
- token: String
-
- """
- Type of integration.
- """
- type: AlertManagementIntegrationType!
-
- """
- Endpoint which accepts alert notifications.
- """
- url: String
-}
-
-"""
-Alert severity values
-"""
-enum AlertManagementSeverity {
- """
- Critical severity
- """
- CRITICAL
-
- """
- High severity
- """
- HIGH
-
- """
- Info severity
- """
- INFO
-
- """
- Low severity
- """
- LOW
-
- """
- Medium severity
- """
- MEDIUM
-
- """
- Unknown severity
- """
- UNKNOWN
-}
-
-"""
-Alert status values
-"""
-enum AlertManagementStatus {
- """
- Acknowledged status
- """
- ACKNOWLEDGED
-
- """
- Ignored status
- """
- IGNORED
-
- """
- Resolved status
- """
- RESOLVED
-
- """
- Triggered status
- """
- TRIGGERED
-}
-
-"""
-Autogenerated input type of AlertSetAssignees
-"""
-input AlertSetAssigneesInput {
- """
- The usernames to assign to the alert. Replaces existing assignees by default.
- """
- assigneeUsernames: [String!]!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the alert to mutate.
- """
- iid: String!
-
- """
- The operation to perform. Defaults to REPLACE.
- """
- operationMode: MutationOperationMode
-
- """
- The project the alert to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of AlertSetAssignees
-"""
-type AlertSetAssigneesPayload {
- """
- The alert after mutation.
- """
- alert: AlertManagementAlert
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue created after mutation.
- """
- issue: Issue
-
- """
- The to-do item after mutation.
- """
- todo: Todo
-}
-
-"""
-Autogenerated input type of AlertTodoCreate
-"""
-input AlertTodoCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the alert to mutate.
- """
- iid: String!
-
- """
- The project the alert to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of AlertTodoCreate
-"""
-type AlertTodoCreatePayload {
- """
- The alert after mutation.
- """
- alert: AlertManagementAlert
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue created after mutation.
- """
- issue: Issue
-
- """
- The to-do item after mutation.
- """
- todo: Todo
-}
-
-"""
-Identifier of Analytics::DevopsAdoption::Segment.
-"""
-scalar AnalyticsDevopsAdoptionSegmentID
-
-"""
-Data associated with configuring API fuzzing scans in GitLab CI
-"""
-type ApiFuzzingCiConfiguration {
- """
- All available scan modes.
- """
- scanModes: [ApiFuzzingScanMode!]
-
- """
- All default scan profiles.
- """
- scanProfiles: [ApiFuzzingScanProfile!]
-}
-
-"""
-Autogenerated input type of ApiFuzzingCiConfigurationCreate
-"""
-input ApiFuzzingCiConfigurationCreateInput {
- """
- File path or URL to the file that defines the API surface for scanning. Must
- be in the format specified by the `scanMode` argument.
- """
- apiSpecificationFile: String!
-
- """
- CI variable containing the password for authenticating with the target API.
- """
- authPassword: String
-
- """
- CI variable containing the username for authenticating with the target API.
- """
- authUsername: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path of the project.
- """
- projectPath: ID!
-
- """
- The mode for API fuzzing scans.
- """
- scanMode: ApiFuzzingScanMode!
-
- """
- Name of a default profile to use for scanning. Ex: Quick-10.
- """
- scanProfile: String
-
- """
- URL for the target of API fuzzing scans.
- """
- target: String!
-}
-
-"""
-Autogenerated return type of ApiFuzzingCiConfigurationCreate
-"""
-type ApiFuzzingCiConfigurationCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- A YAML snippet that can be inserted into the project's `.gitlab-ci.yml` to set up API fuzzing scans.
- """
- configurationYaml: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The location at which the project's `.gitlab-ci.yml` file can be edited in the browser.
- """
- gitlabCiYamlEditPath: String
-}
-
-"""
-All possible ways to specify the API surface for an API fuzzing scan
-"""
-enum ApiFuzzingScanMode {
- """
- The API surface is specified by a HAR file.
- """
- HAR
-
- """
- The API surface is specified by a OPENAPI file.
- """
- OPENAPI
-}
-
-"""
-An API Fuzzing scan profile.
-"""
-type ApiFuzzingScanProfile {
- """
- A short description of the profile.
- """
- description: String
-
- """
- The unique name of the profile.
- """
- name: String
-
- """
- A syntax highlit HTML representation of the YAML.
- """
- yaml: String
-}
-
-"""
-User availability status
-"""
-enum AvailabilityEnum {
- """
- Busy
- """
- BUSY
-
- """
- Not Set
- """
- NOT_SET
-}
-
-"""
-An emoji awarded by a user
-"""
-type AwardEmoji {
- """
- The emoji description.
- """
- description: String!
-
- """
- The emoji as an icon.
- """
- emoji: String!
-
- """
- The emoji name.
- """
- name: String!
-
- """
- The emoji in Unicode.
- """
- unicode: String!
-
- """
- The Unicode version for this emoji.
- """
- unicodeVersion: String!
-
- """
- The user who awarded the emoji.
- """
- user: User!
-}
-
-"""
-Autogenerated input type of AwardEmojiAdd
-"""
-input AwardEmojiAddInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of AwardEmojiAdd
-"""
-type AwardEmojiAddPayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-The connection type for AwardEmoji.
-"""
-type AwardEmojiConnection {
- """
- A list of edges.
- """
- edges: [AwardEmojiEdge]
-
- """
- A list of nodes.
- """
- nodes: [AwardEmoji]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type AwardEmojiEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: AwardEmoji
-}
-
-"""
-Autogenerated input type of AwardEmojiRemove
-"""
-input AwardEmojiRemoveInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of AwardEmojiRemove
-"""
-type AwardEmojiRemovePayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of AwardEmojiToggle
-"""
-input AwardEmojiToggleInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of AwardEmojiToggle
-"""
-type AwardEmojiTogglePayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji.
- """
- toggledOn: Boolean!
-}
-
-"""
-Identifier of Awardable.
-"""
-scalar AwardableID
-
-type BaseService implements Service {
- """
- Indicates if the service is active.
- """
- active: Boolean
-
- """
- Class name of the service.
- """
- type: String
-}
-
-"""
-Represents non-fractional signed whole numeric values. Since the value may
-exceed the size of a 32-bit integer, it's encoded as a string.
-"""
-scalar BigInt
-
-type Blob implements Entry {
- """
- Flat path of the entry.
- """
- flatPath: String!
-
- """
- ID of the entry.
- """
- id: ID!
-
- """
- LFS ID of the blob.
- """
- lfsOid: String
-
- """
- Blob mode in numeric format.
- """
- mode: String
-
- """
- Name of the entry.
- """
- name: String!
-
- """
- Path of the entry.
- """
- path: String!
-
- """
- Last commit SHA for the entry.
- """
- sha: String!
-
- """
- Type of tree entry.
- """
- type: EntryType!
-
- """
- Web path of the blob.
- """
- webPath: String
-
- """
- Web URL of the blob.
- """
- webUrl: String
-}
-
-"""
-The connection type for Blob.
-"""
-type BlobConnection {
- """
- A list of edges.
- """
- edges: [BlobEdge]
-
- """
- A list of nodes.
- """
- nodes: [Blob]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type BlobEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Blob
-}
-
-"""
-Types of blob viewers
-"""
-enum BlobViewersType {
- auxiliary
- rich
- simple
-}
-
-"""
-Represents a project or group board
-"""
-type Board {
- """
- The board assignee.
- """
- assignee: User
-
- """
- Epics associated with board issues.
- """
- epics(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters applied when selecting issues on the board.
- """
- issueFilters: BoardIssueInput
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): BoardEpicConnection
-
- """
- Whether or not backlog list is hidden.
- """
- hideBacklogList: Boolean
-
- """
- Whether or not closed list is hidden.
- """
- hideClosedList: Boolean
-
- """
- ID (global ID) of the board.
- """
- id: ID!
-
- """
- The board iteration.
- """
- iteration: Iteration
-
- """
- Labels of the board.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- Lists of the board.
- """
- lists(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Find a list by its global ID.
- """
- id: ListID
-
- """
- Filters applied when getting issue metadata in the board list.
- """
- issueFilters: BoardIssueInput
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): BoardListConnection
-
- """
- The board milestone.
- """
- milestone: Milestone
-
- """
- Name of the board.
- """
- name: String
-
- """
- Web path of the board.
- """
- webPath: String!
-
- """
- Web URL of the board.
- """
- webUrl: String!
-
- """
- Weight of the board.
- """
- weight: Int
-}
-
-"""
-The connection type for Board.
-"""
-type BoardConnection {
- """
- A list of edges.
- """
- edges: [BoardEdge]
-
- """
- A list of nodes.
- """
- nodes: [Board]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type BoardEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Board
-}
-
-"""
-Represents an epic on an issue board
-"""
-type BoardEpic implements CurrentUserTodos & Eventable & Noteable {
- """
- Author of the epic.
- """
- author: User!
-
- """
- A list of award emojis associated with the epic.
- """
- awardEmoji(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): AwardEmojiConnection
-
- """
- Children (sub-epics) of the epic.
- """
- children(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Filter epics by author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filter epics by given confidentiality.
- """
- confidential: Boolean
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the epic, e.g., "1".
- """
- iid: ID
-
- """
- Filter epics by IID for autocomplete.
- """
- iidStartsWith: String
-
- """
- List of IIDs of epics, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- Include epics from descendant groups.
- """
- includeDescendantGroups: Boolean = true
-
- """
- Filter epics by labels.
- """
- labelName: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter epics by milestone title, computed from epic's issues.
- """
- milestoneTitle: String
-
- """
- Search query for epic title or description.
- """
- search: String
-
- """
- List epics by sort order.
- """
- sort: EpicSort
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter epics by state.
- """
- state: EpicState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
- ): EpicConnection
-
- """
- Timestamp of when the epic was closed.
- """
- closedAt: Time
-
- """
- Indicates if the epic is confidential.
- """
- confidential: Boolean
-
- """
- Timestamp of when the epic was created.
- """
- createdAt: Time
-
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- Number of open and closed descendant epics and issues.
- """
- descendantCounts: EpicDescendantCount
-
- """
- Total weight of open and closed issues in the epic and its descendants.
- """
- descendantWeightSum: EpicDescendantWeights
-
- """
- Description of the epic.
- """
- description: String
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Number of downvotes the epic has received.
- """
- downvotes: Int!
-
- """
- Due date of the epic.
- """
- dueDate: Time
-
- """
- Fixed due date of the epic.
- """
- dueDateFixed: Time
-
- """
- Inherited due date of the epic from milestones.
- """
- dueDateFromMilestones: Time
-
- """
- Indicates if the due date has been manually set.
- """
- dueDateIsFixed: Boolean
-
- """
- A list of events associated with the object.
- """
- events(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EventConnection
-
- """
- Group to which the epic belongs.
- """
- group: Group!
-
- """
- Indicates if the epic has children.
- """
- hasChildren: Boolean!
-
- """
- Indicates if the epic has direct issues.
- """
- hasIssues: Boolean!
-
- """
- Indicates if the epic has a parent epic.
- """
- hasParent: Boolean!
-
- """
- Current health status of the epic.
- """
- healthStatus: EpicHealthStatus
-
- """
- ID of the epic.
- """
- id: ID!
-
- """
- Internal ID of the epic.
- """
- iid: ID!
-
- """
- A list of issues associated with the epic.
- """
- issues(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EpicIssueConnection
-
- """
- Labels assigned to the epic.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- Parent epic of the epic.
- """
- parent: Epic
-
- """
- List of participants for the epic.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Internal reference of the epic. Returned in shortened format by default.
- """
- reference(
- """
- Indicates if the reference should be returned in full.
- """
- full: Boolean = false
- ): String!
-
- """
- URI path of the epic-issue relationship.
- """
- relationPath: String
-
- """
- The relative position of the epic in the epic tree.
- """
- relativePosition: Int
-
- """
- Start date of the epic.
- """
- startDate: Time
-
- """
- Fixed start date of the epic.
- """
- startDateFixed: Time
-
- """
- Inherited start date of the epic from milestones.
- """
- startDateFromMilestones: Time
-
- """
- Indicates if the start date has been manually set.
- """
- startDateIsFixed: Boolean
-
- """
- State of the epic.
- """
- state: EpicState!
-
- """
- Indicates the currently logged in user is subscribed to the epic.
- """
- subscribed: Boolean!
-
- """
- Title of the epic.
- """
- title: String
-
- """
- Timestamp of when the epic was updated.
- """
- updatedAt: Time
-
- """
- Number of upvotes the epic has received.
- """
- upvotes: Int!
-
- """
- Number of user discussions in the epic.
- """
- userDiscussionsCount: Int!
-
- """
- Number of user notes of the epic.
- """
- userNotesCount: Int!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: EpicPermissions!
-
- """
- User preferences for the epic on the issue board.
- """
- userPreferences: BoardEpicUserPreferences
-
- """
- Web path of the epic.
- """
- webPath: String!
-
- """
- Web URL of the epic.
- """
- webUrl: String!
-}
-
-"""
-The connection type for BoardEpic.
-"""
-type BoardEpicConnection {
- """
- A list of edges.
- """
- edges: [BoardEpicEdge]
-
- """
- A list of nodes.
- """
- nodes: [BoardEpic]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type BoardEpicEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: BoardEpic
-}
-
-"""
-Represents user preferences for a board epic
-"""
-type BoardEpicUserPreferences {
- """
- Indicates epic should be displayed as collapsed.
- """
- collapsed: Boolean!
-}
-
-"""
-Identifier of Board.
-"""
-scalar BoardID
-
-input BoardIssueInput {
- """
- Filter by assignee username.
- """
- assigneeUsername: [String]
-
- """
- Filter by author username.
- """
- authorUsername: String
-
- """
- Filter by epic ID. Incompatible with epicWildcardId.
- """
- epicId: EpicID
-
- """
- Filter by epic ID wildcard. Incompatible with epicId.
- """
- epicWildcardId: EpicWildcardId
-
- """
- Filter by iteration title.
- """
- iterationTitle: String
-
- """
- Filter by iteration ID wildcard.
- """
- iterationWildcardId: IterationWildcardId
-
- """
- Filter by label name.
- """
- labelName: [String]
-
- """
- Filter by milestone title.
- """
- milestoneTitle: String
-
- """
- Filter by reaction emoji.
- """
- myReactionEmoji: String
-
- """
- List of negated params. Warning: this argument is experimental and a subject to change in future.
- """
- not: NegatedBoardIssueInput
-
- """
- Filter by release tag.
- """
- releaseTag: String
-
- """
- Search query for issue title or description.
- """
- search: String
-
- """
- Filter by weight.
- """
- weight: String
-}
-
-"""
-Represents a list for an issue board
-"""
-type BoardList {
- """
- Assignee in the list.
- """
- assignee: User
-
- """
- Indicates if list is collapsed for this user.
- """
- collapsed: Boolean
-
- """
- ID (global ID) of the list.
- """
- id: ID!
-
- """
- Board issues.
- """
- issues(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filters applied when selecting issues in the board list.
- """
- filters: BoardIssueInput
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): IssueConnection
-
- """
- Count of issues in the list.
- """
- issuesCount: Int
-
- """
- Iteration of the list.
- """
- iteration: Iteration
-
- """
- Label of the list.
- """
- label: Label
-
- """
- The current limit metric for the list.
- """
- limitMetric: ListLimitMetric
-
- """
- Type of the list.
- """
- listType: String!
-
- """
- Maximum number of issues in the list.
- """
- maxIssueCount: Int
-
- """
- Maximum weight of issues in the list.
- """
- maxIssueWeight: Int
-
- """
- Milestone of the list.
- """
- milestone: Milestone
-
- """
- Position of list within the board.
- """
- position: Int
-
- """
- Title of the list.
- """
- title: String!
-
- """
- Total weight of all issues in the list.
- """
- totalWeight: Int
-}
-
-"""
-The connection type for BoardList.
-"""
-type BoardListConnection {
- """
- A list of edges.
- """
- edges: [BoardListEdge]
-
- """
- A list of nodes.
- """
- nodes: [BoardList]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of BoardListCreate
-"""
-input BoardListCreateInput {
- """
- Global ID of an existing user.
- """
- assigneeId: UserID
-
- """
- Create the backlog list.
- """
- backlog: Boolean
-
- """
- Global ID of the issue board to mutate.
- """
- boardId: BoardID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of an existing iteration.
- """
- iterationId: IterationID
-
- """
- Global ID of an existing label.
- """
- labelId: LabelID
-
- """
- Global ID of an existing milestone.
- """
- milestoneId: MilestoneID
-}
-
-"""
-Autogenerated return type of BoardListCreate
-"""
-type BoardListCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Issue list in the issue board.
- """
- list: BoardList
-}
-
-"""
-An edge in a connection.
-"""
-type BoardListEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: BoardList
-}
-
-"""
-Autogenerated input type of BoardListUpdateLimitMetrics
-"""
-input BoardListUpdateLimitMetricsInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The new limit metric type for the list.
- """
- limitMetric: ListLimitMetric
-
- """
- The global ID of the list.
- """
- listId: ListID!
-
- """
- The new maximum issue count limit.
- """
- maxIssueCount: Int
-
- """
- The new maximum issue weight limit.
- """
- maxIssueWeight: Int
-}
-
-"""
-Autogenerated return type of BoardListUpdateLimitMetrics
-"""
-type BoardListUpdateLimitMetricsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The updated list.
- """
- list: BoardList
-}
-
-"""
-Identifier of Boards::EpicBoard.
-"""
-scalar BoardsEpicBoardID
-
-"""
-Identifier of Boards::EpicList.
-"""
-scalar BoardsEpicListID
-
-type Branch {
- """
- Commit for the branch.
- """
- commit: Commit
-
- """
- Name of the branch.
- """
- name: String!
-}
-
-"""
-Represents the total number of issues and their weights for a particular day
-"""
-type BurnupChartDailyTotals {
- """
- Number of closed issues as of this day.
- """
- completedCount: Int!
-
- """
- Total weight of closed issues as of this day.
- """
- completedWeight: Int!
-
- """
- Date for burnup totals.
- """
- date: ISO8601Date!
-
- """
- Number of issues as of this day.
- """
- scopeCount: Int!
-
- """
- Total weight of issues as of this day.
- """
- scopeWeight: Int!
-}
-
-type CiApplicationSettings {
- """
- Whether to keep the latest jobs artifacts.
- """
- keepLatestArtifact: Boolean
-}
-
-type CiBuildNeed {
- """
- Name of the job we need to complete.
- """
- name: String
-}
-
-"""
-The connection type for CiBuildNeed.
-"""
-type CiBuildNeedConnection {
- """
- A list of edges.
- """
- edges: [CiBuildNeedEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiBuildNeed]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiBuildNeedEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiBuildNeed
-}
-
-"""
-Autogenerated input type of CiCdSettingsUpdate
-"""
-input CiCdSettingsUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full Path of the project the settings belong to.
- """
- fullPath: ID!
-
- """
- Indicates if the latest artifact should be kept for this project.
- """
- keepLatestArtifact: Boolean
-}
-
-"""
-Autogenerated return type of CiCdSettingsUpdate
-"""
-type CiCdSettingsUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-type CiConfig {
- """
- Linting errors.
- """
- errors: [String!]
-
- """
- Merged CI configuration YAML.
- """
- mergedYaml: String
-
- """
- Stages of the pipeline.
- """
- stages(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiConfigStageConnection
-
- """
- Status of linting, can be either valid or invalid.
- """
- status: CiConfigStatus
-}
-
-type CiConfigGroup {
- """
- Jobs in group.
- """
- jobs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiConfigJobConnection
-
- """
- Name of the job group.
- """
- name: String
-
- """
- Size of the job group.
- """
- size: Int
-}
-
-"""
-The connection type for CiConfigGroup.
-"""
-type CiConfigGroupConnection {
- """
- A list of edges.
- """
- edges: [CiConfigGroupEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiConfigGroup]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiConfigGroupEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiConfigGroup
-}
-
-type CiConfigJob {
- """
- Override a set of commands that are executed after the job.
- """
- afterScript: [String!]
-
- """
- Allow job to fail.
- """
- allowFailure: Boolean
-
- """
- Override a set of commands that are executed before the job.
- """
- beforeScript: [String!]
-
- """
- Name of an environment to which the job deploys.
- """
- environment: String
-
- """
- Limit when jobs are not created.
- """
- except: CiConfigJobRestriction
-
- """
- Name of the job group.
- """
- groupName: String
-
- """
- Name of the job.
- """
- name: String
-
- """
- Builds that must complete before the jobs run.
- """
- needs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiConfigNeedConnection
-
- """
- Jobs are created when these conditions do not apply.
- """
- only: CiConfigJobRestriction
-
- """
- Shell script that is executed by a runner.
- """
- script: [String!]
-
- """
- Name of the job stage.
- """
- stage: String
-
- """
- List of tags that are used to select a runner.
- """
- tags: [String!]
-
- """
- When to run the job.
- """
- when: String
-}
-
-"""
-The connection type for CiConfigJob.
-"""
-type CiConfigJobConnection {
- """
- A list of edges.
- """
- edges: [CiConfigJobEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiConfigJob]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiConfigJobEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiConfigJob
-}
-
-type CiConfigJobRestriction {
- """
- The Git refs the job restriction applies to.
- """
- refs: [String!]
-}
-
-type CiConfigNeed {
- """
- Name of the need.
- """
- name: String
-}
-
-"""
-The connection type for CiConfigNeed.
-"""
-type CiConfigNeedConnection {
- """
- A list of edges.
- """
- edges: [CiConfigNeedEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiConfigNeed]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiConfigNeedEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiConfigNeed
-}
-
-type CiConfigStage {
- """
- Groups of jobs for the stage.
- """
- groups(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiConfigGroupConnection
-
- """
- Name of the stage.
- """
- name: String
-}
-
-"""
-The connection type for CiConfigStage.
-"""
-type CiConfigStageConnection {
- """
- A list of edges.
- """
- edges: [CiConfigStageEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiConfigStage]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiConfigStageEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiConfigStage
-}
-
-"""
-Values for YAML processor result
-"""
-enum CiConfigStatus {
- """
- The configuration file is not valid
- """
- INVALID
-
- """
- The configuration file is valid
- """
- VALID
-}
-
-type CiGroup {
- """
- Detailed status of the group.
- """
- detailedStatus: DetailedStatus
-
- """
- Jobs in group.
- """
- jobs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiJobConnection
-
- """
- Name of the job group.
- """
- name: String
-
- """
- Size of the group.
- """
- size: Int
-}
-
-"""
-The connection type for CiGroup.
-"""
-type CiGroupConnection {
- """
- A list of edges.
- """
- edges: [CiGroupEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiGroup]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiGroupEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiGroup
-}
-
-type CiJob {
- """
- Artifacts generated by the job.
- """
- artifacts(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiJobArtifactConnection
-
- """
- Detailed status of the job.
- """
- detailedStatus: DetailedStatus
-
- """
- Name of the job.
- """
- name: String
-
- """
- References to builds that must complete before the jobs run.
- """
- needs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiBuildNeedConnection
-
- """
- Pipeline the job belongs to.
- """
- pipeline: Pipeline
-
- """
- Schedule for the build.
- """
- scheduledAt: Time
-}
-
-type CiJobArtifact {
- """
- URL for downloading the artifact's file.
- """
- downloadPath: String
-
- """
- File type of the artifact.
- """
- fileType: JobArtifactFileType
-}
-
-"""
-The connection type for CiJobArtifact.
-"""
-type CiJobArtifactConnection {
- """
- A list of edges.
- """
- edges: [CiJobArtifactEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiJobArtifact]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiJobArtifactEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiJobArtifact
-}
-
-"""
-The connection type for CiJob.
-"""
-type CiJobConnection {
- """
- A list of edges.
- """
- edges: [CiJobEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiJob]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiJobEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiJob
-}
-
-"""
-Identifier of Ci::Pipeline.
-"""
-scalar CiPipelineID
-
-type CiStage {
- """
- Detailed status of the stage.
- """
- detailedStatus: DetailedStatus
-
- """
- Group of jobs for the stage.
- """
- groups(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiGroupConnection
-
- """
- Name of the stage.
- """
- name: String
-}
-
-"""
-The connection type for CiStage.
-"""
-type CiStageConnection {
- """
- A list of edges.
- """
- edges: [CiStageEdge]
-
- """
- A list of nodes.
- """
- nodes: [CiStage]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CiStageEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CiStage
-}
-
-type ClusterAgent {
- """
- Timestamp the cluster agent was created.
- """
- createdAt: Time
-
- """
- User object, containing information about the person who created the agent.
- """
- createdByUser: User
-
- """
- ID of the cluster agent.
- """
- id: ID!
-
- """
- Name of the cluster agent.
- """
- name: String
-
- """
- The project this cluster agent is associated with.
- """
- project: Project
-
- """
- Tokens associated with the cluster agent.
- """
- tokens(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ClusterAgentTokenConnection
-
- """
- Timestamp the cluster agent was updated.
- """
- updatedAt: Time
-}
-
-"""
-The connection type for ClusterAgent.
-"""
-type ClusterAgentConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [ClusterAgentEdge]
-
- """
- A list of nodes.
- """
- nodes: [ClusterAgent]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of ClusterAgentDelete
-"""
-input ClusterAgentDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the cluster agent that will be deleted.
- """
- id: ClustersAgentID!
-}
-
-"""
-Autogenerated return type of ClusterAgentDelete
-"""
-type ClusterAgentDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type ClusterAgentEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ClusterAgent
-}
-
-type ClusterAgentToken {
- """
- Cluster agent this token is associated with.
- """
- clusterAgent: ClusterAgent
-
- """
- Timestamp the token was created.
- """
- createdAt: Time
-
- """
- The user who created the token.
- """
- createdByUser: User
-
- """
- Global ID of the token.
- """
- id: ClustersAgentTokenID!
-}
-
-"""
-The connection type for ClusterAgentToken.
-"""
-type ClusterAgentTokenConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [ClusterAgentTokenEdge]
-
- """
- A list of nodes.
- """
- nodes: [ClusterAgentToken]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of ClusterAgentTokenCreate
-"""
-input ClusterAgentTokenCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the cluster agent that will be associated with the new token.
- """
- clusterAgentId: ClustersAgentID!
-}
-
-"""
-Autogenerated return type of ClusterAgentTokenCreate
-"""
-type ClusterAgentTokenCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Token secret value. Make sure you save it - you won't be able to access it again.
- """
- secret: String
-
- """
- Token created after mutation.
- """
- token: ClusterAgentToken
-}
-
-"""
-Autogenerated input type of ClusterAgentTokenDelete
-"""
-input ClusterAgentTokenDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the cluster agent token that will be deleted.
- """
- id: ClustersAgentTokenID!
-}
-
-"""
-Autogenerated return type of ClusterAgentTokenDelete
-"""
-type ClusterAgentTokenDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type ClusterAgentTokenEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ClusterAgentToken
-}
-
-"""
-Identifier of Clusters::Agent.
-"""
-scalar ClustersAgentID
-
-"""
-Identifier of Clusters::AgentToken.
-"""
-scalar ClustersAgentTokenID
-
-"""
-Identifier of Clusters::Cluster.
-"""
-scalar ClustersClusterID
-
-"""
-Represents the code coverage activity for a group
-"""
-type CodeCoverageActivity {
- """
- Average percentage of the different code coverage results available for the group.
- """
- averageCoverage: Float
-
- """
- Number of different code coverage results available for the group.
- """
- coverageCount: Int
-
- """
- Date when the code coverage was created.
- """
- date: Date!
-
- """
- Number of projects with code coverage results for the group.
- """
- projectCount: Int
-}
-
-"""
-The connection type for CodeCoverageActivity.
-"""
-type CodeCoverageActivityConnection {
- """
- A list of edges.
- """
- edges: [CodeCoverageActivityEdge]
-
- """
- A list of nodes.
- """
- nodes: [CodeCoverageActivity]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CodeCoverageActivityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CodeCoverageActivity
-}
-
-"""
-Represents the code coverage summary for a project
-"""
-type CodeCoverageSummary {
- """
- Average percentage of the different code coverage results available for the project.
- """
- averageCoverage: Float
-
- """
- Number of different code coverage results available.
- """
- coverageCount: Int
-
- """
- Latest date when the code coverage was created for the project.
- """
- lastUpdatedOn: Date
-}
-
-type Commit {
- """
- Author of the commit.
- """
- author: User
-
- """
- Commit authors gravatar.
- """
- authorGravatar: String
-
- """
- Commit authors name.
- """
- authorName: String
-
- """
- Timestamp of when the commit was authored.
- """
- authoredDate: Time
-
- """
- Description of the commit message.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- ID (global ID) of the commit.
- """
- id: ID!
-
- """
- Raw commit message.
- """
- message: String
-
- """
- Pipelines of the commit ordered latest first.
- """
- pipelines(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter pipelines by the ref they are run for.
- """
- ref: String
-
- """
- Filter pipelines by the sha of the commit they are run for.
- """
- sha: String
-
- """
- Filter pipelines by their status.
- """
- status: PipelineStatusEnum
- ): PipelineConnection
-
- """
- SHA1 ID of the commit.
- """
- sha: String!
-
- """
- Short SHA1 ID of the commit.
- """
- shortId: String!
-
- """
- Rendered HTML of the commit signature.
- """
- signatureHtml: String
-
- """
- Title of the commit message.
- """
- title: String
-
- """
- The GitLab Flavored Markdown rendering of `title`
- """
- titleHtml: String
-
- """
- Web path of the commit.
- """
- webPath: String!
-
- """
- Web URL of the commit.
- """
- webUrl: String!
-}
-
-input CommitAction {
- """
- The action to perform, create, delete, move, update, chmod.
- """
- action: CommitActionMode!
-
- """
- Content of the file.
- """
- content: String
-
- """
- Encoding of the file. Default is text.
- """
- encoding: CommitEncoding
-
- """
- Enables/disables the execute flag on the file.
- """
- executeFilemode: Boolean
-
- """
- Full path to the file.
- """
- filePath: String!
-
- """
- Last known file commit ID.
- """
- lastCommitId: String
-
- """
- Original full path to the file being moved.
- """
- previousPath: String
-}
-
-"""
-Mode of a commit action
-"""
-enum CommitActionMode {
- """
- Chmod command
- """
- CHMOD
-
- """
- Create command
- """
- CREATE
-
- """
- Delete command
- """
- DELETE
-
- """
- Move command
- """
- MOVE
-
- """
- Update command
- """
- UPDATE
-}
-
-"""
-The connection type for Commit.
-"""
-type CommitConnection {
- """
- A list of edges.
- """
- edges: [CommitEdge]
-
- """
- A list of nodes.
- """
- nodes: [Commit]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of CommitCreate
-"""
-input CommitCreateInput {
- """
- Array of action hashes to commit as a batch.
- """
- actions: [CommitAction!]!
-
- """
- Name of the branch to commit into, it can be a new branch.
- """
- branch: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Raw commit message.
- """
- message: String!
-
- """
- Project full path the branch is associated with.
- """
- projectPath: ID!
-
- """
- If on a new branch, name of the original branch.
- """
- startBranch: String
-}
-
-"""
-Autogenerated return type of CommitCreate
-"""
-type CommitCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The commit after mutation.
- """
- commit: Commit
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type CommitEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Commit
-}
-
-enum CommitEncoding {
- """
- Base64 encoding
- """
- BASE64
-
- """
- Text encoding
- """
- TEXT
-}
-
-"""
-Represents a ComplianceFramework associated with a Project
-"""
-type ComplianceFramework {
- """
- Hexadecimal representation of compliance framework's label color.
- """
- color: String!
-
- """
- Description of the compliance framework.
- """
- description: String!
-
- """
- Compliance framework ID.
- """
- id: ID!
-
- """
- Name of the compliance framework.
- """
- name: String!
-
- """
- Full path of the compliance pipeline configuration stored in a project
- repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hippa`.
- """
- pipelineConfigurationFullPath: String
-}
-
-"""
-The connection type for ComplianceFramework.
-"""
-type ComplianceFrameworkConnection {
- """
- A list of edges.
- """
- edges: [ComplianceFrameworkEdge]
-
- """
- A list of nodes.
- """
- nodes: [ComplianceFramework]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ComplianceFrameworkEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ComplianceFramework
-}
-
-input ComplianceFrameworkInput {
- """
- New color representation of the compliance framework in hex format. e.g. #FCA121.
- """
- color: String
-
- """
- New description for the compliance framework.
- """
- description: String
-
- """
- New name for the compliance framework.
- """
- name: String
-
- """
- Full path of the compliance pipeline configuration stored in a project
- repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hippa`.
- """
- pipelineConfigurationFullPath: String
-}
-
-"""
-Identifier of ComplianceManagement::Framework.
-"""
-scalar ComplianceManagementFrameworkID
-
-"""
-Composer metadata
-"""
-type ComposerMetadata {
- """
- Data of the Composer JSON file.
- """
- composerJson: PackageComposerJsonType!
-
- """
- Target SHA of the package.
- """
- targetSha: String!
-}
-
-"""
-Autogenerated input type of ConfigureSast
-"""
-input ConfigureSastInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- SAST CI configuration for the project.
- """
- configuration: SastCiConfigurationInput!
-
- """
- Full path of the project.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of ConfigureSast
-"""
-type ConfigureSastPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Status of creating the commit for the supplied SAST CI configuration.
- """
- status: String!
-
- """
- Redirect path to use when the response is successful.
- """
- successPath: String
-}
-
-"""
-A tag expiration policy designed to keep only the images that matter most
-"""
-type ContainerExpirationPolicy {
- """
- This container expiration policy schedule.
- """
- cadence: ContainerExpirationPolicyCadenceEnum!
-
- """
- Timestamp of when the container expiration policy was created.
- """
- createdAt: Time!
-
- """
- Indicates whether this container expiration policy is enabled.
- """
- enabled: Boolean!
-
- """
- Number of tags to retain.
- """
- keepN: ContainerExpirationPolicyKeepEnum
-
- """
- Tags with names matching this regex pattern will expire.
- """
- nameRegex: UntrustedRegexp
-
- """
- Tags with names matching this regex pattern will be preserved.
- """
- nameRegexKeep: UntrustedRegexp
-
- """
- Next time that this container expiration policy will get executed.
- """
- nextRunAt: Time
-
- """
- Tags older that this will expire.
- """
- olderThan: ContainerExpirationPolicyOlderThanEnum
-
- """
- Timestamp of when the container expiration policy was updated.
- """
- updatedAt: Time!
-}
-
-enum ContainerExpirationPolicyCadenceEnum {
- """
- Every day
- """
- EVERY_DAY
-
- """
- Every month
- """
- EVERY_MONTH
-
- """
- Every three months
- """
- EVERY_THREE_MONTHS
-
- """
- Every two weeks
- """
- EVERY_TWO_WEEKS
-
- """
- Every week
- """
- EVERY_WEEK
-}
-
-enum ContainerExpirationPolicyKeepEnum {
- """
- 50 tags per image name
- """
- FIFTY_TAGS
-
- """
- 5 tags per image name
- """
- FIVE_TAGS
-
- """
- 100 tags per image name
- """
- ONE_HUNDRED_TAGS
-
- """
- 1 tag per image name
- """
- ONE_TAG
-
- """
- 10 tags per image name
- """
- TEN_TAGS
-
- """
- 25 tags per image name
- """
- TWENTY_FIVE_TAGS
-}
-
-enum ContainerExpirationPolicyOlderThanEnum {
- """
- 14 days until tags are automatically removed
- """
- FOURTEEN_DAYS
-
- """
- 90 days until tags are automatically removed
- """
- NINETY_DAYS
-
- """
- 7 days until tags are automatically removed
- """
- SEVEN_DAYS
-
- """
- 30 days until tags are automatically removed
- """
- THIRTY_DAYS
-}
-
-"""
-A container repository
-"""
-type ContainerRepository {
- """
- Can the current user delete the container repository.
- """
- canDelete: Boolean!
-
- """
- Timestamp when the container repository was created.
- """
- createdAt: Time!
-
- """
- The tags cleanup status for the container repository.
- """
- expirationPolicyCleanupStatus: ContainerRepositoryCleanupStatus
-
- """
- Timestamp when the cleanup done by the expiration policy was started on the container repository.
- """
- expirationPolicyStartedAt: Time
-
- """
- ID of the container repository.
- """
- id: ID!
-
- """
- URL of the container repository.
- """
- location: String!
-
- """
- Name of the container repository.
- """
- name: String!
-
- """
- Path of the container repository.
- """
- path: String!
-
- """
- Project of the container registry.
- """
- project: Project!
-
- """
- Status of the container repository.
- """
- status: ContainerRepositoryStatus
-
- """
- Number of tags associated with this image.
- """
- tagsCount: Int!
-
- """
- Timestamp when the container repository was updated.
- """
- updatedAt: Time!
-}
-
-"""
-Status of the tags cleanup of a container repository
-"""
-enum ContainerRepositoryCleanupStatus {
- """
- The tags cleanup is ongoing.
- """
- ONGOING
-
- """
- The tags cleanup is scheduled and is going to be executed shortly.
- """
- SCHEDULED
-
- """
- The tags cleanup has been partially executed. There are still remaining tags to delete.
- """
- UNFINISHED
-
- """
- The tags cleanup is not scheduled. This is the default state.
- """
- UNSCHEDULED
-}
-
-"""
-The connection type for ContainerRepository.
-"""
-type ContainerRepositoryConnection {
- """
- A list of edges.
- """
- edges: [ContainerRepositoryEdge]
-
- """
- A list of nodes.
- """
- nodes: [ContainerRepository]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Details of a container repository
-"""
-type ContainerRepositoryDetails {
- """
- Can the current user delete the container repository.
- """
- canDelete: Boolean!
-
- """
- Timestamp when the container repository was created.
- """
- createdAt: Time!
-
- """
- The tags cleanup status for the container repository.
- """
- expirationPolicyCleanupStatus: ContainerRepositoryCleanupStatus
-
- """
- Timestamp when the cleanup done by the expiration policy was started on the container repository.
- """
- expirationPolicyStartedAt: Time
-
- """
- ID of the container repository.
- """
- id: ID!
-
- """
- URL of the container repository.
- """
- location: String!
-
- """
- Name of the container repository.
- """
- name: String!
-
- """
- Path of the container repository.
- """
- path: String!
-
- """
- Project of the container registry.
- """
- project: Project!
-
- """
- Status of the container repository.
- """
- status: ContainerRepositoryStatus
-
- """
- Tags of the container repository.
- """
- tags(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ContainerRepositoryTagConnection
-
- """
- Number of tags associated with this image.
- """
- tagsCount: Int!
-
- """
- Timestamp when the container repository was updated.
- """
- updatedAt: Time!
-}
-
-"""
-An edge in a connection.
-"""
-type ContainerRepositoryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ContainerRepository
-}
-
-"""
-Identifier of ContainerRepository.
-"""
-scalar ContainerRepositoryID
-
-"""
-Values for sorting container repositories
-"""
-enum ContainerRepositorySort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Name by ascending order
- """
- NAME_ASC
-
- """
- Name by descending order
- """
- NAME_DESC
-
- """
- Updated at ascending order
- """
- UPDATED_ASC
-
- """
- Updated at descending order
- """
- UPDATED_DESC
-
- """
- Created at ascending order
- """
- created_asc @deprecated(reason: "Use CREATED_ASC. Deprecated in 13.5.")
-
- """
- Created at descending order
- """
- created_desc @deprecated(reason: "Use CREATED_DESC. Deprecated in 13.5.")
-
- """
- Updated at ascending order
- """
- updated_asc @deprecated(reason: "Use UPDATED_ASC. Deprecated in 13.5.")
-
- """
- Updated at descending order
- """
- updated_desc @deprecated(reason: "Use UPDATED_DESC. Deprecated in 13.5.")
-}
-
-"""
-Status of a container repository
-"""
-enum ContainerRepositoryStatus {
- """
- Delete Failed status.
- """
- DELETE_FAILED
-
- """
- Delete Scheduled status.
- """
- DELETE_SCHEDULED
-}
-
-"""
-A tag from a container repository
-"""
-type ContainerRepositoryTag {
- """
- Can the current user delete this tag.
- """
- canDelete: Boolean!
-
- """
- Timestamp when the tag was created.
- """
- createdAt: Time
-
- """
- Digest of the tag.
- """
- digest: String
-
- """
- URL of the tag.
- """
- location: String!
-
- """
- Name of the tag.
- """
- name: String!
-
- """
- Path of the tag.
- """
- path: String!
-
- """
- Revision of the tag.
- """
- revision: String
-
- """
- Short revision of the tag.
- """
- shortRevision: String
-
- """
- The size of the tag.
- """
- totalSize: BigInt
-}
-
-"""
-The connection type for ContainerRepositoryTag.
-"""
-type ContainerRepositoryTagConnection {
- """
- A list of edges.
- """
- edges: [ContainerRepositoryTagEdge]
-
- """
- A list of nodes.
- """
- nodes: [ContainerRepositoryTag]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ContainerRepositoryTagEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ContainerRepositoryTag
-}
-
-"""
-Autogenerated input type of CreateAlertIssue
-"""
-input CreateAlertIssueInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the alert to mutate.
- """
- iid: String!
-
- """
- The project the alert to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of CreateAlertIssue
-"""
-type CreateAlertIssuePayload {
- """
- The alert after mutation.
- """
- alert: AlertManagementAlert
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue created after mutation.
- """
- issue: Issue
-
- """
- The to-do item after mutation.
- """
- todo: Todo
-}
-
-"""
-Autogenerated input type of CreateAnnotation
-"""
-input CreateAnnotationInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the cluster to add an annotation to.
- """
- clusterId: ClustersClusterID
-
- """
- The path to a file defining the dashboard on which the annotation should be added.
- """
- dashboardPath: String!
-
- """
- The description of the annotation.
- """
- description: String!
-
- """
- Timestamp indicating ending moment to which the annotation relates.
- """
- endingAt: Time
-
- """
- The global ID of the environment to add an annotation to.
- """
- environmentId: EnvironmentID
-
- """
- Timestamp indicating starting moment to which the annotation relates.
- """
- startingAt: Time!
-}
-
-"""
-Autogenerated return type of CreateAnnotation
-"""
-type CreateAnnotationPayload {
- """
- The created annotation.
- """
- annotation: MetricsDashboardAnnotation
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateBoard
-"""
-input CreateBoardInput {
- """
- The ID of user to be assigned to the board.
- """
- assigneeId: UserID
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path of the group with which the resource is associated.
- """
- groupPath: ID
-
- """
- Whether or not backlog list is hidden.
- """
- hideBacklogList: Boolean
-
- """
- Whether or not closed list is hidden.
- """
- hideClosedList: Boolean
-
- """
- The ID of iteration to be assigned to the board.
- """
- iterationId: IterationID
-
- """
- The IDs of labels to be added to the board.
- """
- labelIds: [LabelID!]
-
- """
- Labels of the issue.
- """
- labels: [String!]
-
- """
- The ID of milestone to be assigned to the board.
- """
- milestoneId: MilestoneID
-
- """
- The board name.
- """
- name: String
-
- """
- Full path of the project with which the resource is associated.
- """
- projectPath: ID
-
- """
- The weight value to be assigned to the board.
- """
- weight: Int
-}
-
-"""
-Autogenerated return type of CreateBoard
-"""
-type CreateBoardPayload {
- """
- The board after mutation.
- """
- board: Board
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateBranch
-"""
-input CreateBranchInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Name of the branch.
- """
- name: String!
-
- """
- Project full path the branch is associated with.
- """
- projectPath: ID!
-
- """
- Branch name or commit SHA to create branch from.
- """
- ref: String!
-}
-
-"""
-Autogenerated return type of CreateBranch
-"""
-type CreateBranchPayload {
- """
- Branch after mutation.
- """
- branch: Branch
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateClusterAgent
-"""
-input CreateClusterAgentInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Name of the cluster agent.
- """
- name: String!
-
- """
- Full path of the associated project for this cluster agent.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of CreateClusterAgent
-"""
-type CreateClusterAgentPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Cluster agent created after mutation.
- """
- clusterAgent: ClusterAgent
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateComplianceFramework
-"""
-input CreateComplianceFrameworkInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path of the namespace to add the compliance framework to.
- """
- namespacePath: ID!
-
- """
- Parameters to update the compliance framework with.
- """
- params: ComplianceFrameworkInput!
-}
-
-"""
-Autogenerated return type of CreateComplianceFramework
-"""
-type CreateComplianceFrameworkPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The created compliance framework.
- """
- framework: ComplianceFramework
-}
-
-"""
-Autogenerated input type of CreateCustomEmoji
-"""
-input CreateCustomEmojiInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Namespace full path the emoji is associated with.
- """
- groupPath: ID!
-
- """
- Name of the emoji.
- """
- name: String!
-
- """
- Location of the emoji file.
- """
- url: String!
-}
-
-"""
-Autogenerated return type of CreateCustomEmoji
-"""
-type CreateCustomEmojiPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The new custom emoji.
- """
- customEmoji: CustomEmoji
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateDevopsAdoptionSegment
-"""
-input CreateDevopsAdoptionSegmentInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Namespace ID to set for the segment.
- """
- namespaceId: NamespaceID!
-}
-
-"""
-Autogenerated return type of CreateDevopsAdoptionSegment
-"""
-type CreateDevopsAdoptionSegmentPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The segment after mutation.
- """
- segment: DevopsAdoptionSegment
-}
-
-"""
-Autogenerated input type of CreateDiffNote
-"""
-input CreateDiffNoteInput {
- """
- Content of the note.
- """
- body: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The confidentiality flag of a note. Default is false.
- """
- confidential: Boolean
-
- """
- The global ID of the resource to add a note to.
- """
- noteableId: NoteableID!
-
- """
- The position of this note on a diff.
- """
- position: DiffPositionInput!
-}
-
-"""
-Autogenerated return type of CreateDiffNote
-"""
-type CreateDiffNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of CreateEpic
-"""
-input CreateEpicInput {
- """
- The IDs of labels to be added to the epic.
- """
- addLabelIds: [ID!]
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates if the epic is confidential.
- """
- confidential: Boolean
-
- """
- The description of the epic.
- """
- description: String
-
- """
- The end date of the epic.
- """
- dueDateFixed: String
-
- """
- Indicates end date should be sourced from due_date_fixed field not the issue milestones.
- """
- dueDateIsFixed: Boolean
-
- """
- The group the epic to mutate is in.
- """
- groupPath: ID!
-
- """
- The IDs of labels to be removed from the epic.
- """
- removeLabelIds: [ID!]
-
- """
- The start date of the epic.
- """
- startDateFixed: String
-
- """
- Indicates start date should be sourced from start_date_fixed field not the issue milestones.
- """
- startDateIsFixed: Boolean
-
- """
- The title of the epic.
- """
- title: String
-}
-
-"""
-Autogenerated return type of CreateEpic
-"""
-type CreateEpicPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The created epic.
- """
- epic: Epic
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of CreateImageDiffNote
-"""
-input CreateImageDiffNoteInput {
- """
- Content of the note.
- """
- body: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The confidentiality flag of a note. Default is false.
- """
- confidential: Boolean
-
- """
- The global ID of the resource to add a note to.
- """
- noteableId: NoteableID!
-
- """
- The position of this note on a diff.
- """
- position: DiffImagePositionInput!
-}
-
-"""
-Autogenerated return type of CreateImageDiffNote
-"""
-type CreateImageDiffNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of CreateIssue
-"""
-input CreateIssueInput {
- """
- The array of user IDs to assign to the issue.
- """
- assigneeIds: [UserID!]
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates the issue is confidential.
- """
- confidential: Boolean
-
- """
- Timestamp when the issue was created. Available only for admins and project owners.
- """
- createdAt: Time
-
- """
- Description of the issue.
- """
- description: String
-
- """
- The ID of a discussion to resolve. Also pass `merge_request_to_resolve_discussions_of`.
- """
- discussionToResolve: String
-
- """
- Due date of the issue.
- """
- dueDate: ISO8601Date
-
- """
- The ID of an epic to associate the issue with.
- """
- epicId: EpicID
-
- """
- The desired health status.
- """
- healthStatus: HealthStatus
-
- """
- The IID (internal ID) of a project issue. Only admins and project owners can modify.
- """
- iid: Int
-
- """
- The IDs of labels to be added to the issue.
- """
- labelIds: [LabelID!]
-
- """
- Labels of the issue.
- """
- labels: [String!]
-
- """
- Indicates discussion is locked on the issue.
- """
- locked: Boolean
-
- """
- The IID of a merge request for which to resolve discussions.
- """
- mergeRequestToResolveDiscussionsOf: MergeRequestID
-
- """
- The ID of the milestone to assign to the issue. On update milestone will be removed if set to null.
- """
- milestoneId: MilestoneID
-
- """
- Project full path the issue is associated with.
- """
- projectPath: ID!
-
- """
- Title of the issue.
- """
- title: String!
-
- """
- The weight of the issue.
- """
- weight: Int
-}
-
-"""
-Autogenerated return type of CreateIssue
-"""
-type CreateIssuePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of CreateIteration
-"""
-input CreateIterationInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The description of the iteration.
- """
- description: String
-
- """
- The end date of the iteration.
- """
- dueDate: String
-
- """
- Full path of the group with which the resource is associated.
- """
- groupPath: ID
-
- """
- Full path of the project with which the resource is associated.
- """
- projectPath: ID
-
- """
- The start date of the iteration.
- """
- startDate: String
-
- """
- The title of the iteration.
- """
- title: String
-}
-
-"""
-Autogenerated return type of CreateIteration
-"""
-type CreateIterationPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The created iteration.
- """
- iteration: Iteration
-}
-
-"""
-Autogenerated input type of CreateNote
-"""
-input CreateNoteInput {
- """
- Content of the note.
- """
- body: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The confidentiality flag of a note. Default is false.
- """
- confidential: Boolean
-
- """
- The global ID of the discussion this note is in reply to.
- """
- discussionId: DiscussionID
-
- """
- The global ID of the resource to add a note to.
- """
- noteableId: NoteableID!
-}
-
-"""
-Autogenerated return type of CreateNote
-"""
-type CreateNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of CreateRequirement
-"""
-input CreateRequirementInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the requirement.
- """
- description: String
-
- """
- Full project path the requirement is associated with.
- """
- projectPath: ID!
-
- """
- Title of the requirement.
- """
- title: String
-}
-
-"""
-Autogenerated return type of CreateRequirement
-"""
-type CreateRequirementPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Requirement after mutation.
- """
- requirement: Requirement
-}
-
-"""
-Autogenerated input type of CreateSnippet
-"""
-input CreateSnippetInput {
- """
- Actions to perform over the snippet repository and blobs.
- """
- blobActions: [SnippetBlobActionInputType!]
-
- """
- A valid CAPTCHA response value obtained by using the provided captchaSiteKey
- with a CAPTCHA API to present a challenge to be solved on the client. Required
- to resubmit if the previous operation returned "NeedsCaptchaResponse: true".
- """
- captchaResponse: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the snippet.
- """
- description: String
-
- """
- The project full path the snippet is associated with.
- """
- projectPath: ID
-
- """
- The spam log ID which must be passed along with a valid CAPTCHA response for
- the operation to be completed. Required to resubmit if the previous operation
- returned "NeedsCaptchaResponse: true".
- """
- spamLogId: Int
-
- """
- Title of the snippet.
- """
- title: String!
-
- """
- The paths to files uploaded in the snippet description.
- """
- uploadedFiles: [String!]
-
- """
- The visibility level of the snippet.
- """
- visibilityLevel: VisibilityLevelsEnum!
-}
-
-"""
-Autogenerated return type of CreateSnippet
-"""
-type CreateSnippetPayload {
- """
- The CAPTCHA site key which must be used to render a challenge for the user to
- solve to obtain a valid captchaResponse value. Included only when an operation
- was not completed because "NeedsCaptchaResponse" is true.
- """
- captchaSiteKey: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Indicates whether the operation was detected as possible spam and not
- completed. If CAPTCHA is enabled, the request must be resubmitted with a valid
- CAPTCHA response and spam_log_id included for the operation to be completed.
- Included only when an operation was not completed because
- "NeedsCaptchaResponse" is true.
- """
- needsCaptchaResponse: Boolean
-
- """
- The snippet after mutation.
- """
- snippet: Snippet
-
- """
- Indicates whether the operation was detected as definite spam. There is no
- option to resubmit the request with a CAPTCHA response.
- """
- spam: Boolean
-
- """
- The spam log ID which must be passed along with a valid CAPTCHA response for
- an operation to be completed. Included only when an operation was not
- completed because "NeedsCaptchaResponse" is true.
- """
- spamLogId: Int
-}
-
-"""
-Autogenerated input type of CreateTestCase
-"""
-input CreateTestCaseInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The test case description.
- """
- description: String
-
- """
- The IDs of labels to be added to the test case.
- """
- labelIds: [ID!]
-
- """
- The project full path to create the test case.
- """
- projectPath: ID!
-
- """
- The test case title.
- """
- title: String!
-}
-
-"""
-Autogenerated return type of CreateTestCase
-"""
-type CreateTestCasePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The test case created.
- """
- testCase: Issue
-}
-
-interface CurrentUserTodos {
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-}
-
-"""
-A custom emoji uploaded by user
-"""
-type CustomEmoji {
- """
- Whether the emoji is an external link.
- """
- external: Boolean!
-
- """
- The ID of the emoji.
- """
- id: CustomEmojiID!
-
- """
- The name of the emoji.
- """
- name: String!
-
- """
- The link to file of the emoji.
- """
- url: String!
-}
-
-"""
-The connection type for CustomEmoji.
-"""
-type CustomEmojiConnection {
- """
- A list of edges.
- """
- edges: [CustomEmojiEdge]
-
- """
- A list of nodes.
- """
- nodes: [CustomEmoji]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type CustomEmojiEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: CustomEmoji
-}
-
-"""
-Identifier of CustomEmoji.
-"""
-scalar CustomEmojiID
-
-"""
-Autogenerated input type of DastOnDemandScanCreate
-"""
-input DastOnDemandScanCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the scanner profile to be used for the scan.
- """
- dastScannerProfileId: DastScannerProfileID
-
- """
- ID of the site profile to be used for the scan.
- """
- dastSiteProfileId: DastSiteProfileID!
-
- """
- The project the site profile belongs to.
- """
- fullPath: ID!
-}
-
-"""
-Autogenerated return type of DastOnDemandScanCreate
-"""
-type DastOnDemandScanCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- URL of the pipeline that was created.
- """
- pipelineUrl: String
-}
-
-"""
-Represents a DAST Profile
-"""
-type DastProfile {
- """
- The associated scanner profile.
- """
- dastScannerProfile: DastScannerProfile
-
- """
- The associated site profile.
- """
- dastSiteProfile: DastSiteProfile
-
- """
- The description of the scan.
- """
- description: String
-
- """
- Relative web path to the edit page of a profile.
- """
- editPath: String
-
- """
- ID of the profile.
- """
- id: DastProfileID!
-
- """
- The name of the profile.
- """
- name: String
-}
-
-"""
-The connection type for DastProfile.
-"""
-type DastProfileConnection {
- """
- A list of edges.
- """
- edges: [DastProfileEdge]
-
- """
- A list of nodes.
- """
- nodes: [DastProfile]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of DastProfileCreate
-"""
-input DastProfileCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the scanner profile to be associated.
- """
- dastScannerProfileId: DastScannerProfileID!
-
- """
- ID of the site profile to be associated.
- """
- dastSiteProfileId: DastSiteProfileID!
-
- """
- The description of the profile. Defaults to an empty string.
- """
- description: String = ""
-
- """
- The project the profile belongs to.
- """
- fullPath: ID!
-
- """
- The name of the profile.
- """
- name: String!
-
- """
- Run scan using profile after creation. Defaults to false.
- """
- runAfterCreate: Boolean = false
-}
-
-"""
-Autogenerated return type of DastProfileCreate
-"""
-type DastProfileCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The created profile.
- """
- dastProfile: DastProfile
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The URL of the pipeline that was created. Requires `runAfterCreate` to be set to `true`.
- """
- pipelineUrl: String
-}
-
-"""
-Autogenerated input type of DastProfileDelete
-"""
-input DastProfileDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the profile to be deleted.
- """
- id: DastProfileID!
-}
-
-"""
-Autogenerated return type of DastProfileDelete
-"""
-type DastProfileDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type DastProfileEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DastProfile
-}
-
-"""
-Identifier of Dast::Profile.
-"""
-scalar DastProfileID
-
-"""
-Autogenerated input type of DastProfileRun
-"""
-input DastProfileRunInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path for the project the scanner profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the profile to be used for the scan.
- """
- id: DastProfileID!
-}
-
-"""
-Autogenerated return type of DastProfileRun
-"""
-type DastProfileRunPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- URL of the pipeline that was created.
- """
- pipelineUrl: String
-}
-
-"""
-Autogenerated input type of DastProfileUpdate
-"""
-input DastProfileUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the scanner profile to be associated.
- """
- dastScannerProfileId: DastScannerProfileID
-
- """
- ID of the site profile to be associated.
- """
- dastSiteProfileId: DastSiteProfileID
-
- """
- The description of the profile. Defaults to an empty string.
- """
- description: String = ""
-
- """
- The project the profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the profile to be deleted.
- """
- id: DastProfileID!
-
- """
- The name of the profile.
- """
- name: String
-
- """
- Run scan using profile after update. Defaults to false.
- """
- runAfterUpdate: Boolean = false
-}
-
-"""
-Autogenerated return type of DastProfileUpdate
-"""
-type DastProfileUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The updated profile.
- """
- dastProfile: DastProfile
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The URL of the pipeline that was created. Requires the input argument
- `runAfterUpdate` to be set to `true` when calling the mutation, otherwise no
- pipeline will be created.
- """
- pipelineUrl: String
-}
-
-enum DastScanTypeEnum {
- """
- Active DAST scan. This scan will make active attacks against the target site.
- """
- ACTIVE
-
- """
- Passive DAST scan. This scan will not make active attacks against the target site.
- """
- PASSIVE
-}
-
-"""
-Represents a DAST scanner profile
-"""
-type DastScannerProfile {
- """
- Relative web path to the edit page of a scanner profile.
- """
- editPath: String
-
- """
- ID of the DAST scanner profile. Deprecated in 13.6: Use `id`.
- """
- globalId: DastScannerProfileID! @deprecated(reason: "Use `id`. Deprecated in 13.6.")
-
- """
- ID of the DAST scanner profile.
- """
- id: DastScannerProfileID!
-
- """
- Name of the DAST scanner profile.
- """
- profileName: String
-
- """
- Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.
- """
- scanType: DastScanTypeEnum
-
- """
- Indicates if debug messages should be included in DAST console output. True to include the debug messages.
- """
- showDebugMessages: Boolean!
-
- """
- The maximum number of minutes allowed for the spider to traverse the site.
- """
- spiderTimeout: Int
-
- """
- The maximum number of seconds allowed for the site under test to respond to a request.
- """
- targetTimeout: Int
-
- """
- Indicates if the AJAX spider should be used to crawl the target site. True to
- run the AJAX spider in addition to the traditional spider, and false to run
- only the traditional spider.
- """
- useAjaxSpider: Boolean!
-}
-
-"""
-The connection type for DastScannerProfile.
-"""
-type DastScannerProfileConnection {
- """
- A list of edges.
- """
- edges: [DastScannerProfileEdge]
-
- """
- A list of nodes.
- """
- nodes: [DastScannerProfile]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of DastScannerProfileCreate
-"""
-input DastScannerProfileCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the scanner profile belongs to.
- """
- fullPath: ID!
-
- """
- The name of the scanner profile.
- """
- profileName: String!
-
- """
- Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.
- """
- scanType: DastScanTypeEnum = PASSIVE
-
- """
- Indicates if debug messages should be included in DAST console output. True to include the debug messages.
- """
- showDebugMessages: Boolean = false
-
- """
- The maximum number of minutes allowed for the spider to traverse the site.
- """
- spiderTimeout: Int
-
- """
- The maximum number of seconds allowed for the site under test to respond to a request.
- """
- targetTimeout: Int
-
- """
- Indicates if the AJAX spider should be used to crawl the target site. True to
- run the AJAX spider in addition to the traditional spider, and false to run
- only the traditional spider.
- """
- useAjaxSpider: Boolean = false
-}
-
-"""
-Autogenerated return type of DastScannerProfileCreate
-"""
-type DastScannerProfileCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the scanner profile. Deprecated in 13.6: Use `id`.
- """
- globalId: DastScannerProfileID @deprecated(reason: "Use `id`. Deprecated in 13.6.")
-
- """
- ID of the scanner profile.
- """
- id: DastScannerProfileID
-}
-
-"""
-Autogenerated input type of DastScannerProfileDelete
-"""
-input DastScannerProfileDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path for the project the scanner profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the scanner profile to be deleted.
- """
- id: DastScannerProfileID!
-}
-
-"""
-Autogenerated return type of DastScannerProfileDelete
-"""
-type DastScannerProfileDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type DastScannerProfileEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DastScannerProfile
-}
-
-"""
-Identifier of DastScannerProfile.
-"""
-scalar DastScannerProfileID
-
-"""
-Autogenerated input type of DastScannerProfileUpdate
-"""
-input DastScannerProfileUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the scanner profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the scanner profile to be updated.
- """
- id: DastScannerProfileID!
-
- """
- The name of the scanner profile.
- """
- profileName: String!
-
- """
- Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.
- """
- scanType: DastScanTypeEnum
-
- """
- Indicates if debug messages should be included in DAST console output. True to include the debug messages.
- """
- showDebugMessages: Boolean
-
- """
- The maximum number of minutes allowed for the spider to traverse the site.
- """
- spiderTimeout: Int!
-
- """
- The maximum number of seconds allowed for the site under test to respond to a request.
- """
- targetTimeout: Int!
-
- """
- Indicates if the AJAX spider should be used to crawl the target site. True to
- run the AJAX spider in addition to the traditional spider, and false to run
- only the traditional spider.
- """
- useAjaxSpider: Boolean
-}
-
-"""
-Autogenerated return type of DastScannerProfileUpdate
-"""
-type DastScannerProfileUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the scanner profile.
- """
- id: DastScannerProfileID
-}
-
-"""
-Represents a DAST Site Profile
-"""
-type DastSiteProfile {
- """
- Relative web path to the edit page of a site profile.
- """
- editPath: String
-
- """
- ID of the site profile.
- """
- id: DastSiteProfileID!
-
- """
- Normalized URL of the target to be scanned.
- """
- normalizedTargetUrl: String
-
- """
- The name of the site profile.
- """
- profileName: String
-
- """
- The URL of the target to be scanned.
- """
- targetUrl: String
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: DastSiteProfilePermissions!
-
- """
- The current validation status of the site profile.
- """
- validationStatus: DastSiteProfileValidationStatusEnum
-}
-
-"""
-The connection type for DastSiteProfile.
-"""
-type DastSiteProfileConnection {
- """
- A list of edges.
- """
- edges: [DastSiteProfileEdge]
-
- """
- A list of nodes.
- """
- nodes: [DastSiteProfile]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of DastSiteProfileCreate
-"""
-input DastSiteProfileCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the site profile belongs to.
- """
- fullPath: ID!
-
- """
- The name of the site profile.
- """
- profileName: String!
-
- """
- The URL of the target to be scanned.
- """
- targetUrl: String
-}
-
-"""
-Autogenerated return type of DastSiteProfileCreate
-"""
-type DastSiteProfileCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the site profile.
- """
- id: DastSiteProfileID
-}
-
-"""
-Autogenerated input type of DastSiteProfileDelete
-"""
-input DastSiteProfileDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the site profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the site profile to be deleted.
- """
- id: DastSiteProfileID!
-}
-
-"""
-Autogenerated return type of DastSiteProfileDelete
-"""
-type DastSiteProfileDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type DastSiteProfileEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DastSiteProfile
-}
-
-"""
-Identifier of DastSiteProfile.
-"""
-scalar DastSiteProfileID
-
-"""
-Check permissions for the current user on site profile
-"""
-type DastSiteProfilePermissions {
- """
- Indicates the user can perform `create_on_demand_dast_scan` on this resource
- """
- createOnDemandDastScan: Boolean!
-}
-
-"""
-Autogenerated input type of DastSiteProfileUpdate
-"""
-input DastSiteProfileUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the site profile belongs to.
- """
- fullPath: ID!
-
- """
- ID of the site profile to be updated.
- """
- id: DastSiteProfileID!
-
- """
- The name of the site profile.
- """
- profileName: String!
-
- """
- The URL of the target to be scanned.
- """
- targetUrl: String
-}
-
-"""
-Autogenerated return type of DastSiteProfileUpdate
-"""
-type DastSiteProfileUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the site profile.
- """
- id: DastSiteProfileID
-}
-
-enum DastSiteProfileValidationStatusEnum {
- """
- Site validation process finished but failed
- """
- FAILED_VALIDATION
-
- """
- Site validation process is in progress
- """
- INPROGRESS_VALIDATION
-
- """
- No site validation exists
- """
- NONE
-
- """
- Site validation process finished successfully
- """
- PASSED_VALIDATION
-
- """
- Site validation process has not started
- """
- PENDING_VALIDATION
-}
-
-"""
-Autogenerated input type of DastSiteTokenCreate
-"""
-input DastSiteTokenCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the site token belongs to.
- """
- fullPath: ID!
-
- """
- The URL of the target to be validated.
- """
- targetUrl: String
-}
-
-"""
-Autogenerated return type of DastSiteTokenCreate
-"""
-type DastSiteTokenCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the site token.
- """
- id: DastSiteTokenID
-
- """
- The current validation status of the target.
- """
- status: DastSiteProfileValidationStatusEnum
-
- """
- Token string.
- """
- token: String
-}
-
-"""
-Identifier of DastSiteToken.
-"""
-scalar DastSiteTokenID
-
-"""
-Represents a DAST Site Validation
-"""
-type DastSiteValidation {
- """
- Global ID of the site validation.
- """
- id: DastSiteValidationID!
-
- """
- Normalized URL of the target to be validated.
- """
- normalizedTargetUrl: String
-
- """
- Status of the site validation.
- """
- status: DastSiteProfileValidationStatusEnum!
-}
-
-"""
-The connection type for DastSiteValidation.
-"""
-type DastSiteValidationConnection {
- """
- A list of edges.
- """
- edges: [DastSiteValidationEdge]
-
- """
- A list of nodes.
- """
- nodes: [DastSiteValidation]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of DastSiteValidationCreate
-"""
-input DastSiteValidationCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the site token.
- """
- dastSiteTokenId: DastSiteTokenID!
-
- """
- The project the site profile belongs to.
- """
- fullPath: ID!
-
- """
- The validation strategy to be used.
- """
- strategy: DastSiteValidationStrategyEnum
-
- """
- The path to be requested during validation.
- """
- validationPath: String!
-}
-
-"""
-Autogenerated return type of DastSiteValidationCreate
-"""
-type DastSiteValidationCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- ID of the site validation.
- """
- id: DastSiteValidationID
-
- """
- The current validation status.
- """
- status: DastSiteProfileValidationStatusEnum
-}
-
-"""
-An edge in a connection.
-"""
-type DastSiteValidationEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DastSiteValidation
-}
-
-"""
-Identifier of DastSiteValidation.
-"""
-scalar DastSiteValidationID
-
-"""
-Autogenerated input type of DastSiteValidationRevoke
-"""
-input DastSiteValidationRevokeInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the site validation belongs to.
- """
- fullPath: ID!
-
- """
- Normalized URL of the target to be revoked.
- """
- normalizedTargetUrl: String!
-}
-
-"""
-Autogenerated return type of DastSiteValidationRevoke
-"""
-type DastSiteValidationRevokePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-enum DastSiteValidationStrategyEnum {
- """
- Header validation
- """
- HEADER
-
- """
- Text file validation
- """
- TEXT_FILE
-}
-
-"""
-Color of the data visualization palette
-"""
-enum DataVisualizationColorEnum {
- """
- Aqua color
- """
- AQUA
-
- """
- Blue color
- """
- BLUE
-
- """
- Green color
- """
- GREEN
-
- """
- Magenta color
- """
- MAGENTA
-
- """
- Orange color
- """
- ORANGE
-}
-
-"""
-Weight of the data visualization palette
-"""
-enum DataVisualizationWeightEnum {
- """
- 100 weight
- """
- WEIGHT_100
-
- """
- 200 weight
- """
- WEIGHT_200
-
- """
- 300 weight
- """
- WEIGHT_300
-
- """
- 400 weight
- """
- WEIGHT_400
-
- """
- 50 weight
- """
- WEIGHT_50
-
- """
- 500 weight
- """
- WEIGHT_500
-
- """
- 600 weight
- """
- WEIGHT_600
-
- """
- 700 weight
- """
- WEIGHT_700
-
- """
- 800 weight
- """
- WEIGHT_800
-
- """
- 900 weight
- """
- WEIGHT_900
-
- """
- 950 weight
- """
- WEIGHT_950
-}
-
-"""
-Date represented in ISO 8601
-"""
-scalar Date
-
-"""
-Autogenerated input type of DeleteAnnotation
-"""
-input DeleteAnnotationInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the annotation to delete.
- """
- id: MetricsDashboardAnnotationID!
-}
-
-"""
-Autogenerated return type of DeleteAnnotation
-"""
-type DeleteAnnotationPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DeleteDevopsAdoptionSegment
-"""
-input DeleteDevopsAdoptionSegmentInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the segment.
- """
- id: AnalyticsDevopsAdoptionSegmentID!
-}
-
-"""
-Autogenerated return type of DeleteDevopsAdoptionSegment
-"""
-type DeleteDevopsAdoptionSegmentPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-The response from the AdminSidekiqQueuesDeleteJobs mutation
-"""
-type DeleteJobsResponse {
- """
- Whether or not the entire queue was processed in time; if not, retrying the same request is safe.
- """
- completed: Boolean
-
- """
- The number of matching jobs deleted.
- """
- deletedJobs: Int
-
- """
- The queue size after processing.
- """
- queueSize: Int
-}
-
-"""
-A single design
-"""
-type Design implements CurrentUserTodos & DesignFields & Noteable {
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- The diff refs for this design.
- """
- diffRefs: DiffRefs!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- How this design was changed in the current version.
- """
- event: DesignVersionEvent!
-
- """
- The filename of the design.
- """
- filename: String!
-
- """
- The full path to the design file.
- """
- fullPath: String!
-
- """
- The ID of this design.
- """
- id: ID!
-
- """
- The URL of the full-sized image.
- """
- image: String!
-
- """
- The URL of the design resized to fit within the bounds of 432x230. This will be `null` if the image has not been generated
- """
- imageV432x230: String
-
- """
- The issue the design belongs to.
- """
- issue: Issue!
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- The total count of user-created notes for this design.
- """
- notesCount: Int!
-
- """
- The project the design belongs to.
- """
- project: Project!
-
- """
- All versions related to this design ordered newest first.
- """
- versions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- The Global ID of the most recent acceptable version.
- """
- earlierOrEqualToId: DesignManagementVersionID
-
- """
- The SHA256 of the most recent acceptable version.
- """
- earlierOrEqualToSha: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DesignVersionConnection!
-}
-
-"""
-A design pinned to a specific version. The image field reflects the design as of the associated version
-"""
-type DesignAtVersion implements DesignFields {
- """
- The underlying design.
- """
- design: Design!
-
- """
- The diff refs for this design.
- """
- diffRefs: DiffRefs!
-
- """
- How this design was changed in the current version.
- """
- event: DesignVersionEvent!
-
- """
- The filename of the design.
- """
- filename: String!
-
- """
- The full path to the design file.
- """
- fullPath: String!
-
- """
- The ID of this design.
- """
- id: ID!
-
- """
- The URL of the full-sized image.
- """
- image: String!
-
- """
- The URL of the design resized to fit within the bounds of 432x230. This will be `null` if the image has not been generated
- """
- imageV432x230: String
-
- """
- The issue the design belongs to.
- """
- issue: Issue!
-
- """
- The total count of user-created notes for this design.
- """
- notesCount: Int!
-
- """
- The project the design belongs to.
- """
- project: Project!
-
- """
- The version this design-at-versions is pinned to.
- """
- version: DesignVersion!
-}
-
-"""
-The connection type for DesignAtVersion.
-"""
-type DesignAtVersionConnection {
- """
- A list of edges.
- """
- edges: [DesignAtVersionEdge]
-
- """
- A list of nodes.
- """
- nodes: [DesignAtVersion]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type DesignAtVersionEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DesignAtVersion
-}
-
-"""
-A collection of designs
-"""
-type DesignCollection {
- """
- Copy state of the design collection.
- """
- copyState: DesignCollectionCopyState
-
- """
- Find a specific design.
- """
- design(
- """
- Find a design by its filename.
- """
- filename: String
-
- """
- Find a design by its ID.
- """
- id: DesignManagementDesignID
- ): Design
-
- """
- Find a design as of a version.
- """
- designAtVersion(
- """
- The Global ID of the design at this version.
- """
- id: DesignManagementDesignAtVersionID!
- ): DesignAtVersion
-
- """
- All designs for the design collection.
- """
- designs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Filters designs to only those that existed at the version. If argument is
- omitted or nil then all designs will reflect the latest version
- """
- atVersion: DesignManagementVersionID
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filters designs by their filename.
- """
- filenames: [String!]
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters designs by their ID.
- """
- ids: [DesignManagementDesignID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DesignConnection!
-
- """
- Issue associated with the design collection.
- """
- issue: Issue!
-
- """
- Project associated with the design collection.
- """
- project: Project!
-
- """
- A specific version.
- """
- version(
- """
- The Global ID of the version.
- """
- id: DesignManagementVersionID
-
- """
- The SHA256 of a specific version.
- """
- sha: String
- ): DesignVersion
-
- """
- All versions related to all designs, ordered newest first.
- """
- versions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- The Global ID of the most recent acceptable version.
- """
- earlierOrEqualToId: DesignManagementVersionID
-
- """
- The SHA256 of the most recent acceptable version.
- """
- earlierOrEqualToSha: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DesignVersionConnection!
-}
-
-"""
-Copy state of a DesignCollection
-"""
-enum DesignCollectionCopyState {
- """
- The DesignCollection encountered an error during a copy
- """
- ERROR
-
- """
- The DesignCollection is being copied
- """
- IN_PROGRESS
-
- """
- The DesignCollection has no copy in progress
- """
- READY
-}
-
-"""
-The connection type for Design.
-"""
-type DesignConnection {
- """
- A list of edges.
- """
- edges: [DesignEdge]
-
- """
- A list of nodes.
- """
- nodes: [Design]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type DesignEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Design
-}
-
-interface DesignFields {
- """
- The diff refs for this design.
- """
- diffRefs: DiffRefs!
-
- """
- How this design was changed in the current version.
- """
- event: DesignVersionEvent!
-
- """
- The filename of the design.
- """
- filename: String!
-
- """
- The full path to the design file.
- """
- fullPath: String!
-
- """
- The ID of this design.
- """
- id: ID!
-
- """
- The URL of the full-sized image.
- """
- image: String!
-
- """
- The URL of the design resized to fit within the bounds of 432x230. This will be `null` if the image has not been generated
- """
- imageV432x230: String
-
- """
- The issue the design belongs to.
- """
- issue: Issue!
-
- """
- The total count of user-created notes for this design.
- """
- notesCount: Int!
-
- """
- The project the design belongs to.
- """
- project: Project!
-}
-
-type DesignManagement {
- """
- Find a design as of a version.
- """
- designAtVersion(
- """
- The Global ID of the design at this version.
- """
- id: DesignManagementDesignAtVersionID!
- ): DesignAtVersion
-
- """
- Find a version.
- """
- version(
- """
- The Global ID of the version.
- """
- id: DesignManagementVersionID!
- ): DesignVersion
-}
-
-"""
-Autogenerated input type of DesignManagementDelete
-"""
-input DesignManagementDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The filenames of the designs to delete.
- """
- filenames: [String!]!
-
- """
- The IID of the issue to modify designs for.
- """
- iid: ID!
-
- """
- The project where the issue is to upload designs for.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of DesignManagementDelete
-"""
-type DesignManagementDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The new version in which the designs are deleted.
- """
- version: DesignVersion
-}
-
-"""
-Identifier of DesignManagement::DesignAtVersion.
-"""
-scalar DesignManagementDesignAtVersionID
-
-"""
-Identifier of DesignManagement::Design.
-"""
-scalar DesignManagementDesignID
-
-"""
-Autogenerated input type of DesignManagementMove
-"""
-input DesignManagementMoveInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the design to move.
- """
- id: DesignManagementDesignID!
-
- """
- ID of the immediately following design.
- """
- next: DesignManagementDesignID
-
- """
- ID of the immediately preceding design.
- """
- previous: DesignManagementDesignID
-}
-
-"""
-Autogenerated return type of DesignManagementMove
-"""
-type DesignManagementMovePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The current state of the collection.
- """
- designCollection: DesignCollection
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DesignManagementUpload
-"""
-input DesignManagementUploadInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The files to upload.
- """
- files: [Upload!]!
-
- """
- The IID of the issue to modify designs for.
- """
- iid: ID!
-
- """
- The project where the issue is to upload designs for.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of DesignManagementUpload
-"""
-type DesignManagementUploadPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The designs that were uploaded by the mutation.
- """
- designs: [Design!]!
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Any designs that were skipped from the upload due to there being no change to their content since their last version
- """
- skippedDesigns: [Design!]!
-}
-
-"""
-Identifier of DesignManagement::Version.
-"""
-scalar DesignManagementVersionID
-
-"""
-A specific version in which designs were added, modified or deleted
-"""
-type DesignVersion {
- """
- A particular design as of this version, provided it is visible at this version.
- """
- designAtVersion(
- """
- The ID of a specific design.
- """
- designId: DesignManagementDesignID
-
- """
- The filename of a specific design.
- """
- filename: String
-
- """
- The ID of the DesignAtVersion.
- """
- id: DesignManagementDesignAtVersionID
- ): DesignAtVersion!
-
- """
- All designs that were changed in the version.
- """
- designs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DesignConnection!
-
- """
- All designs that are visible at this version, as of this version.
- """
- designsAtVersion(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filters designs by their filename.
- """
- filenames: [String!]
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters designs by their ID.
- """
- ids: [DesignManagementDesignID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DesignAtVersionConnection!
-
- """
- ID of the design version.
- """
- id: ID!
-
- """
- SHA of the design version.
- """
- sha: ID!
-}
-
-"""
-The connection type for DesignVersion.
-"""
-type DesignVersionConnection {
- """
- A list of edges.
- """
- edges: [DesignVersionEdge]
-
- """
- A list of nodes.
- """
- nodes: [DesignVersion]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type DesignVersionEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DesignVersion
-}
-
-"""
-Mutation event of a design within a version
-"""
-enum DesignVersionEvent {
- """
- A creation event
- """
- CREATION
-
- """
- A deletion event
- """
- DELETION
-
- """
- A modification event
- """
- MODIFICATION
-
- """
- No change
- """
- NONE
-}
-
-"""
-Autogenerated input type of DestroyBoard
-"""
-input DestroyBoardInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the board to destroy.
- """
- id: BoardID!
-}
-
-"""
-Autogenerated input type of DestroyBoardList
-"""
-input DestroyBoardListInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the list to destroy. Only label lists are accepted.
- """
- listId: ListID!
-}
-
-"""
-Autogenerated return type of DestroyBoardList
-"""
-type DestroyBoardListPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The list after mutation.
- """
- list: BoardList
-}
-
-"""
-Autogenerated return type of DestroyBoard
-"""
-type DestroyBoardPayload {
- """
- The board after mutation.
- """
- board: Board
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DestroyComplianceFramework
-"""
-input DestroyComplianceFrameworkInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the compliance framework to destroy.
- """
- id: ComplianceManagementFrameworkID!
-}
-
-"""
-Autogenerated return type of DestroyComplianceFramework
-"""
-type DestroyComplianceFrameworkPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DestroyContainerRepository
-"""
-input DestroyContainerRepositoryInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the container repository.
- """
- id: ContainerRepositoryID!
-}
-
-"""
-Autogenerated return type of DestroyContainerRepository
-"""
-type DestroyContainerRepositoryPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The container repository policy after scheduling the deletion.
- """
- containerRepository: ContainerRepository!
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DestroyContainerRepositoryTags
-"""
-input DestroyContainerRepositoryTagsInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the container repository.
- """
- id: ContainerRepositoryID!
-
- """
- Container repository tag(s) to delete. Total number can't be greater than 20
- """
- tagNames: [String!]!
-}
-
-"""
-Autogenerated return type of DestroyContainerRepositoryTags
-"""
-type DestroyContainerRepositoryTagsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Deleted container repository tags.
- """
- deletedTagNames: [String!]!
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DestroyNote
-"""
-input DestroyNoteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the note to destroy.
- """
- id: NoteID!
-}
-
-"""
-Autogenerated return type of DestroyNote
-"""
-type DestroyNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of DestroySnippet
-"""
-input DestroySnippetInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the snippet to destroy.
- """
- id: SnippetID!
-}
-
-"""
-Autogenerated return type of DestroySnippet
-"""
-type DestroySnippetPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The snippet after mutation.
- """
- snippet: Snippet
-}
-
-type DetailedStatus {
- """
- Action information for the status. This includes method, button title, icon, path, and title.
- """
- action: StatusAction
-
- """
- Path of the details for the status.
- """
- detailsPath: String
-
- """
- Favicon of the status.
- """
- favicon: String
-
- """
- Group of the status.
- """
- group: String
-
- """
- Indicates if the status has further details.
- """
- hasDetails: Boolean
-
- """
- Icon of the status.
- """
- icon: String
-
- """
- Label of the status.
- """
- label: String
-
- """
- Text of the status.
- """
- text: String
-
- """
- Tooltip associated with the status.
- """
- tooltip: String
-}
-
-"""
-Segment
-"""
-type DevopsAdoptionSegment {
- """
- ID of the segment.
- """
- id: ID!
-
- """
- The latest adoption metrics for the segment.
- """
- latestSnapshot: DevopsAdoptionSnapshot
-
- """
- Segment namespace.
- """
- namespace: Namespace
-}
-
-"""
-The connection type for DevopsAdoptionSegment.
-"""
-type DevopsAdoptionSegmentConnection {
- """
- A list of edges.
- """
- edges: [DevopsAdoptionSegmentEdge]
-
- """
- A list of nodes.
- """
- nodes: [DevopsAdoptionSegment]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type DevopsAdoptionSegmentEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: DevopsAdoptionSegment
-}
-
-"""
-Snapshot
-"""
-type DevopsAdoptionSnapshot {
- """
- At least one deployment succeeded.
- """
- deploySucceeded: Boolean!
-
- """
- The end time for the snapshot where the data points were collected.
- """
- endTime: Time!
-
- """
- At least one issue was opened.
- """
- issueOpened: Boolean!
-
- """
- At least one merge request was approved.
- """
- mergeRequestApproved: Boolean!
-
- """
- At least one merge request was opened.
- """
- mergeRequestOpened: Boolean!
-
- """
- At least one pipeline succeeded.
- """
- pipelineSucceeded: Boolean!
-
- """
- The time the snapshot was recorded.
- """
- recordedAt: Time!
-
- """
- At least one runner was used.
- """
- runnerConfigured: Boolean!
-
- """
- At least one security scan succeeded.
- """
- securityScanSucceeded: Boolean!
-
- """
- The start time for the snapshot where the data points were collected.
- """
- startTime: Time!
-}
-
-input DiffImagePositionInput {
- """
- Merge base of the branch the comment was made on.
- """
- baseSha: String
-
- """
- SHA of the HEAD at the time the comment was made.
- """
- headSha: String!
-
- """
- Total height of the image.
- """
- height: Int!
-
- """
- The paths of the file that was changed. Both of the properties of this input
- are optional, but at least one of them is required
- """
- paths: DiffPathsInput!
-
- """
- SHA of the branch being compared against.
- """
- startSha: String!
-
- """
- Total width of the image.
- """
- width: Int!
-
- """
- X position of the note.
- """
- x: Int!
-
- """
- Y position of the note.
- """
- y: Int!
-}
-
-"""
-Identifier of DiffNote.
-"""
-scalar DiffNoteID
-
-input DiffPathsInput {
- """
- The path of the file on the head sha.
- """
- newPath: String
-
- """
- The path of the file on the start sha.
- """
- oldPath: String
-}
-
-type DiffPosition {
- """
- Information about the branch, HEAD, and base at the time of commenting.
- """
- diffRefs: DiffRefs!
-
- """
- Path of the file that was changed.
- """
- filePath: String!
-
- """
- Total height of the image.
- """
- height: Int
-
- """
- Line on HEAD SHA that was changed.
- """
- newLine: Int
-
- """
- Path of the file on the HEAD SHA.
- """
- newPath: String
-
- """
- Line on start SHA that was changed.
- """
- oldLine: Int
-
- """
- Path of the file on the start SHA.
- """
- oldPath: String
-
- """
- Type of file the position refers to.
- """
- positionType: DiffPositionType!
-
- """
- Total width of the image.
- """
- width: Int
-
- """
- X position of the note.
- """
- x: Int
-
- """
- Y position of the note.
- """
- y: Int
-}
-
-input DiffPositionInput {
- """
- Merge base of the branch the comment was made on.
- """
- baseSha: String
-
- """
- SHA of the HEAD at the time the comment was made.
- """
- headSha: String!
-
- """
- Line on HEAD SHA that was changed.
- """
- newLine: Int!
-
- """
- Line on start SHA that was changed.
- """
- oldLine: Int
-
- """
- The paths of the file that was changed. Both of the properties of this input
- are optional, but at least one of them is required
- """
- paths: DiffPathsInput!
-
- """
- SHA of the branch being compared against.
- """
- startSha: String!
-}
-
-"""
-Type of file the position refers to
-"""
-enum DiffPositionType {
- image
- text
-}
-
-type DiffRefs {
- """
- Merge base of the branch the comment was made on.
- """
- baseSha: String
-
- """
- SHA of the HEAD at the time the comment was made.
- """
- headSha: String!
-
- """
- SHA of the branch being compared against.
- """
- startSha: String!
-}
-
-"""
-Changes to a single file
-"""
-type DiffStats {
- """
- Number of lines added to this file.
- """
- additions: Int!
-
- """
- Number of lines deleted from this file.
- """
- deletions: Int!
-
- """
- File path, relative to repository root.
- """
- path: String!
-}
-
-"""
-Aggregated summary of changes
-"""
-type DiffStatsSummary {
- """
- Number of lines added.
- """
- additions: Int!
-
- """
- Number of lines changed.
- """
- changes: Int!
-
- """
- Number of lines deleted.
- """
- deletions: Int!
-
- """
- Number of files changed.
- """
- fileCount: Int!
-}
-
-type Discussion implements ResolvableInterface {
- """
- Timestamp of the discussion's creation.
- """
- createdAt: Time!
-
- """
- ID of this discussion.
- """
- id: DiscussionID!
-
- """
- All notes in the discussion.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- ID used to reply to this discussion.
- """
- replyId: DiscussionID!
-
- """
- Indicates if the object can be resolved.
- """
- resolvable: Boolean!
-
- """
- Indicates if the object is resolved.
- """
- resolved: Boolean!
-
- """
- Timestamp of when the object was resolved.
- """
- resolvedAt: Time
-
- """
- User who resolved the object.
- """
- resolvedBy: User
-}
-
-"""
-The connection type for Discussion.
-"""
-type DiscussionConnection {
- """
- A list of edges.
- """
- edges: [DiscussionEdge]
-
- """
- A list of nodes.
- """
- nodes: [Discussion]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type DiscussionEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Discussion
-}
-
-"""
-Identifier of Discussion.
-"""
-scalar DiscussionID
-
-"""
-Autogenerated input type of DiscussionToggleResolve
-"""
-input DiscussionToggleResolveInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the discussion.
- """
- id: DiscussionID!
-
- """
- Will resolve the discussion when true, and unresolve the discussion when false.
- """
- resolve: Boolean!
-}
-
-"""
-Autogenerated return type of DiscussionToggleResolve
-"""
-type DiscussionToggleResolvePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The discussion after mutation.
- """
- discussion: Discussion
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of DismissVulnerability
-"""
-input DismissVulnerabilityInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Comment why vulnerability should be dismissed.
- """
- comment: String
-
- """
- Reason why vulnerability should be dismissed.
- """
- dismissalReason: VulnerabilityDismissalReason
-
- """
- ID of the vulnerability to be dismissed.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of DismissVulnerability
-"""
-type DismissVulnerabilityPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after dismissal.
- """
- vulnerability: Vulnerability
-}
-
-interface Entry {
- """
- Flat path of the entry.
- """
- flatPath: String!
-
- """
- ID of the entry.
- """
- id: ID!
-
- """
- Name of the entry.
- """
- name: String!
-
- """
- Path of the entry.
- """
- path: String!
-
- """
- Last commit SHA for the entry.
- """
- sha: String!
-
- """
- Type of tree entry.
- """
- type: EntryType!
-}
-
-"""
-Type of a tree entry
-"""
-enum EntryType {
- blob
- commit
- tree
-}
-
-"""
-Describes where code is deployed for a project
-"""
-type Environment {
- """
- ID of the environment.
- """
- id: ID!
-
- """
- The most severe open alert for the environment. If multiple alerts have equal severity, the most recent is returned.
- """
- latestOpenedMostSevereAlert: AlertManagementAlert
-
- """
- Metrics dashboard schema for the environment.
- """
- metricsDashboard(
- """
- Path to a file which defines metrics dashboard eg: 'config/prometheus/common_metrics.yml'.
- """
- path: String!
- ): MetricsDashboard
-
- """
- Human-readable name of the environment.
- """
- name: String!
-
- """
- The path to the environment.
- """
- path: String!
-
- """
- State of the environment, for example: available/stopped.
- """
- state: String!
-}
-
-"""
-The connection type for Environment.
-"""
-type EnvironmentConnection {
- """
- A list of edges.
- """
- edges: [EnvironmentEdge]
-
- """
- A list of nodes.
- """
- nodes: [Environment]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type EnvironmentEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Environment
-}
-
-"""
-Identifier of Environment.
-"""
-scalar EnvironmentID
-
-"""
-Autogenerated input type of EnvironmentsCanaryIngressUpdate
-"""
-input EnvironmentsCanaryIngressUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the environment to update.
- """
- id: EnvironmentID!
-
- """
- The weight of the Canary Ingress.
- """
- weight: Int!
-}
-
-"""
-Autogenerated return type of EnvironmentsCanaryIngressUpdate
-"""
-type EnvironmentsCanaryIngressUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Represents an epic
-"""
-type Epic implements CurrentUserTodos & Eventable & Noteable {
- """
- Author of the epic.
- """
- author: User!
-
- """
- A list of award emojis associated with the epic.
- """
- awardEmoji(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): AwardEmojiConnection
-
- """
- Children (sub-epics) of the epic.
- """
- children(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Filter epics by author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filter epics by given confidentiality.
- """
- confidential: Boolean
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the epic, e.g., "1".
- """
- iid: ID
-
- """
- Filter epics by IID for autocomplete.
- """
- iidStartsWith: String
-
- """
- List of IIDs of epics, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- Include epics from descendant groups.
- """
- includeDescendantGroups: Boolean = true
-
- """
- Filter epics by labels.
- """
- labelName: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter epics by milestone title, computed from epic's issues.
- """
- milestoneTitle: String
-
- """
- Search query for epic title or description.
- """
- search: String
-
- """
- List epics by sort order.
- """
- sort: EpicSort
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter epics by state.
- """
- state: EpicState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
- ): EpicConnection
-
- """
- Timestamp of when the epic was closed.
- """
- closedAt: Time
-
- """
- Indicates if the epic is confidential.
- """
- confidential: Boolean
-
- """
- Timestamp of when the epic was created.
- """
- createdAt: Time
-
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- Number of open and closed descendant epics and issues.
- """
- descendantCounts: EpicDescendantCount
-
- """
- Total weight of open and closed issues in the epic and its descendants.
- """
- descendantWeightSum: EpicDescendantWeights
-
- """
- Description of the epic.
- """
- description: String
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Number of downvotes the epic has received.
- """
- downvotes: Int!
-
- """
- Due date of the epic.
- """
- dueDate: Time
-
- """
- Fixed due date of the epic.
- """
- dueDateFixed: Time
-
- """
- Inherited due date of the epic from milestones.
- """
- dueDateFromMilestones: Time
-
- """
- Indicates if the due date has been manually set.
- """
- dueDateIsFixed: Boolean
-
- """
- A list of events associated with the object.
- """
- events(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EventConnection
-
- """
- Group to which the epic belongs.
- """
- group: Group!
-
- """
- Indicates if the epic has children.
- """
- hasChildren: Boolean!
-
- """
- Indicates if the epic has direct issues.
- """
- hasIssues: Boolean!
-
- """
- Indicates if the epic has a parent epic.
- """
- hasParent: Boolean!
-
- """
- Current health status of the epic.
- """
- healthStatus: EpicHealthStatus
-
- """
- ID of the epic.
- """
- id: ID!
-
- """
- Internal ID of the epic.
- """
- iid: ID!
-
- """
- A list of issues associated with the epic.
- """
- issues(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EpicIssueConnection
-
- """
- Labels assigned to the epic.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- Parent epic of the epic.
- """
- parent: Epic
-
- """
- List of participants for the epic.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Internal reference of the epic. Returned in shortened format by default.
- """
- reference(
- """
- Indicates if the reference should be returned in full.
- """
- full: Boolean = false
- ): String!
-
- """
- URI path of the epic-issue relationship.
- """
- relationPath: String
-
- """
- The relative position of the epic in the epic tree.
- """
- relativePosition: Int
-
- """
- Start date of the epic.
- """
- startDate: Time
-
- """
- Fixed start date of the epic.
- """
- startDateFixed: Time
-
- """
- Inherited start date of the epic from milestones.
- """
- startDateFromMilestones: Time
-
- """
- Indicates if the start date has been manually set.
- """
- startDateIsFixed: Boolean
-
- """
- State of the epic.
- """
- state: EpicState!
-
- """
- Indicates the currently logged in user is subscribed to the epic.
- """
- subscribed: Boolean!
-
- """
- Title of the epic.
- """
- title: String
-
- """
- Timestamp of when the epic was updated.
- """
- updatedAt: Time
-
- """
- Number of upvotes the epic has received.
- """
- upvotes: Int!
-
- """
- Number of user discussions in the epic.
- """
- userDiscussionsCount: Int!
-
- """
- Number of user notes of the epic.
- """
- userNotesCount: Int!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: EpicPermissions!
-
- """
- Web path of the epic.
- """
- webPath: String!
-
- """
- Web URL of the epic.
- """
- webUrl: String!
-}
-
-"""
-Autogenerated input type of EpicAddIssue
-"""
-input EpicAddIssueInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The group the epic to mutate belongs to.
- """
- groupPath: ID!
-
- """
- The IID of the epic to mutate.
- """
- iid: ID!
-
- """
- The IID of the issue to be added.
- """
- issueIid: String!
-
- """
- The full path of the project the issue belongs to.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of EpicAddIssue
-"""
-type EpicAddIssuePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The epic after mutation.
- """
- epic: Epic
-
- """
- The epic-issue relation.
- """
- epicIssue: EpicIssue
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Represents an epic board
-"""
-type EpicBoard {
- """
- Global ID of the board.
- """
- id: BoardsEpicBoardID!
-
- """
- Epic board lists.
- """
- lists(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Find an epic board list by ID.
- """
- id: BoardsEpicListID
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EpicListConnection
-
- """
- Name of the board.
- """
- name: String
-}
-
-"""
-The connection type for EpicBoard.
-"""
-type EpicBoardConnection {
- """
- A list of edges.
- """
- edges: [EpicBoardEdge]
-
- """
- A list of nodes.
- """
- nodes: [EpicBoard]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of EpicBoardCreate
-"""
-input EpicBoardCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path of the group with which the resource is associated.
- """
- groupPath: ID
-
- """
- Whether or not backlog list is hidden.
- """
- hideBacklogList: Boolean
-
- """
- Whether or not closed list is hidden.
- """
- hideClosedList: Boolean
-
- """
- The board name.
- """
- name: String
-}
-
-"""
-Autogenerated return type of EpicBoardCreate
-"""
-type EpicBoardCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The created epic board.
- """
- epicBoard: EpicBoard
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type EpicBoardEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: EpicBoard
-}
-
-"""
-Autogenerated input type of EpicBoardListCreate
-"""
-input EpicBoardListCreateInput {
- """
- Create the backlog list.
- """
- backlog: Boolean
-
- """
- Global ID of the issue board to mutate.
- """
- boardId: BoardsEpicBoardID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of an existing label.
- """
- labelId: LabelID
-}
-
-"""
-Autogenerated return type of EpicBoardListCreate
-"""
-type EpicBoardListCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Epic list in the epic board.
- """
- list: EpicList
-}
-
-"""
-The connection type for Epic.
-"""
-type EpicConnection {
- """
- A list of edges.
- """
- edges: [EpicEdge]
-
- """
- A list of nodes.
- """
- nodes: [Epic]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Counts of descendent epics
-"""
-type EpicDescendantCount {
- """
- Number of closed child epics.
- """
- closedEpics: Int
-
- """
- Number of closed epic issues.
- """
- closedIssues: Int
-
- """
- Number of opened child epics.
- """
- openedEpics: Int
-
- """
- Number of opened epic issues.
- """
- openedIssues: Int
-}
-
-"""
-Total weight of open and closed descendant issues
-"""
-type EpicDescendantWeights {
- """
- Total weight of completed (closed) issues in this epic, including epic descendants.
- """
- closedIssues: Int
-
- """
- Total weight of opened issues in this epic, including epic descendants.
- """
- openedIssues: Int
-}
-
-"""
-An edge in a connection.
-"""
-type EpicEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Epic
-}
-
-"""
-Health status of child issues
-"""
-type EpicHealthStatus {
- """
- Number of issues at risk.
- """
- issuesAtRisk: Int
-
- """
- Number of issues that need attention.
- """
- issuesNeedingAttention: Int
-
- """
- Number of issues on track.
- """
- issuesOnTrack: Int
-}
-
-"""
-Identifier of Epic.
-"""
-scalar EpicID
-
-"""
-Relationship between an epic and an issue
-"""
-type EpicIssue implements CurrentUserTodos & Noteable {
- """
- Alert associated to this issue.
- """
- alertManagementAlert: AlertManagementAlert
-
- """
- Assignees of the issue.
- """
- assignees(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- User that created the issue.
- """
- author: User!
-
- """
- Indicates the issue is blocked.
- """
- blocked: Boolean!
-
- """
- Count of issues blocking this issue.
- """
- blockedByCount: Int
-
- """
- Timestamp of when the issue was closed.
- """
- closedAt: Time
-
- """
- Indicates the issue is confidential.
- """
- confidential: Boolean!
-
- """
- User specific email address for the issue.
- """
- createNoteEmail: String
-
- """
- Timestamp of when the issue was created.
- """
- createdAt: Time!
-
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- Description of the issue.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Collection of design images associated with this issue.
- """
- designCollection: DesignCollection
-
- """
- Indicates discussion is locked on the issue.
- """
- discussionLocked: Boolean!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Number of downvotes the issue has received.
- """
- downvotes: Int!
-
- """
- Due date of the issue.
- """
- dueDate: Time
-
- """
- Indicates if a project has email notifications disabled: `true` if email notifications are disabled.
- """
- emailsDisabled: Boolean!
-
- """
- Epic to which this issue belongs.
- """
- epic: Epic
-
- """
- ID of the epic-issue relation.
- """
- epicIssueId: ID!
-
- """
- Current health status.
- """
- healthStatus: HealthStatus
-
- """
- Human-readable time estimate of the issue.
- """
- humanTimeEstimate: String
-
- """
- Human-readable total time reported as spent on the issue.
- """
- humanTotalTimeSpent: String
-
- """
- Global ID of the epic-issue relation.
- """
- id: ID
-
- """
- Internal ID of the issue.
- """
- iid: ID!
-
- """
- Iteration of the issue.
- """
- iteration: Iteration
-
- """
- Labels of the issue.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- Metric images associated to the issue.
- """
- metricImages: [MetricImage!]
-
- """
- Milestone of the issue.
- """
- milestone: Milestone
-
- """
- Indicates if issue got moved from other project.
- """
- moved: Boolean
-
- """
- Updated Issue after it got moved to another project.
- """
- movedTo: Issue
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- List of participants in the issue.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Internal reference of the issue. Returned in shortened format by default.
- """
- reference(
- """
- Boolean option specifying whether the reference should be returned in full.
- """
- full: Boolean = false
- ): String!
-
- """
- URI path of the epic-issue relation.
- """
- relationPath: String
-
- """
- Relative position of the issue (used for positioning in epic tree and issue boards).
- """
- relativePosition: Int
-
- """
- Severity level of the incident.
- """
- severity: IssuableSeverity
-
- """
- Timestamp of when the issue SLA expires.
- """
- slaDueAt: Time
-
- """
- State of the issue.
- """
- state: IssueState!
-
- """
- Indicates whether an issue is published to the status page.
- """
- statusPagePublishedIncident: Boolean
-
- """
- Indicates the currently logged in user is subscribed to the issue.
- """
- subscribed: Boolean!
-
- """
- Task completion status of the issue.
- """
- taskCompletionStatus: TaskCompletionStatus!
-
- """
- Time estimate of the issue.
- """
- timeEstimate: Int!
-
- """
- Title of the issue.
- """
- title: String!
-
- """
- The GitLab Flavored Markdown rendering of `title`
- """
- titleHtml: String
-
- """
- Total time reported as spent on the issue.
- """
- totalTimeSpent: Int!
-
- """
- Type of the issue.
- """
- type: IssueType
-
- """
- Timestamp of when the issue was last updated.
- """
- updatedAt: Time!
-
- """
- User that last updated the issue.
- """
- updatedBy: User
-
- """
- Number of upvotes the issue has received.
- """
- upvotes: Int!
-
- """
- Number of user discussions in the issue.
- """
- userDiscussionsCount: Int!
-
- """
- Number of user notes of the issue.
- """
- userNotesCount: Int!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: IssuePermissions!
-
- """
- Web path of the issue.
- """
- webPath: String!
-
- """
- Web URL of the issue.
- """
- webUrl: String!
-
- """
- Weight of the issue.
- """
- weight: Int
-}
-
-"""
-The connection type for EpicIssue.
-"""
-type EpicIssueConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [EpicIssueEdge]
-
- """
- A list of nodes.
- """
- nodes: [EpicIssue]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-
- """
- Total weight of issues collection.
- """
- weight: Int!
-}
-
-"""
-An edge in a connection.
-"""
-type EpicIssueEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: EpicIssue
-}
-
-"""
-Represents an epic board list
-"""
-type EpicList {
- """
- List epics.
- """
- epics(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EpicConnection
-
- """
- Global ID of the board list.
- """
- id: BoardsEpicListID!
-
- """
- Label of the list.
- """
- label: Label
-
- """
- Type of the list.
- """
- listType: String!
-
- """
- Position of the list within the board.
- """
- position: Int
-
- """
- Title of the list.
- """
- title: String!
-}
-
-"""
-The connection type for EpicList.
-"""
-type EpicListConnection {
- """
- A list of edges.
- """
- edges: [EpicListEdge]
-
- """
- A list of nodes.
- """
- nodes: [EpicList]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type EpicListEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: EpicList
-}
-
-"""
-Check permissions for the current user on an epic
-"""
-type EpicPermissions {
- """
- Indicates the user can perform `admin_epic` on this resource
- """
- adminEpic: Boolean!
-
- """
- Indicates the user can perform `award_emoji` on this resource
- """
- awardEmoji: Boolean!
-
- """
- Indicates the user can perform `create_epic` on this resource
- """
- createEpic: Boolean!
-
- """
- Indicates the user can perform `create_note` on this resource
- """
- createNote: Boolean!
-
- """
- Indicates the user can perform `destroy_epic` on this resource
- """
- destroyEpic: Boolean!
-
- """
- Indicates the user can perform `read_epic` on this resource
- """
- readEpic: Boolean!
-
- """
- Indicates the user can perform `read_epic_iid` on this resource
- """
- readEpicIid: Boolean!
-
- """
- Indicates the user can perform `update_epic` on this resource
- """
- updateEpic: Boolean!
-}
-
-"""
-Autogenerated input type of EpicSetSubscription
-"""
-input EpicSetSubscriptionInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The group the epic to mutate belongs to.
- """
- groupPath: ID!
-
- """
- The IID of the epic to mutate.
- """
- iid: ID!
-
- """
- The desired state of the subscription.
- """
- subscribedState: Boolean!
-}
-
-"""
-Autogenerated return type of EpicSetSubscription
-"""
-type EpicSetSubscriptionPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The epic after mutation.
- """
- epic: Epic
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Roadmap sort values
-"""
-enum EpicSort {
- """
- End date at ascending order
- """
- end_date_asc
-
- """
- End date at descending order
- """
- end_date_desc
-
- """
- Start date at ascending order
- """
- start_date_asc
-
- """
- Start date at descending order
- """
- start_date_desc
-}
-
-"""
-State of an epic
-"""
-enum EpicState {
- all
- closed
- opened
-}
-
-"""
-State event of an epic
-"""
-enum EpicStateEvent {
- """
- Close the epic
- """
- CLOSE
-
- """
- Reopen the epic
- """
- REOPEN
-}
-
-"""
-A node of an epic tree.
-"""
-input EpicTreeNodeFieldsInputType {
- """
- The ID of the epic_issue or issue that the actual epic or issue is switched with.
- """
- adjacentReferenceId: EpicTreeSortingID
-
- """
- The ID of the epic_issue or epic that is being moved.
- """
- id: EpicTreeSortingID!
-
- """
- ID of the new parent epic.
- """
- newParentId: EpicID
-
- """
- The type of the switch, after or before allowed.
- """
- relativePosition: MoveType
-}
-
-"""
-Autogenerated input type of EpicTreeReorder
-"""
-input EpicTreeReorderInput {
- """
- The ID of the base epic of the tree.
- """
- baseEpicId: EpicID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Parameters for updating the tree positions.
- """
- moved: EpicTreeNodeFieldsInputType!
-}
-
-"""
-Autogenerated return type of EpicTreeReorder
-"""
-type EpicTreeReorderPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Identifier of EpicTreeSorting.
-"""
-scalar EpicTreeSortingID
-
-"""
-Epic ID wildcard values
-"""
-enum EpicWildcardId {
- """
- Any epic is assigned
- """
- ANY
-
- """
- No epic is assigned
- """
- NONE
-}
-
-"""
-Representing an event
-"""
-type Event {
- """
- Action of the event.
- """
- action: EventAction!
-
- """
- Author of this event.
- """
- author: User!
-
- """
- When this event was created.
- """
- createdAt: Time!
-
- """
- ID of the event.
- """
- id: ID!
-
- """
- When this event was updated.
- """
- updatedAt: Time!
-}
-
-"""
-Event action
-"""
-enum EventAction {
- """
- Approved action
- """
- APPROVED
-
- """
- Archived action
- """
- ARCHIVED
-
- """
- Closed action
- """
- CLOSED
-
- """
- Commented action
- """
- COMMENTED
-
- """
- Created action
- """
- CREATED
-
- """
- Destroyed action
- """
- DESTROYED
-
- """
- Expired action
- """
- EXPIRED
-
- """
- Joined action
- """
- JOINED
-
- """
- Left action
- """
- LEFT
-
- """
- Merged action
- """
- MERGED
-
- """
- Pushed action
- """
- PUSHED
-
- """
- Reopened action
- """
- REOPENED
-
- """
- Updated action
- """
- UPDATED
-}
-
-"""
-The connection type for Event.
-"""
-type EventConnection {
- """
- A list of edges.
- """
- edges: [EventEdge]
-
- """
- A list of nodes.
- """
- nodes: [Event]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type EventEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Event
-}
-
-interface Eventable {
- """
- A list of events associated with the object.
- """
- events(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EventConnection
-}
-
-"""
-Autogenerated input type of ExportRequirements
-"""
-input ExportRequirementsInput {
- """
- Filter requirements by author username.
- """
- authorUsername: [String!]
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full project path the requirements are associated with.
- """
- projectPath: ID!
-
- """
- Search query for requirement title.
- """
- search: String
-
- """
- List of selected requirements fields to be exported.
- """
- selectedFields: [String!]
-
- """
- List requirements by sort order.
- """
- sort: Sort
-
- """
- Filter requirements by state.
- """
- state: RequirementState
-}
-
-"""
-Autogenerated return type of ExportRequirements
-"""
-type ExportRequirementsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Represents an external issue
-"""
-type ExternalIssue {
- """
- Timestamp of when the issue was created.
- """
- createdAt: Time
-
- """
- Type of external tracker.
- """
- externalTracker: String
-
- """
- Relative reference of the issue in the external tracker.
- """
- relativeReference: String
-
- """
- Status of the issue in the external tracker.
- """
- status: String
-
- """
- Title of the issue in the external tracker.
- """
- title: String
-
- """
- Timestamp of when the issue was updated.
- """
- updatedAt: Time
-
- """
- URL to the issue in the external tracker.
- """
- webUrl: String
-}
-
-type GeoNode {
- """
- The maximum concurrency of container repository sync for this secondary node.
- """
- containerRepositoriesMaxCapacity: Int
-
- """
- Indicates whether this Geo node is enabled.
- """
- enabled: Boolean
-
- """
- The maximum concurrency of LFS/attachment backfill for this secondary node.
- """
- filesMaxCapacity: Int
-
- """
- ID of this GeoNode.
- """
- id: ID!
-
- """
- The URL defined on the primary node that secondary nodes should use to contact it.
- """
- internalUrl: String
-
- """
- Find merge request diff registries on this Geo node.
- """
- mergeRequestDiffRegistries(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters registries by their ID.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): MergeRequestDiffRegistryConnection
-
- """
- The interval (in days) in which the repository verification is valid. Once expired, it will be reverified.
- """
- minimumReverificationInterval: Int
-
- """
- The unique identifier for this Geo node.
- """
- name: String
-
- """
- Package file registries of the GeoNode.
- """
- packageFileRegistries(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters registries by their ID.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PackageFileRegistryConnection
-
- """
- Indicates whether this Geo node is the primary.
- """
- primary: Boolean
-
- """
- The maximum concurrency of repository backfill for this secondary node.
- """
- reposMaxCapacity: Int
-
- """
- The namespaces that should be synced, if `selective_sync_type` == `namespaces`.
- """
- selectiveSyncNamespaces(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NamespaceConnection
-
- """
- The repository storages whose projects should be synced, if `selective_sync_type` == `shards`.
- """
- selectiveSyncShards: [String!]
-
- """
- Indicates if syncing is limited to only specific groups, or shards.
- """
- selectiveSyncType: String
-
- """
- Find snippet repository registries on this Geo node.
- """
- snippetRepositoryRegistries(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters registries by their ID.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SnippetRepositoryRegistryConnection
-
- """
- Indicates if this secondary node will replicate blobs in Object Storage.
- """
- syncObjectStorage: Boolean
-
- """
- Find terraform state version registries on this Geo node.
- """
- terraformStateVersionRegistries(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filters registries by their ID.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): TerraformStateVersionRegistryConnection
-
- """
- The user-facing URL for this Geo node.
- """
- url: String
-
- """
- The maximum concurrency of repository verification for this secondary node.
- """
- verificationMaxCapacity: Int
-}
-
-"""
-Identifier of Gitlab::ErrorTracking::DetailedError.
-"""
-scalar GitlabErrorTrackingDetailedErrorID
-
-"""
-Autogenerated input type of GitlabSubscriptionActivate
-"""
-input GitlabSubscriptionActivateInput {
- """
- Activation code received after purchasing a GitLab subscription.
- """
- activationCode: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-}
-
-"""
-Autogenerated return type of GitlabSubscriptionActivate
-"""
-type GitlabSubscriptionActivatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-type GrafanaIntegration {
- """
- Timestamp of the issue's creation.
- """
- createdAt: Time!
-
- """
- Indicates whether Grafana integration is enabled.
- """
- enabled: Boolean!
-
- """
- URL for the Grafana host for the Grafana integration.
- """
- grafanaUrl: String!
-
- """
- Internal ID of the Grafana integration.
- """
- id: ID!
-
- """
- Timestamp of the issue's last activity.
- """
- updatedAt: Time!
-}
-
-type Group {
- """
- Size limit for repositories in the namespace in bytes.
- """
- actualRepositorySizeLimit: Float
-
- """
- Additional storage purchased for the root namespace in bytes.
- """
- additionalPurchasedStorageSize: Float
-
- """
- Indicates whether Auto DevOps is enabled for all projects within this group.
- """
- autoDevopsEnabled: Boolean
-
- """
- Avatar URL of the group.
- """
- avatarUrl: String
-
- """
- A single board of the group.
- """
- board(
- """
- The board's ID.
- """
- id: BoardID!
- ): Board
-
- """
- Boards of the group.
- """
- boards(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Find a board by its ID.
- """
- id: BoardID
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): BoardConnection
-
- """
- Represents the code coverage activity for this group.
- """
- codeCoverageActivities(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch code coverage activity (maximum time window is set to 90 days).
- """
- startDate: Date!
- ): CodeCoverageActivityConnection
-
- """
- Compliance frameworks available to projects in this namespace. Available only
- when feature flag `ff_custom_compliance_frameworks` is enabled.
- """
- complianceFrameworks(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Global ID of a specific compliance framework to return.
- """
- id: ComplianceManagementFrameworkID
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ComplianceFrameworkConnection
-
- """
- Container repositories of the group.
- """
- containerRepositories(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter the container repositories by their name.
- """
- name: String
-
- """
- Sort container repositories by this criteria.
- """
- sort: ContainerRepositorySort = created_desc
- ): ContainerRepositoryConnection
-
- """
- Number of container repositories in the group.
- """
- containerRepositoriesCount: Int!
-
- """
- Includes at least one project where the repository size exceeds the limit.
- """
- containsLockedProjects: Boolean!
-
- """
- Custom emoji within this namespace. Available only when feature flag `custom_emoji` is enabled.
- """
- customEmoji(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CustomEmojiConnection
-
- """
- Description of the namespace.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Indicates if a group has email notifications disabled.
- """
- emailsDisabled: Boolean
-
- """
- Find a single epic.
- """
- epic(
- """
- Filter epics by author.
- """
- authorUsername: String
-
- """
- Filter epics by given confidentiality.
- """
- confidential: Boolean
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- IID of the epic, e.g., "1".
- """
- iid: ID
-
- """
- Filter epics by IID for autocomplete.
- """
- iidStartsWith: String
-
- """
- List of IIDs of epics, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- Include epics from descendant groups.
- """
- includeDescendantGroups: Boolean = true
-
- """
- Filter epics by labels.
- """
- labelName: [String!]
-
- """
- Filter epics by milestone title, computed from epic's issues.
- """
- milestoneTitle: String
-
- """
- Search query for epic title or description.
- """
- search: String
-
- """
- List epics by sort order.
- """
- sort: EpicSort
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter epics by state.
- """
- state: EpicState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
- ): Epic
-
- """
- Find a single epic board.
- """
- epicBoard(
- """
- Find an epic board by ID.
- """
- id: BoardsEpicBoardID!
- ): EpicBoard
-
- """
- Find epic boards.
- """
- epicBoards(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): EpicBoardConnection
-
- """
- Find epics.
- """
- epics(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Filter epics by author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filter epics by given confidentiality.
- """
- confidential: Boolean
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the epic, e.g., "1".
- """
- iid: ID
-
- """
- Filter epics by IID for autocomplete.
- """
- iidStartsWith: String
-
- """
- List of IIDs of epics, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- Include epics from descendant groups.
- """
- includeDescendantGroups: Boolean = true
-
- """
- Filter epics by labels.
- """
- labelName: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter epics by milestone title, computed from epic's issues.
- """
- milestoneTitle: String
-
- """
- Search query for epic title or description.
- """
- search: String
-
- """
- List epics by sort order.
- """
- sort: EpicSort
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter epics by state.
- """
- state: EpicState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
- ): EpicConnection
-
- """
- Indicates if Epics are enabled for namespace
- """
- epicsEnabled: Boolean
-
- """
- Full name of the namespace.
- """
- fullName: String!
-
- """
- Full path of the namespace.
- """
- fullPath: ID!
-
- """
- A membership of a user within this group.
- """
- groupMembers(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter members by the given member relations.
- """
- relations: [GroupMemberRelation!] = [DIRECT, INHERITED]
-
- """
- Search query.
- """
- search: String
- ): GroupMemberConnection
-
- """
- Indicates if Group timelogs are enabled for namespace
- """
- groupTimelogsEnabled: Boolean
-
- """
- ID of the namespace.
- """
- id: ID!
-
- """
- Status of the temporary storage increase.
- """
- isTemporaryStorageIncreaseEnabled: Boolean!
-
- """
- Issues for projects in this group.
- """
- issues(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- ID of a user assigned to the issues, "none" and "any" values are supported.
- """
- assigneeId: String
-
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Usernames of users assigned to the issue.
- """
- assigneeUsernames: [String!]
-
- """
- Username of the author of the issue.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Issues closed after this date.
- """
- closedAfter: Time
-
- """
- Issues closed before this date.
- """
- closedBefore: Time
-
- """
- Issues created after this date.
- """
- createdAfter: Time
-
- """
- Issues created before this date.
- """
- createdBefore: Time
-
- """
- ID of an epic associated with the issues, "none" and "any" values are supported.
- """
- epicId: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the issue. For example, "1".
- """
- iid: String
-
- """
- List of IIDs of issues. For example, [1, 2].
- """
- iids: [String!]
-
- """
- Include issues belonging to subgroups
- """
- includeSubgroups: Boolean = false
-
- """
- Iterations applied to the issue.
- """
- iterationId: [ID]
-
- """
- Labels applied to this issue.
- """
- labelName: [String]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Milestone applied to this issue.
- """
- milestoneTitle: [String]
-
- """
- Search query for issue title or description.
- """
- search: String
-
- """
- Sort issues by this criteria.
- """
- sort: IssueSort = created_desc
-
- """
- Current state of this issue.
- """
- state: IssuableState
-
- """
- Filter issues by the given issue types.
- """
- types: [IssueType!]
-
- """
- Issues updated after this date.
- """
- updatedAfter: Time
-
- """
- Issues updated before this date.
- """
- updatedBefore: Time
- ): IssueConnection
-
- """
- Find iterations.
- """
- iterations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Global ID of the Iteration to look up.
- """
- id: ID
-
- """
- Internal ID of the Iteration to look up.
- """
- iid: ID
-
- """
- Whether to include ancestor iterations. Defaults to true.
- """
- includeAncestors: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter iterations by state.
- """
- state: IterationState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
-
- """
- Fuzzy search by title.
- """
- title: String
- ): IterationConnection
-
- """
- A label available on this group.
- """
- label(
- """
- Title of the label.
- """
- title: String!
- ): Label
-
- """
- Labels available on this group.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Include labels from ancestor groups.
- """
- includeAncestorGroups: Boolean = false
-
- """
- Include labels from descendant groups.
- """
- includeDescendantGroups: Boolean = false
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Include only group level labels.
- """
- onlyGroupLabels: Boolean = false
-
- """
- A search term to find labels with.
- """
- searchTerm: String
- ): LabelConnection
-
- """
- Indicates if Large File Storage (LFS) is enabled for namespace.
- """
- lfsEnabled: Boolean
-
- """
- Indicates if a group is disabled from getting mentioned.
- """
- mentionsDisabled: Boolean
-
- """
- Merge requests for projects in this group.
- """
- mergeRequests(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of the assignee.
- """
- assigneeUsername: String
-
- """
- Username of the author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of IIDs of merge requests, for example `[1, 2]`.
- """
- iids: [String!]
-
- """
- Include merge requests belonging to subgroups
- """
- includeSubgroups: Boolean = false
-
- """
- Array of label names. All resolved merge requests will have all of these labels.
- """
- labels: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Merge requests merged after this date.
- """
- mergedAfter: Time
-
- """
- Merge requests merged before this date.
- """
- mergedBefore: Time
-
- """
- Title of the milestone.
- """
- milestoneTitle: String
-
- """
- Sort merge requests by this criteria.
- """
- sort: MergeRequestSort = created_desc
-
- """
- Array of source branch names. All resolved merge requests will have one of these branches as their source.
- """
- sourceBranches: [String!]
-
- """
- A merge request state. If provided, all resolved merge requests will have this state.
- """
- state: MergeRequestState
-
- """
- Array of target branch names. All resolved merge requests will have one of these branches as their target.
- """
- targetBranches: [String!]
- ): MergeRequestConnection
-
- """
- Milestones of the group.
- """
- milestones(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- A date that the milestone contains.
- """
- containingDate: Time
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of global milestone IDs, e.g., "gid://gitlab/Milestone/1".
- """
- ids: [ID!]
-
- """
- Also return milestones in all subgroups and subprojects.
- """
- includeDescendants: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- A search string for the title.
- """
- searchTitle: String
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter milestones by state.
- """
- state: MilestoneStateEnum
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
-
- """
- The title of the milestone.
- """
- title: String
- ): MilestoneConnection
-
- """
- Name of the namespace.
- """
- name: String!
-
- """
- The package settings for the namespace.
- """
- packageSettings: PackageSettings
-
- """
- Parent group.
- """
- parent: Group
-
- """
- Path of the namespace.
- """
- path: String!
-
- """
- The permission level required to create projects in the group.
- """
- projectCreationLevel: String
-
- """
- Projects within this namespace.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns only the projects which have vulnerabilities.
- """
- hasVulnerabilities: Boolean = false
-
- """
- Include also subgroup projects.
- """
- includeSubgroups: Boolean = false
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Search project with most similar names or paths.
- """
- search: String = null
-
- """
- Sort projects by this criteria.
- """
- sort: NamespaceProjectSort = null
- ): ProjectConnection!
-
- """
- Number of projects in the root namespace where the repository size exceeds the limit.
- """
- repositorySizeExcessProjectCount: Int!
-
- """
- Indicates if users can request access to namespace.
- """
- requestAccessEnabled: Boolean
-
- """
- Indicates if all users in this group are required to set up two-factor authentication.
- """
- requireTwoFactorAuthentication: Boolean
-
- """
- Aggregated storage statistics of the namespace. Only available for root namespaces.
- """
- rootStorageStatistics: RootStorageStatistics
-
- """
- Indicates if sharing a project with another group within this group is prevented.
- """
- shareWithGroupLock: Boolean
-
- """
- Group statistics.
- """
- stats: GroupStats
-
- """
- Total storage limit of the root namespace in bytes.
- """
- storageSizeLimit: Float
-
- """
- The permission level required to create subgroups within the group.
- """
- subgroupCreationLevel: String
-
- """
- Date until the temporary storage increase is active.
- """
- temporaryStorageIncreaseEndsOn: Time
-
- """
- Time logged in issues by group members.
- """
- timelogs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- List time logs within a date range where the logged date is equal to or before endDate.
- """
- endDate: Time
-
- """
- List time-logs within a time range where the logged time is equal to or before endTime.
- """
- endTime: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- List time logs within a date range where the logged date is equal to or after startDate.
- """
- startDate: Time
-
- """
- List time-logs within a time range where the logged time is equal to or after startTime.
- """
- startTime: Time
- ): TimelogConnection!
-
- """
- Total repository size of all projects in the root namespace in bytes.
- """
- totalRepositorySize: Float
-
- """
- Total excess repository size of all projects in the root namespace in bytes.
- """
- totalRepositorySizeExcess: Float
-
- """
- Time before two-factor authentication is enforced.
- """
- twoFactorGracePeriod: Int
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: GroupPermissions!
-
- """
- Visibility of the namespace.
- """
- visibility: String
-
- """
- Vulnerabilities reported on the projects in the group and its subgroups.
- """
- vulnerabilities(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns only the vulnerabilities which have linked issues.
- """
- hasIssues: Boolean
-
- """
- Returns only the vulnerabilities which have been resolved on default branch.
- """
- hasResolution: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by VulnerabilityScanner.externalId.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- List vulnerabilities by sort order.
- """
- sort: VulnerabilitySort = severity_desc
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilityConnection
-
- """
- Number of vulnerabilities per day for the projects in the group and its subgroups.
- """
- vulnerabilitiesCountByDay(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Last day for which to fetch vulnerability history.
- """
- endDate: ISO8601Date!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch vulnerability history.
- """
- startDate: ISO8601Date!
- ): VulnerabilitiesCountByDayConnection
-
- """
- Number of vulnerabilities per severity level, per day, for the projects in the
- group and its subgroups. Deprecated in 13.3: Use `vulnerabilitiesCountByDay`.
- """
- vulnerabilitiesCountByDayAndSeverity(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Last day for which to fetch vulnerability history.
- """
- endDate: ISO8601Date!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch vulnerability history.
- """
- startDate: ISO8601Date!
- ): VulnerabilitiesCountByDayAndSeverityConnection @deprecated(reason: "Use `vulnerabilitiesCountByDay`. Deprecated in 13.3.")
-
- """
- Represents vulnerable project counts for each grade.
- """
- vulnerabilityGrades(
- """
- Include grades belonging to subgroups.
- """
- includeSubgroups: Boolean = false
- ): [VulnerableProjectsByGrade!]!
-
- """
- Vulnerability scanners reported on the project vulnerabilities of the group and its subgroups.
- """
- vulnerabilityScanners(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): VulnerabilityScannerConnection
-
- """
- Counts for each vulnerability severity in the group and its subgroups.
- """
- vulnerabilitySeveritiesCount(
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by scanner.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilitySeveritiesCount
-
- """
- Web URL of the group.
- """
- webUrl: String!
-}
-
-"""
-Identifier of Group.
-"""
-scalar GroupID
-
-"""
-Represents a Group Membership
-"""
-type GroupMember implements MemberInterface {
- """
- GitLab::Access level.
- """
- accessLevel: AccessLevel
-
- """
- Date and time the membership was created.
- """
- createdAt: Time
-
- """
- User that authorized membership.
- """
- createdBy: User
-
- """
- Date and time the membership expires.
- """
- expiresAt: Time
-
- """
- Group that a User is a member of.
- """
- group: Group
-
- """
- ID of the member.
- """
- id: ID!
-
- """
- Date and time the membership was last updated.
- """
- updatedAt: Time
-
- """
- User that is associated with the member object.
- """
- user: User!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: GroupPermissions!
-}
-
-"""
-The connection type for GroupMember.
-"""
-type GroupMemberConnection {
- """
- A list of edges.
- """
- edges: [GroupMemberEdge]
-
- """
- A list of nodes.
- """
- nodes: [GroupMember]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type GroupMemberEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: GroupMember
-}
-
-"""
-Group member relation
-"""
-enum GroupMemberRelation {
- """
- Descendants members
- """
- DESCENDANTS
-
- """
- Direct members
- """
- DIRECT
-
- """
- Inherited members
- """
- INHERITED
-}
-
-type GroupPermissions {
- """
- Indicates the user can perform `read_group` on this resource
- """
- readGroup: Boolean!
-}
-
-"""
-Contains release-related statistics about a group
-"""
-type GroupReleaseStats {
- """
- Total number of releases in all descendant projects of the group. Will always
- return `null` if `group_level_release_statistics` feature flag is disabled
- """
- releasesCount: Int
-
- """
- Percentage of the group's descendant projects that have at least one release.
- Will always return `null` if `group_level_release_statistics` feature flag is disabled
- """
- releasesPercentage: Int
-}
-
-"""
-Contains statistics about a group
-"""
-type GroupStats {
- """
- Statistics related to releases within the group.
- """
- releaseStats: GroupReleaseStats
-}
-
-"""
-Health status of an issue or epic
-"""
-enum HealthStatus {
- atRisk
- needsAttention
- onTrack
-}
-
-"""
-Autogenerated input type of HttpIntegrationCreate
-"""
-input HttpIntegrationCreateInput {
- """
- Whether the integration is receiving alerts.
- """
- active: Boolean!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The name of the integration.
- """
- name: String!
-
- """
- The custom mapping of GitLab alert attributes to fields from the payload_example.
- """
- payloadAttributeMappings: [AlertManagementPayloadAlertFieldInput!]
-
- """
- The example of an alert payload.
- """
- payloadExample: JsonString
-
- """
- The project to create the integration in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of HttpIntegrationCreate
-"""
-type HttpIntegrationCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The HTTP integration.
- """
- integration: AlertManagementHttpIntegration
-}
-
-"""
-Autogenerated input type of HttpIntegrationDestroy
-"""
-input HttpIntegrationDestroyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the integration to remove.
- """
- id: AlertManagementHttpIntegrationID!
-}
-
-"""
-Autogenerated return type of HttpIntegrationDestroy
-"""
-type HttpIntegrationDestroyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The HTTP integration.
- """
- integration: AlertManagementHttpIntegration
-}
-
-"""
-Autogenerated input type of HttpIntegrationResetToken
-"""
-input HttpIntegrationResetTokenInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the integration to mutate.
- """
- id: AlertManagementHttpIntegrationID!
-}
-
-"""
-Autogenerated return type of HttpIntegrationResetToken
-"""
-type HttpIntegrationResetTokenPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The HTTP integration.
- """
- integration: AlertManagementHttpIntegration
-}
-
-"""
-Autogenerated input type of HttpIntegrationUpdate
-"""
-input HttpIntegrationUpdateInput {
- """
- Whether the integration is receiving alerts.
- """
- active: Boolean
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the integration to mutate.
- """
- id: AlertManagementHttpIntegrationID!
-
- """
- The name of the integration.
- """
- name: String
-
- """
- The custom mapping of GitLab alert attributes to fields from the payload_example.
- """
- payloadAttributeMappings: [AlertManagementPayloadAlertFieldInput!]
-
- """
- The example of an alert payload.
- """
- payloadExample: JsonString
-}
-
-"""
-Autogenerated return type of HttpIntegrationUpdate
-"""
-type HttpIntegrationUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The HTTP integration.
- """
- integration: AlertManagementHttpIntegration
-}
-
-"""
-An ISO 8601-encoded date
-"""
-scalar ISO8601Date
-
-"""
-Identifier of IncidentManagement::OncallParticipant.
-"""
-scalar IncidentManagementOncallParticipantID
-
-"""
-Describes an incident management on-call rotation
-"""
-type IncidentManagementOncallRotation {
- """
- ID of the on-call rotation.
- """
- id: IncidentManagementOncallRotationID!
-
- """
- Length of the on-call schedule, in the units specified by lengthUnit.
- """
- length: Int
-
- """
- Unit of the on-call rotation length.
- """
- lengthUnit: OncallRotationUnitEnum
-
- """
- Name of the on-call rotation.
- """
- name: String!
-
- """
- Participants of the on-call rotation.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): OncallParticipantTypeConnection
-
- """
- Blocks of time for which a participant is on-call within a given time frame. Time frame cannot exceed one month.
- """
- shifts(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- End of timeframe to include shifts for. Cannot exceed one month after start.
- """
- endTime: Time!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Start of timeframe to include shifts for.
- """
- startTime: Time!
- ): IncidentManagementOncallShiftConnection
-
- """
- Start date of the on-call rotation.
- """
- startsAt: Time
-}
-
-"""
-The connection type for IncidentManagementOncallRotation.
-"""
-type IncidentManagementOncallRotationConnection {
- """
- A list of edges.
- """
- edges: [IncidentManagementOncallRotationEdge]
-
- """
- A list of nodes.
- """
- nodes: [IncidentManagementOncallRotation]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type IncidentManagementOncallRotationEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: IncidentManagementOncallRotation
-}
-
-"""
-Identifier of IncidentManagement::OncallRotation.
-"""
-scalar IncidentManagementOncallRotationID
-
-"""
-Describes an incident management on-call schedule
-"""
-type IncidentManagementOncallSchedule {
- """
- Description of the on-call schedule.
- """
- description: String
-
- """
- Internal ID of the on-call schedule.
- """
- iid: ID!
-
- """
- Name of the on-call schedule.
- """
- name: String!
-
- """
- On-call rotations for the on-call schedule.
- """
- rotations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): IncidentManagementOncallRotationConnection!
-
- """
- Time zone of the on-call schedule.
- """
- timezone: String!
-}
-
-"""
-The connection type for IncidentManagementOncallSchedule.
-"""
-type IncidentManagementOncallScheduleConnection {
- """
- A list of edges.
- """
- edges: [IncidentManagementOncallScheduleEdge]
-
- """
- A list of nodes.
- """
- nodes: [IncidentManagementOncallSchedule]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type IncidentManagementOncallScheduleEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: IncidentManagementOncallSchedule
-}
-
-"""
-A block of time for which a participant is on-call.
-"""
-type IncidentManagementOncallShift {
- """
- End time of the on-call shift.
- """
- endsAt: Time
-
- """
- Participant assigned to the on-call shift.
- """
- participant: OncallParticipantType
-
- """
- Start time of the on-call shift.
- """
- startsAt: Time
-}
-
-"""
-The connection type for IncidentManagementOncallShift.
-"""
-type IncidentManagementOncallShiftConnection {
- """
- A list of edges.
- """
- edges: [IncidentManagementOncallShiftEdge]
-
- """
- A list of nodes.
- """
- nodes: [IncidentManagementOncallShift]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type IncidentManagementOncallShiftEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: IncidentManagementOncallShift
-}
-
-type InstanceSecurityDashboard {
- """
- Projects selected in Instance Security Dashboard.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ProjectConnection!
-
- """
- Represents vulnerable project counts for each grade.
- """
- vulnerabilityGrades: [VulnerableProjectsByGrade!]!
-
- """
- Vulnerability scanners reported on the vulnerabilities from projects selected in Instance Security Dashboard.
- """
- vulnerabilityScanners(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): VulnerabilityScannerConnection
-
- """
- Counts for each vulnerability severity from projects selected in Instance Security Dashboard.
- """
- vulnerabilitySeveritiesCount(
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by scanner.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilitySeveritiesCount
-}
-
-"""
-Represents a recorded measurement (object count) for the Admins
-"""
-type InstanceStatisticsMeasurement {
- """
- Object count.
- """
- count: Int!
-
- """
- The type of objects being measured.
- """
- identifier: MeasurementIdentifier!
-
- """
- The time the measurement was recorded.
- """
- recordedAt: Time
-}
-
-"""
-The connection type for InstanceStatisticsMeasurement.
-"""
-type InstanceStatisticsMeasurementConnection {
- """
- A list of edges.
- """
- edges: [InstanceStatisticsMeasurementEdge]
-
- """
- A list of nodes.
- """
- nodes: [InstanceStatisticsMeasurement]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type InstanceStatisticsMeasurementEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: InstanceStatisticsMeasurement
-}
-
-"""
-Incident severity
-"""
-enum IssuableSeverity {
- """
- Critical severity
- """
- CRITICAL
-
- """
- High severity
- """
- HIGH
-
- """
- Low severity
- """
- LOW
-
- """
- Medium severity
- """
- MEDIUM
-
- """
- Unknown severity
- """
- UNKNOWN
-}
-
-"""
-State of a GitLab issue or merge request
-"""
-enum IssuableState {
- all
- closed
- locked
- opened
-}
-
-type Issue implements CurrentUserTodos & Noteable {
- """
- Alert associated to this issue.
- """
- alertManagementAlert: AlertManagementAlert
-
- """
- Assignees of the issue.
- """
- assignees(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- User that created the issue.
- """
- author: User!
-
- """
- Indicates the issue is blocked.
- """
- blocked: Boolean!
-
- """
- Count of issues blocking this issue.
- """
- blockedByCount: Int
-
- """
- Timestamp of when the issue was closed.
- """
- closedAt: Time
-
- """
- Indicates the issue is confidential.
- """
- confidential: Boolean!
-
- """
- User specific email address for the issue.
- """
- createNoteEmail: String
-
- """
- Timestamp of when the issue was created.
- """
- createdAt: Time!
-
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- Description of the issue.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Collection of design images associated with this issue.
- """
- designCollection: DesignCollection
-
- """
- Indicates discussion is locked on the issue.
- """
- discussionLocked: Boolean!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Number of downvotes the issue has received.
- """
- downvotes: Int!
-
- """
- Due date of the issue.
- """
- dueDate: Time
-
- """
- Indicates if a project has email notifications disabled: `true` if email notifications are disabled.
- """
- emailsDisabled: Boolean!
-
- """
- Epic to which this issue belongs.
- """
- epic: Epic
-
- """
- Current health status.
- """
- healthStatus: HealthStatus
-
- """
- Human-readable time estimate of the issue.
- """
- humanTimeEstimate: String
-
- """
- Human-readable total time reported as spent on the issue.
- """
- humanTotalTimeSpent: String
-
- """
- ID of the issue.
- """
- id: ID!
-
- """
- Internal ID of the issue.
- """
- iid: ID!
-
- """
- Iteration of the issue.
- """
- iteration: Iteration
-
- """
- Labels of the issue.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- Metric images associated to the issue.
- """
- metricImages: [MetricImage!]
-
- """
- Milestone of the issue.
- """
- milestone: Milestone
-
- """
- Indicates if issue got moved from other project.
- """
- moved: Boolean
-
- """
- Updated Issue after it got moved to another project.
- """
- movedTo: Issue
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- List of participants in the issue.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Internal reference of the issue. Returned in shortened format by default.
- """
- reference(
- """
- Boolean option specifying whether the reference should be returned in full.
- """
- full: Boolean = false
- ): String!
-
- """
- Relative position of the issue (used for positioning in epic tree and issue boards).
- """
- relativePosition: Int
-
- """
- Severity level of the incident.
- """
- severity: IssuableSeverity
-
- """
- Timestamp of when the issue SLA expires.
- """
- slaDueAt: Time
-
- """
- State of the issue.
- """
- state: IssueState!
-
- """
- Indicates whether an issue is published to the status page.
- """
- statusPagePublishedIncident: Boolean
-
- """
- Indicates the currently logged in user is subscribed to the issue.
- """
- subscribed: Boolean!
-
- """
- Task completion status of the issue.
- """
- taskCompletionStatus: TaskCompletionStatus!
-
- """
- Time estimate of the issue.
- """
- timeEstimate: Int!
-
- """
- Title of the issue.
- """
- title: String!
-
- """
- The GitLab Flavored Markdown rendering of `title`
- """
- titleHtml: String
-
- """
- Total time reported as spent on the issue.
- """
- totalTimeSpent: Int!
-
- """
- Type of the issue.
- """
- type: IssueType
-
- """
- Timestamp of when the issue was last updated.
- """
- updatedAt: Time!
-
- """
- User that last updated the issue.
- """
- updatedBy: User
-
- """
- Number of upvotes the issue has received.
- """
- upvotes: Int!
-
- """
- Number of user discussions in the issue.
- """
- userDiscussionsCount: Int!
-
- """
- Number of user notes of the issue.
- """
- userNotesCount: Int!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: IssuePermissions!
-
- """
- Web path of the issue.
- """
- webPath: String!
-
- """
- Web URL of the issue.
- """
- webUrl: String!
-
- """
- Weight of the issue.
- """
- weight: Int
-}
-
-"""
-The connection type for Issue.
-"""
-type IssueConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [IssueEdge]
-
- """
- A list of nodes.
- """
- nodes: [Issue]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-
- """
- Total weight of issues collection.
- """
- weight: Int!
-}
-
-"""
-An edge in a connection.
-"""
-type IssueEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Issue
-}
-
-"""
-Identifier of Issue.
-"""
-scalar IssueID
-
-"""
-Autogenerated input type of IssueMove
-"""
-input IssueMoveInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- The project to move the issue to.
- """
- targetProjectPath: ID!
-}
-
-"""
-Autogenerated input type of IssueMoveList
-"""
-input IssueMoveListInput {
- """
- Global ID of the board that the issue is in.
- """
- boardId: ID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the parent epic. NULL when removing the association.
- """
- epicId: EpicID
-
- """
- ID of the board list that the issue will be moved from.
- """
- fromListId: ID
-
- """
- IID of the issue to mutate.
- """
- iid: String!
-
- """
- ID of issue that should be placed after the current issue.
- """
- moveAfterId: ID
-
- """
- ID of issue that should be placed before the current issue.
- """
- moveBeforeId: ID
-
- """
- Project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- ID of the board list that the issue will be moved to.
- """
- toListId: ID
-}
-
-"""
-Autogenerated return type of IssueMoveList
-"""
-type IssueMoveListPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated return type of IssueMove
-"""
-type IssueMovePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Check permissions for the current user on a issue
-"""
-type IssuePermissions {
- """
- Indicates the user can perform `admin_issue` on this resource
- """
- adminIssue: Boolean!
-
- """
- Indicates the user can perform `create_design` on this resource
- """
- createDesign: Boolean!
-
- """
- Indicates the user can perform `create_note` on this resource
- """
- createNote: Boolean!
-
- """
- Indicates the user can perform `destroy_design` on this resource
- """
- destroyDesign: Boolean!
-
- """
- Indicates the user can perform `read_design` on this resource
- """
- readDesign: Boolean!
-
- """
- Indicates the user can perform `read_issue` on this resource
- """
- readIssue: Boolean!
-
- """
- Indicates the user can perform `reopen_issue` on this resource
- """
- reopenIssue: Boolean!
-
- """
- Indicates the user can perform `update_issue` on this resource
- """
- updateIssue: Boolean!
-}
-
-"""
-Autogenerated input type of IssueSetAssignees
-"""
-input IssueSetAssigneesInput {
- """
- The usernames to assign to the resource. Replaces existing assignees by default.
- """
- assigneeUsernames: [String!]!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The operation to perform. Defaults to REPLACE.
- """
- operationMode: MutationOperationMode
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetAssignees
-"""
-type IssueSetAssigneesPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetConfidential
-"""
-input IssueSetConfidentialInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Whether or not to set the issue as a confidential.
- """
- confidential: Boolean!
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetConfidential
-"""
-type IssueSetConfidentialPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetDueDate
-"""
-input IssueSetDueDateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The desired due date for the issue.
- """
- dueDate: Time!
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetDueDate
-"""
-type IssueSetDueDatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetEpic
-"""
-input IssueSetEpicInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the epic to be assigned to the issue, epic will be removed if absent or set to null
- """
- epicId: EpicID
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetEpic
-"""
-type IssueSetEpicPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetIteration
-"""
-input IssueSetIterationInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The iteration to assign to the issue.
- """
- iterationId: IterationID
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetIteration
-"""
-type IssueSetIterationPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetLocked
-"""
-input IssueSetLockedInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- Whether or not to lock discussion on the issue.
- """
- locked: Boolean!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of IssueSetLocked
-"""
-type IssueSetLockedPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetSeverity
-"""
-input IssueSetSeverityInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- Set the incident severity level.
- """
- severity: IssuableSeverity!
-}
-
-"""
-Autogenerated return type of IssueSetSeverity
-"""
-type IssueSetSeverityPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetSubscription
-"""
-input IssueSetSubscriptionInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- The desired state of the subscription.
- """
- subscribedState: Boolean!
-}
-
-"""
-Autogenerated return type of IssueSetSubscription
-"""
-type IssueSetSubscriptionPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of IssueSetWeight
-"""
-input IssueSetWeightInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- The desired weight for the issue.
- """
- weight: Int!
-}
-
-"""
-Autogenerated return type of IssueSetWeight
-"""
-type IssueSetWeightPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Values for sorting issues
-"""
-enum IssueSort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Due date by ascending order
- """
- DUE_DATE_ASC
-
- """
- Due date by descending order
- """
- DUE_DATE_DESC
-
- """
- Label priority by ascending order
- """
- LABEL_PRIORITY_ASC
-
- """
- Label priority by descending order
- """
- LABEL_PRIORITY_DESC
-
- """
- Milestone due date by ascending order
- """
- MILESTONE_DUE_ASC
-
- """
- Milestone due date by descending order
- """
- MILESTONE_DUE_DESC
-
- """
- Priority by ascending order
- """
- PRIORITY_ASC
-
- """
- Priority by descending order
- """
- PRIORITY_DESC
-
- """
- Published issues shown last
- """
- PUBLISHED_ASC
-
- """
- Published issues shown first
- """
- PUBLISHED_DESC
-
- """
- Relative position by ascending order
- """
- RELATIVE_POSITION_ASC
-
- """
- Severity from less critical to more critical
- """
- SEVERITY_ASC
-
- """
- Severity from more critical to less critical
- """
- SEVERITY_DESC
-
- """
- Issues with earliest SLA due time shown first
- """
- SLA_DUE_AT_ASC
-
- """
- Issues with latest SLA due time shown first
- """
- SLA_DUE_AT_DESC
-
- """
- Updated at ascending order
- """
- UPDATED_ASC
-
- """
- Updated at descending order
- """
- UPDATED_DESC
-
- """
- Weight by ascending order
- """
- WEIGHT_ASC
-
- """
- Weight by descending order
- """
- WEIGHT_DESC
-
- """
- Created at ascending order
- """
- created_asc @deprecated(reason: "Use CREATED_ASC. Deprecated in 13.5.")
-
- """
- Created at descending order
- """
- created_desc @deprecated(reason: "Use CREATED_DESC. Deprecated in 13.5.")
-
- """
- Updated at ascending order
- """
- updated_asc @deprecated(reason: "Use UPDATED_ASC. Deprecated in 13.5.")
-
- """
- Updated at descending order
- """
- updated_desc @deprecated(reason: "Use UPDATED_DESC. Deprecated in 13.5.")
-}
-
-"""
-State of a GitLab issue
-"""
-enum IssueState {
- all
- closed
- locked
- opened
-}
-
-"""
-Values for issue state events
-"""
-enum IssueStateEvent {
- """
- Closes the issue
- """
- CLOSE
-
- """
- Reopens the issue
- """
- REOPEN
-}
-
-"""
-Represents total number of issues for the represented statuses
-"""
-type IssueStatusCountsType {
- """
- Number of issues with status ALL for the project
- """
- all: Int
-
- """
- Number of issues with status CLOSED for the project
- """
- closed: Int
-
- """
- Number of issues with status OPENED for the project
- """
- opened: Int
-}
-
-"""
-Issue type
-"""
-enum IssueType {
- """
- Incident issue type
- """
- INCIDENT
-
- """
- Issue issue type
- """
- ISSUE
-
- """
- Test Case issue type
- """
- TEST_CASE
-}
-
-"""
-Represents an iteration object
-"""
-type Iteration implements TimeboxReportInterface {
- """
- Timestamp of iteration creation.
- """
- createdAt: Time!
-
- """
- Description of the iteration.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Timestamp of the iteration due date.
- """
- dueDate: Time
-
- """
- ID of the iteration.
- """
- id: ID!
-
- """
- Internal ID of the iteration.
- """
- iid: ID!
-
- """
- Historically accurate report about the timebox.
- """
- report: TimeboxReport
-
- """
- Web path of the iteration, scoped to the query parent. Only valid for Project parents. Returns null in other contexts.
- """
- scopedPath: String
-
- """
- Web URL of the iteration, scoped to the query parent. Only valid for Project parents. Returns null in other contexts.
- """
- scopedUrl: String
-
- """
- Timestamp of the iteration start date.
- """
- startDate: Time
-
- """
- State of the iteration.
- """
- state: IterationState!
-
- """
- Title of the iteration.
- """
- title: String!
-
- """
- Timestamp of last iteration update.
- """
- updatedAt: Time!
-
- """
- Web path of the iteration.
- """
- webPath: String!
-
- """
- Web URL of the iteration.
- """
- webUrl: String!
-}
-
-"""
-The connection type for Iteration.
-"""
-type IterationConnection {
- """
- A list of edges.
- """
- edges: [IterationEdge]
-
- """
- A list of nodes.
- """
- nodes: [Iteration]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type IterationEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Iteration
-}
-
-"""
-Identifier of Iteration.
-"""
-scalar IterationID
-
-"""
-State of a GitLab iteration
-"""
-enum IterationState {
- all
- closed
- opened
- started
- upcoming
-}
-
-"""
-Iteration ID wildcard values
-"""
-enum IterationWildcardId {
- """
- An iteration is assigned
- """
- ANY
-
- """
- Current iteration
- """
- CURRENT
-
- """
- No iteration is assigned
- """
- NONE
-}
-
-"""
-Represents untyped JSON
-"""
-scalar JSON
-
-type JiraImport {
- """
- Timestamp of when the Jira import was created.
- """
- createdAt: Time
-
- """
- Count of issues that failed to import.
- """
- failedToImportCount: Int!
-
- """
- Count of issues that were successfully imported.
- """
- importedIssuesCount: Int!
-
- """
- Project key for the imported Jira project.
- """
- jiraProjectKey: String!
-
- """
- Timestamp of when the Jira import was scheduled.
- """
- scheduledAt: Time
-
- """
- User that started the Jira import.
- """
- scheduledBy: User
-
- """
- Total count of issues that were attempted to import.
- """
- totalIssueCount: Int!
-}
-
-"""
-The connection type for JiraImport.
-"""
-type JiraImportConnection {
- """
- A list of edges.
- """
- edges: [JiraImportEdge]
-
- """
- A list of nodes.
- """
- nodes: [JiraImport]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type JiraImportEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: JiraImport
-}
-
-"""
-Autogenerated input type of JiraImportStart
-"""
-input JiraImportStartInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Project key of the importer Jira project.
- """
- jiraProjectKey: String!
-
- """
- Project name of the importer Jira project.
- """
- jiraProjectName: String
-
- """
- The project to import the Jira project into.
- """
- projectPath: ID!
-
- """
- The mapping of Jira to GitLab users.
- """
- usersMapping: [JiraUsersMappingInputType!]
-}
-
-"""
-Autogenerated return type of JiraImportStart
-"""
-type JiraImportStartPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The Jira import data after mutation.
- """
- jiraImport: JiraImport
-}
-
-"""
-Autogenerated input type of JiraImportUsers
-"""
-input JiraImportUsersInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project to import the Jira users into.
- """
- projectPath: ID!
-
- """
- The index of the record the import should started at, default 0 (50 records returned).
- """
- startAt: Int
-}
-
-"""
-Autogenerated return type of JiraImportUsers
-"""
-type JiraImportUsersPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Users returned from Jira, matched by email and name if possible.
- """
- jiraUsers: [JiraUser!]
-}
-
-type JiraProject {
- """
- Key of the Jira project.
- """
- key: String!
-
- """
- Name of the Jira project.
- """
- name: String
-
- """
- ID of the Jira project.
- """
- projectId: Int!
-}
-
-"""
-The connection type for JiraProject.
-"""
-type JiraProjectConnection {
- """
- A list of edges.
- """
- edges: [JiraProjectEdge]
-
- """
- A list of nodes.
- """
- nodes: [JiraProject]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type JiraProjectEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: JiraProject
-}
-
-type JiraService implements Service {
- """
- Indicates if the service is active.
- """
- active: Boolean
-
- """
- List of all Jira projects fetched through Jira REST API.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Project name or key.
- """
- name: String
- ): JiraProjectConnection
-
- """
- Class name of the service.
- """
- type: String
-}
-
-type JiraUser {
- """
- ID of the matched GitLab user.
- """
- gitlabId: Int
-
- """
- Name of the matched GitLab user.
- """
- gitlabName: String
-
- """
- Username of the matched GitLab user.
- """
- gitlabUsername: String
-
- """
- Account ID of the Jira user.
- """
- jiraAccountId: String!
-
- """
- Display name of the Jira user.
- """
- jiraDisplayName: String!
-
- """
- Email of the Jira user, returned only for users with public emails.
- """
- jiraEmail: String
-}
-
-input JiraUsersMappingInputType {
- """
- Id of the GitLab user.
- """
- gitlabId: Int
-
- """
- Jira account ID of the user.
- """
- jiraAccountId: String!
-}
-
-enum JobArtifactFileType {
- ACCESSIBILITY
- API_FUZZING
- ARCHIVE
- BROWSER_PERFORMANCE
- CLUSTER_APPLICATIONS
- COBERTURA
- CODEQUALITY
- CONTAINER_SCANNING
- COVERAGE_FUZZING
- DAST
- DEPENDENCY_SCANNING
- DOTENV
- JUNIT
- LICENSE_MANAGEMENT
- LICENSE_SCANNING
- LOAD_PERFORMANCE
- LSIF
- METADATA
- METRICS
- METRICS_REFEREE
- NETWORK_REFEREE
- PERFORMANCE
- REQUIREMENTS
- SAST
- SECRET_DETECTION
- TERRAFORM
- TRACE
-}
-
-"""
-JSON object as raw string
-"""
-scalar JsonString
-
-type Label {
- """
- Background color of the label.
- """
- color: String!
-
- """
- Description of the label (Markdown rendered as HTML for caching).
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Label ID.
- """
- id: ID!
-
- """
- Text color of the label.
- """
- textColor: String!
-
- """
- Content of the label.
- """
- title: String!
-}
-
-"""
-The connection type for Label.
-"""
-type LabelConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [LabelEdge]
-
- """
- A list of nodes.
- """
- nodes: [Label]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of LabelCreate
-"""
-input LabelCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The color of the label given in 6-digit hex notation with leading '#' sign
- (e.g. #FFAABB) or one of the CSS color names in
- https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_keywords.
- """
- color: String = "#6699cc"
-
- """
- Description of the label.
- """
- description: String
-
- """
- Full path of the group with which the resource is associated.
- """
- groupPath: ID
-
- """
- Full path of the project with which the resource is associated.
- """
- projectPath: ID
-
- """
- Title of the label.
- """
- title: String!
-}
-
-"""
-Autogenerated return type of LabelCreate
-"""
-type LabelCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The label after mutation.
- """
- label: Label
-}
-
-"""
-An edge in a connection.
-"""
-type LabelEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Label
-}
-
-"""
-Identifier of Label.
-"""
-scalar LabelID
-
-"""
-Identifier of List.
-"""
-scalar ListID
-
-"""
-List limit metric setting
-"""
-enum ListLimitMetric {
- all_metrics
- issue_count
- issue_weights
-}
-
-"""
-Autogenerated input type of MarkAsSpamSnippet
-"""
-input MarkAsSpamSnippetInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the snippet to update.
- """
- id: SnippetID!
-}
-
-"""
-Autogenerated return type of MarkAsSpamSnippet
-"""
-type MarkAsSpamSnippetPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The snippet after mutation.
- """
- snippet: Snippet
-}
-
-"""
-Possible identifier types for a measurement
-"""
-enum MeasurementIdentifier {
- """
- Group count
- """
- GROUPS
-
- """
- Issue count
- """
- ISSUES
-
- """
- Merge request count
- """
- MERGE_REQUESTS
-
- """
- Pipeline count
- """
- PIPELINES
-
- """
- Pipeline count with canceled status
- """
- PIPELINES_CANCELED
-
- """
- Pipeline count with failed status
- """
- PIPELINES_FAILED
-
- """
- Pipeline count with skipped status
- """
- PIPELINES_SKIPPED
-
- """
- Pipeline count with success status
- """
- PIPELINES_SUCCEEDED
-
- """
- Project count
- """
- PROJECTS
-
- """
- User count
- """
- USERS
-}
-
-interface MemberInterface {
- """
- GitLab::Access level.
- """
- accessLevel: AccessLevel
-
- """
- Date and time the membership was created.
- """
- createdAt: Time
-
- """
- User that authorized membership.
- """
- createdBy: User
-
- """
- Date and time the membership expires.
- """
- expiresAt: Time
-
- """
- ID of the member.
- """
- id: ID!
-
- """
- Date and time the membership was last updated.
- """
- updatedAt: Time
-
- """
- User that is associated with the member object.
- """
- user: User!
-}
-
-"""
-The connection type for MemberInterface.
-"""
-type MemberInterfaceConnection {
- """
- A list of edges.
- """
- edges: [MemberInterfaceEdge]
-
- """
- A list of nodes.
- """
- nodes: [MemberInterface]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type MemberInterfaceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: MemberInterface
-}
-
-type MergeRequest implements CurrentUserTodos & Noteable {
- """
- Indicates if members of the target project can push to the fork.
- """
- allowCollaboration: Boolean
-
- """
- Number of approvals left.
- """
- approvalsLeft: Int
-
- """
- Number of approvals required.
- """
- approvalsRequired: Int
-
- """
- Indicates if the merge request has all the required approvals. Returns true if no required approvals are configured.
- """
- approved: Boolean!
-
- """
- Users who approved the merge request.
- """
- approvedBy(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Assignees of the merge request.
- """
- assignees(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- User who created this merge request.
- """
- author: User
-
- """
- Indicates if auto merge is enabled for the merge request.
- """
- autoMergeEnabled: Boolean!
-
- """
- Selected auto merge strategy.
- """
- autoMergeStrategy: String
-
- """
- Array of available auto merge strategies.
- """
- availableAutoMergeStrategies: [String!]
-
- """
- Number of commits in the merge request.
- """
- commitCount: Int
-
- """
- Merge request commits excluding merge commits.
- """
- commitsWithoutMergeCommits(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CommitConnection
-
- """
- Indicates if the merge request has conflicts.
- """
- conflicts: Boolean!
-
- """
- Timestamp of when the merge request was created.
- """
- createdAt: Time!
-
- """
- To-do items for the current user.
- """
- currentUserTodos(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- State of the to-do items.
- """
- state: TodoStateEnum
- ): TodoConnection!
-
- """
- Default merge commit message of the merge request.
- """
- defaultMergeCommitMessage: String
-
- """
- Default merge commit message of the merge request with description.
- """
- defaultMergeCommitMessageWithDescription: String
-
- """
- Default squash commit message of the merge request.
- """
- defaultSquashCommitMessage: String
-
- """
- Description of the merge request (Markdown rendered as HTML for caching).
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Diff head SHA of the merge request.
- """
- diffHeadSha: String
-
- """
- References of the base SHA, the head SHA, and the start SHA for this merge request.
- """
- diffRefs: DiffRefs
-
- """
- Details about which files were changed in this merge request.
- """
- diffStats(
- """
- A specific file-path.
- """
- path: String
- ): [DiffStats!]
-
- """
- Summary of which files were changed in this merge request.
- """
- diffStatsSummary: DiffStatsSummary
-
- """
- Indicates if comments on the merge request are locked to members only.
- """
- discussionLocked: Boolean!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Number of downvotes for the merge request.
- """
- downvotes: Int!
-
- """
- Indicates if the project settings will lead to source branch deletion after merge.
- """
- forceRemoveSourceBranch: Boolean
-
- """
- Indicates if the merge request has CI.
- """
- hasCi: Boolean!
-
- """
- Indicates if the source branch has any security reports.
- """
- hasSecurityReports: Boolean!
-
- """
- The pipeline running on the branch HEAD of the merge request.
- """
- headPipeline: Pipeline
-
- """
- ID of the merge request.
- """
- id: ID!
-
- """
- Internal ID of the merge request.
- """
- iid: String!
-
- """
- Commit SHA of the merge request if merge is in progress.
- """
- inProgressMergeCommitSha: String
-
- """
- Labels of the merge request.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): LabelConnection
-
- """
- SHA of the merge request commit (set once merged).
- """
- mergeCommitSha: String
-
- """
- Error message due to a merge error.
- """
- mergeError: String
-
- """
- Indicates if a merge is currently occurring.
- """
- mergeOngoing: Boolean!
-
- """
- Status of the merge request.
- """
- mergeStatus: String
-
- """
- Number of merge requests in the merge train.
- """
- mergeTrainsCount: Int
-
- """
- User who merged this merge request.
- """
- mergeUser: User
-
- """
- Indicates if the merge has been set to be merged when its pipeline succeeds (MWPS).
- """
- mergeWhenPipelineSucceeds: Boolean
-
- """
- Indicates if the merge request is mergeable.
- """
- mergeable: Boolean!
-
- """
- Indicates if all discussions in the merge request have been resolved, allowing the merge request to be merged.
- """
- mergeableDiscussionsState: Boolean
-
- """
- Timestamp of when the merge request was merged, null if not merged.
- """
- mergedAt: Time
-
- """
- The milestone of the merge request.
- """
- milestone: Milestone
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- Participants in the merge request. This includes the author, assignees, reviewers, and users mentioned in notes.
- """
- participants(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Pipelines for the merge request. Note: for performance reasons, no more than
- the most recent 500 pipelines will be returned.
- """
- pipelines(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter pipelines by the ref they are run for.
- """
- ref: String
-
- """
- Filter pipelines by the sha of the commit they are run for.
- """
- sha: String
-
- """
- Filter pipelines by their status.
- """
- status: PipelineStatusEnum
- ): PipelineConnection
-
- """
- Alias for target_project.
- """
- project: Project!
-
- """
- ID of the merge request project.
- """
- projectId: Int!
-
- """
- Rebase commit SHA of the merge request.
- """
- rebaseCommitSha: String
-
- """
- Indicates if there is a rebase currently in progress for the merge request.
- """
- rebaseInProgress: Boolean!
-
- """
- Internal reference of the merge request. Returned in shortened format by default.
- """
- reference(
- """
- Boolean option specifying whether the reference should be returned in full.
- """
- full: Boolean = false
- ): String!
-
- """
- Users from whom a review has been requested.
- """
- reviewers(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): UserConnection
-
- """
- Indicates if the merge request is created by @GitLab-Security-Bot.
- """
- securityAutoFix: Boolean
-
- """
- Indicates if the merge request will be rebased.
- """
- shouldBeRebased: Boolean!
-
- """
- Indicates if the source branch of the merge request will be deleted after merge.
- """
- shouldRemoveSourceBranch: Boolean
-
- """
- Source branch of the merge request.
- """
- sourceBranch: String!
-
- """
- Indicates if the source branch of the merge request exists.
- """
- sourceBranchExists: Boolean!
-
- """
- Indicates if the source branch is protected.
- """
- sourceBranchProtected: Boolean!
-
- """
- Source project of the merge request.
- """
- sourceProject: Project
-
- """
- ID of the merge request source project.
- """
- sourceProjectId: Int
-
- """
- Indicates if squash on merge is enabled.
- """
- squash: Boolean!
-
- """
- Indicates if squash on merge is enabled.
- """
- squashOnMerge: Boolean!
-
- """
- State of the merge request.
- """
- state: MergeRequestState!
-
- """
- Indicates if the currently logged in user is subscribed to this merge request.
- """
- subscribed: Boolean!
-
- """
- Target branch of the merge request.
- """
- targetBranch: String!
-
- """
- Indicates if the target branch of the merge request exists.
- """
- targetBranchExists: Boolean!
-
- """
- Target project of the merge request.
- """
- targetProject: Project!
-
- """
- ID of the merge request target project.
- """
- targetProjectId: Int!
-
- """
- Completion status of tasks
- """
- taskCompletionStatus: TaskCompletionStatus!
-
- """
- Time estimate of the merge request.
- """
- timeEstimate: Int!
-
- """
- Title of the merge request.
- """
- title: String!
-
- """
- The GitLab Flavored Markdown rendering of `title`
- """
- titleHtml: String
-
- """
- Total time reported as spent on the merge request.
- """
- totalTimeSpent: Int!
-
- """
- Timestamp of when the merge request was last updated.
- """
- updatedAt: Time!
-
- """
- Number of upvotes for the merge request.
- """
- upvotes: Int!
-
- """
- Number of user discussions in the merge request.
- """
- userDiscussionsCount: Int
-
- """
- User notes count of the merge request.
- """
- userNotesCount: Int
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: MergeRequestPermissions!
-
- """
- Web URL of the merge request.
- """
- webUrl: String
-
- """
- Indicates if the merge request is a work in progress (WIP).
- """
- workInProgress: Boolean!
-}
-
-"""
-The connection type for MergeRequest.
-"""
-type MergeRequestConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [MergeRequestEdge]
-
- """
- A list of nodes.
- """
- nodes: [MergeRequest]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-
- """
- Total sum of time to merge, in seconds, for the collection of merge requests.
- """
- totalTimeToMerge: Float
-}
-
-"""
-Autogenerated input type of MergeRequestCreate
-"""
-input MergeRequestCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the merge request (Markdown rendered as HTML for caching).
- """
- description: String
-
- """
- Labels of the merge request.
- """
- labels: [String!]
-
- """
- Project full path the merge request is associated with.
- """
- projectPath: ID!
-
- """
- Source branch of the merge request.
- """
- sourceBranch: String!
-
- """
- Target branch of the merge request.
- """
- targetBranch: String!
-
- """
- Title of the merge request.
- """
- title: String!
-}
-
-"""
-Autogenerated return type of MergeRequestCreate
-"""
-type MergeRequestCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Represents the Geo sync and verification state of a Merge Request diff
-"""
-type MergeRequestDiffRegistry {
- """
- Timestamp when the MergeRequestDiffRegistry was created
- """
- createdAt: Time
-
- """
- ID of the MergeRequestDiffRegistry
- """
- id: ID!
-
- """
- Error message during sync of the MergeRequestDiffRegistry
- """
- lastSyncFailure: String
-
- """
- Timestamp of the most recent successful sync of the MergeRequestDiffRegistry
- """
- lastSyncedAt: Time
-
- """
- ID of the Merge Request diff.
- """
- mergeRequestDiffId: ID!
-
- """
- Timestamp after which the MergeRequestDiffRegistry should be resynced
- """
- retryAt: Time
-
- """
- Number of consecutive failed sync attempts of the MergeRequestDiffRegistry
- """
- retryCount: Int
-
- """
- Sync state of the MergeRequestDiffRegistry
- """
- state: RegistryState
-}
-
-"""
-The connection type for MergeRequestDiffRegistry.
-"""
-type MergeRequestDiffRegistryConnection {
- """
- A list of edges.
- """
- edges: [MergeRequestDiffRegistryEdge]
-
- """
- A list of nodes.
- """
- nodes: [MergeRequestDiffRegistry]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type MergeRequestDiffRegistryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: MergeRequestDiffRegistry
-}
-
-"""
-An edge in a connection.
-"""
-type MergeRequestEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: MergeRequest
-}
-
-"""
-Identifier of MergeRequest.
-"""
-scalar MergeRequestID
-
-"""
-New state to apply to a merge request.
-"""
-enum MergeRequestNewState {
- """
- Close the merge request if it is open.
- """
- CLOSED
-
- """
- Open the merge request if it is closed.
- """
- OPEN
-}
-
-"""
-Check permissions for the current user on a merge request
-"""
-type MergeRequestPermissions {
- """
- Indicates the user can perform `admin_merge_request` on this resource
- """
- adminMergeRequest: Boolean!
-
- """
- Indicates the user can perform `can_merge` on this resource
- """
- canMerge: Boolean!
-
- """
- Indicates the user can perform `cherry_pick_on_current_merge_request` on this resource
- """
- cherryPickOnCurrentMergeRequest: Boolean!
-
- """
- Indicates the user can perform `create_note` on this resource
- """
- createNote: Boolean!
-
- """
- Indicates the user can perform `push_to_source_branch` on this resource
- """
- pushToSourceBranch: Boolean!
-
- """
- Indicates the user can perform `read_merge_request` on this resource
- """
- readMergeRequest: Boolean!
-
- """
- Indicates the user can perform `remove_source_branch` on this resource
- """
- removeSourceBranch: Boolean!
-
- """
- Indicates the user can perform `revert_on_current_merge_request` on this resource
- """
- revertOnCurrentMergeRequest: Boolean!
-
- """
- Indicates the user can perform `update_merge_request` on this resource
- """
- updateMergeRequest: Boolean!
-}
-
-"""
-Autogenerated input type of MergeRequestReviewerRereview
-"""
-input MergeRequestReviewerRereviewInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-
- """
- The user ID for the user that has been requested for a new review.
- """
- userId: UserID!
-}
-
-"""
-Autogenerated return type of MergeRequestReviewerRereview
-"""
-type MergeRequestReviewerRereviewPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetAssignees
-"""
-input MergeRequestSetAssigneesInput {
- """
- The usernames to assign to the resource. Replaces existing assignees by default.
- """
- assigneeUsernames: [String!]!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The operation to perform. Defaults to REPLACE.
- """
- operationMode: MutationOperationMode
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of MergeRequestSetAssignees
-"""
-type MergeRequestSetAssigneesPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetLabels
-"""
-input MergeRequestSetLabelsInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The Label IDs to set. Replaces existing labels by default.
- """
- labelIds: [LabelID!]!
-
- """
- Changes the operation mode. Defaults to REPLACE.
- """
- operationMode: MutationOperationMode
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of MergeRequestSetLabels
-"""
-type MergeRequestSetLabelsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetLocked
-"""
-input MergeRequestSetLockedInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- Whether or not to lock the merge request.
- """
- locked: Boolean!
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of MergeRequestSetLocked
-"""
-type MergeRequestSetLockedPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetMilestone
-"""
-input MergeRequestSetMilestoneInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The milestone to assign to the merge request.
- """
- milestoneId: MilestoneID
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of MergeRequestSetMilestone
-"""
-type MergeRequestSetMilestonePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetSubscription
-"""
-input MergeRequestSetSubscriptionInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-
- """
- The desired state of the subscription.
- """
- subscribedState: Boolean!
-}
-
-"""
-Autogenerated return type of MergeRequestSetSubscription
-"""
-type MergeRequestSetSubscriptionPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Autogenerated input type of MergeRequestSetWip
-"""
-input MergeRequestSetWipInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-
- """
- Whether or not to set the merge request as a WIP.
- """
- wip: Boolean!
-}
-
-"""
-Autogenerated return type of MergeRequestSetWip
-"""
-type MergeRequestSetWipPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-"""
-Values for sorting merge requests
-"""
-enum MergeRequestSort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Label priority by ascending order
- """
- LABEL_PRIORITY_ASC
-
- """
- Label priority by descending order
- """
- LABEL_PRIORITY_DESC
-
- """
- Merge time by ascending order
- """
- MERGED_AT_ASC
-
- """
- Merge time by descending order
- """
- MERGED_AT_DESC
-
- """
- Milestone due date by ascending order
- """
- MILESTONE_DUE_ASC
-
- """
- Milestone due date by descending order
- """
- MILESTONE_DUE_DESC
-
- """
- Priority by ascending order
- """
- PRIORITY_ASC
-
- """
- Priority by descending order
- """
- PRIORITY_DESC
-
- """
- Updated at ascending order
- """
- UPDATED_ASC
-
- """
- Updated at descending order
- """
- UPDATED_DESC
-
- """
- Created at ascending order
- """
- created_asc @deprecated(reason: "Use CREATED_ASC. Deprecated in 13.5.")
-
- """
- Created at descending order
- """
- created_desc @deprecated(reason: "Use CREATED_DESC. Deprecated in 13.5.")
-
- """
- Updated at ascending order
- """
- updated_asc @deprecated(reason: "Use UPDATED_ASC. Deprecated in 13.5.")
-
- """
- Updated at descending order
- """
- updated_desc @deprecated(reason: "Use UPDATED_DESC. Deprecated in 13.5.")
-}
-
-"""
-State of a GitLab merge request
-"""
-enum MergeRequestState {
- all
- closed
- locked
-
- """
- Merge Request has been merged
- """
- merged
- opened
-}
-
-"""
-Autogenerated input type of MergeRequestUpdate
-"""
-input MergeRequestUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the merge request (Markdown rendered as HTML for caching).
- """
- description: String
-
- """
- The IID of the merge request to mutate.
- """
- iid: String!
-
- """
- The project the merge request to mutate is in.
- """
- projectPath: ID!
-
- """
- The action to perform to change the state.
- """
- state: MergeRequestNewState
-
- """
- Target branch of the merge request.
- """
- targetBranch: String
-
- """
- Title of the merge request.
- """
- title: String
-}
-
-"""
-Autogenerated return type of MergeRequestUpdate
-"""
-type MergeRequestUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The merge request after mutation.
- """
- mergeRequest: MergeRequest
-}
-
-type Metadata {
- """
- Revision.
- """
- revision: String!
-
- """
- Version.
- """
- version: String!
-}
-
-"""
-Represents a metric image upload
-"""
-type MetricImage {
- """
- File name of the metric image.
- """
- fileName: String
-
- """
- File path of the metric image.
- """
- filePath: String
-
- """
- ID of the metric upload.
- """
- id: ID!
-
- """
- Internal ID of the metric upload.
- """
- iid: ID!
-
- """
- URL of the metric source.
- """
- url: String!
-}
-
-type MetricsDashboard {
- """
- Annotations added to the dashboard.
- """
- annotations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Timestamp marking date and time from which annotations need to be fetched.
- """
- from: Time!
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Timestamp marking date and time to which annotations need to be fetched.
- """
- to: Time
- ): MetricsDashboardAnnotationConnection
-
- """
- Path to a file with the dashboard definition.
- """
- path: String
-
- """
- Dashboard schema validation warnings.
- """
- schemaValidationWarnings: [String!]
-}
-
-type MetricsDashboardAnnotation {
- """
- Description of the annotation.
- """
- description: String
-
- """
- Timestamp marking end of annotated time span.
- """
- endingAt: Time
-
- """
- ID of the annotation.
- """
- id: ID!
-
- """
- ID of a dashboard panel to which the annotation should be scoped.
- """
- panelId: String
-
- """
- Timestamp marking start of annotated time span.
- """
- startingAt: Time
-}
-
-"""
-The connection type for MetricsDashboardAnnotation.
-"""
-type MetricsDashboardAnnotationConnection {
- """
- A list of edges.
- """
- edges: [MetricsDashboardAnnotationEdge]
-
- """
- A list of nodes.
- """
- nodes: [MetricsDashboardAnnotation]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type MetricsDashboardAnnotationEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: MetricsDashboardAnnotation
-}
-
-"""
-Identifier of Metrics::Dashboard::Annotation.
-"""
-scalar MetricsDashboardAnnotationID
-
-"""
-Represents a milestone
-"""
-type Milestone implements TimeboxReportInterface {
- """
- Timestamp of milestone creation.
- """
- createdAt: Time!
-
- """
- Description of the milestone.
- """
- description: String
-
- """
- Timestamp of the milestone due date.
- """
- dueDate: Time
-
- """
- Indicates if milestone is at group level.
- """
- groupMilestone: Boolean!
-
- """
- ID of the milestone.
- """
- id: ID!
-
- """
- Indicates if milestone is at project level.
- """
- projectMilestone: Boolean!
-
- """
- Historically accurate report about the timebox.
- """
- report: TimeboxReport
-
- """
- Timestamp of the milestone start date.
- """
- startDate: Time
-
- """
- State of the milestone.
- """
- state: MilestoneStateEnum!
-
- """
- Milestone statistics.
- """
- stats: MilestoneStats
-
- """
- Indicates if milestone is at subgroup level.
- """
- subgroupMilestone: Boolean!
-
- """
- Title of the milestone.
- """
- title: String!
-
- """
- Timestamp of last milestone update.
- """
- updatedAt: Time!
-
- """
- Web path of the milestone.
- """
- webPath: String!
-}
-
-"""
-The connection type for Milestone.
-"""
-type MilestoneConnection {
- """
- A list of edges.
- """
- edges: [MilestoneEdge]
-
- """
- A list of nodes.
- """
- nodes: [Milestone]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type MilestoneEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Milestone
-}
-
-"""
-Identifier of Milestone.
-"""
-scalar MilestoneID
-
-"""
-Current state of milestone
-"""
-enum MilestoneStateEnum {
- """
- Milestone is currently active
- """
- active
-
- """
- Milestone is closed
- """
- closed
-}
-
-"""
-Contains statistics about a milestone
-"""
-type MilestoneStats {
- """
- Number of closed issues associated with the milestone.
- """
- closedIssuesCount: Int
-
- """
- Total number of issues associated with the milestone.
- """
- totalIssuesCount: Int
-}
-
-"""
-The position to which the adjacent object should be moved
-"""
-enum MoveType {
- """
- The adjacent object will be moved after the object that is being moved
- """
- after
-
- """
- The adjacent object will be moved before the object that is being moved
- """
- before
-}
-
-type Mutation {
- addAwardEmoji(input: AddAwardEmojiInput!): AddAwardEmojiPayload @deprecated(reason: "Use awardEmojiAdd. Deprecated in 13.2.")
- addProjectToSecurityDashboard(input: AddProjectToSecurityDashboardInput!): AddProjectToSecurityDashboardPayload
- adminSidekiqQueuesDeleteJobs(input: AdminSidekiqQueuesDeleteJobsInput!): AdminSidekiqQueuesDeleteJobsPayload
- alertSetAssignees(input: AlertSetAssigneesInput!): AlertSetAssigneesPayload
- alertTodoCreate(input: AlertTodoCreateInput!): AlertTodoCreatePayload
- apiFuzzingCiConfigurationCreate(input: ApiFuzzingCiConfigurationCreateInput!): ApiFuzzingCiConfigurationCreatePayload
- awardEmojiAdd(input: AwardEmojiAddInput!): AwardEmojiAddPayload
- awardEmojiRemove(input: AwardEmojiRemoveInput!): AwardEmojiRemovePayload
- awardEmojiToggle(input: AwardEmojiToggleInput!): AwardEmojiTogglePayload
- boardListCreate(input: BoardListCreateInput!): BoardListCreatePayload
- boardListUpdateLimitMetrics(input: BoardListUpdateLimitMetricsInput!): BoardListUpdateLimitMetricsPayload
- ciCdSettingsUpdate(input: CiCdSettingsUpdateInput!): CiCdSettingsUpdatePayload
- clusterAgentDelete(input: ClusterAgentDeleteInput!): ClusterAgentDeletePayload
- clusterAgentTokenCreate(input: ClusterAgentTokenCreateInput!): ClusterAgentTokenCreatePayload
- clusterAgentTokenDelete(input: ClusterAgentTokenDeleteInput!): ClusterAgentTokenDeletePayload
- commitCreate(input: CommitCreateInput!): CommitCreatePayload
- configureSast(input: ConfigureSastInput!): ConfigureSastPayload
- createAlertIssue(input: CreateAlertIssueInput!): CreateAlertIssuePayload
- createAnnotation(input: CreateAnnotationInput!): CreateAnnotationPayload
- createBoard(input: CreateBoardInput!): CreateBoardPayload
- createBranch(input: CreateBranchInput!): CreateBranchPayload
- createClusterAgent(input: CreateClusterAgentInput!): CreateClusterAgentPayload
- createComplianceFramework(input: CreateComplianceFrameworkInput!): CreateComplianceFrameworkPayload
-
- """
- Available only when feature flag `custom_emoji` is enabled.
- """
- createCustomEmoji(input: CreateCustomEmojiInput!): CreateCustomEmojiPayload
- createDevopsAdoptionSegment(input: CreateDevopsAdoptionSegmentInput!): CreateDevopsAdoptionSegmentPayload
- createDiffNote(input: CreateDiffNoteInput!): CreateDiffNotePayload
- createEpic(input: CreateEpicInput!): CreateEpicPayload
- createImageDiffNote(input: CreateImageDiffNoteInput!): CreateImageDiffNotePayload
- createIssue(input: CreateIssueInput!): CreateIssuePayload
- createIteration(input: CreateIterationInput!): CreateIterationPayload
- createNote(input: CreateNoteInput!): CreateNotePayload
- createRequirement(input: CreateRequirementInput!): CreateRequirementPayload
- createSnippet(input: CreateSnippetInput!): CreateSnippetPayload
- createTestCase(input: CreateTestCaseInput!): CreateTestCasePayload
- dastOnDemandScanCreate(input: DastOnDemandScanCreateInput!): DastOnDemandScanCreatePayload
- dastProfileCreate(input: DastProfileCreateInput!): DastProfileCreatePayload
- dastProfileDelete(input: DastProfileDeleteInput!): DastProfileDeletePayload
- dastProfileRun(input: DastProfileRunInput!): DastProfileRunPayload
- dastProfileUpdate(input: DastProfileUpdateInput!): DastProfileUpdatePayload
- dastScannerProfileCreate(input: DastScannerProfileCreateInput!): DastScannerProfileCreatePayload
- dastScannerProfileDelete(input: DastScannerProfileDeleteInput!): DastScannerProfileDeletePayload
- dastScannerProfileUpdate(input: DastScannerProfileUpdateInput!): DastScannerProfileUpdatePayload
- dastSiteProfileCreate(input: DastSiteProfileCreateInput!): DastSiteProfileCreatePayload
- dastSiteProfileDelete(input: DastSiteProfileDeleteInput!): DastSiteProfileDeletePayload
- dastSiteProfileUpdate(input: DastSiteProfileUpdateInput!): DastSiteProfileUpdatePayload
- dastSiteTokenCreate(input: DastSiteTokenCreateInput!): DastSiteTokenCreatePayload
- dastSiteValidationCreate(input: DastSiteValidationCreateInput!): DastSiteValidationCreatePayload
- dastSiteValidationRevoke(input: DastSiteValidationRevokeInput!): DastSiteValidationRevokePayload
- deleteAnnotation(input: DeleteAnnotationInput!): DeleteAnnotationPayload
- deleteDevopsAdoptionSegment(input: DeleteDevopsAdoptionSegmentInput!): DeleteDevopsAdoptionSegmentPayload
- designManagementDelete(input: DesignManagementDeleteInput!): DesignManagementDeletePayload
- designManagementMove(input: DesignManagementMoveInput!): DesignManagementMovePayload
- designManagementUpload(input: DesignManagementUploadInput!): DesignManagementUploadPayload
- destroyBoard(input: DestroyBoardInput!): DestroyBoardPayload
- destroyBoardList(input: DestroyBoardListInput!): DestroyBoardListPayload
- destroyComplianceFramework(input: DestroyComplianceFrameworkInput!): DestroyComplianceFrameworkPayload
- destroyContainerRepository(input: DestroyContainerRepositoryInput!): DestroyContainerRepositoryPayload
- destroyContainerRepositoryTags(input: DestroyContainerRepositoryTagsInput!): DestroyContainerRepositoryTagsPayload
- destroyNote(input: DestroyNoteInput!): DestroyNotePayload
- destroySnippet(input: DestroySnippetInput!): DestroySnippetPayload
-
- """
- Toggles the resolved state of a discussion
- """
- discussionToggleResolve(input: DiscussionToggleResolveInput!): DiscussionToggleResolvePayload
- dismissVulnerability(input: DismissVulnerabilityInput!): DismissVulnerabilityPayload @deprecated(reason: "Use vulnerabilityDismiss. Deprecated in 13.5.")
- environmentsCanaryIngressUpdate(input: EnvironmentsCanaryIngressUpdateInput!): EnvironmentsCanaryIngressUpdatePayload
- epicAddIssue(input: EpicAddIssueInput!): EpicAddIssuePayload
- epicBoardCreate(input: EpicBoardCreateInput!): EpicBoardCreatePayload
- epicBoardListCreate(input: EpicBoardListCreateInput!): EpicBoardListCreatePayload
- epicSetSubscription(input: EpicSetSubscriptionInput!): EpicSetSubscriptionPayload
- epicTreeReorder(input: EpicTreeReorderInput!): EpicTreeReorderPayload
- exportRequirements(input: ExportRequirementsInput!): ExportRequirementsPayload
- gitlabSubscriptionActivate(input: GitlabSubscriptionActivateInput!): GitlabSubscriptionActivatePayload
- httpIntegrationCreate(input: HttpIntegrationCreateInput!): HttpIntegrationCreatePayload
- httpIntegrationDestroy(input: HttpIntegrationDestroyInput!): HttpIntegrationDestroyPayload
- httpIntegrationResetToken(input: HttpIntegrationResetTokenInput!): HttpIntegrationResetTokenPayload
- httpIntegrationUpdate(input: HttpIntegrationUpdateInput!): HttpIntegrationUpdatePayload
- issueMove(input: IssueMoveInput!): IssueMovePayload
- issueMoveList(input: IssueMoveListInput!): IssueMoveListPayload
- issueSetAssignees(input: IssueSetAssigneesInput!): IssueSetAssigneesPayload
- issueSetConfidential(input: IssueSetConfidentialInput!): IssueSetConfidentialPayload
- issueSetDueDate(input: IssueSetDueDateInput!): IssueSetDueDatePayload
- issueSetEpic(input: IssueSetEpicInput!): IssueSetEpicPayload
- issueSetIteration(input: IssueSetIterationInput!): IssueSetIterationPayload
- issueSetLocked(input: IssueSetLockedInput!): IssueSetLockedPayload
- issueSetSeverity(input: IssueSetSeverityInput!): IssueSetSeverityPayload
- issueSetSubscription(input: IssueSetSubscriptionInput!): IssueSetSubscriptionPayload
- issueSetWeight(input: IssueSetWeightInput!): IssueSetWeightPayload
- jiraImportStart(input: JiraImportStartInput!): JiraImportStartPayload
- jiraImportUsers(input: JiraImportUsersInput!): JiraImportUsersPayload
- labelCreate(input: LabelCreateInput!): LabelCreatePayload
- markAsSpamSnippet(input: MarkAsSpamSnippetInput!): MarkAsSpamSnippetPayload
- mergeRequestCreate(input: MergeRequestCreateInput!): MergeRequestCreatePayload
- mergeRequestReviewerRereview(input: MergeRequestReviewerRereviewInput!): MergeRequestReviewerRereviewPayload
- mergeRequestSetAssignees(input: MergeRequestSetAssigneesInput!): MergeRequestSetAssigneesPayload
- mergeRequestSetLabels(input: MergeRequestSetLabelsInput!): MergeRequestSetLabelsPayload
- mergeRequestSetLocked(input: MergeRequestSetLockedInput!): MergeRequestSetLockedPayload
- mergeRequestSetMilestone(input: MergeRequestSetMilestoneInput!): MergeRequestSetMilestonePayload
- mergeRequestSetSubscription(input: MergeRequestSetSubscriptionInput!): MergeRequestSetSubscriptionPayload
- mergeRequestSetWip(input: MergeRequestSetWipInput!): MergeRequestSetWipPayload
-
- """
- Update attributes of a merge request
- """
- mergeRequestUpdate(input: MergeRequestUpdateInput!): MergeRequestUpdatePayload
- namespaceIncreaseStorageTemporarily(input: NamespaceIncreaseStorageTemporarilyInput!): NamespaceIncreaseStorageTemporarilyPayload
- oncallRotationCreate(input: OncallRotationCreateInput!): OncallRotationCreatePayload
- oncallRotationDestroy(input: OncallRotationDestroyInput!): OncallRotationDestroyPayload
- oncallScheduleCreate(input: OncallScheduleCreateInput!): OncallScheduleCreatePayload
- oncallScheduleDestroy(input: OncallScheduleDestroyInput!): OncallScheduleDestroyPayload
- oncallScheduleUpdate(input: OncallScheduleUpdateInput!): OncallScheduleUpdatePayload
- pipelineCancel(input: PipelineCancelInput!): PipelineCancelPayload
- pipelineDestroy(input: PipelineDestroyInput!): PipelineDestroyPayload
- pipelineRetry(input: PipelineRetryInput!): PipelineRetryPayload
- prometheusIntegrationCreate(input: PrometheusIntegrationCreateInput!): PrometheusIntegrationCreatePayload
- prometheusIntegrationResetToken(input: PrometheusIntegrationResetTokenInput!): PrometheusIntegrationResetTokenPayload
- prometheusIntegrationUpdate(input: PrometheusIntegrationUpdateInput!): PrometheusIntegrationUpdatePayload
- promoteToEpic(input: PromoteToEpicInput!): PromoteToEpicPayload
- releaseCreate(input: ReleaseCreateInput!): ReleaseCreatePayload
- releaseDelete(input: ReleaseDeleteInput!): ReleaseDeletePayload
- releaseUpdate(input: ReleaseUpdateInput!): ReleaseUpdatePayload
- removeAwardEmoji(input: RemoveAwardEmojiInput!): RemoveAwardEmojiPayload @deprecated(reason: "Use awardEmojiRemove. Deprecated in 13.2.")
- removeProjectFromSecurityDashboard(input: RemoveProjectFromSecurityDashboardInput!): RemoveProjectFromSecurityDashboardPayload
-
- """
- Repositions a DiffNote on an image (a `Note` where the `position.positionType` is `"image"`)
- """
- repositionImageDiffNote(input: RepositionImageDiffNoteInput!): RepositionImageDiffNotePayload
- revertVulnerabilityToDetected(input: RevertVulnerabilityToDetectedInput!): RevertVulnerabilityToDetectedPayload @deprecated(reason: "Use vulnerabilityRevertToDetected. Deprecated in 13.5.")
- runDastScan(input: RunDASTScanInput!): RunDASTScanPayload @deprecated(reason: "Use DastOnDemandScanCreate. Deprecated in 13.4.")
- terraformStateDelete(input: TerraformStateDeleteInput!): TerraformStateDeletePayload
- terraformStateLock(input: TerraformStateLockInput!): TerraformStateLockPayload
- terraformStateUnlock(input: TerraformStateUnlockInput!): TerraformStateUnlockPayload
- todoCreate(input: TodoCreateInput!): TodoCreatePayload
- todoMarkDone(input: TodoMarkDoneInput!): TodoMarkDonePayload
- todoRestore(input: TodoRestoreInput!): TodoRestorePayload
- todoRestoreMany(input: TodoRestoreManyInput!): TodoRestoreManyPayload
- todosMarkAllDone(input: TodosMarkAllDoneInput!): TodosMarkAllDonePayload
- toggleAwardEmoji(input: ToggleAwardEmojiInput!): ToggleAwardEmojiPayload @deprecated(reason: "Use awardEmojiToggle. Deprecated in 13.2.")
- updateAlertStatus(input: UpdateAlertStatusInput!): UpdateAlertStatusPayload
- updateBoard(input: UpdateBoardInput!): UpdateBoardPayload
- updateBoardEpicUserPreferences(input: UpdateBoardEpicUserPreferencesInput!): UpdateBoardEpicUserPreferencesPayload
- updateBoardList(input: UpdateBoardListInput!): UpdateBoardListPayload
- updateComplianceFramework(input: UpdateComplianceFrameworkInput!): UpdateComplianceFrameworkPayload
- updateContainerExpirationPolicy(input: UpdateContainerExpirationPolicyInput!): UpdateContainerExpirationPolicyPayload
- updateEpic(input: UpdateEpicInput!): UpdateEpicPayload
-
- """
- Updates a DiffNote on an image (a `Note` where the `position.positionType` is
- `"image"`). If the body of the Note contains only quick actions, the Note will
- be destroyed during the update, and no Note will be returned
- """
- updateImageDiffNote(input: UpdateImageDiffNoteInput!): UpdateImageDiffNotePayload
- updateIssue(input: UpdateIssueInput!): UpdateIssuePayload
- updateIteration(input: UpdateIterationInput!): UpdateIterationPayload
- updateNamespacePackageSettings(input: UpdateNamespacePackageSettingsInput!): UpdateNamespacePackageSettingsPayload
-
- """
- Updates a Note. If the body of the Note contains only quick actions, the Note
- will be destroyed during the update, and no Note will be returned
- """
- updateNote(input: UpdateNoteInput!): UpdateNotePayload
- updateRequirement(input: UpdateRequirementInput!): UpdateRequirementPayload
- updateSnippet(input: UpdateSnippetInput!): UpdateSnippetPayload
- vulnerabilityConfirm(input: VulnerabilityConfirmInput!): VulnerabilityConfirmPayload
- vulnerabilityDismiss(input: VulnerabilityDismissInput!): VulnerabilityDismissPayload
- vulnerabilityExternalIssueLinkCreate(input: VulnerabilityExternalIssueLinkCreateInput!): VulnerabilityExternalIssueLinkCreatePayload
- vulnerabilityExternalIssueLinkDestroy(input: VulnerabilityExternalIssueLinkDestroyInput!): VulnerabilityExternalIssueLinkDestroyPayload
- vulnerabilityResolve(input: VulnerabilityResolveInput!): VulnerabilityResolvePayload
- vulnerabilityRevertToDetected(input: VulnerabilityRevertToDetectedInput!): VulnerabilityRevertToDetectedPayload
-}
-
-"""
-Different toggles for changing mutator behavior
-"""
-enum MutationOperationMode {
- """
- Performs an append operation
- """
- APPEND
-
- """
- Performs a removal operation
- """
- REMOVE
-
- """
- Performs a replace operation
- """
- REPLACE
-}
-
-type Namespace {
- """
- Size limit for repositories in the namespace in bytes.
- """
- actualRepositorySizeLimit: Float
-
- """
- Additional storage purchased for the root namespace in bytes.
- """
- additionalPurchasedStorageSize: Float
-
- """
- Compliance frameworks available to projects in this namespace. Available only
- when feature flag `ff_custom_compliance_frameworks` is enabled.
- """
- complianceFrameworks(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Global ID of a specific compliance framework to return.
- """
- id: ComplianceManagementFrameworkID
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ComplianceFrameworkConnection
-
- """
- Includes at least one project where the repository size exceeds the limit.
- """
- containsLockedProjects: Boolean!
-
- """
- Description of the namespace.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Full name of the namespace.
- """
- fullName: String!
-
- """
- Full path of the namespace.
- """
- fullPath: ID!
-
- """
- ID of the namespace.
- """
- id: ID!
-
- """
- Status of the temporary storage increase.
- """
- isTemporaryStorageIncreaseEnabled: Boolean!
-
- """
- Indicates if Large File Storage (LFS) is enabled for namespace.
- """
- lfsEnabled: Boolean
-
- """
- Name of the namespace.
- """
- name: String!
-
- """
- The package settings for the namespace.
- """
- packageSettings: PackageSettings
-
- """
- Path of the namespace.
- """
- path: String!
-
- """
- Projects within this namespace.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns only the projects which have vulnerabilities.
- """
- hasVulnerabilities: Boolean = false
-
- """
- Include also subgroup projects.
- """
- includeSubgroups: Boolean = false
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Search project with most similar names or paths.
- """
- search: String = null
-
- """
- Sort projects by this criteria.
- """
- sort: NamespaceProjectSort = null
- ): ProjectConnection!
-
- """
- Number of projects in the root namespace where the repository size exceeds the limit.
- """
- repositorySizeExcessProjectCount: Int!
-
- """
- Indicates if users can request access to namespace.
- """
- requestAccessEnabled: Boolean
-
- """
- Aggregated storage statistics of the namespace. Only available for root namespaces.
- """
- rootStorageStatistics: RootStorageStatistics
-
- """
- Total storage limit of the root namespace in bytes.
- """
- storageSizeLimit: Float
-
- """
- Date until the temporary storage increase is active.
- """
- temporaryStorageIncreaseEndsOn: Time
-
- """
- Total repository size of all projects in the root namespace in bytes.
- """
- totalRepositorySize: Float
-
- """
- Total excess repository size of all projects in the root namespace in bytes.
- """
- totalRepositorySizeExcess: Float
-
- """
- Visibility of the namespace.
- """
- visibility: String
-}
-
-"""
-The connection type for Namespace.
-"""
-type NamespaceConnection {
- """
- A list of edges.
- """
- edges: [NamespaceEdge]
-
- """
- A list of nodes.
- """
- nodes: [Namespace]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type NamespaceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Namespace
-}
-
-"""
-Identifier of Namespace.
-"""
-scalar NamespaceID
-
-"""
-Autogenerated input type of NamespaceIncreaseStorageTemporarily
-"""
-input NamespaceIncreaseStorageTemporarilyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the namespace to mutate.
- """
- id: NamespaceID!
-}
-
-"""
-Autogenerated return type of NamespaceIncreaseStorageTemporarily
-"""
-type NamespaceIncreaseStorageTemporarilyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The namespace after mutation.
- """
- namespace: Namespace
-}
-
-"""
-Values for sorting projects
-"""
-enum NamespaceProjectSort {
- """
- Most similar to the search query
- """
- SIMILARITY
-
- """
- Sort by storage size
- """
- STORAGE
-}
-
-input NegatedBoardIssueInput {
- """
- Filter by assignee username.
- """
- assigneeUsername: [String]
-
- """
- Filter by author username.
- """
- authorUsername: String
-
- """
- Filter by epic ID. Incompatible with epicWildcardId.
- """
- epicId: EpicID
-
- """
- Filter by iteration title.
- """
- iterationTitle: String
-
- """
- Filter by label name.
- """
- labelName: [String]
-
- """
- Filter by milestone title.
- """
- milestoneTitle: String
-
- """
- Filter by reaction emoji.
- """
- myReactionEmoji: String
-
- """
- Filter by release tag.
- """
- releaseTag: String
-
- """
- Filter by weight.
- """
- weight: String
-}
-
-type Note implements ResolvableInterface {
- """
- User who wrote this note.
- """
- author: User!
-
- """
- Content of the note.
- """
- body: String!
-
- """
- The GitLab Flavored Markdown rendering of `note`
- """
- bodyHtml: String
-
- """
- Indicates if this note is confidential.
- """
- confidential: Boolean
-
- """
- Timestamp of the note creation.
- """
- createdAt: Time!
-
- """
- The discussion this note is a part of.
- """
- discussion: Discussion
-
- """
- ID of the note.
- """
- id: NoteID!
-
- """
- The position of this note on a diff.
- """
- position: DiffPosition
-
- """
- Project associated with the note.
- """
- project: Project
-
- """
- Indicates if the object can be resolved.
- """
- resolvable: Boolean!
-
- """
- Indicates if the object is resolved.
- """
- resolved: Boolean!
-
- """
- Timestamp of when the object was resolved.
- """
- resolvedAt: Time
-
- """
- User who resolved the object.
- """
- resolvedBy: User
-
- """
- Indicates whether this note was created by the system or by a user.
- """
- system: Boolean!
-
- """
- Name of the icon corresponding to a system note.
- """
- systemNoteIconName: String
-
- """
- Timestamp of the note's last activity.
- """
- updatedAt: Time!
-
- """
- URL to view this Note in the Web UI.
- """
- url: String
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: NotePermissions!
-}
-
-"""
-The connection type for Note.
-"""
-type NoteConnection {
- """
- A list of edges.
- """
- edges: [NoteEdge]
-
- """
- A list of nodes.
- """
- nodes: [Note]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type NoteEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Note
-}
-
-"""
-Identifier of Note.
-"""
-scalar NoteID
-
-type NotePermissions {
- """
- Indicates the user can perform `admin_note` on this resource
- """
- adminNote: Boolean!
-
- """
- Indicates the user can perform `award_emoji` on this resource
- """
- awardEmoji: Boolean!
-
- """
- Indicates the user can perform `create_note` on this resource
- """
- createNote: Boolean!
-
- """
- Indicates the user can perform `read_note` on this resource
- """
- readNote: Boolean!
-
- """
- Indicates the user can perform `reposition_note` on this resource
- """
- repositionNote: Boolean!
-
- """
- Indicates the user can perform `resolve_note` on this resource
- """
- resolveNote: Boolean!
-}
-
-interface Noteable {
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-}
-
-"""
-Identifier of Noteable.
-"""
-scalar NoteableID
-
-"""
-The rotation participant and color palette
-"""
-type OncallParticipantType {
- """
- The color palette to assign to the on-call user. For example "blue".
- """
- colorPalette: String
-
- """
- The color weight to assign to for the on-call user, for example "500". Max 4 chars. For easy identification of the user.
- """
- colorWeight: String
-
- """
- ID of the on-call participant.
- """
- id: IncidentManagementOncallParticipantID!
-
- """
- The user who is participating.
- """
- user: User!
-}
-
-"""
-The connection type for OncallParticipantType.
-"""
-type OncallParticipantTypeConnection {
- """
- A list of edges.
- """
- edges: [OncallParticipantTypeEdge]
-
- """
- A list of nodes.
- """
- nodes: [OncallParticipantType]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type OncallParticipantTypeEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: OncallParticipantType
-}
-
-"""
-Autogenerated input type of OncallRotationCreate
-"""
-input OncallRotationCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The name of the on-call rotation.
- """
- name: String!
-
- """
- The usernames of users participating in the on-call rotation.
- """
- participants: [OncallUserInputType!]!
-
- """
- The project to create the on-call schedule in.
- """
- projectPath: ID!
-
- """
- The rotation length of the on-call rotation.
- """
- rotationLength: OncallRotationLengthInputType!
-
- """
- The IID of the on-call schedule to create the on-call rotation in.
- """
- scheduleIid: String!
-
- """
- The start date and time of the on-call rotation, in the timezone of the on-call schedule.
- """
- startsAt: OncallRotationDateInputType!
-}
-
-"""
-Autogenerated return type of OncallRotationCreate
-"""
-type OncallRotationCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The on-call rotation.
- """
- oncallRotation: IncidentManagementOncallRotation
-}
-
-"""
-Date input type for on-call rotation
-"""
-input OncallRotationDateInputType {
- """
- The date component of the date in YYYY-MM-DD format.
- """
- date: String!
-
- """
- The time component of the date in 24hr HH:MM format.
- """
- time: String!
-}
-
-"""
-Autogenerated input type of OncallRotationDestroy
-"""
-input OncallRotationDestroyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the on-call rotation to remove.
- """
- id: IncidentManagementOncallRotationID!
-
- """
- The project to remove the on-call schedule from.
- """
- projectPath: ID!
-
- """
- The IID of the on-call schedule to the on-call rotation belongs to.
- """
- scheduleIid: String!
-}
-
-"""
-Autogenerated return type of OncallRotationDestroy
-"""
-type OncallRotationDestroyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The on-call rotation.
- """
- oncallRotation: IncidentManagementOncallRotation
-}
-
-"""
-The rotation length of the on-call rotation
-"""
-input OncallRotationLengthInputType {
- """
- The rotation length of the on-call rotation.
- """
- length: Int!
-
- """
- The unit of the rotation length of the on-call rotation.
- """
- unit: OncallRotationUnitEnum!
-}
-
-"""
-Rotation length unit of an on-call rotation
-"""
-enum OncallRotationUnitEnum {
- """
- Days
- """
- DAYS
-
- """
- Hours
- """
- HOURS
-
- """
- Weeks
- """
- WEEKS
-}
-
-"""
-Autogenerated input type of OncallScheduleCreate
-"""
-input OncallScheduleCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The description of the on-call schedule.
- """
- description: String
-
- """
- The name of the on-call schedule.
- """
- name: String!
-
- """
- The project to create the on-call schedule in.
- """
- projectPath: ID!
-
- """
- The timezone of the on-call schedule.
- """
- timezone: String!
-}
-
-"""
-Autogenerated return type of OncallScheduleCreate
-"""
-type OncallScheduleCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The on-call schedule.
- """
- oncallSchedule: IncidentManagementOncallSchedule
-}
-
-"""
-Autogenerated input type of OncallScheduleDestroy
-"""
-input OncallScheduleDestroyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The on-call schedule internal ID to remove.
- """
- iid: String!
-
- """
- The project to remove the on-call schedule from.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of OncallScheduleDestroy
-"""
-type OncallScheduleDestroyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The on-call schedule.
- """
- oncallSchedule: IncidentManagementOncallSchedule
-}
-
-"""
-Autogenerated input type of OncallScheduleUpdate
-"""
-input OncallScheduleUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The description of the on-call schedule.
- """
- description: String
-
- """
- The on-call schedule internal ID to update.
- """
- iid: String!
-
- """
- The name of the on-call schedule.
- """
- name: String
-
- """
- The project to update the on-call schedule in.
- """
- projectPath: ID!
-
- """
- The timezone of the on-call schedule.
- """
- timezone: String
-}
-
-"""
-Autogenerated return type of OncallScheduleUpdate
-"""
-type OncallScheduleUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The on-call schedule.
- """
- oncallSchedule: IncidentManagementOncallSchedule
-}
-
-"""
-The rotation user and color palette
-"""
-input OncallUserInputType {
- """
- A value of DataVisualizationColorEnum. The color from the palette to assign to the on-call user.
- """
- colorPalette: DataVisualizationColorEnum
-
- """
- A value of DataVisualizationWeightEnum. The color weight to assign to for the on-call user.
- """
- colorWeight: DataVisualizationWeightEnum
-
- """
- The username of the user to participate in the on-call rotation, such as `user_one`.
- """
- username: String!
-}
-
-"""
-Represents a package in the Package Registry
-"""
-type Package {
- """
- Date of creation.
- """
- createdAt: Time!
-
- """
- ID of the package.
- """
- id: PackagesPackageID!
-
- """
- Package metadata.
- """
- metadata: PackageMetadata
-
- """
- Name of the package.
- """
- name: String!
-
- """
- Package type.
- """
- packageType: PackageTypeEnum!
-
- """
- Pipelines that built the package.
- """
- pipelines(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PipelineConnection
-
- """
- Project where the package is stored.
- """
- project: Project!
-
- """
- Package tags.
- """
- tags(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PackageTagConnection
-
- """
- Date of most recent update.
- """
- updatedAt: Time!
-
- """
- Version string.
- """
- version: String
-
- """
- The other versions of the package.
- """
- versions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PackageWithoutVersionsConnection
-}
-
-"""
-Represents a composer JSON file
-"""
-type PackageComposerJsonType {
- """
- The license set in the Composer JSON file.
- """
- license: String
-
- """
- The name set in the Composer JSON file.
- """
- name: String
-
- """
- The type set in the Composer JSON file.
- """
- type: String
-
- """
- The version set in the Composer JSON file.
- """
- version: String
-}
-
-"""
-The connection type for Package.
-"""
-type PackageConnection {
- """
- A list of edges.
- """
- edges: [PackageEdge]
-
- """
- A list of nodes.
- """
- nodes: [Package]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type PackageEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Package
-}
-
-"""
-Represents the Geo sync and verification state of a package file
-"""
-type PackageFileRegistry {
- """
- Timestamp when the PackageFileRegistry was created
- """
- createdAt: Time
-
- """
- ID of the PackageFileRegistry
- """
- id: ID!
-
- """
- Error message during sync of the PackageFileRegistry
- """
- lastSyncFailure: String
-
- """
- Timestamp of the most recent successful sync of the PackageFileRegistry
- """
- lastSyncedAt: Time
-
- """
- ID of the PackageFile.
- """
- packageFileId: ID!
-
- """
- Timestamp after which the PackageFileRegistry should be resynced
- """
- retryAt: Time
-
- """
- Number of consecutive failed sync attempts of the PackageFileRegistry
- """
- retryCount: Int
-
- """
- Sync state of the PackageFileRegistry
- """
- state: RegistryState
-}
-
-"""
-The connection type for PackageFileRegistry.
-"""
-type PackageFileRegistryConnection {
- """
- A list of edges.
- """
- edges: [PackageFileRegistryEdge]
-
- """
- A list of nodes.
- """
- nodes: [PackageFileRegistry]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type PackageFileRegistryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: PackageFileRegistry
-}
-
-"""
-Represents metadata associated with a Package
-"""
-union PackageMetadata = ComposerMetadata
-
-"""
-Namespace-level Package Registry settings
-"""
-type PackageSettings {
- """
- When maven_duplicates_allowed is false, you can publish duplicate packages
- with names that match this regex. Otherwise, this setting has no effect.
- """
- mavenDuplicateExceptionRegex: UntrustedRegexp
-
- """
- Indicates whether duplicate Maven packages are allowed for this namespace.
- """
- mavenDuplicatesAllowed: Boolean!
-}
-
-"""
-Represents a package tag
-"""
-type PackageTag {
- """
- The created date.
- """
- createdAt: Time!
-
- """
- The ID of the tag.
- """
- id: ID!
-
- """
- The name of the tag.
- """
- name: String!
-
- """
- The updated date.
- """
- updatedAt: Time!
-}
-
-"""
-The connection type for PackageTag.
-"""
-type PackageTagConnection {
- """
- A list of edges.
- """
- edges: [PackageTagEdge]
-
- """
- A list of nodes.
- """
- nodes: [PackageTag]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type PackageTagEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: PackageTag
-}
-
-enum PackageTypeEnum {
- """
- Packages from the Composer package manager
- """
- COMPOSER
-
- """
- Packages from the Conan package manager
- """
- CONAN
-
- """
- Packages from the Debian package manager
- """
- DEBIAN
-
- """
- Packages from the Generic package manager
- """
- GENERIC
-
- """
- Packages from the Golang package manager
- """
- GOLANG
-
- """
- Packages from the Maven package manager
- """
- MAVEN
-
- """
- Packages from the npm package manager
- """
- NPM
-
- """
- Packages from the Nuget package manager
- """
- NUGET
-
- """
- Packages from the PyPI package manager
- """
- PYPI
-
- """
- Packages from the Rubygems package manager
- """
- RUBYGEMS
-}
-
-"""
-Represents a version of a package in the Package Registry
-"""
-type PackageWithoutVersions {
- """
- Date of creation.
- """
- createdAt: Time!
-
- """
- ID of the package.
- """
- id: PackagesPackageID!
-
- """
- Package metadata.
- """
- metadata: PackageMetadata
-
- """
- Name of the package.
- """
- name: String!
-
- """
- Package type.
- """
- packageType: PackageTypeEnum!
-
- """
- Pipelines that built the package.
- """
- pipelines(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PipelineConnection
-
- """
- Project where the package is stored.
- """
- project: Project!
-
- """
- Package tags.
- """
- tags(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PackageTagConnection
-
- """
- Date of most recent update.
- """
- updatedAt: Time!
-
- """
- Version string.
- """
- version: String
-}
-
-"""
-The connection type for PackageWithoutVersions.
-"""
-type PackageWithoutVersionsConnection {
- """
- A list of edges.
- """
- edges: [PackageWithoutVersionsEdge]
-
- """
- A list of nodes.
- """
- nodes: [PackageWithoutVersions]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type PackageWithoutVersionsEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: PackageWithoutVersions
-}
-
-"""
-Identifier of Packages::Package.
-"""
-scalar PackagesPackageID
-
-"""
-Information about pagination in a connection.
-"""
-type PageInfo {
- """
- When paginating forwards, the cursor to continue.
- """
- endCursor: String
-
- """
- When paginating forwards, are there more items?
- """
- hasNextPage: Boolean!
-
- """
- When paginating backwards, are there more items?
- """
- hasPreviousPage: Boolean!
-
- """
- When paginating backwards, the cursor to continue.
- """
- startCursor: String
-}
-
-type Pipeline {
- """
- Indicates if the pipeline is active.
- """
- active: Boolean!
-
- """
- Base SHA of the source branch.
- """
- beforeSha: String
-
- """
- Specifies if a pipeline can be canceled.
- """
- cancelable: Boolean!
-
- """
- Timestamp of the pipeline's commit.
- """
- committedAt: Time
-
- """
- Configuration source of the pipeline (UNKNOWN_SOURCE, REPOSITORY_SOURCE,
- AUTO_DEVOPS_SOURCE, WEBIDE_SOURCE, REMOTE_SOURCE, EXTERNAL_PROJECT_SOURCE,
- BRIDGE_SOURCE, PARAMETER_SOURCE, COMPLIANCE_SOURCE)
- """
- configSource: PipelineConfigSourceEnum
-
- """
- Coverage percentage.
- """
- coverage: Float
-
- """
- Timestamp of the pipeline's creation.
- """
- createdAt: Time!
-
- """
- Detailed status of the pipeline.
- """
- detailedStatus: DetailedStatus!
-
- """
- Pipelines this pipeline will trigger.
- """
- downstream(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PipelineConnection
-
- """
- Duration of the pipeline in seconds.
- """
- duration: Int
-
- """
- Timestamp of the pipeline's completion.
- """
- finishedAt: Time
-
- """
- ID of the pipeline.
- """
- id: ID!
-
- """
- Internal ID of the pipeline.
- """
- iid: String!
-
- """
- Jobs belonging to the pipeline.
- """
- jobs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter jobs by the type of security report they produce.
- """
- securityReportTypes: [SecurityReportTypeEnum!]
- ): CiJobConnection
-
- """
- Relative path to the pipeline's page.
- """
- path: String
-
- """
- Project the pipeline belongs to.
- """
- project: Project
-
- """
- Specifies if a pipeline can be retried.
- """
- retryable: Boolean!
-
- """
- Vulnerability and scanned resource counts for each security scanner of the pipeline.
- """
- securityReportSummary: SecurityReportSummary
-
- """
- SHA of the pipeline's commit.
- """
- sha: String!
-
- """
- Job where pipeline was triggered from.
- """
- sourceJob: CiJob
-
- """
- Stages of the pipeline.
- """
- stages(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): CiStageConnection
-
- """
- Timestamp when the pipeline was started.
- """
- startedAt: Time
-
- """
- Status of the pipeline (CREATED, WAITING_FOR_RESOURCE, PREPARING, PENDING,
- RUNNING, FAILED, SUCCESS, CANCELED, SKIPPED, MANUAL, SCHEDULED)
- """
- status: PipelineStatusEnum!
-
- """
- Timestamp of the pipeline's last activity.
- """
- updatedAt: Time!
-
- """
- Pipeline that triggered the pipeline.
- """
- upstream: Pipeline
-
- """
- Pipeline user.
- """
- user: User
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: PipelinePermissions!
-
- """
- Indicates if a pipeline has warnings.
- """
- warnings: Boolean!
-}
-
-type PipelineAnalytics {
- """
- Labels for the monthly pipeline count.
- """
- monthPipelinesLabels: [String!]
-
- """
- Total monthly successful pipeline count.
- """
- monthPipelinesSuccessful: [Int!]
-
- """
- Total monthly pipeline count.
- """
- monthPipelinesTotals: [Int!]
-
- """
- Pipeline times labels.
- """
- pipelineTimesLabels: [String!]
-
- """
- Pipeline times.
- """
- pipelineTimesValues: [Int!]
-
- """
- Labels for the weekly pipeline count.
- """
- weekPipelinesLabels: [String!]
-
- """
- Total weekly successful pipeline count.
- """
- weekPipelinesSuccessful: [Int!]
-
- """
- Total weekly pipeline count.
- """
- weekPipelinesTotals: [Int!]
-
- """
- Labels for the yearly pipeline count.
- """
- yearPipelinesLabels: [String!]
-
- """
- Total yearly successful pipeline count.
- """
- yearPipelinesSuccessful: [Int!]
-
- """
- Total yearly pipeline count.
- """
- yearPipelinesTotals: [Int!]
-}
-
-"""
-Autogenerated input type of PipelineCancel
-"""
-input PipelineCancelInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the pipeline to mutate.
- """
- id: CiPipelineID!
-}
-
-"""
-Autogenerated return type of PipelineCancel
-"""
-type PipelineCancelPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-enum PipelineConfigSourceEnum {
- AUTO_DEVOPS_SOURCE
- BRIDGE_SOURCE
- COMPLIANCE_SOURCE
- EXTERNAL_PROJECT_SOURCE
- PARAMETER_SOURCE
- REMOTE_SOURCE
- REPOSITORY_SOURCE
- UNKNOWN_SOURCE
- WEBIDE_SOURCE
-}
-
-"""
-The connection type for Pipeline.
-"""
-type PipelineConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [PipelineEdge]
-
- """
- A list of nodes.
- """
- nodes: [Pipeline]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of PipelineDestroy
-"""
-input PipelineDestroyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the pipeline to mutate.
- """
- id: CiPipelineID!
-}
-
-"""
-Autogenerated return type of PipelineDestroy
-"""
-type PipelineDestroyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type PipelineEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Pipeline
-}
-
-type PipelinePermissions {
- """
- Indicates the user can perform `admin_pipeline` on this resource
- """
- adminPipeline: Boolean!
-
- """
- Indicates the user can perform `destroy_pipeline` on this resource
- """
- destroyPipeline: Boolean!
-
- """
- Indicates the user can perform `update_pipeline` on this resource
- """
- updatePipeline: Boolean!
-}
-
-"""
-Autogenerated input type of PipelineRetry
-"""
-input PipelineRetryInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the pipeline to mutate.
- """
- id: CiPipelineID!
-}
-
-"""
-Autogenerated return type of PipelineRetry
-"""
-type PipelineRetryPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The pipeline after mutation.
- """
- pipeline: Pipeline
-}
-
-enum PipelineStatusEnum {
- CANCELED
- CREATED
- FAILED
- MANUAL
- PENDING
- PREPARING
- RUNNING
- SCHEDULED
- SKIPPED
- SUCCESS
- WAITING_FOR_RESOURCE
-}
-
-type Project {
- """
- Size limit for the repository in bytes.
- """
- actualRepositorySizeLimit: Float
-
- """
- A single Alert Management alert of the project.
- """
- alertManagementAlert(
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Filter query for given domain.
- """
- domain: AlertManagementDomainFilter! = operations
-
- """
- IID of the alert. For example, "1".
- """
- iid: String
-
- """
- Search query for title, description, service, or monitoring_tool.
- """
- search: String
-
- """
- Sort alerts by this criteria.
- """
- sort: AlertManagementAlertSort
-
- """
- Alerts with the specified statues. For example, [TRIGGERED].
- """
- statuses: [AlertManagementStatus!]
- ): AlertManagementAlert
-
- """
- Counts of alerts by status for the project.
- """
- alertManagementAlertStatusCounts(
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Search query for title, description, service, or monitoring_tool.
- """
- search: String
- ): AlertManagementAlertStatusCountsType
-
- """
- Alert Management alerts of the project.
- """
- alertManagementAlerts(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Filter query for given domain.
- """
- domain: AlertManagementDomainFilter! = operations
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the alert. For example, "1".
- """
- iid: String
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Search query for title, description, service, or monitoring_tool.
- """
- search: String
-
- """
- Sort alerts by this criteria.
- """
- sort: AlertManagementAlertSort
-
- """
- Alerts with the specified statues. For example, [TRIGGERED].
- """
- statuses: [AlertManagementStatus!]
- ): AlertManagementAlertConnection
-
- """
- Integrations which can receive alerts for the project.
- """
- alertManagementIntegrations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): AlertManagementIntegrationConnection
-
- """
- Extract alert fields from payload for custom mapping.
- """
- alertManagementPayloadFields(
- """
- Sample payload for extracting alert fields for custom mappings.
- """
- payloadExample: String!
- ): [AlertManagementPayloadAlertField!]
-
- """
- If `only_allow_merge_if_pipeline_succeeds` is true, indicates if merge
- requests of the project can also be merged with skipped jobs.
- """
- allowMergeOnSkippedPipeline: Boolean
-
- """
- API fuzzing configuration for the project. Available only when feature flag `api_fuzzing_configuration_ui` is enabled.
- """
- apiFuzzingCiConfiguration: ApiFuzzingCiConfiguration
-
- """
- Indicates the archived status of the project.
- """
- archived: Boolean
-
- """
- Indicates if issues referenced by merge requests and commits within the default branch are closed automatically.
- """
- autocloseReferencedIssues: Boolean
-
- """
- URL to avatar image file of the project.
- """
- avatarUrl: String
-
- """
- A single board of the project.
- """
- board(
- """
- The board's ID.
- """
- id: BoardID!
- ): Board
-
- """
- Boards of the project.
- """
- boards(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Find a board by its ID.
- """
- id: BoardID
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): BoardConnection
-
- """
- CI/CD settings for the project.
- """
- ciCdSettings: ProjectCiCdSetting
-
- """
- Find a single cluster agent by name.
- """
- clusterAgent(
- """
- Name of the cluster agent.
- """
- name: String!
- ): ClusterAgent
-
- """
- Cluster agents associated with the project.
- """
- clusterAgents(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ClusterAgentConnection
-
- """
- Code coverage summary associated with the project.
- """
- codeCoverageSummary: CodeCoverageSummary
-
- """
- Compliance frameworks associated with the project.
- """
- complianceFrameworks(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ComplianceFrameworkConnection
-
- """
- The container expiration policy of the project.
- """
- containerExpirationPolicy: ContainerExpirationPolicy
-
- """
- Indicates if the project stores Docker container images in a container registry.
- """
- containerRegistryEnabled: Boolean
-
- """
- Container repositories of the project.
- """
- containerRepositories(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter the container repositories by their name.
- """
- name: String
-
- """
- Sort container repositories by this criteria.
- """
- sort: ContainerRepositorySort = created_desc
- ): ContainerRepositoryConnection
-
- """
- Number of container repositories in the project.
- """
- containerRepositoriesCount: Int!
-
- """
- Timestamp of the project creation.
- """
- createdAt: Time
-
- """
- DAST Profiles associated with the project. Always returns no nodes if `dast_saved_scans` is disabled.
- """
- dastProfiles(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DastProfileConnection
-
- """
- The DAST scanner profiles associated with the project.
- """
- dastScannerProfiles(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DastScannerProfileConnection
-
- """
- DAST Site Profile associated with the project.
- """
- dastSiteProfile(
- """
- ID of the site profile.
- """
- id: DastSiteProfileID!
- ): DastSiteProfile
-
- """
- DAST Site Profiles associated with the project.
- """
- dastSiteProfiles(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DastSiteProfileConnection
-
- """
- DAST Site Validations associated with the project. Always returns no nodes if
- `security_on_demand_scans_site_validation` is disabled.
- """
- dastSiteValidations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Normalized URL of the target to be scanned.
- """
- normalizedTargetUrls: [String!]
- ): DastSiteValidationConnection
-
- """
- Short description of the project.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- A single environment of the project.
- """
- environment(
- """
- Name of the environment.
- """
- name: String
-
- """
- Search query for environment name.
- """
- search: String
-
- """
- States of environments that should be included in result.
- """
- states: [String!]
- ): Environment
-
- """
- Environments of the project.
- """
- environments(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Name of the environment.
- """
- name: String
-
- """
- Search query for environment name.
- """
- search: String
-
- """
- States of environments that should be included in result.
- """
- states: [String!]
- ): EnvironmentConnection
-
- """
- Number of times the project has been forked.
- """
- forksCount: Int!
-
- """
- Full path of the project.
- """
- fullPath: ID!
-
- """
- Grafana integration details for the project.
- """
- grafanaIntegration: GrafanaIntegration
-
- """
- Group of the project.
- """
- group: Group
-
- """
- URL to connect to the project via HTTPS.
- """
- httpUrlToRepo: String
-
- """
- ID of the project.
- """
- id: ID!
-
- """
- Status of import background job of the project.
- """
- importStatus: String
-
- """
- Incident Management On-call schedules of the project.
- """
- incidentManagementOncallSchedules(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): IncidentManagementOncallScheduleConnection
-
- """
- A single issue of the project.
- """
- issue(
- """
- ID of a user assigned to the issues, "none" and "any" values are supported.
- """
- assigneeId: String
-
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Usernames of users assigned to the issue.
- """
- assigneeUsernames: [String!]
-
- """
- Username of the author of the issue.
- """
- authorUsername: String
-
- """
- Issues closed after this date.
- """
- closedAfter: Time
-
- """
- Issues closed before this date.
- """
- closedBefore: Time
-
- """
- Issues created after this date.
- """
- createdAfter: Time
-
- """
- Issues created before this date.
- """
- createdBefore: Time
-
- """
- ID of an epic associated with the issues, "none" and "any" values are supported.
- """
- epicId: String
-
- """
- IID of the issue. For example, "1".
- """
- iid: String
-
- """
- List of IIDs of issues. For example, [1, 2].
- """
- iids: [String!]
-
- """
- Iterations applied to the issue.
- """
- iterationId: [ID]
-
- """
- Labels applied to this issue.
- """
- labelName: [String]
-
- """
- Milestone applied to this issue.
- """
- milestoneTitle: [String]
-
- """
- Search query for issue title or description.
- """
- search: String
-
- """
- Sort issues by this criteria.
- """
- sort: IssueSort = created_desc
-
- """
- Current state of this issue.
- """
- state: IssuableState
-
- """
- Filter issues by the given issue types.
- """
- types: [IssueType!]
-
- """
- Issues updated after this date.
- """
- updatedAfter: Time
-
- """
- Issues updated before this date.
- """
- updatedBefore: Time
- ): Issue
-
- """
- Counts of issues by status for the project.
- """
- issueStatusCounts(
- """
- ID of a user assigned to the issues, "none" and "any" values are supported.
- """
- assigneeId: String
-
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Usernames of users assigned to the issue.
- """
- assigneeUsernames: [String!]
-
- """
- Username of the author of the issue.
- """
- authorUsername: String
-
- """
- Issues closed after this date.
- """
- closedAfter: Time
-
- """
- Issues closed before this date.
- """
- closedBefore: Time
-
- """
- Issues created after this date.
- """
- createdAfter: Time
-
- """
- Issues created before this date.
- """
- createdBefore: Time
-
- """
- IID of the issue. For example, "1".
- """
- iid: String
-
- """
- List of IIDs of issues. For example, [1, 2].
- """
- iids: [String!]
-
- """
- Labels applied to this issue.
- """
- labelName: [String]
-
- """
- Milestone applied to this issue.
- """
- milestoneTitle: [String]
-
- """
- Search query for issue title or description.
- """
- search: String
-
- """
- Filter issues by the given issue types.
- """
- types: [IssueType!]
-
- """
- Issues updated after this date.
- """
- updatedAfter: Time
-
- """
- Issues updated before this date.
- """
- updatedBefore: Time
- ): IssueStatusCountsType
-
- """
- Issues of the project.
- """
- issues(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- ID of a user assigned to the issues, "none" and "any" values are supported.
- """
- assigneeId: String
-
- """
- Username of a user assigned to the issue.
- """
- assigneeUsername: String
-
- """
- Usernames of users assigned to the issue.
- """
- assigneeUsernames: [String!]
-
- """
- Username of the author of the issue.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Issues closed after this date.
- """
- closedAfter: Time
-
- """
- Issues closed before this date.
- """
- closedBefore: Time
-
- """
- Issues created after this date.
- """
- createdAfter: Time
-
- """
- Issues created before this date.
- """
- createdBefore: Time
-
- """
- ID of an epic associated with the issues, "none" and "any" values are supported.
- """
- epicId: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the issue. For example, "1".
- """
- iid: String
-
- """
- List of IIDs of issues. For example, [1, 2].
- """
- iids: [String!]
-
- """
- Iterations applied to the issue.
- """
- iterationId: [ID]
-
- """
- Labels applied to this issue.
- """
- labelName: [String]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Milestone applied to this issue.
- """
- milestoneTitle: [String]
-
- """
- Search query for issue title or description.
- """
- search: String
-
- """
- Sort issues by this criteria.
- """
- sort: IssueSort = created_desc
-
- """
- Current state of this issue.
- """
- state: IssuableState
-
- """
- Filter issues by the given issue types.
- """
- types: [IssueType!]
-
- """
- Issues updated after this date.
- """
- updatedAfter: Time
-
- """
- Issues updated before this date.
- """
- updatedBefore: Time
- ): IssueConnection
-
- """
- Indicates if Issues are enabled for the current user
- """
- issuesEnabled: Boolean
-
- """
- Find iterations.
- """
- iterations(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Global ID of the Iteration to look up.
- """
- id: ID
-
- """
- Internal ID of the Iteration to look up.
- """
- iid: ID
-
- """
- Whether to include ancestor iterations. Defaults to true.
- """
- includeAncestors: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter iterations by state.
- """
- state: IterationState
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
-
- """
- Fuzzy search by title.
- """
- title: String
- ): IterationConnection
-
- """
- Status of Jira import background job of the project.
- """
- jiraImportStatus: String
-
- """
- Jira imports into the project.
- """
- jiraImports(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): JiraImportConnection
-
- """
- Indicates if CI/CD pipeline jobs are enabled for the current user.
- """
- jobsEnabled: Boolean
-
- """
- A label available on this project.
- """
- label(
- """
- Title of the label.
- """
- title: String!
- ): Label
-
- """
- Labels available on this project.
- """
- labels(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Include labels from ancestor groups.
- """
- includeAncestorGroups: Boolean = false
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- A search term to find labels with.
- """
- searchTerm: String
- ): LabelConnection
-
- """
- Timestamp of the project last activity.
- """
- lastActivityAt: Time
-
- """
- Indicates if the project has Large File Storage (LFS) enabled.
- """
- lfsEnabled: Boolean
-
- """
- A single merge request of the project.
- """
- mergeRequest(
- """
- IID of the merge request, for example `1`.
- """
- iid: String!
- ): MergeRequest
-
- """
- Merge requests of the project.
- """
- mergeRequests(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of the assignee.
- """
- assigneeUsername: String
-
- """
- Username of the author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of IIDs of merge requests, for example `[1, 2]`.
- """
- iids: [String!]
-
- """
- Array of label names. All resolved merge requests will have all of these labels.
- """
- labels: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Merge requests merged after this date.
- """
- mergedAfter: Time
-
- """
- Merge requests merged before this date.
- """
- mergedBefore: Time
-
- """
- Title of the milestone.
- """
- milestoneTitle: String
-
- """
- Username of the reviewer.
- """
- reviewerUsername: String
-
- """
- Sort merge requests by this criteria.
- """
- sort: MergeRequestSort = created_desc
-
- """
- Array of source branch names. All resolved merge requests will have one of these branches as their source.
- """
- sourceBranches: [String!]
-
- """
- A merge request state. If provided, all resolved merge requests will have this state.
- """
- state: MergeRequestState
-
- """
- Array of target branch names. All resolved merge requests will have one of these branches as their target.
- """
- targetBranches: [String!]
- ): MergeRequestConnection
-
- """
- Indicates if Merge Requests are enabled for the current user
- """
- mergeRequestsEnabled: Boolean
-
- """
- Indicates if no merge commits should be created and all merges should instead
- be fast-forwarded, which means that merging is only allowed if the branch
- could be fast-forwarded.
- """
- mergeRequestsFfOnlyEnabled: Boolean
-
- """
- Milestones of the project.
- """
- milestones(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- A date that the milestone contains.
- """
- containingDate: Time
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.
- """
- endDate: Time
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of global milestone IDs, e.g., "gid://gitlab/Milestone/1".
- """
- ids: [ID!]
-
- """
- Also return milestones in the project's parent group and its ancestors.
- """
- includeAncestors: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- A search string for the title.
- """
- searchTitle: String
-
- """
- List items overlapping a time frame defined by startDate..endDate (if one
- date is provided, both must be present) Deprecated in 13.5: Use
- timeframe.start.
- """
- startDate: Time
-
- """
- Filter milestones by state.
- """
- state: MilestoneStateEnum
-
- """
- List items overlapping the given timeframe.
- """
- timeframe: Timeframe
-
- """
- The title of the milestone.
- """
- title: String
- ): MilestoneConnection
-
- """
- Name of the project (without namespace).
- """
- name: String!
-
- """
- Full name of the project with its namespace.
- """
- nameWithNamespace: String!
-
- """
- Namespace of the project.
- """
- namespace: Namespace
-
- """
- Indicates if merge requests of the project can only be merged when all the discussions are resolved.
- """
- onlyAllowMergeIfAllDiscussionsAreResolved: Boolean
-
- """
- Indicates if merge requests of the project can only be merged with successful jobs.
- """
- onlyAllowMergeIfPipelineSucceeds: Boolean
-
- """
- Number of open issues for the project.
- """
- openIssuesCount: Int
-
- """
- Packages of the project.
- """
- packages(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): PackageConnection
-
- """
- Path of the project.
- """
- path: String!
-
- """
- Build pipeline of the project.
- """
- pipeline(
- """
- IID of the Pipeline, e.g., "1".
- """
- iid: ID!
- ): Pipeline
-
- """
- Pipeline analytics.
- """
- pipelineAnalytics: PipelineAnalytics
-
- """
- Build pipelines of the project.
- """
- pipelines(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter pipelines by the ref they are run for.
- """
- ref: String
-
- """
- Filter pipelines by the sha of the commit they are run for.
- """
- sha: String
-
- """
- Filter pipelines by their status.
- """
- status: PipelineStatusEnum
- ): PipelineConnection
-
- """
- Indicates if a link to create or view a merge request should display after a
- push to Git repositories of the project from the command line.
- """
- printingMergeRequestLinkEnabled: Boolean
-
- """
- Members of the project.
- """
- projectMembers(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter members by the given member relations.
- """
- relations: [ProjectMemberRelation!] = [DIRECT, INHERITED]
-
- """
- Search query.
- """
- search: String
- ): MemberInterfaceConnection
-
- """
- Indicates if there is public access to pipelines and job details of the project, including output logs and artifacts.
- """
- publicJobs: Boolean
-
- """
- A single release of the project.
- """
- release(
- """
- The name of the tag associated to the release.
- """
- tagName: String!
- ): Release
-
- """
- Releases of the project.
- """
- releases(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Sort releases by this criteria.
- """
- sort: ReleaseSort = RELEASED_AT_DESC
- ): ReleaseConnection
-
- """
- Indicates if `Delete source branch` option should be enabled by default for all new merge requests of the project.
- """
- removeSourceBranchAfterMerge: Boolean
-
- """
- Git repository of the project.
- """
- repository: Repository
-
- """
- Size of repository that exceeds the limit in bytes.
- """
- repositorySizeExcess: Float
-
- """
- Indicates if users can request member access to the project.
- """
- requestAccessEnabled: Boolean
-
- """
- Find a single requirement.
- """
- requirement(
- """
- Filter requirements by author username.
- """
- authorUsername: [String!]
-
- """
- IID of the requirement, e.g., "1".
- """
- iid: ID
-
- """
- List of IIDs of requirements, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- The state of latest requirement test report.
- """
- lastTestReportState: TestReportState
-
- """
- Search query for requirement title.
- """
- search: String
-
- """
- List requirements by sort order.
- """
- sort: Sort
-
- """
- Filter requirements by state.
- """
- state: RequirementState
- ): Requirement
-
- """
- Number of requirements for the project by their state.
- """
- requirementStatesCount: RequirementStatesCount
-
- """
- Find requirements.
- """
- requirements(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Filter requirements by author username.
- """
- authorUsername: [String!]
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- IID of the requirement, e.g., "1".
- """
- iid: ID
-
- """
- List of IIDs of requirements, e.g., [1, 2].
- """
- iids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The state of latest requirement test report.
- """
- lastTestReportState: TestReportState
-
- """
- Search query for requirement title.
- """
- search: String
-
- """
- List requirements by sort order.
- """
- sort: Sort
-
- """
- Filter requirements by state.
- """
- state: RequirementState
- ): RequirementConnection
-
- """
- SAST CI configuration for the project.
- """
- sastCiConfiguration: SastCiConfiguration
-
- """
- Path to project's security dashboard.
- """
- securityDashboardPath: String
-
- """
- Information about security analyzers used in the project.
- """
- securityScanners: SecurityScanners
-
- """
- Detailed version of a Sentry error on the project.
- """
- sentryDetailedError(
- """
- ID of the Sentry issue.
- """
- id: GitlabErrorTrackingDetailedErrorID!
- ): SentryDetailedError
-
- """
- Paginated collection of Sentry errors on the project.
- """
- sentryErrors: SentryErrorCollection
-
- """
- E-mail address of the service desk.
- """
- serviceDeskAddress: String
-
- """
- Indicates if the project has service desk enabled.
- """
- serviceDeskEnabled: Boolean
-
- """
- Project services.
- """
- services(
- """
- Indicates if the service is active.
- """
- active: Boolean
-
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Class name of the service.
- """
- type: ServiceType
- ): ServiceConnection
-
- """
- Indicates if shared runners are enabled for the project.
- """
- sharedRunnersEnabled: Boolean
-
- """
- Snippets of the project.
- """
- snippets(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of global snippet ids, e.g., "gid://gitlab/ProjectSnippet/1".
- """
- ids: [SnippetID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The visibility of the snippet.
- """
- visibility: VisibilityScopesEnum
- ): SnippetConnection
-
- """
- Indicates if Snippets are enabled for the current user
- """
- snippetsEnabled: Boolean
-
- """
- Indicates if `squashReadOnly` is enabled.
- """
- squashReadOnly: Boolean!
-
- """
- URL to connect to the project via SSH.
- """
- sshUrlToRepo: String
-
- """
- Number of times the project has been starred.
- """
- starCount: Int!
-
- """
- Statistics of the project.
- """
- statistics: ProjectStatistics
-
- """
- The commit message used to apply merge request suggestions.
- """
- suggestionCommitMessage: String
-
- """
- List of project topics (not Git tags).
- """
- tagList: String
-
- """
- Find a single Terraform state by name.
- """
- terraformState(
- """
- Name of the Terraform state.
- """
- name: String!
- ): TerraformState
-
- """
- Terraform states associated with the project.
- """
- terraformStates(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): TerraformStateConnection
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: ProjectPermissions!
-
- """
- Visibility of the project.
- """
- visibility: String
-
- """
- Vulnerabilities reported on the project.
- """
- vulnerabilities(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns only the vulnerabilities which have linked issues.
- """
- hasIssues: Boolean
-
- """
- Returns only the vulnerabilities which have been resolved on default branch.
- """
- hasResolution: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by VulnerabilityScanner.externalId.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- List vulnerabilities by sort order.
- """
- sort: VulnerabilitySort = severity_desc
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilityConnection
-
- """
- Number of vulnerabilities per day for the project.
- """
- vulnerabilitiesCountByDay(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Last day for which to fetch vulnerability history.
- """
- endDate: ISO8601Date!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch vulnerability history.
- """
- startDate: ISO8601Date!
- ): VulnerabilitiesCountByDayConnection
-
- """
- Vulnerability scanners reported on the project vulnerabilities.
- """
- vulnerabilityScanners(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): VulnerabilityScannerConnection
-
- """
- Counts for each vulnerability severity in the project.
- """
- vulnerabilitySeveritiesCount(
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by scanner.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilitySeveritiesCount
-
- """
- Web URL of the project.
- """
- webUrl: String
-
- """
- Indicates if Wikis are enabled for the current user
- """
- wikiEnabled: Boolean
-}
-
-type ProjectCiCdSetting {
- """
- Whether to keep the latest builds artifacts.
- """
- keepLatestArtifact: Boolean
-
- """
- Whether merge pipelines are enabled.
- """
- mergePipelinesEnabled: Boolean
-
- """
- Whether merge trains are enabled.
- """
- mergeTrainsEnabled: Boolean
-
- """
- Project the CI/CD settings belong to.
- """
- project: Project
-}
-
-"""
-The connection type for Project.
-"""
-type ProjectConnection {
- """
- A list of edges.
- """
- edges: [ProjectEdge]
-
- """
- A list of nodes.
- """
- nodes: [Project]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ProjectEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Project
-}
-
-"""
-Identifier of Project.
-"""
-scalar ProjectID
-
-"""
-Represents a Project Membership
-"""
-type ProjectMember implements MemberInterface {
- """
- GitLab::Access level.
- """
- accessLevel: AccessLevel
-
- """
- Date and time the membership was created.
- """
- createdAt: Time
-
- """
- User that authorized membership.
- """
- createdBy: User
-
- """
- Date and time the membership expires.
- """
- expiresAt: Time
-
- """
- ID of the member.
- """
- id: ID!
-
- """
- Project that User is a member of.
- """
- project: Project
-
- """
- Date and time the membership was last updated.
- """
- updatedAt: Time
-
- """
- User that is associated with the member object.
- """
- user: User!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: ProjectPermissions!
-}
-
-"""
-The connection type for ProjectMember.
-"""
-type ProjectMemberConnection {
- """
- A list of edges.
- """
- edges: [ProjectMemberEdge]
-
- """
- A list of nodes.
- """
- nodes: [ProjectMember]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ProjectMemberEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ProjectMember
-}
-
-"""
-Project member relation
-"""
-enum ProjectMemberRelation {
- """
- Descendants members
- """
- DESCENDANTS
-
- """
- Direct members
- """
- DIRECT
-
- """
- Inherited members
- """
- INHERITED
-
- """
- Invited Groups members
- """
- INVITED_GROUPS
-}
-
-type ProjectPermissions {
- """
- Indicates the user can perform `admin_operations` on this resource
- """
- adminOperations: Boolean!
-
- """
- Indicates the user can perform `admin_project` on this resource
- """
- adminProject: Boolean!
-
- """
- Indicates the user can perform `admin_remote_mirror` on this resource
- """
- adminRemoteMirror: Boolean!
-
- """
- Indicates the user can perform `admin_wiki` on this resource
- """
- adminWiki: Boolean!
-
- """
- Indicates the user can perform `archive_project` on this resource
- """
- archiveProject: Boolean!
-
- """
- Indicates the user can perform `change_namespace` on this resource
- """
- changeNamespace: Boolean!
-
- """
- Indicates the user can perform `change_visibility_level` on this resource
- """
- changeVisibilityLevel: Boolean!
-
- """
- Indicates the user can perform `create_deployment` on this resource
- """
- createDeployment: Boolean!
-
- """
- Indicates the user can perform `create_design` on this resource
- """
- createDesign: Boolean!
-
- """
- Indicates the user can perform `create_issue` on this resource
- """
- createIssue: Boolean!
-
- """
- Indicates the user can perform `create_label` on this resource
- """
- createLabel: Boolean!
-
- """
- Indicates the user can perform `create_merge_request_from` on this resource
- """
- createMergeRequestFrom: Boolean!
-
- """
- Indicates the user can perform `create_merge_request_in` on this resource
- """
- createMergeRequestIn: Boolean!
-
- """
- Indicates the user can perform `create_pages` on this resource
- """
- createPages: Boolean!
-
- """
- Indicates the user can perform `create_pipeline` on this resource
- """
- createPipeline: Boolean!
-
- """
- Indicates the user can perform `create_pipeline_schedule` on this resource
- """
- createPipelineSchedule: Boolean!
-
- """
- Indicates the user can perform `create_snippet` on this resource
- """
- createSnippet: Boolean!
-
- """
- Indicates the user can perform `create_wiki` on this resource
- """
- createWiki: Boolean!
-
- """
- Indicates the user can perform `destroy_design` on this resource
- """
- destroyDesign: Boolean!
-
- """
- Indicates the user can perform `destroy_pages` on this resource
- """
- destroyPages: Boolean!
-
- """
- Indicates the user can perform `destroy_wiki` on this resource
- """
- destroyWiki: Boolean!
-
- """
- Indicates the user can perform `download_code` on this resource
- """
- downloadCode: Boolean!
-
- """
- Indicates the user can perform `download_wiki_code` on this resource
- """
- downloadWikiCode: Boolean!
-
- """
- Indicates the user can perform `fork_project` on this resource
- """
- forkProject: Boolean!
-
- """
- Indicates the user can perform `push_code` on this resource
- """
- pushCode: Boolean!
-
- """
- Indicates the user can perform `push_to_delete_protected_branch` on this resource
- """
- pushToDeleteProtectedBranch: Boolean!
-
- """
- Indicates the user can perform `read_commit_status` on this resource
- """
- readCommitStatus: Boolean!
-
- """
- Indicates the user can perform `read_cycle_analytics` on this resource
- """
- readCycleAnalytics: Boolean!
-
- """
- Indicates the user can perform `read_design` on this resource
- """
- readDesign: Boolean!
-
- """
- Indicates the user can perform `read_merge_request` on this resource
- """
- readMergeRequest: Boolean!
-
- """
- Indicates the user can perform `read_pages_content` on this resource
- """
- readPagesContent: Boolean!
-
- """
- Indicates the user can perform `read_project` on this resource
- """
- readProject: Boolean!
-
- """
- Indicates the user can perform `read_project_member` on this resource
- """
- readProjectMember: Boolean!
-
- """
- Indicates the user can perform `read_wiki` on this resource
- """
- readWiki: Boolean!
-
- """
- Indicates the user can perform `remove_fork_project` on this resource
- """
- removeForkProject: Boolean!
-
- """
- Indicates the user can perform `remove_pages` on this resource
- """
- removePages: Boolean!
-
- """
- Indicates the user can perform `remove_project` on this resource
- """
- removeProject: Boolean!
-
- """
- Indicates the user can perform `rename_project` on this resource
- """
- renameProject: Boolean!
-
- """
- Indicates the user can perform `request_access` on this resource
- """
- requestAccess: Boolean!
-
- """
- Indicates the user can perform `update_pages` on this resource
- """
- updatePages: Boolean!
-
- """
- Indicates the user can perform `update_wiki` on this resource
- """
- updateWiki: Boolean!
-
- """
- Indicates the user can perform `upload_file` on this resource
- """
- uploadFile: Boolean!
-}
-
-type ProjectStatistics {
- """
- Build artifacts size of the project in bytes.
- """
- buildArtifactsSize: Float!
-
- """
- Commit count of the project.
- """
- commitCount: Float!
-
- """
- Large File Storage (LFS) object size of the project in bytes.
- """
- lfsObjectsSize: Float!
-
- """
- Packages size of the project in bytes.
- """
- packagesSize: Float!
-
- """
- Repository size of the project in bytes.
- """
- repositorySize: Float!
-
- """
- Snippets size of the project in bytes.
- """
- snippetsSize: Float
-
- """
- Storage size of the project in bytes.
- """
- storageSize: Float!
-
- """
- Uploads size of the project in bytes.
- """
- uploadsSize: Float
-
- """
- Wiki size of the project in bytes.
- """
- wikiSize: Float
-}
-
-"""
-The alert condition for Prometheus
-"""
-type PrometheusAlert {
- """
- The human-readable text of the alert condition.
- """
- humanizedText: String!
-
- """
- ID of the alert condition.
- """
- id: ID!
-}
-
-"""
-Autogenerated input type of PrometheusIntegrationCreate
-"""
-input PrometheusIntegrationCreateInput {
- """
- Whether the integration is receiving alerts.
- """
- active: Boolean!
-
- """
- Endpoint at which prometheus can be queried.
- """
- apiUrl: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project to create the integration in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of PrometheusIntegrationCreate
-"""
-type PrometheusIntegrationCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The newly created integration.
- """
- integration: AlertManagementPrometheusIntegration
-}
-
-"""
-Autogenerated input type of PrometheusIntegrationResetToken
-"""
-input PrometheusIntegrationResetTokenInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the integration to mutate.
- """
- id: PrometheusServiceID!
-}
-
-"""
-Autogenerated return type of PrometheusIntegrationResetToken
-"""
-type PrometheusIntegrationResetTokenPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The newly created integration.
- """
- integration: AlertManagementPrometheusIntegration
-}
-
-"""
-Autogenerated input type of PrometheusIntegrationUpdate
-"""
-input PrometheusIntegrationUpdateInput {
- """
- Whether the integration is receiving alerts.
- """
- active: Boolean
-
- """
- Endpoint at which prometheus can be queried.
- """
- apiUrl: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The ID of the integration to mutate.
- """
- id: PrometheusServiceID!
-}
-
-"""
-Autogenerated return type of PrometheusIntegrationUpdate
-"""
-type PrometheusIntegrationUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The newly created integration.
- """
- integration: AlertManagementPrometheusIntegration
-}
-
-"""
-Identifier of PrometheusService.
-"""
-scalar PrometheusServiceID
-
-"""
-Autogenerated input type of PromoteToEpic
-"""
-input PromoteToEpicInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The group the promoted epic will belong to.
- """
- groupPath: ID
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of PromoteToEpic
-"""
-type PromoteToEpicPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The epic after issue promotion.
- """
- epic: Epic
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-type Query {
- """
- CI related settings that apply to the entire instance.
- """
- ciApplicationSettings: CiApplicationSettings
-
- """
- Get linted and processed contents of a CI config. Should not be requested more than once per request.
- """
- ciConfig(
- """
- Contents of '.gitlab-ci.yml'.
- """
- content: String!
-
- """
- Run pipeline creation simulation, or only do static check.
- """
- dryRun: Boolean
-
- """
- The project of the CI config.
- """
- projectPath: ID!
- ): CiConfig
-
- """
- Find a container repository.
- """
- containerRepository(
- """
- The global ID of the container repository.
- """
- id: ContainerRepositoryID!
- ): ContainerRepositoryDetails
-
- """
- Get information about current user.
- """
- currentUser: User
-
- """
- Fields related to design management.
- """
- designManagement: DesignManagement!
-
- """
- Get configured DevOps adoption segments on the instance.
- """
- devopsAdoptionSegments(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DevopsAdoptionSegmentConnection
-
- """
- Text to echo back.
- """
- echo(
- """
- Text to echo back.
- """
- text: String!
- ): String!
-
- """
- Find a Geo node.
- """
- geoNode(
- """
- The name of the Geo node. Defaults to the current Geo node name.
- """
- name: String
- ): GeoNode
-
- """
- Find a group.
- """
- group(
- """
- The full path of the project, group or namespace, e.g., "gitlab-org/gitlab-foss".
- """
- fullPath: ID!
- ): Group
-
- """
- Fields related to Instance Security Dashboard.
- """
- instanceSecurityDashboard: InstanceSecurityDashboard
-
- """
- Get statistics on the instance.
- """
- instanceStatisticsMeasurements(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- The type of measurement/statistics to retrieve.
- """
- identifier: MeasurementIdentifier!
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Measurement recorded after this date.
- """
- recordedAfter: Time
-
- """
- Measurement recorded before this date.
- """
- recordedBefore: Time
- ): InstanceStatisticsMeasurementConnection
-
- """
- Find an issue.
- """
- issue(
- """
- The global ID of the Issue.
- """
- id: IssueID!
- ): Issue
-
- """
- Find an iteration.
- """
- iteration(
- """
- Find an iteration by its ID.
- """
- id: IterationID!
- ): Iteration
-
- """
- Metadata about GitLab.
- """
- metadata: Metadata
-
- """
- Find a milestone.
- """
- milestone(
- """
- Find a milestone by its ID.
- """
- id: MilestoneID!
- ): Milestone
-
- """
- Find a namespace.
- """
- namespace(
- """
- The full path of the project, group or namespace, e.g., "gitlab-org/gitlab-foss".
- """
- fullPath: ID!
- ): Namespace
-
- """
- Find a package.
- """
- package(
- """
- The global ID of the package.
- """
- id: PackagesPackageID!
- ): Package
-
- """
- Find a project.
- """
- project(
- """
- The full path of the project, group or namespace, e.g., "gitlab-org/gitlab-foss".
- """
- fullPath: ID!
- ): Project
-
- """
- Find projects visible to the current user.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Filter projects by IDs.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Limit projects that the current user is a member of.
- """
- membership: Boolean
-
- """
- Search query for project name, path, or description.
- """
- search: String
-
- """
- Include namespace in project search.
- """
- searchNamespaces: Boolean
-
- """
- Sort order of results.
- """
- sort: String
- ): ProjectConnection
-
- """
- Supported runner platforms.
- """
- runnerPlatforms(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): RunnerPlatformConnection
-
- """
- Get runner setup instructions.
- """
- runnerSetup(
- """
- Architecture to generate the instructions for.
- """
- architecture: String!
-
- """
- Group to register the runner for.
- """
- groupId: GroupID
-
- """
- Platform to generate the instructions for.
- """
- platform: String!
-
- """
- Project to register the runner for.
- """
- projectId: ProjectID
- ): RunnerSetup
-
- """
- Find Snippets visible to the current user.
- """
- snippets(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- The ID of an author.
- """
- authorId: UserID
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Explore personal snippets.
- """
- explore: Boolean
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of global snippet ids, e.g., "gid://gitlab/ProjectSnippet/1".
- """
- ids: [SnippetID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The ID of a project.
- """
- projectId: ProjectID
-
- """
- The type of snippet.
- """
- type: TypeEnum
-
- """
- The visibility of the snippet.
- """
- visibility: VisibilityScopesEnum
- ): SnippetConnection
-
- """
- Find a user.
- """
- user(
- """
- ID of the User.
- """
- id: UserID
-
- """
- Username of the User.
- """
- username: String
- ): User
-
- """
- Find users.
- """
- users(
- """
- Return only admin users.
- """
- admins: Boolean = false
-
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- List of user Global IDs.
- """
- ids: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Query to search users by name, username, or primary email.
- """
- search: String
-
- """
- Sort users by this criteria.
- """
- sort: Sort = created_desc
-
- """
- List of usernames.
- """
- usernames: [String!]
- ): UserConnection
-
- """
- Vulnerabilities reported on projects on the current user's instance security dashboard.
- """
- vulnerabilities(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns only the vulnerabilities which have linked issues.
- """
- hasIssues: Boolean
-
- """
- Returns only the vulnerabilities which have been resolved on default branch.
- """
- hasResolution: Boolean
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter vulnerabilities by project.
- """
- projectId: [ID!]
-
- """
- Filter vulnerabilities by report type.
- """
- reportType: [VulnerabilityReportType!]
-
- """
- Filter vulnerabilities by VulnerabilityScanner.externalId.
- """
- scanner: [String!]
-
- """
- Filter vulnerabilities by severity.
- """
- severity: [VulnerabilitySeverity!]
-
- """
- List vulnerabilities by sort order.
- """
- sort: VulnerabilitySort = severity_desc
-
- """
- Filter vulnerabilities by state.
- """
- state: [VulnerabilityState!]
- ): VulnerabilityConnection
-
- """
- Number of vulnerabilities per day for the projects on the current user's instance security dashboard.
- """
- vulnerabilitiesCountByDay(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Last day for which to fetch vulnerability history.
- """
- endDate: ISO8601Date!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch vulnerability history.
- """
- startDate: ISO8601Date!
- ): VulnerabilitiesCountByDayConnection
-
- """
- Number of vulnerabilities per severity level, per day, for the projects on the
- current user's instance security dashboard. Deprecated in 13.3: Use
- `vulnerabilitiesCountByDay`.
- """
- vulnerabilitiesCountByDayAndSeverity(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Last day for which to fetch vulnerability history.
- """
- endDate: ISO8601Date!
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- First day for which to fetch vulnerability history.
- """
- startDate: ISO8601Date!
- ): VulnerabilitiesCountByDayAndSeverityConnection @deprecated(reason: "Use `vulnerabilitiesCountByDay`. Deprecated in 13.3.")
-
- """
- Find a vulnerability.
- """
- vulnerability(
- """
- The Global ID of the Vulnerability.
- """
- id: VulnerabilityID!
- ): Vulnerability
-}
-
-"""
-State of a Geo registry
-"""
-enum RegistryState {
- """
- Registry that failed to sync
- """
- FAILED
-
- """
- Registry waiting to be synced
- """
- PENDING
-
- """
- Registry currently syncing
- """
- STARTED
-
- """
- Registry that is synced
- """
- SYNCED
-}
-
-"""
-Represents a release
-"""
-type Release {
- """
- Assets of the release.
- """
- assets: ReleaseAssets
-
- """
- User that created the release.
- """
- author: User
-
- """
- The commit associated with the release.
- """
- commit: Commit
-
- """
- Timestamp of when the release was created.
- """
- createdAt: Time
-
- """
- Description (also known as "release notes") of the release.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- Evidence for the release.
- """
- evidences(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ReleaseEvidenceConnection
-
- """
- Links of the release.
- """
- links: ReleaseLinks
-
- """
- Milestones associated to the release.
- """
- milestones(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): MilestoneConnection
-
- """
- Name of the release.
- """
- name: String
-
- """
- Timestamp of when the release was released.
- """
- releasedAt: Time
-
- """
- Name of the tag associated with the release.
- """
- tagName: String
-
- """
- Relative web path to the tag associated with the release.
- """
- tagPath: String
-
- """
- Indicates the release is an upcoming release.
- """
- upcomingRelease: Boolean
-}
-
-"""
-Represents an asset link associated with a release
-"""
-type ReleaseAssetLink {
- """
- Direct asset URL of the link.
- """
- directAssetUrl: String
-
- """
- Indicates the link points to an external resource.
- """
- external: Boolean
-
- """
- ID of the link.
- """
- id: ID!
-
- """
- Type of the link: `other`, `runbook`, `image`, `package`; defaults to `other`.
- """
- linkType: ReleaseAssetLinkType
-
- """
- Name of the link.
- """
- name: String
-
- """
- URL of the link.
- """
- url: String
-}
-
-"""
-The connection type for ReleaseAssetLink.
-"""
-type ReleaseAssetLinkConnection {
- """
- A list of edges.
- """
- edges: [ReleaseAssetLinkEdge]
-
- """
- A list of nodes.
- """
- nodes: [ReleaseAssetLink]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ReleaseAssetLinkEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ReleaseAssetLink
-}
-
-"""
-Fields that are available when modifying a release asset link
-"""
-input ReleaseAssetLinkInput {
- """
- Relative path for a direct asset link.
- """
- directAssetPath: String
-
- """
- The type of the asset link.
- """
- linkType: ReleaseAssetLinkType = OTHER
-
- """
- Name of the asset link.
- """
- name: String!
-
- """
- URL of the asset link.
- """
- url: String!
-}
-
-"""
-Type of the link: `other`, `runbook`, `image`, `package`
-"""
-enum ReleaseAssetLinkType {
- """
- Image link type
- """
- IMAGE
-
- """
- Other link type
- """
- OTHER
-
- """
- Package link type
- """
- PACKAGE
-
- """
- Runbook link type
- """
- RUNBOOK
-}
-
-"""
-A container for all assets associated with a release
-"""
-type ReleaseAssets {
- """
- Number of assets of the release.
- """
- count: Int
-
- """
- Asset links of the release.
- """
- links(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ReleaseAssetLinkConnection
-
- """
- Sources of the release.
- """
- sources(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ReleaseSourceConnection
-}
-
-"""
-Fields that are available when modifying release assets
-"""
-input ReleaseAssetsInput {
- """
- A list of asset links to associate to the release.
- """
- links: [ReleaseAssetLinkInput!]
-}
-
-"""
-The connection type for Release.
-"""
-type ReleaseConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [ReleaseEdge]
-
- """
- A list of nodes.
- """
- nodes: [Release]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of ReleaseCreate
-"""
-input ReleaseCreateInput {
- """
- Assets associated to the release.
- """
- assets: ReleaseAssetsInput
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description (also known as "release notes") of the release.
- """
- description: String
-
- """
- The title of each milestone the release is associated with. GitLab Premium customers can specify group milestones.
- """
- milestones: [String!]
-
- """
- Name of the release.
- """
- name: String
-
- """
- Full path of the project the release is associated with.
- """
- projectPath: ID!
-
- """
- The commit SHA or branch name to use if creating a new tag.
- """
- ref: String
-
- """
- The date when the release will be/was ready. Defaults to the current time.
- """
- releasedAt: Time
-
- """
- Name of the tag to associate with the release.
- """
- tagName: String!
-}
-
-"""
-Autogenerated return type of ReleaseCreate
-"""
-type ReleaseCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The release after mutation.
- """
- release: Release
-}
-
-"""
-Autogenerated input type of ReleaseDelete
-"""
-input ReleaseDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Full path of the project the release is associated with.
- """
- projectPath: ID!
-
- """
- Name of the tag associated with the release to delete.
- """
- tagName: String!
-}
-
-"""
-Autogenerated return type of ReleaseDelete
-"""
-type ReleaseDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The deleted release.
- """
- release: Release
-}
-
-"""
-An edge in a connection.
-"""
-type ReleaseEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Release
-}
-
-"""
-Evidence for a release
-"""
-type ReleaseEvidence {
- """
- Timestamp when the evidence was collected.
- """
- collectedAt: Time
-
- """
- URL from where the evidence can be downloaded.
- """
- filepath: String
-
- """
- ID of the evidence.
- """
- id: ID!
-
- """
- SHA1 ID of the evidence hash.
- """
- sha: String
-}
-
-"""
-The connection type for ReleaseEvidence.
-"""
-type ReleaseEvidenceConnection {
- """
- A list of edges.
- """
- edges: [ReleaseEvidenceEdge]
-
- """
- A list of nodes.
- """
- nodes: [ReleaseEvidence]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ReleaseEvidenceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ReleaseEvidence
-}
-
-type ReleaseLinks {
- """
- HTTP URL of the issues page, filtered by this release and `state=closed`.
- """
- closedIssuesUrl: String
-
- """
- HTTP URL of the merge request page , filtered by this release and `state=closed`.
- """
- closedMergeRequestsUrl: String
-
- """
- HTTP URL of the release's edit page.
- """
- editUrl: String
-
- """
- HTTP URL of the merge request page , filtered by this release and `state=merged`.
- """
- mergedMergeRequestsUrl: String
-
- """
- HTTP URL of the issues page, filtered by this release and `state=open`.
- """
- openedIssuesUrl: String
-
- """
- HTTP URL of the merge request page, filtered by this release and `state=open`.
- """
- openedMergeRequestsUrl: String
-
- """
- HTTP URL of the release.
- """
- selfUrl: String
-}
-
-"""
-Values for sorting releases
-"""
-enum ReleaseSort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Released at by ascending order
- """
- RELEASED_AT_ASC
-
- """
- Released at by descending order
- """
- RELEASED_AT_DESC
-}
-
-"""
-Represents the source code attached to a release in a particular format
-"""
-type ReleaseSource {
- """
- Format of the source.
- """
- format: String
-
- """
- Download URL of the source.
- """
- url: String
-}
-
-"""
-The connection type for ReleaseSource.
-"""
-type ReleaseSourceConnection {
- """
- A list of edges.
- """
- edges: [ReleaseSourceEdge]
-
- """
- A list of nodes.
- """
- nodes: [ReleaseSource]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ReleaseSourceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ReleaseSource
-}
-
-"""
-Autogenerated input type of ReleaseUpdate
-"""
-input ReleaseUpdateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description (release notes) of the release.
- """
- description: String
-
- """
- The title of each milestone the release is associated with. GitLab Premium customers can specify group milestones.
- """
- milestones: [String!]
-
- """
- Name of the release.
- """
- name: String
-
- """
- Full path of the project the release is associated with.
- """
- projectPath: ID!
-
- """
- The release date.
- """
- releasedAt: Time
-
- """
- Name of the tag associated with the release.
- """
- tagName: String!
-}
-
-"""
-Autogenerated return type of ReleaseUpdate
-"""
-type ReleaseUpdatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The release after mutation.
- """
- release: Release
-}
-
-"""
-Autogenerated input type of RemoveAwardEmoji
-"""
-input RemoveAwardEmojiInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of RemoveAwardEmoji
-"""
-type RemoveAwardEmojiPayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of RemoveProjectFromSecurityDashboard
-"""
-input RemoveProjectFromSecurityDashboardInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the project to remove from the Instance Security Dashboard.
- """
- id: ProjectID!
-}
-
-"""
-Autogenerated return type of RemoveProjectFromSecurityDashboard
-"""
-type RemoveProjectFromSecurityDashboardPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of RepositionImageDiffNote
-"""
-input RepositionImageDiffNoteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the DiffNote to update.
- """
- id: DiffNoteID!
-
- """
- The position of this note on a diff.
- """
- position: UpdateDiffImagePositionInput!
-}
-
-"""
-Autogenerated return type of RepositionImageDiffNote
-"""
-type RepositionImageDiffNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-type Repository {
- """
- Indicates repository has no visible content.
- """
- empty: Boolean!
-
- """
- Indicates a corresponding Git repository exists on disk.
- """
- exists: Boolean!
-
- """
- Default branch of the repository.
- """
- rootRef: String
-
- """
- Tree of the repository.
- """
- tree(
- """
- The path to get the tree for. Default value is the root of the repository.
- """
- path: String = ""
-
- """
- Used to get a recursive tree. Default is false.
- """
- recursive: Boolean = false
-
- """
- The commit ref to get the tree for. Default value is HEAD.
- """
- ref: String = "head"
- ): Tree
-}
-
-"""
-Represents a requirement
-"""
-type Requirement {
- """
- Author of the requirement.
- """
- author: User!
-
- """
- Timestamp of when the requirement was created.
- """
- createdAt: Time!
-
- """
- Description of the requirement.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- ID of the requirement.
- """
- id: ID!
-
- """
- Internal ID of the requirement.
- """
- iid: ID!
-
- """
- Indicates if latest test report was created by user.
- """
- lastTestReportManuallyCreated: Boolean
-
- """
- Latest requirement test report state.
- """
- lastTestReportState: TestReportState
-
- """
- Project to which the requirement belongs.
- """
- project: Project!
-
- """
- State of the requirement.
- """
- state: RequirementState!
-
- """
- Test reports of the requirement.
- """
- testReports(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- List test reports by sort order.
- """
- sort: Sort
- ): TestReportConnection
-
- """
- Title of the requirement.
- """
- title: String
-
- """
- The GitLab Flavored Markdown rendering of `title`
- """
- titleHtml: String
-
- """
- Timestamp of when the requirement was last updated.
- """
- updatedAt: Time!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: RequirementPermissions!
-}
-
-"""
-The connection type for Requirement.
-"""
-type RequirementConnection {
- """
- A list of edges.
- """
- edges: [RequirementEdge]
-
- """
- A list of nodes.
- """
- nodes: [Requirement]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type RequirementEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Requirement
-}
-
-"""
-Check permissions for the current user on a requirement
-"""
-type RequirementPermissions {
- """
- Indicates the user can perform `admin_requirement` on this resource
- """
- adminRequirement: Boolean!
-
- """
- Indicates the user can perform `create_requirement` on this resource
- """
- createRequirement: Boolean!
-
- """
- Indicates the user can perform `destroy_requirement` on this resource
- """
- destroyRequirement: Boolean!
-
- """
- Indicates the user can perform `read_requirement` on this resource
- """
- readRequirement: Boolean!
-
- """
- Indicates the user can perform `update_requirement` on this resource
- """
- updateRequirement: Boolean!
-}
-
-"""
-State of a requirement
-"""
-enum RequirementState {
- ARCHIVED
- OPENED
-}
-
-"""
-Counts of requirements by their state
-"""
-type RequirementStatesCount {
- """
- Number of archived requirements.
- """
- archived: Int
-
- """
- Number of opened requirements.
- """
- opened: Int
-}
-
-interface ResolvableInterface {
- """
- Indicates if the object can be resolved.
- """
- resolvable: Boolean!
-
- """
- Indicates if the object is resolved.
- """
- resolved: Boolean!
-
- """
- Timestamp of when the object was resolved.
- """
- resolvedAt: Time
-
- """
- User who resolved the object.
- """
- resolvedBy: User
-}
-
-"""
-Autogenerated input type of RevertVulnerabilityToDetected
-"""
-input RevertVulnerabilityToDetectedInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the vulnerability to be reverted.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of RevertVulnerabilityToDetected
-"""
-type RevertVulnerabilityToDetectedPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after revert.
- """
- vulnerability: Vulnerability
-}
-
-type RootStorageStatistics {
- """
- The CI artifacts size in bytes.
- """
- buildArtifactsSize: Float!
-
- """
- The LFS objects size in bytes.
- """
- lfsObjectsSize: Float!
-
- """
- The packages size in bytes.
- """
- packagesSize: Float!
-
- """
- The CI pipeline artifacts size in bytes.
- """
- pipelineArtifactsSize: Float!
-
- """
- The Git repository size in bytes.
- """
- repositorySize: Float!
-
- """
- The snippets size in bytes.
- """
- snippetsSize: Float!
-
- """
- The total storage in bytes.
- """
- storageSize: Float!
-
- """
- The uploads size in bytes.
- """
- uploadsSize: Float!
-
- """
- The wiki size in bytes.
- """
- wikiSize: Float!
-}
-
-"""
-Autogenerated input type of RunDASTScan
-"""
-input RunDASTScanInput {
- """
- The branch to be associated with the scan.
- """
- branch: String!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The project the DAST scan belongs to.
- """
- projectPath: ID!
-
- """
- The type of scan to be run.
- """
- scanType: DastScanTypeEnum!
-
- """
- The URL of the target to be scanned.
- """
- targetUrl: String!
-}
-
-"""
-Autogenerated return type of RunDASTScan
-"""
-type RunDASTScanPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- URL of the pipeline that was created.
- """
- pipelineUrl: String
-}
-
-type RunnerArchitecture {
- """
- Download location for the runner for the platform architecture.
- """
- downloadLocation: String!
-
- """
- Name of the runner platform architecture.
- """
- name: String!
-}
-
-"""
-The connection type for RunnerArchitecture.
-"""
-type RunnerArchitectureConnection {
- """
- A list of edges.
- """
- edges: [RunnerArchitectureEdge]
-
- """
- A list of nodes.
- """
- nodes: [RunnerArchitecture]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type RunnerArchitectureEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: RunnerArchitecture
-}
-
-type RunnerPlatform {
- """
- Runner architectures supported for the platform.
- """
- architectures(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): RunnerArchitectureConnection
-
- """
- Human readable name of the runner platform.
- """
- humanReadableName: String!
-
- """
- Name slug of the runner platform.
- """
- name: String!
-}
-
-"""
-The connection type for RunnerPlatform.
-"""
-type RunnerPlatformConnection {
- """
- A list of edges.
- """
- edges: [RunnerPlatformEdge]
-
- """
- A list of nodes.
- """
- nodes: [RunnerPlatform]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type RunnerPlatformEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: RunnerPlatform
-}
-
-type RunnerSetup {
- """
- Instructions for installing the runner on the specified architecture.
- """
- installInstructions: String!
-
- """
- Instructions for registering the runner.
- """
- registerInstructions: String
-}
-
-"""
-Represents a CI configuration of SAST
-"""
-type SastCiConfiguration {
- """
- List of analyzers entities attached to SAST configuration.
- """
- analyzers(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SastCiConfigurationAnalyzersEntityConnection
-
- """
- List of global entities related to SAST configuration.
- """
- global(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SastCiConfigurationEntityConnection
-
- """
- List of pipeline entities related to SAST configuration.
- """
- pipeline(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SastCiConfigurationEntityConnection
-}
-
-"""
-Represents an analyzer entity in SAST CI configuration
-"""
-type SastCiConfigurationAnalyzersEntity {
- """
- Analyzer description that is displayed on the form.
- """
- description: String
-
- """
- Indicates whether an analyzer is enabled.
- """
- enabled: Boolean
-
- """
- Analyzer label used in the config UI.
- """
- label: String
-
- """
- Name of the analyzer.
- """
- name: String
-
- """
- List of supported variables.
- """
- variables(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SastCiConfigurationEntityConnection
-}
-
-"""
-The connection type for SastCiConfigurationAnalyzersEntity.
-"""
-type SastCiConfigurationAnalyzersEntityConnection {
- """
- A list of edges.
- """
- edges: [SastCiConfigurationAnalyzersEntityEdge]
-
- """
- A list of nodes.
- """
- nodes: [SastCiConfigurationAnalyzersEntity]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SastCiConfigurationAnalyzersEntityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SastCiConfigurationAnalyzersEntity
-}
-
-"""
-Represents the analyzers entity in SAST CI configuration
-"""
-input SastCiConfigurationAnalyzersEntityInput {
- """
- State of the analyzer.
- """
- enabled: Boolean!
-
- """
- Name of analyzer.
- """
- name: String!
-
- """
- List of variables for the analyzer.
- """
- variables: [SastCiConfigurationEntityInput!]
-}
-
-"""
-Represents an entity in SAST CI configuration
-"""
-type SastCiConfigurationEntity {
- """
- Default value that is used if value is empty.
- """
- defaultValue: String
-
- """
- Entity description that is displayed on the form.
- """
- description: String
-
- """
- CI keyword of entity.
- """
- field: String
-
- """
- Label for entity used in the form.
- """
- label: String
-
- """
- Different possible values of the field.
- """
- options(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SastCiConfigurationOptionsEntityConnection
-
- """
- Size of the UI component.
- """
- size: SastUiComponentSize
-
- """
- Type of the field value.
- """
- type: String
-
- """
- Current value of the entity.
- """
- value: String
-}
-
-"""
-The connection type for SastCiConfigurationEntity.
-"""
-type SastCiConfigurationEntityConnection {
- """
- A list of edges.
- """
- edges: [SastCiConfigurationEntityEdge]
-
- """
- A list of nodes.
- """
- nodes: [SastCiConfigurationEntity]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SastCiConfigurationEntityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SastCiConfigurationEntity
-}
-
-"""
-Represents an entity in SAST CI configuration
-"""
-input SastCiConfigurationEntityInput {
- """
- Default value that is used if value is empty.
- """
- defaultValue: String!
-
- """
- CI keyword of entity.
- """
- field: String!
-
- """
- Current value of the entity.
- """
- value: String!
-}
-
-"""
-Represents a CI configuration of SAST
-"""
-input SastCiConfigurationInput {
- """
- List of analyzers and related variables for the SAST configuration.
- """
- analyzers: [SastCiConfigurationAnalyzersEntityInput!]
-
- """
- List of global entities related to SAST configuration.
- """
- global: [SastCiConfigurationEntityInput!]
-
- """
- List of pipeline entities related to SAST configuration.
- """
- pipeline: [SastCiConfigurationEntityInput!]
-}
-
-"""
-Represents an entity for options in SAST CI configuration
-"""
-type SastCiConfigurationOptionsEntity {
- """
- Label of option entity.
- """
- label: String
-
- """
- Value of option entity.
- """
- value: String
-}
-
-"""
-The connection type for SastCiConfigurationOptionsEntity.
-"""
-type SastCiConfigurationOptionsEntityConnection {
- """
- A list of edges.
- """
- edges: [SastCiConfigurationOptionsEntityEdge]
-
- """
- A list of nodes.
- """
- nodes: [SastCiConfigurationOptionsEntity]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SastCiConfigurationOptionsEntityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SastCiConfigurationOptionsEntity
-}
-
-"""
-Size of UI component in SAST configuration page
-"""
-enum SastUiComponentSize {
- LARGE
- MEDIUM
- SMALL
-}
-
-"""
-Represents a resource scanned by a security scan
-"""
-type ScannedResource {
- """
- The HTTP request method used to access the URL.
- """
- requestMethod: String
-
- """
- The URL scanned by the scanner.
- """
- url: String
-}
-
-"""
-The connection type for ScannedResource.
-"""
-type ScannedResourceConnection {
- """
- A list of edges.
- """
- edges: [ScannedResourceEdge]
-
- """
- A list of nodes.
- """
- nodes: [ScannedResource]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ScannedResourceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: ScannedResource
-}
-
-"""
-Represents summary of a security report
-"""
-type SecurityReportSummary {
- """
- Aggregated counts for the `api_fuzzing` scan
- """
- apiFuzzing: SecurityReportSummarySection
-
- """
- Aggregated counts for the `container_scanning` scan
- """
- containerScanning: SecurityReportSummarySection
-
- """
- Aggregated counts for the `coverage_fuzzing` scan
- """
- coverageFuzzing: SecurityReportSummarySection
-
- """
- Aggregated counts for the `dast` scan
- """
- dast: SecurityReportSummarySection
-
- """
- Aggregated counts for the `dependency_scanning` scan
- """
- dependencyScanning: SecurityReportSummarySection
-
- """
- Aggregated counts for the `sast` scan
- """
- sast: SecurityReportSummarySection
-
- """
- Aggregated counts for the `secret_detection` scan
- """
- secretDetection: SecurityReportSummarySection
-}
-
-"""
-Represents a section of a summary of a security report
-"""
-type SecurityReportSummarySection {
- """
- A list of the first 20 scanned resources.
- """
- scannedResources(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ScannedResourceConnection
-
- """
- Total number of scanned resources.
- """
- scannedResourcesCount: Int
-
- """
- Path to download all the scanned resources in CSV format.
- """
- scannedResourcesCsvPath: String
-
- """
- Total number of vulnerabilities.
- """
- vulnerabilitiesCount: Int
-}
-
-enum SecurityReportTypeEnum {
- """
- API FUZZING scan report
- """
- API_FUZZING
-
- """
- CONTAINER SCANNING scan report
- """
- CONTAINER_SCANNING
-
- """
- COVERAGE FUZZING scan report
- """
- COVERAGE_FUZZING
-
- """
- DAST scan report
- """
- DAST
-
- """
- DEPENDENCY SCANNING scan report
- """
- DEPENDENCY_SCANNING
-
- """
- SAST scan report
- """
- SAST
-
- """
- SECRET DETECTION scan report
- """
- SECRET_DETECTION
-}
-
-"""
-The type of the security scanner
-"""
-enum SecurityScannerType {
- API_FUZZING
- CONTAINER_SCANNING
- COVERAGE_FUZZING
- DAST
- DEPENDENCY_SCANNING
- SAST
- SECRET_DETECTION
-}
-
-"""
-Represents a list of security scanners
-"""
-type SecurityScanners {
- """
- List of analyzers which are available for the project.
- """
- available: [SecurityScannerType!]
-
- """
- List of analyzers which are enabled for the project.
- """
- enabled: [SecurityScannerType!]
-
- """
- List of analyzers which ran successfully in the latest pipeline.
- """
- pipelineRun: [SecurityScannerType!]
-}
-
-"""
-A Sentry error
-"""
-type SentryDetailedError {
- """
- Count of occurrences.
- """
- count: Int!
-
- """
- Culprit of the error.
- """
- culprit: String!
-
- """
- External Base URL of the Sentry Instance.
- """
- externalBaseUrl: String!
-
- """
- External URL of the error.
- """
- externalUrl: String!
-
- """
- Commit the error was first seen.
- """
- firstReleaseLastCommit: String
-
- """
- Release short version the error was first seen.
- """
- firstReleaseShortVersion: String
-
- """
- Release version the error was first seen.
- """
- firstReleaseVersion: String
-
- """
- Timestamp when the error was first seen.
- """
- firstSeen: Time!
-
- """
- Last 24hr stats of the error.
- """
- frequency: [SentryErrorFrequency!]!
-
- """
- GitLab commit SHA attributed to the Error based on the release version.
- """
- gitlabCommit: String
-
- """
- Path to the GitLab page for the GitLab commit attributed to the error.
- """
- gitlabCommitPath: String
-
- """
- URL of GitLab Issue.
- """
- gitlabIssuePath: String
-
- """
- ID (global ID) of the error.
- """
- id: ID!
-
- """
- Commit the error was last seen.
- """
- lastReleaseLastCommit: String
-
- """
- Release short version the error was last seen.
- """
- lastReleaseShortVersion: String
-
- """
- Release version the error was last seen.
- """
- lastReleaseVersion: String
-
- """
- Timestamp when the error was last seen.
- """
- lastSeen: Time!
-
- """
- Sentry metadata message of the error.
- """
- message: String
-
- """
- ID (Sentry ID) of the error.
- """
- sentryId: String!
-
- """
- ID of the project (Sentry project).
- """
- sentryProjectId: ID!
-
- """
- Name of the project affected by the error.
- """
- sentryProjectName: String!
-
- """
- Slug of the project affected by the error.
- """
- sentryProjectSlug: String!
-
- """
- Short ID (Sentry ID) of the error.
- """
- shortId: String!
-
- """
- Status of the error.
- """
- status: SentryErrorStatus!
-
- """
- Tags associated with the Sentry Error.
- """
- tags: SentryErrorTags!
-
- """
- Title of the error.
- """
- title: String!
-
- """
- Type of the error.
- """
- type: String!
-
- """
- Count of users affected by the error.
- """
- userCount: Int!
-}
-
-"""
-A Sentry error. A simplified version of SentryDetailedError
-"""
-type SentryError {
- """
- Count of occurrences.
- """
- count: Int!
-
- """
- Culprit of the error.
- """
- culprit: String!
-
- """
- External URL of the error.
- """
- externalUrl: String!
-
- """
- Timestamp when the error was first seen.
- """
- firstSeen: Time!
-
- """
- Last 24hr stats of the error.
- """
- frequency: [SentryErrorFrequency!]!
-
- """
- ID (global ID) of the error.
- """
- id: ID!
-
- """
- Timestamp when the error was last seen.
- """
- lastSeen: Time!
-
- """
- Sentry metadata message of the error.
- """
- message: String
-
- """
- ID (Sentry ID) of the error.
- """
- sentryId: String!
-
- """
- ID of the project (Sentry project).
- """
- sentryProjectId: ID!
-
- """
- Name of the project affected by the error.
- """
- sentryProjectName: String!
-
- """
- Slug of the project affected by the error.
- """
- sentryProjectSlug: String!
-
- """
- Short ID (Sentry ID) of the error.
- """
- shortId: String!
-
- """
- Status of the error.
- """
- status: SentryErrorStatus!
-
- """
- Title of the error.
- """
- title: String!
-
- """
- Type of the error.
- """
- type: String!
-
- """
- Count of users affected by the error.
- """
- userCount: Int!
-}
-
-"""
-An object containing a collection of Sentry errors, and a detailed error
-"""
-type SentryErrorCollection {
- """
- Detailed version of a Sentry error on the project.
- """
- detailedError(
- """
- ID of the Sentry issue.
- """
- id: GitlabErrorTrackingDetailedErrorID!
- ): SentryDetailedError
-
- """
- Stack Trace of Sentry Error.
- """
- errorStackTrace(
- """
- ID of the Sentry issue.
- """
- id: GitlabErrorTrackingDetailedErrorID!
- ): SentryErrorStackTrace
-
- """
- Collection of Sentry Errors.
- """
- errors(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Search query for the Sentry error details.
- """
- searchTerm: String
-
- """
- Attribute to sort on. Options are frequency, first_seen, last_seen. last_seen is default.
- """
- sort: String
- ): SentryErrorConnection
-
- """
- External URL for Sentry.
- """
- externalUrl: String
-}
-
-"""
-The connection type for SentryError.
-"""
-type SentryErrorConnection {
- """
- A list of edges.
- """
- edges: [SentryErrorEdge]
-
- """
- A list of nodes.
- """
- nodes: [SentryError]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SentryErrorEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SentryError
-}
-
-type SentryErrorFrequency {
- """
- Count of errors received since the previously recorded time.
- """
- count: Int!
-
- """
- Time the error frequency stats were recorded.
- """
- time: Time!
-}
-
-"""
-An object containing a stack trace entry for a Sentry error
-"""
-type SentryErrorStackTrace {
- """
- Time the stack trace was received by Sentry.
- """
- dateReceived: String!
-
- """
- ID of the Sentry error.
- """
- issueId: String!
-
- """
- Stack trace entries for the Sentry error.
- """
- stackTraceEntries: [SentryErrorStackTraceEntry!]!
-}
-
-"""
-An object context for a Sentry error stack trace
-"""
-type SentryErrorStackTraceContext {
- """
- Code number of the context.
- """
- code: String!
-
- """
- Line number of the context.
- """
- line: Int!
-}
-
-"""
-An object containing a stack trace entry for a Sentry error
-"""
-type SentryErrorStackTraceEntry {
- """
- Function in which the Sentry error occurred.
- """
- col: String
-
- """
- File in which the Sentry error occurred.
- """
- fileName: String
-
- """
- Function in which the Sentry error occurred.
- """
- function: String
-
- """
- Function in which the Sentry error occurred.
- """
- line: String
-
- """
- Context of the Sentry error.
- """
- traceContext: [SentryErrorStackTraceContext!]
-}
-
-"""
-State of a Sentry error
-"""
-enum SentryErrorStatus {
- """
- Error has been ignored
- """
- IGNORED
-
- """
- Error has been resolved
- """
- RESOLVED
-
- """
- Error has been ignored until next release
- """
- RESOLVED_IN_NEXT_RELEASE
-
- """
- Error is unresolved
- """
- UNRESOLVED
-}
-
-"""
-State of a Sentry error
-"""
-type SentryErrorTags {
- """
- Severity level of the Sentry Error.
- """
- level: String
-
- """
- Logger of the Sentry Error.
- """
- logger: String
-}
-
-interface Service {
- """
- Indicates if the service is active.
- """
- active: Boolean
-
- """
- Class name of the service.
- """
- type: String
-}
-
-"""
-The connection type for Service.
-"""
-type ServiceConnection {
- """
- A list of edges.
- """
- edges: [ServiceEdge]
-
- """
- A list of nodes.
- """
- nodes: [Service]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type ServiceEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Service
-}
-
-enum ServiceType {
- """
- AsanaService type
- """
- ASANA_SERVICE
-
- """
- AssemblaService type
- """
- ASSEMBLA_SERVICE
-
- """
- BambooService type
- """
- BAMBOO_SERVICE
-
- """
- BugzillaService type
- """
- BUGZILLA_SERVICE
-
- """
- BuildkiteService type
- """
- BUILDKITE_SERVICE
-
- """
- CampfireService type
- """
- CAMPFIRE_SERVICE
-
- """
- ConfluenceService type
- """
- CONFLUENCE_SERVICE
-
- """
- CustomIssueTrackerService type
- """
- CUSTOM_ISSUE_TRACKER_SERVICE
-
- """
- DatadogService type
- """
- DATADOG_SERVICE
-
- """
- DiscordService type
- """
- DISCORD_SERVICE
-
- """
- DroneCiService type
- """
- DRONE_CI_SERVICE
-
- """
- EmailsOnPushService type
- """
- EMAILS_ON_PUSH_SERVICE
-
- """
- EwmService type
- """
- EWM_SERVICE
-
- """
- ExternalWikiService type
- """
- EXTERNAL_WIKI_SERVICE
-
- """
- FlowdockService type
- """
- FLOWDOCK_SERVICE
-
- """
- GithubService type
- """
- GITHUB_SERVICE
-
- """
- HangoutsChatService type
- """
- HANGOUTS_CHAT_SERVICE
-
- """
- HipchatService type
- """
- HIPCHAT_SERVICE
-
- """
- IrkerService type
- """
- IRKER_SERVICE
-
- """
- JenkinsService type
- """
- JENKINS_SERVICE
-
- """
- JiraService type
- """
- JIRA_SERVICE
-
- """
- MattermostService type
- """
- MATTERMOST_SERVICE
-
- """
- MattermostSlashCommandsService type
- """
- MATTERMOST_SLASH_COMMANDS_SERVICE
-
- """
- MicrosoftTeamsService type
- """
- MICROSOFT_TEAMS_SERVICE
-
- """
- PackagistService type
- """
- PACKAGIST_SERVICE
-
- """
- PipelinesEmailService type
- """
- PIPELINES_EMAIL_SERVICE
-
- """
- PivotaltrackerService type
- """
- PIVOTALTRACKER_SERVICE
-
- """
- PrometheusService type
- """
- PROMETHEUS_SERVICE
-
- """
- PushoverService type
- """
- PUSHOVER_SERVICE
-
- """
- RedmineService type
- """
- REDMINE_SERVICE
-
- """
- SlackService type
- """
- SLACK_SERVICE
-
- """
- SlackSlashCommandsService type
- """
- SLACK_SLASH_COMMANDS_SERVICE
-
- """
- TeamcityService type
- """
- TEAMCITY_SERVICE
-
- """
- UnifyCircuitService type
- """
- UNIFY_CIRCUIT_SERVICE
-
- """
- WebexTeamsService type
- """
- WEBEX_TEAMS_SERVICE
-
- """
- YoutrackService type
- """
- YOUTRACK_SERVICE
-}
-
-"""
-Represents a snippet entry
-"""
-type Snippet implements Noteable {
- """
- The owner of the snippet.
- """
- author: User
-
- """
- Snippet blob. Deprecated in 13.3: Use `blobs`.
- """
- blob: SnippetBlob! @deprecated(reason: "Use `blobs`. Deprecated in 13.3.")
-
- """
- Snippet blobs.
- """
- blobs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Paths of the blobs.
- """
- paths: [String!]
- ): SnippetBlobConnection
-
- """
- Timestamp this snippet was created.
- """
- createdAt: Time!
-
- """
- Description of the snippet.
- """
- description: String
-
- """
- The GitLab Flavored Markdown rendering of `description`
- """
- descriptionHtml: String
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- File Name of the snippet.
- """
- fileName: String
-
- """
- HTTP URL to the snippet repository.
- """
- httpUrlToRepo: String
-
- """
- ID of the snippet.
- """
- id: SnippetID!
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- The project the snippet is associated with.
- """
- project: Project
-
- """
- Raw URL of the snippet.
- """
- rawUrl: String!
-
- """
- SSH URL to the snippet repository.
- """
- sshUrlToRepo: String
-
- """
- Title of the snippet.
- """
- title: String!
-
- """
- Timestamp this snippet was updated.
- """
- updatedAt: Time!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: SnippetPermissions!
-
- """
- Visibility Level of the snippet.
- """
- visibilityLevel: VisibilityLevelsEnum!
-
- """
- Web URL of the snippet.
- """
- webUrl: String!
-}
-
-"""
-Represents the snippet blob
-"""
-type SnippetBlob {
- """
- Shows whether the blob is binary.
- """
- binary: Boolean!
-
- """
- Blob external storage.
- """
- externalStorage: String
-
- """
- Blob mode.
- """
- mode: String
-
- """
- Blob name.
- """
- name: String
-
- """
- Blob path.
- """
- path: String
-
- """
- Blob plain highlighted data.
- """
- plainData: String
-
- """
- Blob raw content endpoint path.
- """
- rawPath: String!
-
- """
- Shows whether the blob is rendered as text.
- """
- renderedAsText: Boolean!
-
- """
- Blob highlighted data.
- """
- richData: String
-
- """
- Blob content rich viewer.
- """
- richViewer: SnippetBlobViewer
-
- """
- Blob content simple viewer.
- """
- simpleViewer: SnippetBlobViewer!
-
- """
- Blob size.
- """
- size: Int!
-}
-
-"""
-Type of a snippet blob input action
-"""
-enum SnippetBlobActionEnum {
- create
- delete
- move
- update
-}
-
-"""
-Represents an action to perform over a snippet file
-"""
-input SnippetBlobActionInputType {
- """
- Type of input action.
- """
- action: SnippetBlobActionEnum!
-
- """
- Snippet file content.
- """
- content: String
-
- """
- Path of the snippet file.
- """
- filePath: String!
-
- """
- Previous path of the snippet file.
- """
- previousPath: String
-}
-
-"""
-The connection type for SnippetBlob.
-"""
-type SnippetBlobConnection {
- """
- A list of edges.
- """
- edges: [SnippetBlobEdge]
-
- """
- A list of nodes.
- """
- nodes: [SnippetBlob]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SnippetBlobEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SnippetBlob
-}
-
-"""
-Represents how the blob content should be displayed
-"""
-type SnippetBlobViewer {
- """
- Shows whether the blob should be displayed collapsed.
- """
- collapsed: Boolean!
-
- """
- Content file type.
- """
- fileType: String!
-
- """
- Shows whether the blob content is loaded asynchronously.
- """
- loadAsync: Boolean!
-
- """
- Loading partial name.
- """
- loadingPartialName: String!
-
- """
- Error rendering the blob content.
- """
- renderError: String
-
- """
- Shows whether the blob too large to be displayed.
- """
- tooLarge: Boolean!
-
- """
- Type of blob viewer.
- """
- type: BlobViewersType!
-}
-
-"""
-The connection type for Snippet.
-"""
-type SnippetConnection {
- """
- A list of edges.
- """
- edges: [SnippetEdge]
-
- """
- A list of nodes.
- """
- nodes: [Snippet]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SnippetEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Snippet
-}
-
-"""
-Identifier of Snippet.
-"""
-scalar SnippetID
-
-type SnippetPermissions {
- """
- Indicates the user can perform `admin_snippet` on this resource
- """
- adminSnippet: Boolean!
-
- """
- Indicates the user can perform `award_emoji` on this resource
- """
- awardEmoji: Boolean!
-
- """
- Indicates the user can perform `create_note` on this resource
- """
- createNote: Boolean!
-
- """
- Indicates the user can perform `read_snippet` on this resource
- """
- readSnippet: Boolean!
-
- """
- Indicates the user can perform `report_snippet` on this resource
- """
- reportSnippet: Boolean!
-
- """
- Indicates the user can perform `update_snippet` on this resource
- """
- updateSnippet: Boolean!
-}
-
-"""
-Represents the Geo sync and verification state of a snippet repository
-"""
-type SnippetRepositoryRegistry {
- """
- Timestamp when the SnippetRepositoryRegistry was created
- """
- createdAt: Time
-
- """
- ID of the SnippetRepositoryRegistry
- """
- id: ID!
-
- """
- Error message during sync of the SnippetRepositoryRegistry
- """
- lastSyncFailure: String
-
- """
- Timestamp of the most recent successful sync of the SnippetRepositoryRegistry
- """
- lastSyncedAt: Time
-
- """
- Timestamp after which the SnippetRepositoryRegistry should be resynced
- """
- retryAt: Time
-
- """
- Number of consecutive failed sync attempts of the SnippetRepositoryRegistry
- """
- retryCount: Int
-
- """
- ID of the Snippet Repository.
- """
- snippetRepositoryId: ID!
-
- """
- Sync state of the SnippetRepositoryRegistry
- """
- state: RegistryState
-}
-
-"""
-The connection type for SnippetRepositoryRegistry.
-"""
-type SnippetRepositoryRegistryConnection {
- """
- A list of edges.
- """
- edges: [SnippetRepositoryRegistryEdge]
-
- """
- A list of nodes.
- """
- nodes: [SnippetRepositoryRegistry]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SnippetRepositoryRegistryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: SnippetRepositoryRegistry
-}
-
-"""
-Common sort values
-"""
-enum Sort {
- """
- Created at ascending order
- """
- CREATED_ASC
-
- """
- Created at descending order
- """
- CREATED_DESC
-
- """
- Updated at ascending order
- """
- UPDATED_ASC
-
- """
- Updated at descending order
- """
- UPDATED_DESC
-
- """
- Created at ascending order
- """
- created_asc @deprecated(reason: "Use CREATED_ASC. Deprecated in 13.5.")
-
- """
- Created at descending order
- """
- created_desc @deprecated(reason: "Use CREATED_DESC. Deprecated in 13.5.")
-
- """
- Updated at ascending order
- """
- updated_asc @deprecated(reason: "Use UPDATED_ASC. Deprecated in 13.5.")
-
- """
- Updated at descending order
- """
- updated_desc @deprecated(reason: "Use UPDATED_DESC. Deprecated in 13.5.")
-}
-
-type StatusAction {
- """
- Title for the button, for example: Retry this job.
- """
- buttonTitle: String
-
- """
- Icon used in the action button.
- """
- icon: String
-
- """
- Method for the action, for example: :post.
- """
- method: String
-
- """
- Path for the action.
- """
- path: String
-
- """
- Title for the action, for example: Retry.
- """
- title: String
-}
-
-type Submodule implements Entry {
- """
- Flat path of the entry.
- """
- flatPath: String!
-
- """
- ID of the entry.
- """
- id: ID!
-
- """
- Name of the entry.
- """
- name: String!
-
- """
- Path of the entry.
- """
- path: String!
-
- """
- Last commit SHA for the entry.
- """
- sha: String!
-
- """
- Tree URL for the sub-module.
- """
- treeUrl: String
-
- """
- Type of tree entry.
- """
- type: EntryType!
-
- """
- Web URL for the sub-module.
- """
- webUrl: String
-}
-
-"""
-The connection type for Submodule.
-"""
-type SubmoduleConnection {
- """
- A list of edges.
- """
- edges: [SubmoduleEdge]
-
- """
- A list of nodes.
- """
- nodes: [Submodule]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type SubmoduleEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Submodule
-}
-
-"""
-Completion status of tasks
-"""
-type TaskCompletionStatus {
- """
- Number of completed tasks.
- """
- completedCount: Int!
-
- """
- Number of total tasks.
- """
- count: Int!
-}
-
-type TerraformState {
- """
- Timestamp the Terraform state was created.
- """
- createdAt: Time!
-
- """
- ID of the Terraform state.
- """
- id: ID!
-
- """
- The latest version of the Terraform state.
- """
- latestVersion: TerraformStateVersion
-
- """
- Timestamp the Terraform state was locked.
- """
- lockedAt: Time
-
- """
- The user currently holding a lock on the Terraform state.
- """
- lockedByUser: User
-
- """
- Name of the Terraform state.
- """
- name: String!
-
- """
- Timestamp the Terraform state was updated.
- """
- updatedAt: Time!
-}
-
-"""
-The connection type for TerraformState.
-"""
-type TerraformStateConnection {
- """
- Total count of collection.
- """
- count: Int!
-
- """
- A list of edges.
- """
- edges: [TerraformStateEdge]
-
- """
- A list of nodes.
- """
- nodes: [TerraformState]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of TerraformStateDelete
-"""
-input TerraformStateDeleteInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the Terraform state.
- """
- id: TerraformStateID!
-}
-
-"""
-Autogenerated return type of TerraformStateDelete
-"""
-type TerraformStateDeletePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type TerraformStateEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: TerraformState
-}
-
-"""
-Identifier of Terraform::State.
-"""
-scalar TerraformStateID
-
-"""
-Autogenerated input type of TerraformStateLock
-"""
-input TerraformStateLockInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the Terraform state.
- """
- id: TerraformStateID!
-}
-
-"""
-Autogenerated return type of TerraformStateLock
-"""
-type TerraformStateLockPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of TerraformStateUnlock
-"""
-input TerraformStateUnlockInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Global ID of the Terraform state.
- """
- id: TerraformStateID!
-}
-
-"""
-Autogenerated return type of TerraformStateUnlock
-"""
-type TerraformStateUnlockPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-type TerraformStateVersion {
- """
- Timestamp the version was created.
- """
- createdAt: Time!
-
- """
- The user that created this version.
- """
- createdByUser: User
-
- """
- URL for downloading the version's JSON file.
- """
- downloadPath: String
-
- """
- ID of the Terraform state version.
- """
- id: ID!
-
- """
- The job that created this version.
- """
- job: CiJob
-
- """
- Serial number of the version.
- """
- serial: Int
-
- """
- Timestamp the version was updated.
- """
- updatedAt: Time!
-}
-
-"""
-Represents the Geo sync and verification state of a terraform state version
-"""
-type TerraformStateVersionRegistry {
- """
- Timestamp when the TerraformStateVersionRegistry was created
- """
- createdAt: Time
-
- """
- ID of the TerraformStateVersionRegistry
- """
- id: ID!
-
- """
- Error message during sync of the TerraformStateVersionRegistry
- """
- lastSyncFailure: String
-
- """
- Timestamp of the most recent successful sync of the TerraformStateVersionRegistry
- """
- lastSyncedAt: Time
-
- """
- Timestamp after which the TerraformStateVersionRegistry should be resynced
- """
- retryAt: Time
-
- """
- Number of consecutive failed sync attempts of the TerraformStateVersionRegistry
- """
- retryCount: Int
-
- """
- Sync state of the TerraformStateVersionRegistry
- """
- state: RegistryState
-
- """
- ID of the terraform state version.
- """
- terraformStateVersionId: ID!
-}
-
-"""
-The connection type for TerraformStateVersionRegistry.
-"""
-type TerraformStateVersionRegistryConnection {
- """
- A list of edges.
- """
- edges: [TerraformStateVersionRegistryEdge]
-
- """
- A list of nodes.
- """
- nodes: [TerraformStateVersionRegistry]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type TerraformStateVersionRegistryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: TerraformStateVersionRegistry
-}
-
-"""
-Represents a requirement test report
-"""
-type TestReport {
- """
- Author of the test report.
- """
- author: User
-
- """
- Timestamp of when the test report was created.
- """
- createdAt: Time!
-
- """
- ID of the test report.
- """
- id: ID!
-
- """
- State of the test report.
- """
- state: TestReportState!
-}
-
-"""
-The connection type for TestReport.
-"""
-type TestReportConnection {
- """
- A list of edges.
- """
- edges: [TestReportEdge]
-
- """
- A list of nodes.
- """
- nodes: [TestReport]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type TestReportEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: TestReport
-}
-
-"""
-State of a test report
-"""
-enum TestReportState {
- FAILED
- PASSED
-}
-
-"""
-Time represented in ISO 8601
-"""
-scalar Time
-
-"""
-Represents the time report stats for timeboxes
-"""
-type TimeReportStats {
- """
- Completed issues metrics.
- """
- complete: TimeboxMetrics
-
- """
- Incomplete issues metrics.
- """
- incomplete: TimeboxMetrics
-
- """
- Total issues metrics.
- """
- total: TimeboxMetrics
-}
-
-"""
-Represents measured stats metrics for timeboxes
-"""
-type TimeboxMetrics {
- """
- The count metric.
- """
- count: Int!
-
- """
- The weight metric.
- """
- weight: Int!
-}
-
-"""
-Represents a historically accurate report about the timebox
-"""
-type TimeboxReport {
- """
- Daily scope and completed totals for burnup charts.
- """
- burnupTimeSeries: [BurnupChartDailyTotals!]
-
- """
- Represents the time report stats for the timebox.
- """
- stats: TimeReportStats
-}
-
-interface TimeboxReportInterface {
- """
- Historically accurate report about the timebox.
- """
- report: TimeboxReport
-}
-
-"""
-A time-frame defined as a closed inclusive range of two dates
-"""
-input Timeframe {
- """
- The end of the range.
- """
- end: Date!
-
- """
- The start of the range.
- """
- start: Date!
-}
-
-type Timelog {
- """
- The issue that logged time was added to.
- """
- issue: Issue
-
- """
- The note where the quick action to add the logged time was executed.
- """
- note: Note
-
- """
- Timestamp of when the time tracked was spent at.
- """
- spentAt: Time
-
- """
- The time spent displayed in seconds.
- """
- timeSpent: Int!
-
- """
- The user that logged the time.
- """
- user: User!
-}
-
-"""
-The connection type for Timelog.
-"""
-type TimelogConnection {
- """
- A list of edges.
- """
- edges: [TimelogEdge]
-
- """
- A list of nodes.
- """
- nodes: [Timelog]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type TimelogEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Timelog
-}
-
-"""
-Representing a to-do entry
-"""
-type Todo {
- """
- Action of the to-do item.
- """
- action: TodoActionEnum!
-
- """
- The author of this to-do item.
- """
- author: User!
-
- """
- Body of the to-do item.
- """
- body: String!
-
- """
- Timestamp this to-do item was created.
- """
- createdAt: Time!
-
- """
- Group this to-do item is associated with.
- """
- group: Group
-
- """
- ID of the to-do item.
- """
- id: ID!
-
- """
- The project this to-do item is associated with.
- """
- project: Project
-
- """
- State of the to-do item.
- """
- state: TodoStateEnum!
-
- """
- Target type of the to-do item.
- """
- targetType: TodoTargetEnum!
-}
-
-enum TodoActionEnum {
- approval_required
- assigned
- build_failed
- directly_addressed
- marked
- mentioned
- unmergeable
-}
-
-"""
-The connection type for Todo.
-"""
-type TodoConnection {
- """
- A list of edges.
- """
- edges: [TodoEdge]
-
- """
- A list of nodes.
- """
- nodes: [Todo]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of TodoCreate
-"""
-input TodoCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the to-do item's parent. Issues, merge requests, designs and epics are supported.
- """
- targetId: TodoableID!
-}
-
-"""
-Autogenerated return type of TodoCreate
-"""
-type TodoCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The to-do item created.
- """
- todo: Todo
-}
-
-"""
-An edge in a connection.
-"""
-type TodoEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Todo
-}
-
-"""
-Identifier of Todo.
-"""
-scalar TodoID
-
-"""
-Autogenerated input type of TodoMarkDone
-"""
-input TodoMarkDoneInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the to-do item to mark as done.
- """
- id: TodoID!
-}
-
-"""
-Autogenerated return type of TodoMarkDone
-"""
-type TodoMarkDonePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The requested to-do item.
- """
- todo: Todo!
-}
-
-"""
-Autogenerated input type of TodoRestore
-"""
-input TodoRestoreInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the to-do item to restore.
- """
- id: TodoID!
-}
-
-"""
-Autogenerated input type of TodoRestoreMany
-"""
-input TodoRestoreManyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global IDs of the to-do items to restore (a maximum of 50 is supported at once).
- """
- ids: [TodoID!]!
-}
-
-"""
-Autogenerated return type of TodoRestoreMany
-"""
-type TodoRestoreManyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Updated to-do items.
- """
- todos: [Todo!]!
-
- """
- The IDs of the updated to-do items. Deprecated in 13.2: Use to-do items.
- """
- updatedIds: [TodoID!]! @deprecated(reason: "Use to-do items. Deprecated in 13.2.")
-}
-
-"""
-Autogenerated return type of TodoRestore
-"""
-type TodoRestorePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The requested to-do item.
- """
- todo: Todo!
-}
-
-enum TodoStateEnum {
- done
- pending
-}
-
-enum TodoTargetEnum {
- """
- An Alert
- """
- ALERT
-
- """
- A Commit
- """
- COMMIT
-
- """
- A Design
- """
- DESIGN
-
- """
- An Epic
- """
- EPIC
-
- """
- An Issue
- """
- ISSUE
-
- """
- A MergeRequest
- """
- MERGEREQUEST
-}
-
-"""
-Identifier of Todoable.
-"""
-scalar TodoableID
-
-"""
-Autogenerated input type of TodosMarkAllDone
-"""
-input TodosMarkAllDoneInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-}
-
-"""
-Autogenerated return type of TodosMarkAllDone
-"""
-type TodosMarkAllDonePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Updated to-do items.
- """
- todos: [Todo!]!
-
- """
- IDs of the updated to-do items. Deprecated in 13.2: Use to-do items.
- """
- updatedIds: [TodoID!]! @deprecated(reason: "Use to-do items. Deprecated in 13.2.")
-}
-
-"""
-Autogenerated input type of ToggleAwardEmoji
-"""
-input ToggleAwardEmojiInput {
- """
- The global ID of the awardable resource.
- """
- awardableId: AwardableID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The emoji name.
- """
- name: String!
-}
-
-"""
-Autogenerated return type of ToggleAwardEmoji
-"""
-type ToggleAwardEmojiPayload {
- """
- The award emoji after mutation.
- """
- awardEmoji: AwardEmoji
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji.
- """
- toggledOn: Boolean!
-}
-
-type Tree {
- """
- Blobs of the tree.
- """
- blobs(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): BlobConnection!
-
- """
- Last commit for the tree.
- """
- lastCommit: Commit
-
- """
- Sub-modules of the tree.
- """
- submodules(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): SubmoduleConnection!
-
- """
- Trees of the tree.
- """
- trees(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): TreeEntryConnection!
-}
-
-"""
-Represents a directory
-"""
-type TreeEntry implements Entry {
- """
- Flat path of the entry.
- """
- flatPath: String!
-
- """
- ID of the entry.
- """
- id: ID!
-
- """
- Name of the entry.
- """
- name: String!
-
- """
- Path of the entry.
- """
- path: String!
-
- """
- Last commit SHA for the entry.
- """
- sha: String!
-
- """
- Type of tree entry.
- """
- type: EntryType!
-
- """
- Web path for the tree entry (directory).
- """
- webPath: String
-
- """
- Web URL for the tree entry (directory).
- """
- webUrl: String
-}
-
-"""
-The connection type for TreeEntry.
-"""
-type TreeEntryConnection {
- """
- A list of edges.
- """
- edges: [TreeEntryEdge]
-
- """
- A list of nodes.
- """
- nodes: [TreeEntry]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type TreeEntryEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: TreeEntry
-}
-
-enum TypeEnum {
- personal
- project
-}
-
-"""
-A regexp containing patterns sourced from user input
-"""
-scalar UntrustedRegexp
-
-"""
-Autogenerated input type of UpdateAlertStatus
-"""
-input UpdateAlertStatusInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The IID of the alert to mutate.
- """
- iid: String!
-
- """
- The project the alert to mutate is in.
- """
- projectPath: ID!
-
- """
- The status to set the alert.
- """
- status: AlertManagementStatus!
-}
-
-"""
-Autogenerated return type of UpdateAlertStatus
-"""
-type UpdateAlertStatusPayload {
- """
- The alert after mutation.
- """
- alert: AlertManagementAlert
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue created after mutation.
- """
- issue: Issue
-
- """
- The to-do item after mutation.
- """
- todo: Todo
-}
-
-"""
-Autogenerated input type of UpdateBoardEpicUserPreferences
-"""
-input UpdateBoardEpicUserPreferencesInput {
- """
- The board global ID.
- """
- boardId: BoardID!
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Whether the epic should be collapsed in the board.
- """
- collapsed: Boolean!
-
- """
- ID of an epic to set preferences for.
- """
- epicId: EpicID!
-}
-
-"""
-Autogenerated return type of UpdateBoardEpicUserPreferences
-"""
-type UpdateBoardEpicUserPreferencesPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- User preferences for the epic in the board after mutation.
- """
- epicUserPreferences: BoardEpicUserPreferences
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of UpdateBoard
-"""
-input UpdateBoardInput {
- """
- The ID of user to be assigned to the board.
- """
- assigneeId: UserID
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Whether or not backlog list is hidden.
- """
- hideBacklogList: Boolean
-
- """
- Whether or not closed list is hidden.
- """
- hideClosedList: Boolean
-
- """
- The board global ID.
- """
- id: BoardID!
-
- """
- The ID of iteration to be assigned to the board.
- """
- iterationId: IterationID
-
- """
- The IDs of labels to be added to the board.
- """
- labelIds: [LabelID!]
-
- """
- Labels of the issue.
- """
- labels: [String!]
-
- """
- The ID of milestone to be assigned to the board.
- """
- milestoneId: MilestoneID
-
- """
- The board name.
- """
- name: String
-
- """
- The weight value to be assigned to the board.
- """
- weight: Int
-}
-
-"""
-Autogenerated input type of UpdateBoardList
-"""
-input UpdateBoardListInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates if list is collapsed for this user.
- """
- collapsed: Boolean
-
- """
- Global ID of the list.
- """
- listId: ListID!
-
- """
- Position of list within the board.
- """
- position: Int
-}
-
-"""
-Autogenerated return type of UpdateBoardList
-"""
-type UpdateBoardListPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Mutated list.
- """
- list: BoardList
-}
-
-"""
-Autogenerated return type of UpdateBoard
-"""
-type UpdateBoardPayload {
- """
- The board after mutation.
- """
- board: Board
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of UpdateComplianceFramework
-"""
-input UpdateComplianceFrameworkInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the compliance framework to update.
- """
- id: ComplianceManagementFrameworkID!
-
- """
- Parameters to update the compliance framework with.
- """
- params: ComplianceFrameworkInput!
-}
-
-"""
-Autogenerated return type of UpdateComplianceFramework
-"""
-type UpdateComplianceFrameworkPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The compliance framework after mutation.
- """
- complianceFramework: ComplianceFramework
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of UpdateContainerExpirationPolicy
-"""
-input UpdateContainerExpirationPolicyInput {
- """
- This container expiration policy schedule.
- """
- cadence: ContainerExpirationPolicyCadenceEnum
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates whether this container expiration policy is enabled.
- """
- enabled: Boolean
-
- """
- Number of tags to retain.
- """
- keepN: ContainerExpirationPolicyKeepEnum
-
- """
- Tags with names matching this regex pattern will expire.
- """
- nameRegex: UntrustedRegexp
-
- """
- Tags with names matching this regex pattern will be preserved.
- """
- nameRegexKeep: UntrustedRegexp
-
- """
- Tags older that this will expire.
- """
- olderThan: ContainerExpirationPolicyOlderThanEnum
-
- """
- The project path where the container expiration policy is located.
- """
- projectPath: ID!
-}
-
-"""
-Autogenerated return type of UpdateContainerExpirationPolicy
-"""
-type UpdateContainerExpirationPolicyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The container expiration policy after mutation.
- """
- containerExpirationPolicy: ContainerExpirationPolicy
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-input UpdateDiffImagePositionInput {
- """
- Total height of the image.
- """
- height: Int
-
- """
- Total width of the image.
- """
- width: Int
-
- """
- X position of the note.
- """
- x: Int
-
- """
- Y position of the note.
- """
- y: Int
-}
-
-"""
-Autogenerated input type of UpdateEpic
-"""
-input UpdateEpicInput {
- """
- The IDs of labels to be added to the epic.
- """
- addLabelIds: [ID!]
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates if the epic is confidential.
- """
- confidential: Boolean
-
- """
- The description of the epic.
- """
- description: String
-
- """
- The end date of the epic.
- """
- dueDateFixed: String
-
- """
- Indicates end date should be sourced from due_date_fixed field not the issue milestones.
- """
- dueDateIsFixed: Boolean
-
- """
- The group the epic to mutate is in.
- """
- groupPath: ID!
-
- """
- The IID of the epic to mutate.
- """
- iid: ID!
-
- """
- The IDs of labels to be removed from the epic.
- """
- removeLabelIds: [ID!]
-
- """
- The start date of the epic.
- """
- startDateFixed: String
-
- """
- Indicates start date should be sourced from start_date_fixed field not the issue milestones.
- """
- startDateIsFixed: Boolean
-
- """
- State event for the epic.
- """
- stateEvent: EpicStateEvent
-
- """
- The title of the epic.
- """
- title: String
-}
-
-"""
-Autogenerated return type of UpdateEpic
-"""
-type UpdateEpicPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The epic after mutation.
- """
- epic: Epic
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-Autogenerated input type of UpdateImageDiffNote
-"""
-input UpdateImageDiffNoteInput {
- """
- Content of the note.
- """
- body: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the note to update.
- """
- id: NoteID!
-
- """
- The position of this note on a diff.
- """
- position: UpdateDiffImagePositionInput
-}
-
-"""
-Autogenerated return type of UpdateImageDiffNote
-"""
-type UpdateImageDiffNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of UpdateIssue
-"""
-input UpdateIssueInput {
- """
- The IDs of labels to be added to the issue.
- """
- addLabelIds: [ID!]
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Indicates the issue is confidential.
- """
- confidential: Boolean
-
- """
- Description of the issue.
- """
- description: String
-
- """
- Due date of the issue.
- """
- dueDate: ISO8601Date
-
- """
- The ID of the parent epic. NULL when removing the association.
- """
- epicId: EpicID
-
- """
- The desired health status.
- """
- healthStatus: HealthStatus
-
- """
- The IID of the issue to mutate.
- """
- iid: String!
-
- """
- Indicates discussion is locked on the issue.
- """
- locked: Boolean
-
- """
- The ID of the milestone to assign to the issue. On update milestone will be removed if set to null.
- """
- milestoneId: ID
-
- """
- The project the issue to mutate is in.
- """
- projectPath: ID!
-
- """
- The IDs of labels to be removed from the issue.
- """
- removeLabelIds: [ID!]
-
- """
- Close or reopen an issue.
- """
- stateEvent: IssueStateEvent
-
- """
- Title of the issue.
- """
- title: String
-
- """
- The weight of the issue.
- """
- weight: Int
-}
-
-"""
-Autogenerated return type of UpdateIssue
-"""
-type UpdateIssuePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The issue after mutation.
- """
- issue: Issue
-}
-
-"""
-Autogenerated input type of UpdateIteration
-"""
-input UpdateIterationInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the iteration.
- """
- description: String
-
- """
- End date of the iteration.
- """
- dueDate: String
-
- """
- Group of the iteration.
- """
- groupPath: ID!
-
- """
- Global ID of the iteration.
- """
- id: ID!
-
- """
- Start date of the iteration.
- """
- startDate: String
-
- """
- Title of the iteration.
- """
- title: String
-}
-
-"""
-Autogenerated return type of UpdateIteration
-"""
-type UpdateIterationPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Updated iteration.
- """
- iteration: Iteration
-}
-
-"""
-Autogenerated input type of UpdateNamespacePackageSettings
-"""
-input UpdateNamespacePackageSettingsInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- When maven_duplicates_allowed is false, you can publish duplicate packages
- with names that match this regex. Otherwise, this setting has no effect.
- """
- mavenDuplicateExceptionRegex: UntrustedRegexp
-
- """
- Indicates whether duplicate Maven packages are allowed for this namespace.
- """
- mavenDuplicatesAllowed: Boolean
-
- """
- The namespace path where the namespace package setting is located.
- """
- namespacePath: ID!
-}
-
-"""
-Autogenerated return type of UpdateNamespacePackageSettings
-"""
-type UpdateNamespacePackageSettingsPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The namespace package setting after mutation.
- """
- packageSettings: PackageSettings
-}
-
-"""
-Autogenerated input type of UpdateNote
-"""
-input UpdateNoteInput {
- """
- Content of the note.
- """
- body: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The confidentiality flag of a note. Default is false.
- """
- confidential: Boolean
-
- """
- The global ID of the note to update.
- """
- id: NoteID!
-}
-
-"""
-Autogenerated return type of UpdateNote
-"""
-type UpdateNotePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The note after mutation.
- """
- note: Note
-}
-
-"""
-Autogenerated input type of UpdateRequirement
-"""
-input UpdateRequirementInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the requirement.
- """
- description: String
-
- """
- The IID of the requirement to update.
- """
- iid: String!
-
- """
- Creates a test report for the requirement with the given state.
- """
- lastTestReportState: TestReportState
-
- """
- Full project path the requirement is associated with.
- """
- projectPath: ID!
-
- """
- State of the requirement.
- """
- state: RequirementState
-
- """
- Title of the requirement.
- """
- title: String
-}
-
-"""
-Autogenerated return type of UpdateRequirement
-"""
-type UpdateRequirementPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Requirement after mutation.
- """
- requirement: Requirement
-}
-
-"""
-Autogenerated input type of UpdateSnippet
-"""
-input UpdateSnippetInput {
- """
- Actions to perform over the snippet repository and blobs.
- """
- blobActions: [SnippetBlobActionInputType!]
-
- """
- A valid CAPTCHA response value obtained by using the provided captchaSiteKey
- with a CAPTCHA API to present a challenge to be solved on the client. Required
- to resubmit if the previous operation returned "NeedsCaptchaResponse: true".
- """
- captchaResponse: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Description of the snippet.
- """
- description: String
-
- """
- The global ID of the snippet to update.
- """
- id: SnippetID!
-
- """
- The spam log ID which must be passed along with a valid CAPTCHA response for
- the operation to be completed. Required to resubmit if the previous operation
- returned "NeedsCaptchaResponse: true".
- """
- spamLogId: Int
-
- """
- Title of the snippet.
- """
- title: String
-
- """
- The visibility level of the snippet.
- """
- visibilityLevel: VisibilityLevelsEnum
-}
-
-"""
-Autogenerated return type of UpdateSnippet
-"""
-type UpdateSnippetPayload {
- """
- The CAPTCHA site key which must be used to render a challenge for the user to
- solve to obtain a valid captchaResponse value. Included only when an operation
- was not completed because "NeedsCaptchaResponse" is true.
- """
- captchaSiteKey: String
-
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- Indicates whether the operation was detected as possible spam and not
- completed. If CAPTCHA is enabled, the request must be resubmitted with a valid
- CAPTCHA response and spam_log_id included for the operation to be completed.
- Included only when an operation was not completed because
- "NeedsCaptchaResponse" is true.
- """
- needsCaptchaResponse: Boolean
-
- """
- The snippet after mutation.
- """
- snippet: Snippet
-
- """
- Indicates whether the operation was detected as definite spam. There is no
- option to resubmit the request with a CAPTCHA response.
- """
- spam: Boolean
-
- """
- The spam log ID which must be passed along with a valid CAPTCHA response for
- an operation to be completed. Included only when an operation was not
- completed because "NeedsCaptchaResponse" is true.
- """
- spamLogId: Int
-}
-
-scalar Upload
-
-type User {
- """
- Merge Requests assigned to the user.
- """
- assignedMergeRequests(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of the author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of IIDs of merge requests, for example `[1, 2]`.
- """
- iids: [String!]
-
- """
- Array of label names. All resolved merge requests will have all of these labels.
- """
- labels: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Merge requests merged after this date.
- """
- mergedAfter: Time
-
- """
- Merge requests merged before this date.
- """
- mergedBefore: Time
-
- """
- Title of the milestone.
- """
- milestoneTitle: String
-
- """
- The global ID of the project the authored merge requests should be in. Incompatible with projectPath.
- """
- projectId: ProjectID
-
- """
- The full-path of the project the authored merge requests should be in. Incompatible with projectId.
- """
- projectPath: String
-
- """
- Username of the reviewer.
- """
- reviewerUsername: String
-
- """
- Sort merge requests by this criteria.
- """
- sort: MergeRequestSort = created_desc
-
- """
- Array of source branch names. All resolved merge requests will have one of these branches as their source.
- """
- sourceBranches: [String!]
-
- """
- A merge request state. If provided, all resolved merge requests will have this state.
- """
- state: MergeRequestState
-
- """
- Array of target branch names. All resolved merge requests will have one of these branches as their target.
- """
- targetBranches: [String!]
- ): MergeRequestConnection
-
- """
- Merge Requests authored by the user.
- """
- authoredMergeRequests(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of the assignee.
- """
- assigneeUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of IIDs of merge requests, for example `[1, 2]`.
- """
- iids: [String!]
-
- """
- Array of label names. All resolved merge requests will have all of these labels.
- """
- labels: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Merge requests merged after this date.
- """
- mergedAfter: Time
-
- """
- Merge requests merged before this date.
- """
- mergedBefore: Time
-
- """
- Title of the milestone.
- """
- milestoneTitle: String
-
- """
- The global ID of the project the authored merge requests should be in. Incompatible with projectPath.
- """
- projectId: ProjectID
-
- """
- The full-path of the project the authored merge requests should be in. Incompatible with projectId.
- """
- projectPath: String
-
- """
- Username of the reviewer.
- """
- reviewerUsername: String
-
- """
- Sort merge requests by this criteria.
- """
- sort: MergeRequestSort = created_desc
-
- """
- Array of source branch names. All resolved merge requests will have one of these branches as their source.
- """
- sourceBranches: [String!]
-
- """
- A merge request state. If provided, all resolved merge requests will have this state.
- """
- state: MergeRequestState
-
- """
- Array of target branch names. All resolved merge requests will have one of these branches as their target.
- """
- targetBranches: [String!]
- ): MergeRequestConnection
-
- """
- URL of the user's avatar.
- """
- avatarUrl: String
-
- """
- Indicates if the user is a bot.
- """
- bot: Boolean!
-
- """
- User email. Deprecated in 13.7: Use public_email.
- """
- email: String @deprecated(reason: "Use public_email. Deprecated in 13.7.")
-
- """
- Group count for the user. Available only when feature flag `user_group_counts` is enabled.
- """
- groupCount: Int
-
- """
- Group memberships of the user.
- """
- groupMemberships(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): GroupMemberConnection
-
- """
- ID of the user.
- """
- id: ID!
-
- """
- The location of the user.
- """
- location: String
-
- """
- Human-readable name of the user.
- """
- name: String!
-
- """
- Project memberships of the user.
- """
- projectMemberships(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ProjectMemberConnection
-
- """
- User's public email.
- """
- publicEmail: String
-
- """
- Merge Requests assigned to the user for review.
- """
- reviewRequestedMergeRequests(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Username of the assignee.
- """
- assigneeUsername: String
-
- """
- Username of the author.
- """
- authorUsername: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of IIDs of merge requests, for example `[1, 2]`.
- """
- iids: [String!]
-
- """
- Array of label names. All resolved merge requests will have all of these labels.
- """
- labels: [String!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Merge requests merged after this date.
- """
- mergedAfter: Time
-
- """
- Merge requests merged before this date.
- """
- mergedBefore: Time
-
- """
- Title of the milestone.
- """
- milestoneTitle: String
-
- """
- The global ID of the project the authored merge requests should be in. Incompatible with projectPath.
- """
- projectId: ProjectID
-
- """
- The full-path of the project the authored merge requests should be in. Incompatible with projectId.
- """
- projectPath: String
-
- """
- Sort merge requests by this criteria.
- """
- sort: MergeRequestSort = created_desc
-
- """
- Array of source branch names. All resolved merge requests will have one of these branches as their source.
- """
- sourceBranches: [String!]
-
- """
- A merge request state. If provided, all resolved merge requests will have this state.
- """
- state: MergeRequestState
-
- """
- Array of target branch names. All resolved merge requests will have one of these branches as their target.
- """
- targetBranches: [String!]
- ): MergeRequestConnection
-
- """
- Snippets authored by the user.
- """
- snippets(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Array of global snippet ids, e.g., "gid://gitlab/ProjectSnippet/1".
- """
- ids: [SnippetID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The type of snippet.
- """
- type: TypeEnum
-
- """
- The visibility of the snippet.
- """
- visibility: VisibilityScopesEnum
- ): SnippetConnection
-
- """
- Projects starred by the user.
- """
- starredProjects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Search query.
- """
- search: String
- ): ProjectConnection
-
- """
- State of the user.
- """
- state: UserState!
-
- """
- User status.
- """
- status: UserStatus
-
- """
- To-do items of the user.
- """
- todos(
- """
- The action to be filtered.
- """
- action: [TodoActionEnum!]
-
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- The ID of an author.
- """
- authorId: [ID!]
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- The ID of a group.
- """
- groupId: [ID!]
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- The ID of a project.
- """
- projectId: [ID!]
-
- """
- The state of the todo.
- """
- state: [TodoStateEnum!]
-
- """
- The type of the todo.
- """
- type: [TodoTargetEnum!]
- ): TodoConnection!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: UserPermissions!
-
- """
- Username of the user. Unique within this instance of GitLab.
- """
- username: String!
-
- """
- Web path of the user.
- """
- webPath: String!
-
- """
- Web URL of the user.
- """
- webUrl: String!
-}
-
-"""
-The connection type for User.
-"""
-type UserConnection {
- """
- A list of edges.
- """
- edges: [UserEdge]
-
- """
- A list of nodes.
- """
- nodes: [User]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type UserEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: User
-}
-
-"""
-Identifier of User.
-"""
-scalar UserID
-
-type UserPermissions {
- """
- Indicates the user can perform `create_snippet` on this resource
- """
- createSnippet: Boolean!
-}
-
-"""
-Possible states of a user
-"""
-enum UserState {
- """
- The user is active and is able to use the system
- """
- active
-
- """
- The user has been blocked and is prevented from using the system
- """
- blocked
-
- """
- The user is no longer active and is unable to use the system
- """
- deactivated
-}
-
-type UserStatus {
- """
- User availability status.
- """
- availability: AvailabilityEnum!
-
- """
- String representation of emoji.
- """
- emoji: String
-
- """
- User status message.
- """
- message: String
-
- """
- HTML of the user status message
- """
- messageHtml: String
-}
-
-enum VisibilityLevelsEnum {
- internal
- private
- public
-}
-
-enum VisibilityScopesEnum {
- internal
- private
- public
-}
-
-"""
-Represents the count of vulnerabilities by severity on a particular day. This data is retained for 365 days
-"""
-type VulnerabilitiesCountByDay {
- """
- Total number of vulnerabilities on a particular day with critical severity
- """
- critical: Int!
-
- """
- Date for the count.
- """
- date: ISO8601Date!
-
- """
- Total number of vulnerabilities on a particular day with high severity
- """
- high: Int!
-
- """
- Total number of vulnerabilities on a particular day with info severity
- """
- info: Int!
-
- """
- Total number of vulnerabilities on a particular day with low severity
- """
- low: Int!
-
- """
- Total number of vulnerabilities on a particular day with medium severity
- """
- medium: Int!
-
- """
- Total number of vulnerabilities on a particular day.
- """
- total: Int!
-
- """
- Total number of vulnerabilities on a particular day with unknown severity
- """
- unknown: Int!
-}
-
-"""
-Represents the number of vulnerabilities for a particular severity on a particular day. This data is retained for 365 days
-"""
-type VulnerabilitiesCountByDayAndSeverity {
- """
- Number of vulnerabilities.
- """
- count: Int
-
- """
- Date for the count.
- """
- day: ISO8601Date
-
- """
- Severity of the counted vulnerabilities.
- """
- severity: VulnerabilitySeverity
-}
-
-"""
-The connection type for VulnerabilitiesCountByDayAndSeverity.
-"""
-type VulnerabilitiesCountByDayAndSeverityConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilitiesCountByDayAndSeverityEdge]
-
- """
- A list of nodes.
- """
- nodes: [VulnerabilitiesCountByDayAndSeverity]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilitiesCountByDayAndSeverityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: VulnerabilitiesCountByDayAndSeverity
-}
-
-"""
-The connection type for VulnerabilitiesCountByDay.
-"""
-type VulnerabilitiesCountByDayConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilitiesCountByDayEdge]
-
- """
- A list of nodes.
- """
- nodes: [VulnerabilitiesCountByDay]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilitiesCountByDayEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: VulnerabilitiesCountByDay
-}
-
-"""
-Identifier of Vulnerabilities::ExternalIssueLink.
-"""
-scalar VulnerabilitiesExternalIssueLinkID
-
-"""
-Represents a vulnerability
-"""
-type Vulnerability implements Noteable {
- """
- Timestamp of when the vulnerability state was changed to confirmed.
- """
- confirmedAt: Time
-
- """
- The user that confirmed the vulnerability.
- """
- confirmedBy: User
-
- """
- Description of the vulnerability.
- """
- description: String
-
- """
- Details of the vulnerability.
- """
- details: [VulnerabilityDetail!]!
-
- """
- Timestamp of when the vulnerability was first detected.
- """
- detectedAt: Time!
-
- """
- All discussions on this noteable.
- """
- discussions(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): DiscussionConnection!
-
- """
- Timestamp of when the vulnerability state was changed to dismissed.
- """
- dismissedAt: Time
-
- """
- The user that dismissed the vulnerability.
- """
- dismissedBy: User
-
- """
- List of external issue links related to the vulnerability.
- """
- externalIssueLinks(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): VulnerabilityExternalIssueLinkConnection!
-
- """
- Indicates whether there is a solution available for this vulnerability.
- """
- hasSolutions: Boolean
-
- """
- GraphQL ID of the vulnerability.
- """
- id: ID!
-
- """
- Identifiers of the vulnerability.
- """
- identifiers: [VulnerabilityIdentifier!]!
-
- """
- List of issue links related to the vulnerability.
- """
- issueLinks(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
-
- """
- Filter issue links by link type.
- """
- linkType: VulnerabilityIssueLinkType
- ): VulnerabilityIssueLinkConnection!
-
- """
- Location metadata for the vulnerability. Its fields depend on the type of security scan that found the vulnerability.
- """
- location: VulnerabilityLocation
-
- """
- Merge request that fixes the vulnerability.
- """
- mergeRequest: MergeRequest
-
- """
- All notes on this noteable.
- """
- notes(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): NoteConnection!
-
- """
- Primary identifier of the vulnerability.
- """
- primaryIdentifier: VulnerabilityIdentifier
-
- """
- The project on which the vulnerability was found.
- """
- project: Project
-
- """
- Type of the security report that found the vulnerability (SAST,
- DEPENDENCY_SCANNING, CONTAINER_SCANNING, DAST, SECRET_DETECTION,
- COVERAGE_FUZZING, API_FUZZING)
- """
- reportType: VulnerabilityReportType
-
- """
- Timestamp of when the vulnerability state was changed to resolved.
- """
- resolvedAt: Time
-
- """
- The user that resolved the vulnerability.
- """
- resolvedBy: User
-
- """
- Indicates whether the vulnerability is fixed on the default branch or not.
- """
- resolvedOnDefaultBranch: Boolean!
-
- """
- Scanner metadata for the vulnerability.
- """
- scanner: VulnerabilityScanner
-
- """
- Severity of the vulnerability (INFO, UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL)
- """
- severity: VulnerabilitySeverity
-
- """
- State of the vulnerability (DETECTED, CONFIRMED, RESOLVED, DISMISSED)
- """
- state: VulnerabilityState
-
- """
- Title of the vulnerability.
- """
- title: String
-
- """
- Number of user notes attached to the vulnerability.
- """
- userNotesCount: Int!
-
- """
- Permissions for the current user on the resource
- """
- userPermissions: VulnerabilityPermissions!
-
- """
- URL to the vulnerability's details page.
- """
- vulnerabilityPath: String
-}
-
-"""
-Autogenerated input type of VulnerabilityConfirm
-"""
-input VulnerabilityConfirmInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the vulnerability to be confirmed.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of VulnerabilityConfirm
-"""
-type VulnerabilityConfirmPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after state change.
- """
- vulnerability: Vulnerability
-}
-
-"""
-The connection type for Vulnerability.
-"""
-type VulnerabilityConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilityEdge]
-
- """
- A list of nodes.
- """
- nodes: [Vulnerability]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Represents a vulnerability detail field. The fields with data will depend on the vulnerability detail type
-"""
-union VulnerabilityDetail = VulnerabilityDetailBase | VulnerabilityDetailBoolean | VulnerabilityDetailCode | VulnerabilityDetailCommit | VulnerabilityDetailDiff | VulnerabilityDetailFileLocation | VulnerabilityDetailInt | VulnerabilityDetailList | VulnerabilityDetailMarkdown | VulnerabilityDetailModuleLocation | VulnerabilityDetailTable | VulnerabilityDetailText | VulnerabilityDetailUrl
-
-"""
-Represents the vulnerability details base
-"""
-type VulnerabilityDetailBase {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-}
-
-"""
-Represents the vulnerability details boolean value
-"""
-type VulnerabilityDetailBoolean {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Value of the field.
- """
- value: Boolean!
-}
-
-"""
-Represents the vulnerability details code field
-"""
-type VulnerabilityDetailCode {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Language of the code.
- """
- lang: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Source code.
- """
- value: String!
-}
-
-"""
-Represents the vulnerability details commit field
-"""
-type VulnerabilityDetailCommit {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- The commit SHA value.
- """
- value: String!
-}
-
-"""
-Represents the vulnerability details diff field
-"""
-type VulnerabilityDetailDiff {
- """
- Value of the field after the change.
- """
- after: String!
-
- """
- Value of the field before the change.
- """
- before: String!
-
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-}
-
-"""
-Represents the vulnerability details location within a file in the project
-"""
-type VulnerabilityDetailFileLocation {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- File name.
- """
- fileName: String!
-
- """
- End line number of the file location.
- """
- lineEnd: Int!
-
- """
- Start line number of the file location.
- """
- lineStart: Int!
-
- """
- Name of the field.
- """
- name: String!
-}
-
-"""
-Represents the vulnerability details integer value
-"""
-type VulnerabilityDetailInt {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Value of the field.
- """
- value: Int!
-}
-
-"""
-Represents the vulnerability details list value
-"""
-type VulnerabilityDetailList {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- List of details.
- """
- items: [VulnerabilityDetail!]!
-
- """
- Name of the field.
- """
- name: String!
-}
-
-"""
-Represents the vulnerability details Markdown field
-"""
-type VulnerabilityDetailMarkdown {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Value of the Markdown field.
- """
- value: String!
-}
-
-"""
-Represents the vulnerability details location within a file in the project
-"""
-type VulnerabilityDetailModuleLocation {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Module name.
- """
- moduleName: String!
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Offset of the module location.
- """
- offset: Int!
-}
-
-"""
-Represents the vulnerability details table value
-"""
-type VulnerabilityDetailTable {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Table headers.
- """
- headers: [VulnerabilityDetail!]!
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Table rows.
- """
- rows: [VulnerabilityDetail!]!
-}
-
-"""
-Represents the vulnerability details text field
-"""
-type VulnerabilityDetailText {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Value of the text field.
- """
- value: String!
-}
-
-"""
-Represents the vulnerability details URL field
-"""
-type VulnerabilityDetailUrl {
- """
- Description of the field.
- """
- description: String!
-
- """
- Name of the field.
- """
- fieldName: String
-
- """
- Href of the URL.
- """
- href: String!
-
- """
- Name of the field.
- """
- name: String!
-
- """
- Text of the URL.
- """
- text: String
-}
-
-"""
-Autogenerated input type of VulnerabilityDismiss
-"""
-input VulnerabilityDismissInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Comment why vulnerability should be dismissed.
- """
- comment: String
-
- """
- Reason why vulnerability should be dismissed.
- """
- dismissalReason: VulnerabilityDismissalReason
-
- """
- ID of the vulnerability to be dismissed.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of VulnerabilityDismiss
-"""
-type VulnerabilityDismissPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after dismissal.
- """
- vulnerability: Vulnerability
-}
-
-"""
-The dismissal reason of the Vulnerability
-"""
-enum VulnerabilityDismissalReason {
- """
- The likelihood of the Vulnerability occurring and its impact are deemed acceptable
- """
- ACCEPTABLE_RISK
-
- """
- The Vulnerability was incorrectly identified as being present
- """
- FALSE_POSITIVE
-
- """
- There is a mitigating control that eliminates the Vulnerability or makes its risk acceptable
- """
- MITIGATING_CONTROL
-
- """
- Other reasons for dismissal
- """
- NOT_APPLICABLE
-
- """
- The Vulnerability is used in tests and does not pose an actual risk
- """
- USED_IN_TESTS
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilityEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: Vulnerability
-}
-
-"""
-Represents an external issue link of a vulnerability
-"""
-type VulnerabilityExternalIssueLink {
- """
- The external issue attached to the issue link.
- """
- externalIssue: ExternalIssue
-
- """
- GraphQL ID of the external issue link.
- """
- id: VulnerabilitiesExternalIssueLinkID!
-
- """
- Type of the external issue link.
- """
- linkType: VulnerabilityExternalIssueLinkType!
-}
-
-"""
-The connection type for VulnerabilityExternalIssueLink.
-"""
-type VulnerabilityExternalIssueLinkConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilityExternalIssueLinkEdge]
-
- """
- A list of nodes.
- """
- nodes: [VulnerabilityExternalIssueLink]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-Autogenerated input type of VulnerabilityExternalIssueLinkCreate
-"""
-input VulnerabilityExternalIssueLinkCreateInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- External tracker type of the external issue link.
- """
- externalTracker: VulnerabilityExternalIssueLinkExternalTracker!
-
- """
- ID of the vulnerability.
- """
- id: VulnerabilityID!
-
- """
- Type of the external issue link.
- """
- linkType: VulnerabilityExternalIssueLinkType!
-}
-
-"""
-Autogenerated return type of VulnerabilityExternalIssueLinkCreate
-"""
-type VulnerabilityExternalIssueLinkCreatePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The created external issue link.
- """
- externalIssueLink: VulnerabilityExternalIssueLink
-}
-
-"""
-Autogenerated input type of VulnerabilityExternalIssueLinkDestroy
-"""
-input VulnerabilityExternalIssueLinkDestroyInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- The global ID of the vulnerability external issue link.
- """
- id: VulnerabilitiesExternalIssueLinkID!
-}
-
-"""
-Autogenerated return type of VulnerabilityExternalIssueLinkDestroy
-"""
-type VulnerabilityExternalIssueLinkDestroyPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilityExternalIssueLinkEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: VulnerabilityExternalIssueLink
-}
-
-"""
-The external tracker of the external issue link related to a vulnerability
-"""
-enum VulnerabilityExternalIssueLinkExternalTracker {
- """
- Jira external tracker
- """
- JIRA
-}
-
-"""
-The type of the external issue link related to a vulnerability
-"""
-enum VulnerabilityExternalIssueLinkType {
- """
- Created link type
- """
- CREATED
-}
-
-"""
-The grade of the vulnerable project
-"""
-enum VulnerabilityGrade {
- A
- B
- C
- D
- F
-}
-
-"""
-Identifier of Vulnerability.
-"""
-scalar VulnerabilityID
-
-"""
-Represents a vulnerability identifier
-"""
-type VulnerabilityIdentifier {
- """
- External ID of the vulnerability identifier.
- """
- externalId: String
-
- """
- External type of the vulnerability identifier.
- """
- externalType: String
-
- """
- Name of the vulnerability identifier.
- """
- name: String
-
- """
- URL of the vulnerability identifier.
- """
- url: String
-}
-
-"""
-Represents an issue link of a vulnerability
-"""
-type VulnerabilityIssueLink {
- """
- GraphQL ID of the vulnerability.
- """
- id: ID!
-
- """
- The issue attached to issue link.
- """
- issue: Issue!
-
- """
- Type of the issue link.
- """
- linkType: VulnerabilityIssueLinkType!
-}
-
-"""
-The connection type for VulnerabilityIssueLink.
-"""
-type VulnerabilityIssueLinkConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilityIssueLinkEdge]
-
- """
- A list of nodes.
- """
- nodes: [VulnerabilityIssueLink]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilityIssueLinkEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: VulnerabilityIssueLink
-}
-
-"""
-The type of the issue link related to a vulnerability
-"""
-enum VulnerabilityIssueLinkType {
- CREATED
- RELATED
-}
-
-"""
-Represents a vulnerability location. The fields with data will depend on the vulnerability report type
-"""
-union VulnerabilityLocation = VulnerabilityLocationContainerScanning | VulnerabilityLocationCoverageFuzzing | VulnerabilityLocationDast | VulnerabilityLocationDependencyScanning | VulnerabilityLocationSast | VulnerabilityLocationSecretDetection
-
-"""
-Represents the location of a vulnerability found by a container security scan
-"""
-type VulnerabilityLocationContainerScanning {
- """
- Dependency containing the vulnerability.
- """
- dependency: VulnerableDependency
-
- """
- Name of the vulnerable container image.
- """
- image: String
-
- """
- Operating system that runs on the vulnerable container image.
- """
- operatingSystem: String
-}
-
-"""
-Represents the location of a vulnerability found by a Coverage Fuzzing scan
-"""
-type VulnerabilityLocationCoverageFuzzing {
- """
- Blob path to the vulnerable file.
- """
- blobPath: String
-
- """
- Number of the last relevant line in the vulnerable file.
- """
- endLine: String
-
- """
- Path to the vulnerable file.
- """
- file: String
-
- """
- Number of the first relevant line in the vulnerable file.
- """
- startLine: String
-
- """
- Class containing the vulnerability.
- """
- vulnerableClass: String
-
- """
- Method containing the vulnerability.
- """
- vulnerableMethod: String
-}
-
-"""
-Represents the location of a vulnerability found by a DAST scan
-"""
-type VulnerabilityLocationDast {
- """
- Domain name of the vulnerable request.
- """
- hostname: String
-
- """
- Query parameter for the URL on which the vulnerability occurred.
- """
- param: String
-
- """
- URL path and query string of the vulnerable request.
- """
- path: String
-
- """
- HTTP method of the vulnerable request.
- """
- requestMethod: String
-}
-
-"""
-Represents the location of a vulnerability found by a dependency security scan
-"""
-type VulnerabilityLocationDependencyScanning {
- """
- Blob path to the vulnerable file.
- """
- blobPath: String
-
- """
- Dependency containing the vulnerability.
- """
- dependency: VulnerableDependency
-
- """
- Path to the vulnerable file.
- """
- file: String
-}
-
-"""
-Represents the location of a vulnerability found by a SAST scan
-"""
-type VulnerabilityLocationSast {
- """
- Blob path to the vulnerable file.
- """
- blobPath: String
-
- """
- Number of the last relevant line in the vulnerable file.
- """
- endLine: String
-
- """
- Path to the vulnerable file.
- """
- file: String
-
- """
- Number of the first relevant line in the vulnerable file.
- """
- startLine: String
-
- """
- Class containing the vulnerability.
- """
- vulnerableClass: String
-
- """
- Method containing the vulnerability.
- """
- vulnerableMethod: String
-}
-
-"""
-Represents the location of a vulnerability found by a secret detection scan
-"""
-type VulnerabilityLocationSecretDetection {
- """
- Blob path to the vulnerable file.
- """
- blobPath: String
-
- """
- Number of the last relevant line in the vulnerable file.
- """
- endLine: String
-
- """
- Path to the vulnerable file.
- """
- file: String
-
- """
- Number of the first relevant line in the vulnerable file.
- """
- startLine: String
-
- """
- Class containing the vulnerability.
- """
- vulnerableClass: String
-
- """
- Method containing the vulnerability.
- """
- vulnerableMethod: String
-}
-
-"""
-Check permissions for the current user on a vulnerability
-"""
-type VulnerabilityPermissions {
- """
- Indicates the user can perform `admin_vulnerability` on this resource
- """
- adminVulnerability: Boolean!
-
- """
- Indicates the user can perform `admin_vulnerability_external_issue_link` on this resource
- """
- adminVulnerabilityExternalIssueLink: Boolean!
-
- """
- Indicates the user can perform `admin_vulnerability_issue_link` on this resource
- """
- adminVulnerabilityIssueLink: Boolean!
-
- """
- Indicates the user can perform `create_vulnerability` on this resource
- """
- createVulnerability: Boolean!
-
- """
- Indicates the user can perform `create_vulnerability_export` on this resource
- """
- createVulnerabilityExport: Boolean!
-
- """
- Indicates the user can perform `create_vulnerability_feedback` on this resource
- """
- createVulnerabilityFeedback: Boolean!
-
- """
- Indicates the user can perform `destroy_vulnerability_feedback` on this resource
- """
- destroyVulnerabilityFeedback: Boolean!
-
- """
- Indicates the user can perform `read_vulnerability_feedback` on this resource
- """
- readVulnerabilityFeedback: Boolean!
-
- """
- Indicates the user can perform `update_vulnerability_feedback` on this resource
- """
- updateVulnerabilityFeedback: Boolean!
-}
-
-"""
-The type of the security scan that found the vulnerability
-"""
-enum VulnerabilityReportType {
- API_FUZZING
- CONTAINER_SCANNING
- COVERAGE_FUZZING
- DAST
- DEPENDENCY_SCANNING
- SAST
- SECRET_DETECTION
-}
-
-"""
-Autogenerated input type of VulnerabilityResolve
-"""
-input VulnerabilityResolveInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the vulnerability to be resolved.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of VulnerabilityResolve
-"""
-type VulnerabilityResolvePayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after state change.
- """
- vulnerability: Vulnerability
-}
-
-"""
-Autogenerated input type of VulnerabilityRevertToDetected
-"""
-input VulnerabilityRevertToDetectedInput {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- ID of the vulnerability to be reverted.
- """
- id: VulnerabilityID!
-}
-
-"""
-Autogenerated return type of VulnerabilityRevertToDetected
-"""
-type VulnerabilityRevertToDetectedPayload {
- """
- A unique identifier for the client performing the mutation.
- """
- clientMutationId: String
-
- """
- Errors encountered during execution of the mutation.
- """
- errors: [String!]!
-
- """
- The vulnerability after revert.
- """
- vulnerability: Vulnerability
-}
-
-"""
-Represents a vulnerability scanner
-"""
-type VulnerabilityScanner {
- """
- External ID of the vulnerability scanner.
- """
- externalId: String
-
- """
- Name of the vulnerability scanner.
- """
- name: String
-
- """
- Type of the vulnerability report.
- """
- reportType: VulnerabilityReportType
-
- """
- Vendor of the vulnerability scanner.
- """
- vendor: String
-}
-
-"""
-The connection type for VulnerabilityScanner.
-"""
-type VulnerabilityScannerConnection {
- """
- A list of edges.
- """
- edges: [VulnerabilityScannerEdge]
-
- """
- A list of nodes.
- """
- nodes: [VulnerabilityScanner]
-
- """
- Information to aid in pagination.
- """
- pageInfo: PageInfo!
-}
-
-"""
-An edge in a connection.
-"""
-type VulnerabilityScannerEdge {
- """
- A cursor for use in pagination.
- """
- cursor: String!
-
- """
- The item at the end of the edge.
- """
- node: VulnerabilityScanner
-}
-
-"""
-Represents vulnerability counts by severity
-"""
-type VulnerabilitySeveritiesCount {
- """
- Number of vulnerabilities of CRITICAL severity of the project
- """
- critical: Int
-
- """
- Number of vulnerabilities of HIGH severity of the project
- """
- high: Int
-
- """
- Number of vulnerabilities of INFO severity of the project
- """
- info: Int
-
- """
- Number of vulnerabilities of LOW severity of the project
- """
- low: Int
-
- """
- Number of vulnerabilities of MEDIUM severity of the project
- """
- medium: Int
-
- """
- Number of vulnerabilities of UNKNOWN severity of the project
- """
- unknown: Int
-}
-
-"""
-The severity of the vulnerability
-"""
-enum VulnerabilitySeverity {
- CRITICAL
- HIGH
- INFO
- LOW
- MEDIUM
- UNKNOWN
-}
-
-"""
-Vulnerability sort values
-"""
-enum VulnerabilitySort {
- """
- Detection timestamp in ascending order
- """
- detected_asc
-
- """
- Detection timestamp in descending order
- """
- detected_desc
-
- """
- Report Type in ascending order
- """
- report_type_asc
-
- """
- Report Type in descending order
- """
- report_type_desc
-
- """
- Severity in ascending order
- """
- severity_asc
-
- """
- Severity in descending order
- """
- severity_desc
-
- """
- State in ascending order
- """
- state_asc
-
- """
- State in descending order
- """
- state_desc
-
- """
- Title in ascending order
- """
- title_asc
-
- """
- Title in descending order
- """
- title_desc
-}
-
-"""
-The state of the vulnerability
-"""
-enum VulnerabilityState {
- CONFIRMED
- DETECTED
- DISMISSED
- RESOLVED
-}
-
-"""
-Represents a vulnerable dependency. Used in vulnerability location data
-"""
-type VulnerableDependency {
- """
- The package associated with the vulnerable dependency.
- """
- package: VulnerablePackage
-
- """
- The version of the vulnerable dependency.
- """
- version: String
-}
-
-"""
-Represents a vulnerable package. Used in vulnerability dependency data
-"""
-type VulnerablePackage {
- """
- The name of the vulnerable package.
- """
- name: String
-}
-
-"""
-Represents vulnerability letter grades with associated projects
-"""
-type VulnerableProjectsByGrade {
- """
- Number of projects within this grade.
- """
- count: Int!
-
- """
- Grade based on the highest severity vulnerability present.
- """
- grade: VulnerabilityGrade!
-
- """
- Projects within this grade.
- """
- projects(
- """
- Returns the elements in the list that come after the specified cursor.
- """
- after: String
-
- """
- Returns the elements in the list that come before the specified cursor.
- """
- before: String
-
- """
- Returns the first _n_ elements from the list.
- """
- first: Int
-
- """
- Returns the last _n_ elements from the list.
- """
- last: Int
- ): ProjectConnection!
-} \ No newline at end of file
diff --git a/doc/api/graphql/reference/gitlab_schema.json b/doc/api/graphql/reference/gitlab_schema.json
deleted file mode 100644
index 492682d2e54..00000000000
--- a/doc/api/graphql/reference/gitlab_schema.json
+++ /dev/null
@@ -1,85944 +0,0 @@
-{
- "data": {
- "__schema": {
- "queryType": {
- "name": "Query"
- },
- "mutationType": {
- "name": "Mutation"
- },
- "subscriptionType": null,
- "types": [
- {
- "kind": "OBJECT",
- "name": "AccessLevel",
- "description": "Represents the access level of a relationship between a User and object that it is related to",
- "fields": [
- {
- "name": "integerValue",
- "description": "Integer representation of access level.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stringValue",
- "description": "String representation of access level.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "AccessLevelEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AccessLevelEnum",
- "description": "Access level to a resource",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NO_ACCESS",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GUEST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REPORTER",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEVELOPER",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MAINTAINER",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "OWNER",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AddAwardEmojiInput",
- "description": "Autogenerated input type of AddAwardEmoji",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AddAwardEmojiPayload",
- "description": "Autogenerated return type of AddAwardEmoji",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AddProjectToSecurityDashboardInput",
- "description": "Autogenerated input type of AddProjectToSecurityDashboard",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the project to be added to Instance Security Dashboard.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AddProjectToSecurityDashboardPayload",
- "description": "Autogenerated return type of AddProjectToSecurityDashboard",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project that was added to the Instance Security Dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AdminSidekiqQueuesDeleteJobsInput",
- "description": "Autogenerated input type of AdminSidekiqQueuesDeleteJobs",
- "fields": null,
- "inputFields": [
- {
- "name": "user",
- "description": "Delete jobs matching user in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "project",
- "description": "Delete jobs matching project in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "rootNamespace",
- "description": "Delete jobs matching root_namespace in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "subscriptionPlan",
- "description": "Delete jobs matching subscription_plan in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "callerId",
- "description": "Delete jobs matching caller_id in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "remoteIp",
- "description": "Delete jobs matching remote_ip in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "relatedClass",
- "description": "Delete jobs matching related_class in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "featureCategory",
- "description": "Delete jobs matching feature_category in the context metadata",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "queueName",
- "description": "The name of the queue to delete jobs from.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AdminSidekiqQueuesDeleteJobsPayload",
- "description": "Autogenerated return type of AdminSidekiqQueuesDeleteJobs",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "result",
- "description": "Information about the status of the deletion request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DeleteJobsResponse",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "description": "Describes an alert from the project's Alert Management",
- "fields": [
- {
- "name": "assignees",
- "description": "Assignees of the alert.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp the alert was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "details",
- "description": "Alert details.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "JSON",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detailsUrl",
- "description": "The URL of the alert detail page.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endedAt",
- "description": "Timestamp the alert ended.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "environment",
- "description": "Environment for the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Environment",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "eventCount",
- "description": "Number of events of this alert.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hosts",
- "description": "List of hosts the alert came from.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueIid",
- "description": "Internal ID of the GitLab issue attached to the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metricsDashboardUrl",
- "description": "URL for metrics embed for the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "monitoringTool",
- "description": "Monitoring tool the alert came from.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "prometheusAlert",
- "description": "The alert condition for Prometheus.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PrometheusAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "runbook",
- "description": "Runbook for the alert as defined in alert details.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "service",
- "description": "Service the alert came from.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity",
- "description": "Severity of the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "AlertManagementSeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startedAt",
- "description": "Timestamp the alert was raised.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "AlertManagementStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the alert.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todos",
- "description": "To-do items of the current user for the alert.",
- "args": [
- {
- "name": "action",
- "description": "The action to be filtered.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoActionEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorId",
- "description": "The ID of an author.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The ID of a project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupId",
- "description": "The ID of a group.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "The state of the todo.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "The type of the todo.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoTargetEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp the alert was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementAlertConnection",
- "description": "The connection type for AlertManagementAlert.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AlertManagementAlertEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementAlertEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementAlertSort",
- "description": "Values for sorting alerts",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "updated_desc",
- "description": "Updated at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "updated_asc",
- "description": "Updated at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "created_desc",
- "description": "Created at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "created_asc",
- "description": "Created at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "UPDATED_DESC",
- "description": "Updated at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_ASC",
- "description": "Updated at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STARTED_AT_ASC",
- "description": "Start time by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STARTED_AT_DESC",
- "description": "Start time by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ENDED_AT_ASC",
- "description": "End time by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ENDED_AT_DESC",
- "description": "End time by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_TIME_ASC",
- "description": "Created time by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_TIME_DESC",
- "description": "Created time by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_TIME_ASC",
- "description": "Created time by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_TIME_DESC",
- "description": "Created time by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVENT_COUNT_ASC",
- "description": "Events count by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVENT_COUNT_DESC",
- "description": "Events count by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SEVERITY_ASC",
- "description": "Severity from less critical to more critical",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SEVERITY_DESC",
- "description": "Severity from more critical to less critical",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STATUS_ASC",
- "description": "Status by order: Ignored > Resolved > Acknowledged > Triggered",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STATUS_DESC",
- "description": "Status by order: Triggered > Acknowledged > Resolved > Ignored",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementAlertStatusCountsType",
- "description": "Represents total number of alerts for the represented categories",
- "fields": [
- {
- "name": "acknowledged",
- "description": "Number of alerts with status ACKNOWLEDGED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "all",
- "description": "Total number of alerts for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ignored",
- "description": "Number of alerts with status IGNORED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "open",
- "description": "Number of alerts with status TRIGGERED or ACKNOWLEDGED for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolved",
- "description": "Number of alerts with status RESOLVED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "triggered",
- "description": "Number of alerts with status TRIGGERED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementDomainFilter",
- "description": "Filters the alerts based on given domain",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "operations",
- "description": "Alerts for operations domain",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "threat_monitoring",
- "description": "Alerts for threat monitoring domain",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "description": "An endpoint and credentials used to accept alerts for a project",
- "fields": [
- {
- "name": "active",
- "description": "Whether the endpoint is currently accepting alerts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "apiUrl",
- "description": "URL at which Prometheus metrics can be queried to populate the metrics dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "token",
- "description": "Token used to authenticate alert notification requests.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementIntegrationType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "Endpoint which accepts alert notifications.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "AlertManagementIntegration",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "AlertManagementHttpIntegrationID",
- "description": "Identifier of AlertManagement::HttpIntegration.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "AlertManagementIntegration",
- "description": null,
- "fields": [
- {
- "name": "active",
- "description": "Whether the endpoint is currently accepting alerts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "apiUrl",
- "description": "URL at which Prometheus metrics can be queried to populate the metrics dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "token",
- "description": "Token used to authenticate alert notification requests.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementIntegrationType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "Endpoint which accepts alert notifications.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementPrometheusIntegration",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementIntegrationConnection",
- "description": "The connection type for AlertManagementIntegration.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AlertManagementIntegrationEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "INTERFACE",
- "name": "AlertManagementIntegration",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementIntegrationEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "INTERFACE",
- "name": "AlertManagementIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementIntegrationType",
- "description": "Values of types of integrations",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "PROMETHEUS",
- "description": "Prometheus integration",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HTTP",
- "description": "Integration with any monitoring tool",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementPayloadAlertField",
- "description": "Parsed field from an alert used for custom mappings",
- "fields": [
- {
- "name": "label",
- "description": "Human-readable label of the payload path.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path to value inside payload JSON.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the parsed value.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "AlertManagementPayloadAlertFieldType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AlertManagementPayloadAlertFieldInput",
- "description": "Field that are available while modifying the custom mapping attributes for an HTTP integration",
- "fields": null,
- "inputFields": [
- {
- "name": "fieldName",
- "description": "A GitLab alert field name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementPayloadAlertFieldName",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "path",
- "description": "Path to value inside payload JSON.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "label",
- "description": "Human-readable label of the payload path.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "Type of the parsed value.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementPayloadAlertFieldType",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementPayloadAlertFieldName",
- "description": "Values for alert field names used in the custom mapping",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "TITLE",
- "description": "The title of the incident.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DESCRIPTION",
- "description": "A high-level summary of the problem.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "START_TIME",
- "description": "The time of the incident.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "END_TIME",
- "description": "The resolved time of the incident.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SERVICE",
- "description": "The affected service.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MONITORING_TOOL",
- "description": "The name of the associated monitoring tool.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HOSTS",
- "description": "One or more hosts, as to where this incident occurred.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SEVERITY",
- "description": "The severity of the alert.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FINGERPRINT",
- "description": "The unique identifier of the alert. This can be used to group occurrences of the same alert.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GITLAB_ENVIRONMENT_NAME",
- "description": "The name of the associated GitLab environment.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementPayloadAlertFieldType",
- "description": "Values for alert field types used in the custom mapping",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ARRAY",
- "description": "Array field type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DATETIME",
- "description": "DateTime field type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STRING",
- "description": "String field type",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertManagementPrometheusIntegration",
- "description": "An endpoint and credentials used to accept Prometheus alerts for a project",
- "fields": [
- {
- "name": "active",
- "description": "Whether the endpoint is currently accepting alerts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "apiUrl",
- "description": "URL at which Prometheus metrics can be queried to populate the metrics dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the integration.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "token",
- "description": "Token used to authenticate alert notification requests.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementIntegrationType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "Endpoint which accepts alert notifications.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "AlertManagementIntegration",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementSeverity",
- "description": "Alert severity values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CRITICAL",
- "description": "Critical severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HIGH",
- "description": "High severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MEDIUM",
- "description": "Medium severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LOW",
- "description": "Low severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INFO",
- "description": "Info severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNKNOWN",
- "description": "Unknown severity",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AlertManagementStatus",
- "description": "Alert status values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "TRIGGERED",
- "description": "Triggered status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ACKNOWLEDGED",
- "description": "Acknowledged status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RESOLVED",
- "description": "Resolved status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "IGNORED",
- "description": "Ignored status",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AlertSetAssigneesInput",
- "description": "Autogenerated input type of AlertSetAssignees",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the alert to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the alert to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "The usernames to assign to the alert. Replaces existing assignees by default.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "operationMode",
- "description": "The operation to perform. Defaults to REPLACE.",
- "type": {
- "kind": "ENUM",
- "name": "MutationOperationMode",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertSetAssigneesPayload",
- "description": "Autogenerated return type of AlertSetAssignees",
- "fields": [
- {
- "name": "alert",
- "description": "The alert after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The to-do item after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AlertTodoCreateInput",
- "description": "Autogenerated input type of AlertTodoCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the alert to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the alert to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AlertTodoCreatePayload",
- "description": "Autogenerated return type of AlertTodoCreate",
- "fields": [
- {
- "name": "alert",
- "description": "The alert after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The to-do item after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "AnalyticsDevopsAdoptionSegmentID",
- "description": "Identifier of Analytics::DevopsAdoption::Segment.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ApiFuzzingCiConfiguration",
- "description": "Data associated with configuring API fuzzing scans in GitLab CI",
- "fields": [
- {
- "name": "scanModes",
- "description": "All available scan modes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "ApiFuzzingScanMode",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scanProfiles",
- "description": "All default scan profiles.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ApiFuzzingScanProfile",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ApiFuzzingCiConfigurationCreateInput",
- "description": "Autogenerated input type of ApiFuzzingCiConfigurationCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "apiSpecificationFile",
- "description": "File path or URL to the file that defines the API surface for scanning. Must be in the format specified by the `scanMode` argument.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authPassword",
- "description": "CI variable containing the password for authenticating with the target API.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authUsername",
- "description": "CI variable containing the username for authenticating with the target API.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "scanMode",
- "description": "The mode for API fuzzing scans.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "ApiFuzzingScanMode",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanProfile",
- "description": "Name of a default profile to use for scanning. Ex: Quick-10.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "target",
- "description": "URL for the target of API fuzzing scans.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ApiFuzzingCiConfigurationCreatePayload",
- "description": "Autogenerated return type of ApiFuzzingCiConfigurationCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "configurationYaml",
- "description": "A YAML snippet that can be inserted into the project's `.gitlab-ci.yml` to set up API fuzzing scans.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabCiYamlEditPath",
- "description": "The location at which the project's `.gitlab-ci.yml` file can be edited in the browser.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ApiFuzzingScanMode",
- "description": "All possible ways to specify the API surface for an API fuzzing scan",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "HAR",
- "description": "The API surface is specified by a HAR file.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "OPENAPI",
- "description": "The API surface is specified by a OPENAPI file.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ApiFuzzingScanProfile",
- "description": "An API Fuzzing scan profile.",
- "fields": [
- {
- "name": "description",
- "description": "A short description of the profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The unique name of the profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "yaml",
- "description": "A syntax highlit HTML representation of the YAML.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "AvailabilityEnum",
- "description": "User availability status",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NOT_SET",
- "description": "Not Set",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BUSY",
- "description": "Busy",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "description": "An emoji awarded by a user",
- "fields": [
- {
- "name": "description",
- "description": "The emoji description.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "emoji",
- "description": "The emoji as an icon.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "unicode",
- "description": "The emoji in Unicode.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "unicodeVersion",
- "description": "The Unicode version for this emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "The user who awarded the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiAddInput",
- "description": "Autogenerated input type of AwardEmojiAdd",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmojiAddPayload",
- "description": "Autogenerated return type of AwardEmojiAdd",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmojiConnection",
- "description": "The connection type for AwardEmoji.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AwardEmojiEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmojiEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiRemoveInput",
- "description": "Autogenerated input type of AwardEmojiRemove",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmojiRemovePayload",
- "description": "Autogenerated return type of AwardEmojiRemove",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiToggleInput",
- "description": "Autogenerated input type of AwardEmojiToggle",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "AwardEmojiTogglePayload",
- "description": "Autogenerated return type of AwardEmojiToggle",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "toggledOn",
- "description": "Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "AwardableID",
- "description": "Identifier of Awardable.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BaseService",
- "description": null,
- "fields": [
- {
- "name": "active",
- "description": "Indicates if the service is active.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Class name of the service.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Service",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "BigInt",
- "description": "Represents non-fractional signed whole numeric values. Since the value may exceed the size of a 32-bit integer, it's encoded as a string.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Blob",
- "description": null,
- "fields": [
- {
- "name": "flatPath",
- "description": "Flat path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsOid",
- "description": "LFS ID of the blob.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mode",
- "description": "Blob mode in numeric format.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "Last commit SHA for the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of tree entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EntryType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the blob.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the blob.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Entry",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BlobConnection",
- "description": "The connection type for Blob.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BlobEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Blob",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BlobEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Blob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "BlobViewersType",
- "description": "Types of blob viewers",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "rich",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "simple",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "auxiliary",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Board",
- "description": "Represents a project or group board",
- "fields": [
- {
- "name": "assignee",
- "description": "The board assignee.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epics",
- "description": "Epics associated with board issues.",
- "args": [
- {
- "name": "issueFilters",
- "description": "Filters applied when selecting issues on the board.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "BoardIssueInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardEpicConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hideBacklogList",
- "description": "Whether or not backlog list is hidden.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hideClosedList",
- "description": "Whether or not closed list is hidden.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID (global ID) of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "The board iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels of the board.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lists",
- "description": "Lists of the board.",
- "args": [
- {
- "name": "id",
- "description": "Find a list by its global ID.",
- "type": {
- "kind": "SCALAR",
- "name": "ListID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "issueFilters",
- "description": "Filters applied when getting issue metadata in the board list.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "BoardIssueInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardListConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "The board milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "Weight of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardConnection",
- "description": "The connection type for Board.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BoardEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "description": "Represents an epic on an issue board",
- "fields": [
- {
- "name": "author",
- "description": "Author of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmoji",
- "description": "A list of award emojis associated with the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmojiConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "children",
- "description": "Children (sub-epics) of the epic.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the epic, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of epics, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter epics by state.",
- "type": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for epic title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List epics by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "EpicSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter epics by author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Filter epics by labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter epics by milestone title, computed from epic's issues.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iidStartsWith",
- "description": "Filter epics by IID for autocomplete.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeDescendantGroups",
- "description": "Include epics from descendant groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "true"
- },
- {
- "name": "confidential",
- "description": "Filter epics by given confidentiality.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedAt",
- "description": "Timestamp of when the epic was closed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confidential",
- "description": "Indicates if the epic is confidential.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the epic was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descendantCounts",
- "description": "Number of open and closed descendant epics and issues.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicDescendantCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descendantWeightSum",
- "description": "Total weight of open and closed issues in the epic and its descendants.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicDescendantWeights",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downvotes",
- "description": "Number of downvotes the epic has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateFixed",
- "description": "Fixed due date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateFromMilestones",
- "description": "Inherited due date of the epic from milestones.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateIsFixed",
- "description": "Indicates if the due date has been manually set.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "events",
- "description": "A list of events associated with the object.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EventConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group to which the epic belongs.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasChildren",
- "description": "Indicates if the epic has children.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasIssues",
- "description": "Indicates if the epic has direct issues.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasParent",
- "description": "Indicates if the epic has a parent epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "healthStatus",
- "description": "Current health status of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicHealthStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issues",
- "description": "A list of issues associated with the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicIssueConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels assigned to the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "parent",
- "description": "Parent epic of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "List of participants for the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reference",
- "description": "Internal reference of the epic. Returned in shortened format by default.",
- "args": [
- {
- "name": "full",
- "description": "Indicates if the reference should be returned in full.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relationPath",
- "description": "URI path of the epic-issue relationship.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relativePosition",
- "description": "The relative position of the epic in the epic tree.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDate",
- "description": "Start date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateFixed",
- "description": "Fixed start date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateFromMilestones",
- "description": "Inherited start date of the epic from milestones.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateIsFixed",
- "description": "Indicates if the start date has been manually set.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscribed",
- "description": "Indicates the currently logged in user is subscribed to the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the epic was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upvotes",
- "description": "Number of upvotes the epic has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userDiscussionsCount",
- "description": "Number of user discussions in the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "Number of user notes of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPreferences",
- "description": "User preferences for the epic on the issue board.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardEpicUserPreferences",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "Eventable",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEpicConnection",
- "description": "The connection type for BoardEpic.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BoardEpicEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEpicEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEpicUserPreferences",
- "description": "Represents user preferences for a board epic",
- "fields": [
- {
- "name": "collapsed",
- "description": "Indicates epic should be displayed as collapsed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "BoardID",
- "description": "Identifier of Board.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "BoardIssueInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "labelName",
- "description": "Filter by label name.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter by milestone title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Filter by assignee username.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter by author username.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "releaseTag",
- "description": "Filter by release tag.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "myReactionEmoji",
- "description": "Filter by reaction emoji.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "Filter by epic ID. Incompatible with epicWildcardId.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationTitle",
- "description": "Filter by iteration title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "Filter by weight.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "not",
- "description": "List of negated params. Warning: this argument is experimental and a subject to change in future.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "NegatedBoardIssueInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for issue title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicWildcardId",
- "description": "Filter by epic ID wildcard. Incompatible with epicId.",
- "type": {
- "kind": "ENUM",
- "name": "EpicWildcardId",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationWildcardId",
- "description": "Filter by iteration ID wildcard.",
- "type": {
- "kind": "ENUM",
- "name": "IterationWildcardId",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardList",
- "description": "Represents a list for an issue board",
- "fields": [
- {
- "name": "assignee",
- "description": "Assignee in the list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "collapsed",
- "description": "Indicates if list is collapsed for this user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID (global ID) of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issues",
- "description": "Board issues.",
- "args": [
- {
- "name": "filters",
- "description": "Filters applied when selecting issues in the board list.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "BoardIssueInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issuesCount",
- "description": "Count of issues in the list.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "Iteration of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "Label of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "limitMetric",
- "description": "The current limit metric for the list.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ListLimitMetric",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "listType",
- "description": "Type of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "maxIssueCount",
- "description": "Maximum number of issues in the list.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "maxIssueWeight",
- "description": "Maximum weight of issues in the list.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "Milestone of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "position",
- "description": "Position of list within the board.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalWeight",
- "description": "Total weight of all issues in the list.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardListConnection",
- "description": "The connection type for BoardList.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BoardListEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "BoardListCreateInput",
- "description": "Autogenerated input type of BoardListCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "backlog",
- "description": "Create the backlog list.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelId",
- "description": "Global ID of an existing label.",
- "type": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "boardId",
- "description": "Global ID of the issue board to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "Global ID of an existing milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationId",
- "description": "Global ID of an existing iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "IterationID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "Global ID of an existing user.",
- "type": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardListCreatePayload",
- "description": "Autogenerated return type of BoardListCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "list",
- "description": "Issue list in the issue board.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardListEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "BoardListUpdateLimitMetricsInput",
- "description": "Autogenerated input type of BoardListUpdateLimitMetrics",
- "fields": null,
- "inputFields": [
- {
- "name": "listId",
- "description": "The global ID of the list.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ListID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "limitMetric",
- "description": "The new limit metric type for the list.",
- "type": {
- "kind": "ENUM",
- "name": "ListLimitMetric",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "maxIssueCount",
- "description": "The new maximum issue count limit.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "maxIssueWeight",
- "description": "The new maximum issue weight limit.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardListUpdateLimitMetricsPayload",
- "description": "Autogenerated return type of BoardListUpdateLimitMetrics",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "list",
- "description": "The updated list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "BoardsEpicBoardID",
- "description": "Identifier of Boards::EpicBoard.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "BoardsEpicListID",
- "description": "Identifier of Boards::EpicList.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Boolean",
- "description": "Represents `true` or `false` values.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Branch",
- "description": null,
- "fields": [
- {
- "name": "commit",
- "description": "Commit for the branch.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the branch.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "BurnupChartDailyTotals",
- "description": "Represents the total number of issues and their weights for a particular day",
- "fields": [
- {
- "name": "completedCount",
- "description": "Number of closed issues as of this day.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "completedWeight",
- "description": "Total weight of closed issues as of this day.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "date",
- "description": "Date for burnup totals.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scopeCount",
- "description": "Number of issues as of this day.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scopeWeight",
- "description": "Total weight of issues as of this day.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiApplicationSettings",
- "description": null,
- "fields": [
- {
- "name": "keepLatestArtifact",
- "description": "Whether to keep the latest jobs artifacts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiBuildNeed",
- "description": null,
- "fields": [
- {
- "name": "name",
- "description": "Name of the job we need to complete.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiBuildNeedConnection",
- "description": "The connection type for CiBuildNeed.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiBuildNeedEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiBuildNeed",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiBuildNeedEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiBuildNeed",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CiCdSettingsUpdateInput",
- "description": "Autogenerated input type of CiCdSettingsUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "Full Path of the project the settings belong to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "keepLatestArtifact",
- "description": "Indicates if the latest artifact should be kept for this project.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiCdSettingsUpdatePayload",
- "description": "Autogenerated return type of CiCdSettingsUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfig",
- "description": null,
- "fields": [
- {
- "name": "errors",
- "description": "Linting errors.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergedYaml",
- "description": "Merged CI configuration YAML.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stages",
- "description": "Stages of the pipeline.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigStageConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of linting, can be either valid or invalid.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "CiConfigStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigGroup",
- "description": null,
- "fields": [
- {
- "name": "jobs",
- "description": "Jobs in group.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigJobConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the job group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "size",
- "description": "Size of the job group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigGroupConnection",
- "description": "The connection type for CiConfigGroup.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigGroupEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigGroup",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigGroupEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigGroup",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigJob",
- "description": null,
- "fields": [
- {
- "name": "afterScript",
- "description": "Override a set of commands that are executed after the job.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "allowFailure",
- "description": "Allow job to fail.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "beforeScript",
- "description": "Override a set of commands that are executed before the job.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "environment",
- "description": "Name of an environment to which the job deploys.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "except",
- "description": "Limit when jobs are not created.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigJobRestriction",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groupName",
- "description": "Name of the job group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the job.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "needs",
- "description": "Builds that must complete before the jobs run.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigNeedConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "only",
- "description": "Jobs are created when these conditions do not apply.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigJobRestriction",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "script",
- "description": "Shell script that is executed by a runner.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stage",
- "description": "Name of the job stage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tags",
- "description": "List of tags that are used to select a runner.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "when",
- "description": "When to run the job.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigJobConnection",
- "description": "The connection type for CiConfigJob.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigJobEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigJob",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigJobEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigJob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigJobRestriction",
- "description": null,
- "fields": [
- {
- "name": "refs",
- "description": "The Git refs the job restriction applies to.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigNeed",
- "description": null,
- "fields": [
- {
- "name": "name",
- "description": "Name of the need.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigNeedConnection",
- "description": "The connection type for CiConfigNeed.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigNeedEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigNeed",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigNeedEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigNeed",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigStage",
- "description": null,
- "fields": [
- {
- "name": "groups",
- "description": "Groups of jobs for the stage.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigGroupConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the stage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigStageConnection",
- "description": "The connection type for CiConfigStage.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigStageEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiConfigStage",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiConfigStageEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfigStage",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "CiConfigStatus",
- "description": "Values for YAML processor result",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "VALID",
- "description": "The configuration file is valid",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INVALID",
- "description": "The configuration file is not valid",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiGroup",
- "description": null,
- "fields": [
- {
- "name": "detailedStatus",
- "description": "Detailed status of the group.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DetailedStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jobs",
- "description": "Jobs in group.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJobConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the job group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "size",
- "description": "Size of the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiGroupConnection",
- "description": "The connection type for CiGroup.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiGroupEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiGroup",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiGroupEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiGroup",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJob",
- "description": null,
- "fields": [
- {
- "name": "artifacts",
- "description": "Artifacts generated by the job.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJobArtifactConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detailedStatus",
- "description": "Detailed status of the job.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DetailedStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the job.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "needs",
- "description": "References to builds that must complete before the jobs run.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiBuildNeedConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipeline",
- "description": "Pipeline the job belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scheduledAt",
- "description": "Schedule for the build.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJobArtifact",
- "description": null,
- "fields": [
- {
- "name": "downloadPath",
- "description": "URL for downloading the artifact's file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileType",
- "description": "File type of the artifact.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "JobArtifactFileType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJobArtifactConnection",
- "description": "The connection type for CiJobArtifact.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiJobArtifactEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiJobArtifact",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJobArtifactEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJobArtifact",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJobConnection",
- "description": "The connection type for CiJob.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiJobEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiJob",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiJobEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "CiPipelineID",
- "description": "Identifier of Ci::Pipeline.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiStage",
- "description": null,
- "fields": [
- {
- "name": "detailedStatus",
- "description": "Detailed status of the stage.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DetailedStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groups",
- "description": "Group of jobs for the stage.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiGroupConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the stage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiStageConnection",
- "description": "The connection type for CiStage.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiStageEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CiStage",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CiStageEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiStage",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp the cluster agent was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdByUser",
- "description": "User object, containing information about the person who created the agent.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the cluster agent.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the cluster agent.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project this cluster agent is associated with.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tokens",
- "description": "Tokens associated with the cluster agent.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp the cluster agent was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentConnection",
- "description": "The connection type for ClusterAgent.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ClusterAgentEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentDeleteInput",
- "description": "Autogenerated input type of ClusterAgentDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the cluster agent that will be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ClustersAgentID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentDeletePayload",
- "description": "Autogenerated return type of ClusterAgentDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentToken",
- "description": null,
- "fields": [
- {
- "name": "clusterAgent",
- "description": "Cluster agent this token is associated with.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp the token was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdByUser",
- "description": "The user who created the token.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Global ID of the token.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ClustersAgentTokenID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenConnection",
- "description": "The connection type for ClusterAgentToken.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ClusterAgentToken",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentTokenCreateInput",
- "description": "Autogenerated input type of ClusterAgentTokenCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "clusterAgentId",
- "description": "Global ID of the cluster agent that will be associated with the new token.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ClustersAgentID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenCreatePayload",
- "description": "Autogenerated return type of ClusterAgentTokenCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "secret",
- "description": "Token secret value. Make sure you save it - you won't be able to access it again.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "token",
- "description": "Token created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentToken",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentTokenDeleteInput",
- "description": "Autogenerated input type of ClusterAgentTokenDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the cluster agent token that will be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ClustersAgentTokenID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenDeletePayload",
- "description": "Autogenerated return type of ClusterAgentTokenDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentToken",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ClustersAgentID",
- "description": "Identifier of Clusters::Agent.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ClustersAgentTokenID",
- "description": "Identifier of Clusters::AgentToken.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ClustersClusterID",
- "description": "Identifier of Clusters::Cluster.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CodeCoverageActivity",
- "description": "Represents the code coverage activity for a group",
- "fields": [
- {
- "name": "averageCoverage",
- "description": "Average percentage of the different code coverage results available for the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "coverageCount",
- "description": "Number of different code coverage results available for the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "date",
- "description": "Date when the code coverage was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Date",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectCount",
- "description": "Number of projects with code coverage results for the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CodeCoverageActivityConnection",
- "description": "The connection type for CodeCoverageActivity.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CodeCoverageActivityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CodeCoverageActivity",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CodeCoverageActivityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CodeCoverageActivity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CodeCoverageSummary",
- "description": "Represents the code coverage summary for a project",
- "fields": [
- {
- "name": "averageCoverage",
- "description": "Average percentage of the different code coverage results available for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "coverageCount",
- "description": "Number of different code coverage results available.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastUpdatedOn",
- "description": "Latest date when the code coverage was created for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Date",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Commit",
- "description": null,
- "fields": [
- {
- "name": "author",
- "description": "Author of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "authorGravatar",
- "description": "Commit authors gravatar.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "authorName",
- "description": "Commit authors name.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "authoredDate",
- "description": "Timestamp of when the commit was authored.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the commit message.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID (global ID) of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "message",
- "description": "Raw commit message.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelines",
- "description": "Pipelines of the commit ordered latest first.",
- "args": [
- {
- "name": "status",
- "description": "Filter pipelines by their status.",
- "type": {
- "kind": "ENUM",
- "name": "PipelineStatusEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ref",
- "description": "Filter pipelines by the ref they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sha",
- "description": "Filter pipelines by the sha of the commit they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "SHA1 ID of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shortId",
- "description": "Short SHA1 ID of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "signatureHtml",
- "description": "Rendered HTML of the commit signature.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the commit message.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "titleHtml",
- "description": "The GitLab Flavored Markdown rendering of `title`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CommitAction",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "action",
- "description": "The action to perform, create, delete, move, update, chmod.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "CommitActionMode",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "filePath",
- "description": "Full path to the file.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "content",
- "description": "Content of the file.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "previousPath",
- "description": "Original full path to the file being moved.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "lastCommitId",
- "description": "Last known file commit ID.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "executeFilemode",
- "description": "Enables/disables the execute flag on the file.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "encoding",
- "description": "Encoding of the file. Default is text.",
- "type": {
- "kind": "ENUM",
- "name": "CommitEncoding",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "CommitActionMode",
- "description": "Mode of a commit action",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CREATE",
- "description": "Create command",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DELETE",
- "description": "Delete command",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MOVE",
- "description": "Move command",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATE",
- "description": "Update command",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CHMOD",
- "description": "Chmod command",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CommitConnection",
- "description": "The connection type for Commit.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CommitEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CommitCreateInput",
- "description": "Autogenerated input type of CommitCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Project full path the branch is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "branch",
- "description": "Name of the branch to commit into, it can be a new branch.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "startBranch",
- "description": "If on a new branch, name of the original branch.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "message",
- "description": "Raw commit message.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "actions",
- "description": "Array of action hashes to commit as a batch.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CommitAction",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CommitCreatePayload",
- "description": "Autogenerated return type of CommitCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commit",
- "description": "The commit after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CommitEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "CommitEncoding",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "TEXT",
- "description": "Text encoding",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BASE64",
- "description": "Base64 encoding",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ComplianceFramework",
- "description": "Represents a ComplianceFramework associated with a Project",
- "fields": [
- {
- "name": "color",
- "description": "Hexadecimal representation of compliance framework's label color.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the compliance framework.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Compliance framework ID.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the compliance framework.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineConfigurationFullPath",
- "description": "Full path of the compliance pipeline configuration stored in a project repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hippa`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkConnection",
- "description": "The connection type for ComplianceFramework.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ComplianceFramework",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFramework",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ComplianceFrameworkInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "name",
- "description": "New name for the compliance framework.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "New description for the compliance framework.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "color",
- "description": "New color representation of the compliance framework in hex format. e.g. #FCA121.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "pipelineConfigurationFullPath",
- "description": "Full path of the compliance pipeline configuration stored in a project repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hippa`.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ComplianceManagementFrameworkID",
- "description": "Identifier of ComplianceManagement::Framework.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ComposerMetadata",
- "description": "Composer metadata",
- "fields": [
- {
- "name": "composerJson",
- "description": "Data of the Composer JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageComposerJsonType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetSha",
- "description": "Target SHA of the package.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ConfigureSastInput",
- "description": "Autogenerated input type of ConfigureSast",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "configuration",
- "description": "SAST CI configuration for the project.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ConfigureSastPayload",
- "description": "Autogenerated return type of ConfigureSast",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of creating the commit for the supplied SAST CI configuration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "successPath",
- "description": "Redirect path to use when the response is successful.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerExpirationPolicy",
- "description": "A tag expiration policy designed to keep only the images that matter most",
- "fields": [
- {
- "name": "cadence",
- "description": "This container expiration policy schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyCadenceEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the container expiration policy was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enabled",
- "description": "Indicates whether this container expiration policy is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "keepN",
- "description": "Number of tags to retain.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyKeepEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nameRegex",
- "description": "Tags with names matching this regex pattern will expire.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nameRegexKeep",
- "description": "Tags with names matching this regex pattern will be preserved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nextRunAt",
- "description": "Next time that this container expiration policy will get executed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "olderThan",
- "description": "Tags older that this will expire.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyOlderThanEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the container expiration policy was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyCadenceEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "EVERY_DAY",
- "description": "Every day",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVERY_WEEK",
- "description": "Every week",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVERY_TWO_WEEKS",
- "description": "Every two weeks",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVERY_MONTH",
- "description": "Every month",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EVERY_THREE_MONTHS",
- "description": "Every three months",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyKeepEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ONE_TAG",
- "description": "1 tag per image name",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FIVE_TAGS",
- "description": "5 tags per image name",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TEN_TAGS",
- "description": "10 tags per image name",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TWENTY_FIVE_TAGS",
- "description": "25 tags per image name",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FIFTY_TAGS",
- "description": "50 tags per image name",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ONE_HUNDRED_TAGS",
- "description": "100 tags per image name",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyOlderThanEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SEVEN_DAYS",
- "description": "7 days until tags are automatically removed",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FOURTEEN_DAYS",
- "description": "14 days until tags are automatically removed",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "THIRTY_DAYS",
- "description": "30 days until tags are automatically removed",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NINETY_DAYS",
- "description": "90 days until tags are automatically removed",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepository",
- "description": "A container repository",
- "fields": [
- {
- "name": "canDelete",
- "description": "Can the current user delete the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp when the container repository was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expirationPolicyCleanupStatus",
- "description": "The tags cleanup status for the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositoryCleanupStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expirationPolicyStartedAt",
- "description": "Timestamp when the cleanup done by the expiration policy was started on the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "location",
- "description": "URL of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project of the container registry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositoryStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tagsCount",
- "description": "Number of tags associated with this image.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp when the container repository was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerRepositoryCleanupStatus",
- "description": "Status of the tags cleanup of a container repository",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "UNSCHEDULED",
- "description": "The tags cleanup is not scheduled. This is the default state.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SCHEDULED",
- "description": "The tags cleanup is scheduled and is going to be executed shortly.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNFINISHED",
- "description": "The tags cleanup has been partially executed. There are still remaining tags to delete.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ONGOING",
- "description": "The tags cleanup is ongoing.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryConnection",
- "description": "The connection type for ContainerRepository.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ContainerRepository",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryDetails",
- "description": "Details of a container repository",
- "fields": [
- {
- "name": "canDelete",
- "description": "Can the current user delete the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp when the container repository was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expirationPolicyCleanupStatus",
- "description": "The tags cleanup status for the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositoryCleanupStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expirationPolicyStartedAt",
- "description": "Timestamp when the cleanup done by the expiration policy was started on the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "location",
- "description": "URL of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project of the container registry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the container repository.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositoryStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tags",
- "description": "Tags of the container repository.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTagConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tagsCount",
- "description": "Number of tags associated with this image.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp when the container repository was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepository",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ContainerRepositoryID",
- "description": "Identifier of ContainerRepository.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerRepositorySort",
- "description": "Values for sorting container repositories",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "updated_desc",
- "description": "Updated at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "updated_asc",
- "description": "Updated at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "created_desc",
- "description": "Created at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "created_asc",
- "description": "Created at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "UPDATED_DESC",
- "description": "Updated at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_ASC",
- "description": "Updated at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NAME_ASC",
- "description": "Name by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NAME_DESC",
- "description": "Name by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ContainerRepositoryStatus",
- "description": "Status of a container repository",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "DELETE_SCHEDULED",
- "description": "Delete Scheduled status.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DELETE_FAILED",
- "description": "Delete Failed status.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTag",
- "description": "A tag from a container repository",
- "fields": [
- {
- "name": "canDelete",
- "description": "Can the current user delete this tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp when the tag was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "digest",
- "description": "Digest of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "location",
- "description": "URL of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "revision",
- "description": "Revision of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shortRevision",
- "description": "Short revision of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalSize",
- "description": "The size of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "BigInt",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTagConnection",
- "description": "The connection type for ContainerRepositoryTag.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTagEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTag",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTagEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryTag",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateAlertIssueInput",
- "description": "Autogenerated input type of CreateAlertIssue",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the alert to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the alert to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateAlertIssuePayload",
- "description": "Autogenerated return type of CreateAlertIssue",
- "fields": [
- {
- "name": "alert",
- "description": "The alert after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The to-do item after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateAnnotationInput",
- "description": "Autogenerated input type of CreateAnnotation",
- "fields": null,
- "inputFields": [
- {
- "name": "environmentId",
- "description": "The global ID of the environment to add an annotation to.",
- "type": {
- "kind": "SCALAR",
- "name": "EnvironmentID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clusterId",
- "description": "The global ID of the cluster to add an annotation to.",
- "type": {
- "kind": "SCALAR",
- "name": "ClustersClusterID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startingAt",
- "description": "Timestamp indicating starting moment to which the annotation relates.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endingAt",
- "description": "Timestamp indicating ending moment to which the annotation relates.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dashboardPath",
- "description": "The path to a file defining the dashboard on which the annotation should be added.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the annotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateAnnotationPayload",
- "description": "Autogenerated return type of CreateAnnotation",
- "fields": [
- {
- "name": "annotation",
- "description": "The created annotation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateBoardInput",
- "description": "Autogenerated input type of CreateBoard",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "Full path of the group with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The board name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideBacklogList",
- "description": "Whether or not backlog list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideClosedList",
- "description": "Whether or not closed list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "The ID of user to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "The ID of milestone to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationId",
- "description": "The ID of iteration to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "IterationID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The weight value to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Labels of the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelIds",
- "description": "The IDs of labels to be added to the board.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateBoardPayload",
- "description": "Autogenerated return type of CreateBoard",
- "fields": [
- {
- "name": "board",
- "description": "The board after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateBranchInput",
- "description": "Autogenerated input type of CreateBranch",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Project full path the branch is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "Name of the branch.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "ref",
- "description": "Branch name or commit SHA to create branch from.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateBranchPayload",
- "description": "Autogenerated return type of CreateBranch",
- "fields": [
- {
- "name": "branch",
- "description": "Branch after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Branch",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateClusterAgentInput",
- "description": "Autogenerated input type of CreateClusterAgent",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the associated project for this cluster agent.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "Name of the cluster agent.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateClusterAgentPayload",
- "description": "Autogenerated return type of CreateClusterAgent",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgent",
- "description": "Cluster agent created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateComplianceFrameworkInput",
- "description": "Autogenerated input type of CreateComplianceFramework",
- "fields": null,
- "inputFields": [
- {
- "name": "namespacePath",
- "description": "Full path of the namespace to add the compliance framework to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "params",
- "description": "Parameters to update the compliance framework with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ComplianceFrameworkInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateComplianceFrameworkPayload",
- "description": "Autogenerated return type of CreateComplianceFramework",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "framework",
- "description": "The created compliance framework.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFramework",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateCustomEmojiInput",
- "description": "Autogenerated input type of CreateCustomEmoji",
- "fields": null,
- "inputFields": [
- {
- "name": "groupPath",
- "description": "Namespace full path the emoji is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "Name of the emoji.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "url",
- "description": "Location of the emoji file.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateCustomEmojiPayload",
- "description": "Autogenerated return type of CreateCustomEmoji",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "customEmoji",
- "description": "The new custom emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CustomEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateDevopsAdoptionSegmentInput",
- "description": "Autogenerated input type of CreateDevopsAdoptionSegment",
- "fields": null,
- "inputFields": [
- {
- "name": "namespaceId",
- "description": "Namespace ID to set for the segment.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NamespaceID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateDevopsAdoptionSegmentPayload",
- "description": "Autogenerated return type of CreateDevopsAdoptionSegment",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "segment",
- "description": "The segment after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegment",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateDiffNoteInput",
- "description": "Autogenerated input type of CreateDiffNote",
- "fields": null,
- "inputFields": [
- {
- "name": "noteableId",
- "description": "The global ID of the resource to add a note to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "The confidentiality flag of a note. Default is false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "position",
- "description": "The position of this note on a diff.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DiffPositionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateDiffNotePayload",
- "description": "Autogenerated return type of CreateDiffNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateEpicInput",
- "description": "Autogenerated input type of CreateEpic",
- "fields": null,
- "inputFields": [
- {
- "name": "groupPath",
- "description": "The group the epic to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "The title of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "Indicates if the epic is confidential.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDateFixed",
- "description": "The start date of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDateFixed",
- "description": "The end date of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDateIsFixed",
- "description": "Indicates start date should be sourced from start_date_fixed field not the issue milestones.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDateIsFixed",
- "description": "Indicates end date should be sourced from due_date_fixed field not the issue milestones.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "addLabelIds",
- "description": "The IDs of labels to be added to the epic.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "removeLabelIds",
- "description": "The IDs of labels to be removed from the epic.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateEpicPayload",
- "description": "Autogenerated return type of CreateEpic",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "The created epic.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateImageDiffNoteInput",
- "description": "Autogenerated input type of CreateImageDiffNote",
- "fields": null,
- "inputFields": [
- {
- "name": "noteableId",
- "description": "The global ID of the resource to add a note to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "The confidentiality flag of a note. Default is false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "position",
- "description": "The position of this note on a diff.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DiffImagePositionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateImageDiffNotePayload",
- "description": "Autogenerated return type of CreateImageDiffNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateIssueInput",
- "description": "Autogenerated input type of CreateIssue",
- "fields": null,
- "inputFields": [
- {
- "name": "description",
- "description": "Description of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "Indicates the issue is confidential.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "locked",
- "description": "Indicates discussion is locked on the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "Project full path the issue is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID (internal ID) of a project issue. Only admins and project owners can modify.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "The ID of the milestone to assign to the issue. On update milestone will be removed if set to null.",
- "type": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Labels of the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelIds",
- "description": "The IDs of labels to be added to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp when the issue was created. Available only for admins and project owners.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergeRequestToResolveDiscussionsOf",
- "description": "The IID of a merge request for which to resolve discussions.",
- "type": {
- "kind": "SCALAR",
- "name": "MergeRequestID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "discussionToResolve",
- "description": "The ID of a discussion to resolve. Also pass `merge_request_to_resolve_discussions_of`.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeIds",
- "description": "The array of user IDs to assign to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "healthStatus",
- "description": "The desired health status.",
- "type": {
- "kind": "ENUM",
- "name": "HealthStatus",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The weight of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "The ID of an epic to associate the issue with.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateIssuePayload",
- "description": "Autogenerated return type of CreateIssue",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateIterationInput",
- "description": "Autogenerated input type of CreateIteration",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "Full path of the group with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "The title of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDate",
- "description": "The start date of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDate",
- "description": "The end date of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateIterationPayload",
- "description": "Autogenerated return type of CreateIteration",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "The created iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateNoteInput",
- "description": "Autogenerated input type of CreateNote",
- "fields": null,
- "inputFields": [
- {
- "name": "noteableId",
- "description": "The global ID of the resource to add a note to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "The confidentiality flag of a note. Default is false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "discussionId",
- "description": "The global ID of the discussion this note is in reply to.",
- "type": {
- "kind": "SCALAR",
- "name": "DiscussionID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateNotePayload",
- "description": "Autogenerated return type of CreateNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateRequirementInput",
- "description": "Autogenerated input type of CreateRequirement",
- "fields": null,
- "inputFields": [
- {
- "name": "title",
- "description": "Title of the requirement.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the requirement.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "Full project path the requirement is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateRequirementPayload",
- "description": "Autogenerated return type of CreateRequirement",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requirement",
- "description": "Requirement after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Requirement",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateSnippetInput",
- "description": "Autogenerated input type of CreateSnippet",
- "fields": null,
- "inputFields": [
- {
- "name": "captchaResponse",
- "description": "A valid CAPTCHA response value obtained by using the provided captchaSiteKey with a CAPTCHA API to present a challenge to be solved on the client. Required to resubmit if the previous operation returned \"NeedsCaptchaResponse: true\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "spamLogId",
- "description": "The spam log ID which must be passed along with a valid CAPTCHA response for the operation to be completed. Required to resubmit if the previous operation returned \"NeedsCaptchaResponse: true\".",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the snippet.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the snippet.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "visibilityLevel",
- "description": "The visibility level of the snippet.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VisibilityLevelsEnum",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "The project full path the snippet is associated with.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "uploadedFiles",
- "description": "The paths to files uploaded in the snippet description.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "blobActions",
- "description": "Actions to perform over the snippet repository and blobs.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SnippetBlobActionInputType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateSnippetPayload",
- "description": "Autogenerated return type of CreateSnippet",
- "fields": [
- {
- "name": "captchaSiteKey",
- "description": "The CAPTCHA site key which must be used to render a challenge for the user to solve to obtain a valid captchaResponse value. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "needsCaptchaResponse",
- "description": "Indicates whether the operation was detected as possible spam and not completed. If CAPTCHA is enabled, the request must be resubmitted with a valid CAPTCHA response and spam_log_id included for the operation to be completed. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippet",
- "description": "The snippet after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spam",
- "description": "Indicates whether the operation was detected as definite spam. There is no option to resubmit the request with a CAPTCHA response.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spamLogId",
- "description": "The spam log ID which must be passed along with a valid CAPTCHA response for an operation to be completed. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "CreateTestCaseInput",
- "description": "Autogenerated input type of CreateTestCase",
- "fields": null,
- "inputFields": [
- {
- "name": "title",
- "description": "The test case title.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The test case description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelIds",
- "description": "The IDs of labels to be added to the test case.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "The project full path to create the test case.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CreateTestCasePayload",
- "description": "Autogenerated return type of CreateTestCase",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "testCase",
- "description": "The test case created.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "description": null,
- "fields": [
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "CustomEmoji",
- "description": "A custom emoji uploaded by user",
- "fields": [
- {
- "name": "external",
- "description": "Whether the emoji is an external link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "The ID of the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "CustomEmojiID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The name of the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "The link to file of the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CustomEmojiConnection",
- "description": "The connection type for CustomEmoji.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CustomEmojiEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "CustomEmoji",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "CustomEmojiEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CustomEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "CustomEmojiID",
- "description": "Identifier of CustomEmoji.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastOnDemandScanCreateInput",
- "description": "Autogenerated input type of DastOnDemandScanCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dastSiteProfileId",
- "description": "ID of the site profile to be used for the scan.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dastScannerProfileId",
- "description": "ID of the scanner profile to be used for the scan.",
- "type": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastOnDemandScanCreatePayload",
- "description": "Autogenerated return type of DastOnDemandScanCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineUrl",
- "description": "URL of the pipeline that was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfile",
- "description": "Represents a DAST Profile",
- "fields": [
- {
- "name": "dastScannerProfile",
- "description": "The associated scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfile",
- "description": "The associated site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "The description of the scan.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "editPath",
- "description": "Relative web path to the edit page of a profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the profile.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastProfileID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The name of the profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileConnection",
- "description": "The connection type for DastProfile.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastProfileEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastProfile",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileCreateInput",
- "description": "Autogenerated input type of DastProfileCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the profile. Defaults to an empty string.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"\""
- },
- {
- "name": "dastSiteProfileId",
- "description": "ID of the site profile to be associated.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dastScannerProfileId",
- "description": "ID of the scanner profile to be associated.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "runAfterCreate",
- "description": "Run scan using profile after creation. Defaults to false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileCreatePayload",
- "description": "Autogenerated return type of DastProfileCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfile",
- "description": "The created profile.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineUrl",
- "description": "The URL of the pipeline that was created. Requires `runAfterCreate` to be set to `true`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileDeleteInput",
- "description": "Autogenerated input type of DastProfileDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the profile to be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileDeletePayload",
- "description": "Autogenerated return type of DastProfileDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DastProfileID",
- "description": "Identifier of Dast::Profile.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileRunInput",
- "description": "Autogenerated input type of DastProfileRun",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "Full path for the project the scanner profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "ID of the profile to be used for the scan.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileRunPayload",
- "description": "Autogenerated return type of DastProfileRun",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineUrl",
- "description": "URL of the pipeline that was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileUpdateInput",
- "description": "Autogenerated input type of DastProfileUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the profile to be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "fullPath",
- "description": "The project the profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the profile.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the profile. Defaults to an empty string.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"\""
- },
- {
- "name": "dastSiteProfileId",
- "description": "ID of the site profile to be associated.",
- "type": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dastScannerProfileId",
- "description": "ID of the scanner profile to be associated.",
- "type": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "runAfterUpdate",
- "description": "Run scan using profile after update. Defaults to false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastProfileUpdatePayload",
- "description": "Autogenerated return type of DastProfileUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfile",
- "description": "The updated profile.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineUrl",
- "description": "The URL of the pipeline that was created. Requires the input argument `runAfterUpdate` to be set to `true` when calling the mutation, otherwise no pipeline will be created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DastScanTypeEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "PASSIVE",
- "description": "Passive DAST scan. This scan will not make active attacks against the target site.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ACTIVE",
- "description": "Active DAST scan. This scan will make active attacks against the target site.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfile",
- "description": "Represents a DAST scanner profile",
- "fields": [
- {
- "name": "editPath",
- "description": "Relative web path to the edit page of a scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "globalId",
- "description": "ID of the DAST scanner profile. Deprecated in 13.6: Use `id`.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use `id`. Deprecated in 13.6."
- },
- {
- "name": "id",
- "description": "ID of the DAST scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "profileName",
- "description": "Name of the DAST scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scanType",
- "description": "Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "DastScanTypeEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "showDebugMessages",
- "description": "Indicates if debug messages should be included in DAST console output. True to include the debug messages.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spiderTimeout",
- "description": "The maximum number of minutes allowed for the spider to traverse the site.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetTimeout",
- "description": "The maximum number of seconds allowed for the site under test to respond to a request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "useAjaxSpider",
- "description": "Indicates if the AJAX spider should be used to crawl the target site. True to run the AJAX spider in addition to the traditional spider, and false to run only the traditional spider.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfileConnection",
- "description": "The connection type for DastScannerProfile.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastScannerProfileEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastScannerProfile",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileCreateInput",
- "description": "Autogenerated input type of DastScannerProfileCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the scanner profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "profileName",
- "description": "The name of the scanner profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "spiderTimeout",
- "description": "The maximum number of minutes allowed for the spider to traverse the site.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "targetTimeout",
- "description": "The maximum number of seconds allowed for the site under test to respond to a request.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "scanType",
- "description": "Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.",
- "type": {
- "kind": "ENUM",
- "name": "DastScanTypeEnum",
- "ofType": null
- },
- "defaultValue": "PASSIVE"
- },
- {
- "name": "useAjaxSpider",
- "description": "Indicates if the AJAX spider should be used to crawl the target site. True to run the AJAX spider in addition to the traditional spider, and false to run only the traditional spider.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "showDebugMessages",
- "description": "Indicates if debug messages should be included in DAST console output. True to include the debug messages.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfileCreatePayload",
- "description": "Autogenerated return type of DastScannerProfileCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "globalId",
- "description": "ID of the scanner profile. Deprecated in 13.6: Use `id`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use `id`. Deprecated in 13.6."
- },
- {
- "name": "id",
- "description": "ID of the scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileDeleteInput",
- "description": "Autogenerated input type of DastScannerProfileDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "Full path for the project the scanner profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "ID of the scanner profile to be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfileDeletePayload",
- "description": "Autogenerated return type of DastScannerProfileDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfileEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "description": "Identifier of DastScannerProfile.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileUpdateInput",
- "description": "Autogenerated input type of DastScannerProfileUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the scanner profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "ID of the scanner profile to be updated.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "profileName",
- "description": "The name of the scanner profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "spiderTimeout",
- "description": "The maximum number of minutes allowed for the spider to traverse the site.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetTimeout",
- "description": "The maximum number of seconds allowed for the site under test to respond to a request.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanType",
- "description": "Indicates the type of DAST scan that will run. Either a Passive Scan or an Active Scan.",
- "type": {
- "kind": "ENUM",
- "name": "DastScanTypeEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "useAjaxSpider",
- "description": "Indicates if the AJAX spider should be used to crawl the target site. True to run the AJAX spider in addition to the traditional spider, and false to run only the traditional spider.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "showDebugMessages",
- "description": "Indicates if debug messages should be included in DAST console output. True to include the debug messages.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastScannerProfileUpdatePayload",
- "description": "Autogenerated return type of DastScannerProfileUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the scanner profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastScannerProfileID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfile",
- "description": "Represents a DAST Site Profile",
- "fields": [
- {
- "name": "editPath",
- "description": "Relative web path to the edit page of a site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "normalizedTargetUrl",
- "description": "Normalized URL of the target to be scanned.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "profileName",
- "description": "The name of the site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetUrl",
- "description": "The URL of the target to be scanned.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastSiteProfilePermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "validationStatus",
- "description": "The current validation status of the site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "DastSiteProfileValidationStatusEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfileConnection",
- "description": "The connection type for DastSiteProfile.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastSiteProfileEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastSiteProfile",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileCreateInput",
- "description": "Autogenerated input type of DastSiteProfileCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "profileName",
- "description": "The name of the site profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetUrl",
- "description": "The URL of the target to be scanned.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfileCreatePayload",
- "description": "Autogenerated return type of DastSiteProfileCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileDeleteInput",
- "description": "Autogenerated input type of DastSiteProfileDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "ID of the site profile to be deleted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfileDeletePayload",
- "description": "Autogenerated return type of DastSiteProfileDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfileEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "description": "Identifier of DastSiteProfile.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfilePermissions",
- "description": "Check permissions for the current user on site profile",
- "fields": [
- {
- "name": "createOnDemandDastScan",
- "description": "Indicates the user can perform `create_on_demand_dast_scan` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileUpdateInput",
- "description": "Autogenerated input type of DastSiteProfileUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "ID of the site profile to be updated.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "profileName",
- "description": "The name of the site profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetUrl",
- "description": "The URL of the target to be scanned.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteProfileUpdatePayload",
- "description": "Autogenerated return type of DastSiteProfileUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the site profile.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DastSiteProfileValidationStatusEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NONE",
- "description": "No site validation exists",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PENDING_VALIDATION",
- "description": "Site validation process has not started",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INPROGRESS_VALIDATION",
- "description": "Site validation process is in progress",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PASSED_VALIDATION",
- "description": "Site validation process finished successfully",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FAILED_VALIDATION",
- "description": "Site validation process finished but failed",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteTokenCreateInput",
- "description": "Autogenerated input type of DastSiteTokenCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site token belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetUrl",
- "description": "The URL of the target to be validated.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteTokenCreatePayload",
- "description": "Autogenerated return type of DastSiteTokenCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the site token.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastSiteTokenID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "The current validation status of the target.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "DastSiteProfileValidationStatusEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "token",
- "description": "Token string.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DastSiteTokenID",
- "description": "Identifier of DastSiteToken.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteValidation",
- "description": "Represents a DAST Site Validation",
- "fields": [
- {
- "name": "id",
- "description": "Global ID of the site validation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteValidationID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "normalizedTargetUrl",
- "description": "Normalized URL of the target to be validated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the site validation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DastSiteProfileValidationStatusEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteValidationConnection",
- "description": "The connection type for DastSiteValidation.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastSiteValidationEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DastSiteValidation",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteValidationCreateInput",
- "description": "Autogenerated input type of DastSiteValidationCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site profile belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dastSiteTokenId",
- "description": "ID of the site token.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteTokenID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "validationPath",
- "description": "The path to be requested during validation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "strategy",
- "description": "The validation strategy to be used.",
- "type": {
- "kind": "ENUM",
- "name": "DastSiteValidationStrategyEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteValidationCreatePayload",
- "description": "Autogenerated return type of DastSiteValidationCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the site validation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "DastSiteValidationID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "The current validation status.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "DastSiteProfileValidationStatusEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteValidationEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteValidation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DastSiteValidationID",
- "description": "Identifier of DastSiteValidation.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteValidationRevokeInput",
- "description": "Autogenerated input type of DastSiteValidationRevoke",
- "fields": null,
- "inputFields": [
- {
- "name": "fullPath",
- "description": "The project the site validation belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "normalizedTargetUrl",
- "description": "Normalized URL of the target to be revoked.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DastSiteValidationRevokePayload",
- "description": "Autogenerated return type of DastSiteValidationRevoke",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DastSiteValidationStrategyEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "TEXT_FILE",
- "description": "Text file validation",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HEADER",
- "description": "Header validation",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DataVisualizationColorEnum",
- "description": "Color of the data visualization palette",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "BLUE",
- "description": "Blue color",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ORANGE",
- "description": "Orange color",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "AQUA",
- "description": "Aqua color",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GREEN",
- "description": "Green color",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MAGENTA",
- "description": "Magenta color",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DataVisualizationWeightEnum",
- "description": "Weight of the data visualization palette",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "WEIGHT_50",
- "description": "50 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_100",
- "description": "100 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_200",
- "description": "200 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_300",
- "description": "300 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_400",
- "description": "400 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_500",
- "description": "500 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_600",
- "description": "600 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_700",
- "description": "700 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_800",
- "description": "800 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_900",
- "description": "900 weight",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_950",
- "description": "950 weight",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Date",
- "description": "Date represented in ISO 8601",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DeleteAnnotationInput",
- "description": "Autogenerated input type of DeleteAnnotation",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the annotation to delete.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "MetricsDashboardAnnotationID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DeleteAnnotationPayload",
- "description": "Autogenerated return type of DeleteAnnotation",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DeleteDevopsAdoptionSegmentInput",
- "description": "Autogenerated input type of DeleteDevopsAdoptionSegment",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the segment.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AnalyticsDevopsAdoptionSegmentID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DeleteDevopsAdoptionSegmentPayload",
- "description": "Autogenerated return type of DeleteDevopsAdoptionSegment",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DeleteJobsResponse",
- "description": "The response from the AdminSidekiqQueuesDeleteJobs mutation",
- "fields": [
- {
- "name": "completed",
- "description": "Whether or not the entire queue was processed in time; if not, retrying the same request is safe.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deletedJobs",
- "description": "The number of matching jobs deleted.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "queueSize",
- "description": "The queue size after processing.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Design",
- "description": "A single design",
- "fields": [
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffRefs",
- "description": "The diff refs for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "event",
- "description": "How this design was changed in the current version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DesignVersionEvent",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filename",
- "description": "The filename of the design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "The full path to the design file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "The ID of this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "image",
- "description": "The URL of the full-sized image.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "imageV432x230",
- "description": "The URL of the design resized to fit within the bounds of 432x230. This will be `null` if the image has not been generated",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notesCount",
- "description": "The total count of user-created notes for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "versions",
- "description": "All versions related to this design ordered newest first.",
- "args": [
- {
- "name": "earlierOrEqualToSha",
- "description": "The SHA256 of the most recent acceptable version.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "earlierOrEqualToId",
- "description": "The Global ID of the most recent acceptable version.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignVersionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "DesignFields",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "description": "A design pinned to a specific version. The image field reflects the design as of the associated version",
- "fields": [
- {
- "name": "design",
- "description": "The underlying design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffRefs",
- "description": "The diff refs for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "event",
- "description": "How this design was changed in the current version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DesignVersionEvent",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filename",
- "description": "The filename of the design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "The full path to the design file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "The ID of this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "image",
- "description": "The URL of the full-sized image.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "imageV432x230",
- "description": "The URL of the design resized to fit within the bounds of 432x230. This will be `null` if the image has not been generated",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notesCount",
- "description": "The total count of user-created notes for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "The version this design-at-versions is pinned to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "DesignFields",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignAtVersionConnection",
- "description": "The connection type for DesignAtVersion.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignAtVersionEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignAtVersionEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignCollection",
- "description": "A collection of designs",
- "fields": [
- {
- "name": "copyState",
- "description": "Copy state of the design collection.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "DesignCollectionCopyState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "design",
- "description": "Find a specific design.",
- "args": [
- {
- "name": "id",
- "description": "Find a design by its ID.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "filename",
- "description": "Find a design by its filename.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designAtVersion",
- "description": "Find a design as of a version.",
- "args": [
- {
- "name": "id",
- "description": "The Global ID of the design at this version.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignAtVersionID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designs",
- "description": "All designs for the design collection.",
- "args": [
- {
- "name": "ids",
- "description": "Filters designs by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "filenames",
- "description": "Filters designs by their filename.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "atVersion",
- "description": "Filters designs to only those that existed at the version. If argument is omitted or nil then all designs will reflect the latest version",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "Issue associated with the design collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project associated with the design collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "A specific version.",
- "args": [
- {
- "name": "sha",
- "description": "The SHA256 of a specific version.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "The Global ID of the version.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "versions",
- "description": "All versions related to all designs, ordered newest first.",
- "args": [
- {
- "name": "earlierOrEqualToSha",
- "description": "The SHA256 of the most recent acceptable version.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "earlierOrEqualToId",
- "description": "The Global ID of the most recent acceptable version.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignVersionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DesignCollectionCopyState",
- "description": "Copy state of a DesignCollection",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "READY",
- "description": "The DesignCollection has no copy in progress",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "IN_PROGRESS",
- "description": "The DesignCollection is being copied",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ERROR",
- "description": "The DesignCollection encountered an error during a copy",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignConnection",
- "description": "The connection type for Design.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "DesignFields",
- "description": null,
- "fields": [
- {
- "name": "diffRefs",
- "description": "The diff refs for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "event",
- "description": "How this design was changed in the current version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DesignVersionEvent",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filename",
- "description": "The filename of the design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "The full path to the design file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "The ID of this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "image",
- "description": "The URL of the full-sized image.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "imageV432x230",
- "description": "The URL of the design resized to fit within the bounds of 432x230. This will be `null` if the image has not been generated",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notesCount",
- "description": "The total count of user-created notes for this design.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project the design belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "DesignManagement",
- "description": null,
- "fields": [
- {
- "name": "designAtVersion",
- "description": "Find a design as of a version.",
- "args": [
- {
- "name": "id",
- "description": "The Global ID of the design at this version.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignAtVersionID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "Find a version.",
- "args": [
- {
- "name": "id",
- "description": "The Global ID of the version.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementDeleteInput",
- "description": "Autogenerated input type of DesignManagementDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project where the issue is to upload designs for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to modify designs for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "filenames",
- "description": "The filenames of the designs to delete.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignManagementDeletePayload",
- "description": "Autogenerated return type of DesignManagementDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "The new version in which the designs are deleted.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DesignManagementDesignAtVersionID",
- "description": "Identifier of DesignManagement::DesignAtVersion.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "description": "Identifier of DesignManagement::Design.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementMoveInput",
- "description": "Autogenerated input type of DesignManagementMove",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the design to move.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "previous",
- "description": "ID of the immediately preceding design.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "next",
- "description": "ID of the immediately following design.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignManagementMovePayload",
- "description": "Autogenerated return type of DesignManagementMove",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designCollection",
- "description": "The current state of the collection.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignCollection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementUploadInput",
- "description": "Autogenerated input type of DesignManagementUpload",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project where the issue is to upload designs for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to modify designs for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "files",
- "description": "The files to upload.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Upload",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignManagementUploadPayload",
- "description": "Autogenerated return type of DesignManagementUpload",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designs",
- "description": "The designs that were uploaded by the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "skippedDesigns",
- "description": "Any designs that were skipped from the upload due to there being no change to their content since their last version",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DesignManagementVersionID",
- "description": "Identifier of DesignManagement::Version.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "description": "A specific version in which designs were added, modified or deleted",
- "fields": [
- {
- "name": "designAtVersion",
- "description": "A particular design as of this version, provided it is visible at this version.",
- "args": [
- {
- "name": "id",
- "description": "The ID of the DesignAtVersion.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignAtVersionID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "designId",
- "description": "The ID of a specific design.",
- "type": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "filename",
- "description": "The filename of a specific design.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignAtVersion",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designs",
- "description": "All designs that were changed in the version.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designsAtVersion",
- "description": "All designs that are visible at this version, as of this version.",
- "args": [
- {
- "name": "ids",
- "description": "Filters designs by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DesignManagementDesignID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "filenames",
- "description": "Filters designs by their filename.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignAtVersionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the design version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "SHA of the design version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignVersionConnection",
- "description": "The connection type for DesignVersion.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignVersionEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DesignVersionEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DesignVersionEvent",
- "description": "Mutation event of a design within a version",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NONE",
- "description": "No change",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATION",
- "description": "A creation event",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MODIFICATION",
- "description": "A modification event",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DELETION",
- "description": "A deletion event",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyBoardInput",
- "description": "Autogenerated input type of DestroyBoard",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the board to destroy.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyBoardListInput",
- "description": "Autogenerated input type of DestroyBoardList",
- "fields": null,
- "inputFields": [
- {
- "name": "listId",
- "description": "Global ID of the list to destroy. Only label lists are accepted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ListID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyBoardListPayload",
- "description": "Autogenerated return type of DestroyBoardList",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "list",
- "description": "The list after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyBoardPayload",
- "description": "Autogenerated return type of DestroyBoard",
- "fields": [
- {
- "name": "board",
- "description": "The board after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyComplianceFrameworkInput",
- "description": "Autogenerated input type of DestroyComplianceFramework",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the compliance framework to destroy.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ComplianceManagementFrameworkID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyComplianceFrameworkPayload",
- "description": "Autogenerated return type of DestroyComplianceFramework",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyContainerRepositoryInput",
- "description": "Autogenerated input type of DestroyContainerRepository",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the container repository.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ContainerRepositoryID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyContainerRepositoryPayload",
- "description": "Autogenerated return type of DestroyContainerRepository",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepository",
- "description": "The container repository policy after scheduling the deletion.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ContainerRepository",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyContainerRepositoryTagsInput",
- "description": "Autogenerated input type of DestroyContainerRepositoryTags",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the container repository.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ContainerRepositoryID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "tagNames",
- "description": "Container repository tag(s) to delete. Total number can't be greater than 20",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyContainerRepositoryTagsPayload",
- "description": "Autogenerated return type of DestroyContainerRepositoryTags",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deletedTagNames",
- "description": "Deleted container repository tags.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroyNoteInput",
- "description": "Autogenerated input type of DestroyNote",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the note to destroy.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroyNotePayload",
- "description": "Autogenerated return type of DestroyNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DestroySnippetInput",
- "description": "Autogenerated input type of DestroySnippet",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the snippet to destroy.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DestroySnippetPayload",
- "description": "Autogenerated return type of DestroySnippet",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippet",
- "description": "The snippet after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DetailedStatus",
- "description": null,
- "fields": [
- {
- "name": "action",
- "description": "Action information for the status. This includes method, button title, icon, path, and title.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "StatusAction",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detailsPath",
- "description": "Path of the details for the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "favicon",
- "description": "Favicon of the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group of the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasDetails",
- "description": "Indicates if the status has further details.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "icon",
- "description": "Icon of the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "Label of the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "text",
- "description": "Text of the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tooltip",
- "description": "Tooltip associated with the status.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegment",
- "description": "Segment",
- "fields": [
- {
- "name": "id",
- "description": "ID of the segment.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "latestSnapshot",
- "description": "The latest adoption metrics for the segment.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSnapshot",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "namespace",
- "description": "Segment namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegmentConnection",
- "description": "The connection type for DevopsAdoptionSegment.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegmentEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegment",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegmentEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegment",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSnapshot",
- "description": "Snapshot",
- "fields": [
- {
- "name": "deploySucceeded",
- "description": "At least one deployment succeeded.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endTime",
- "description": "The end time for the snapshot where the data points were collected.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueOpened",
- "description": "At least one issue was opened.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestApproved",
- "description": "At least one merge request was approved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestOpened",
- "description": "At least one merge request was opened.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineSucceeded",
- "description": "At least one pipeline succeeded.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "recordedAt",
- "description": "The time the snapshot was recorded.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "runnerConfigured",
- "description": "At least one runner was used.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "securityScanSucceeded",
- "description": "At least one security scan succeeded.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startTime",
- "description": "The start time for the snapshot where the data points were collected.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DiffImagePositionInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "headSha",
- "description": "SHA of the HEAD at the time the comment was made.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "baseSha",
- "description": "Merge base of the branch the comment was made on.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startSha",
- "description": "SHA of the branch being compared against.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "paths",
- "description": "The paths of the file that was changed. Both of the properties of this input are optional, but at least one of them is required",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DiffPathsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "x",
- "description": "X position of the note.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "y",
- "description": "Y position of the note.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "width",
- "description": "Total width of the image.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "height",
- "description": "Total height of the image.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DiffNoteID",
- "description": "Identifier of DiffNote.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DiffPathsInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "oldPath",
- "description": "The path of the file on the start sha.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "newPath",
- "description": "The path of the file on the head sha.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiffPosition",
- "description": null,
- "fields": [
- {
- "name": "diffRefs",
- "description": "Information about the branch, HEAD, and base at the time of commenting.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filePath",
- "description": "Path of the file that was changed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "height",
- "description": "Total height of the image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "newLine",
- "description": "Line on HEAD SHA that was changed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "newPath",
- "description": "Path of the file on the HEAD SHA.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oldLine",
- "description": "Line on start SHA that was changed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oldPath",
- "description": "Path of the file on the start SHA.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "positionType",
- "description": "Type of file the position refers to.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DiffPositionType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "width",
- "description": "Total width of the image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "x",
- "description": "X position of the note.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "y",
- "description": "Y position of the note.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DiffPositionInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "headSha",
- "description": "SHA of the HEAD at the time the comment was made.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "baseSha",
- "description": "Merge base of the branch the comment was made on.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startSha",
- "description": "SHA of the branch being compared against.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "paths",
- "description": "The paths of the file that was changed. Both of the properties of this input are optional, but at least one of them is required",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DiffPathsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "oldLine",
- "description": "Line on start SHA that was changed.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "newLine",
- "description": "Line on HEAD SHA that was changed.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "DiffPositionType",
- "description": "Type of file the position refers to",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "text",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "image",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "description": null,
- "fields": [
- {
- "name": "baseSha",
- "description": "Merge base of the branch the comment was made on.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "headSha",
- "description": "SHA of the HEAD at the time the comment was made.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startSha",
- "description": "SHA of the branch being compared against.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiffStats",
- "description": "Changes to a single file",
- "fields": [
- {
- "name": "additions",
- "description": "Number of lines added to this file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deletions",
- "description": "Number of lines deleted from this file.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "File path, relative to repository root.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiffStatsSummary",
- "description": "Aggregated summary of changes",
- "fields": [
- {
- "name": "additions",
- "description": "Number of lines added.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "changes",
- "description": "Number of lines changed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deletions",
- "description": "Number of lines deleted.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileCount",
- "description": "Number of files changed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Discussion",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of the discussion's creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of this discussion.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DiscussionID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes in the discussion.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "replyId",
- "description": "ID used to reply to this discussion.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DiscussionID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvable",
- "description": "Indicates if the object can be resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolved",
- "description": "Indicates if the object is resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedAt",
- "description": "Timestamp of when the object was resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedBy",
- "description": "User who resolved the object.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "ResolvableInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "description": "The connection type for Discussion.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Discussion",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiscussionEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Discussion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "DiscussionID",
- "description": "Identifier of Discussion.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DiscussionToggleResolveInput",
- "description": "Autogenerated input type of DiscussionToggleResolve",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the discussion.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DiscussionID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "resolve",
- "description": "Will resolve the discussion when true, and unresolve the discussion when false.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DiscussionToggleResolvePayload",
- "description": "Autogenerated return type of DiscussionToggleResolve",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussion",
- "description": "The discussion after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Discussion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "DismissVulnerabilityInput",
- "description": "Autogenerated input type of DismissVulnerability",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be dismissed.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "comment",
- "description": "Comment why vulnerability should be dismissed.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dismissalReason",
- "description": "Reason why vulnerability should be dismissed.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityDismissalReason",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "DismissVulnerabilityPayload",
- "description": "Autogenerated return type of DismissVulnerability",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after dismissal.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "Entry",
- "description": null,
- "fields": [
- {
- "name": "flatPath",
- "description": "Flat path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "Last commit SHA for the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of tree entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EntryType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "Blob",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Submodule",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "TreeEntry",
- "ofType": null
- }
- ]
- },
- {
- "kind": "ENUM",
- "name": "EntryType",
- "description": "Type of a tree entry",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "tree",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blob",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commit",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Environment",
- "description": "Describes where code is deployed for a project",
- "fields": [
- {
- "name": "id",
- "description": "ID of the environment.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "latestOpenedMostSevereAlert",
- "description": "The most severe open alert for the environment. If multiple alerts have equal severity, the most recent is returned.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metricsDashboard",
- "description": "Metrics dashboard schema for the environment.",
- "args": [
- {
- "name": "path",
- "description": "Path to a file which defines metrics dashboard eg: 'config/prometheus/common_metrics.yml'.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MetricsDashboard",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Human-readable name of the environment.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "The path to the environment.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the environment, for example: available/stopped.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EnvironmentConnection",
- "description": "The connection type for Environment.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EnvironmentEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Environment",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EnvironmentEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Environment",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "EnvironmentID",
- "description": "Identifier of Environment.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EnvironmentsCanaryIngressUpdateInput",
- "description": "Autogenerated input type of EnvironmentsCanaryIngressUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the environment to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "EnvironmentID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The weight of the Canary Ingress.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EnvironmentsCanaryIngressUpdatePayload",
- "description": "Autogenerated return type of EnvironmentsCanaryIngressUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Epic",
- "description": "Represents an epic",
- "fields": [
- {
- "name": "author",
- "description": "Author of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmoji",
- "description": "A list of award emojis associated with the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmojiConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "children",
- "description": "Children (sub-epics) of the epic.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the epic, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of epics, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter epics by state.",
- "type": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for epic title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List epics by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "EpicSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter epics by author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Filter epics by labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter epics by milestone title, computed from epic's issues.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iidStartsWith",
- "description": "Filter epics by IID for autocomplete.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeDescendantGroups",
- "description": "Include epics from descendant groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "true"
- },
- {
- "name": "confidential",
- "description": "Filter epics by given confidentiality.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedAt",
- "description": "Timestamp of when the epic was closed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confidential",
- "description": "Indicates if the epic is confidential.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the epic was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descendantCounts",
- "description": "Number of open and closed descendant epics and issues.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicDescendantCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descendantWeightSum",
- "description": "Total weight of open and closed issues in the epic and its descendants.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicDescendantWeights",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downvotes",
- "description": "Number of downvotes the epic has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateFixed",
- "description": "Fixed due date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateFromMilestones",
- "description": "Inherited due date of the epic from milestones.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDateIsFixed",
- "description": "Indicates if the due date has been manually set.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "events",
- "description": "A list of events associated with the object.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EventConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group to which the epic belongs.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasChildren",
- "description": "Indicates if the epic has children.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasIssues",
- "description": "Indicates if the epic has direct issues.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasParent",
- "description": "Indicates if the epic has a parent epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "healthStatus",
- "description": "Current health status of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicHealthStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issues",
- "description": "A list of issues associated with the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicIssueConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels assigned to the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "parent",
- "description": "Parent epic of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "List of participants for the epic.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reference",
- "description": "Internal reference of the epic. Returned in shortened format by default.",
- "args": [
- {
- "name": "full",
- "description": "Indicates if the reference should be returned in full.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relationPath",
- "description": "URI path of the epic-issue relationship.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relativePosition",
- "description": "The relative position of the epic in the epic tree.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDate",
- "description": "Start date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateFixed",
- "description": "Fixed start date of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateFromMilestones",
- "description": "Inherited start date of the epic from milestones.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDateIsFixed",
- "description": "Indicates if the start date has been manually set.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscribed",
- "description": "Indicates the currently logged in user is subscribed to the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the epic was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upvotes",
- "description": "Number of upvotes the epic has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userDiscussionsCount",
- "description": "Number of user discussions in the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "Number of user notes of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the epic.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "Eventable",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicAddIssueInput",
- "description": "Autogenerated input type of EpicAddIssue",
- "fields": null,
- "inputFields": [
- {
- "name": "iid",
- "description": "The IID of the epic to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "The group the epic to mutate belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "The full path of the project the issue belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "issueIid",
- "description": "The IID of the issue to be added.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicAddIssuePayload",
- "description": "Autogenerated return type of EpicAddIssue",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "The epic after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicIssue",
- "description": "The epic-issue relation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicBoard",
- "description": "Represents an epic board",
- "fields": [
- {
- "name": "id",
- "description": "Global ID of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardsEpicBoardID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lists",
- "description": "Epic board lists.",
- "args": [
- {
- "name": "id",
- "description": "Find an epic board list by ID.",
- "type": {
- "kind": "SCALAR",
- "name": "BoardsEpicListID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicListConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the board.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicBoardConnection",
- "description": "The connection type for EpicBoard.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicBoardEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicBoard",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicBoardCreateInput",
- "description": "Autogenerated input type of EpicBoardCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "name",
- "description": "The board name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideBacklogList",
- "description": "Whether or not backlog list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideClosedList",
- "description": "Whether or not closed list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "Full path of the group with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicBoardCreatePayload",
- "description": "Autogenerated return type of EpicBoardCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicBoard",
- "description": "The created epic board.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoard",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicBoardEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoard",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicBoardListCreateInput",
- "description": "Autogenerated input type of EpicBoardListCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "backlog",
- "description": "Create the backlog list.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelId",
- "description": "Global ID of an existing label.",
- "type": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "boardId",
- "description": "Global ID of the issue board to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardsEpicBoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicBoardListCreatePayload",
- "description": "Autogenerated return type of EpicBoardListCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "list",
- "description": "Epic list in the epic board.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicConnection",
- "description": "The connection type for Epic.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicDescendantCount",
- "description": "Counts of descendent epics",
- "fields": [
- {
- "name": "closedEpics",
- "description": "Number of closed child epics.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedIssues",
- "description": "Number of closed epic issues.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openedEpics",
- "description": "Number of opened child epics.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openedIssues",
- "description": "Number of opened epic issues.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicDescendantWeights",
- "description": "Total weight of open and closed descendant issues",
- "fields": [
- {
- "name": "closedIssues",
- "description": "Total weight of completed (closed) issues in this epic, including epic descendants.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openedIssues",
- "description": "Total weight of opened issues in this epic, including epic descendants.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicHealthStatus",
- "description": "Health status of child issues",
- "fields": [
- {
- "name": "issuesAtRisk",
- "description": "Number of issues at risk.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issuesNeedingAttention",
- "description": "Number of issues that need attention.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issuesOnTrack",
- "description": "Number of issues on track.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "EpicID",
- "description": "Identifier of Epic.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "description": "Relationship between an epic and an issue",
- "fields": [
- {
- "name": "alertManagementAlert",
- "description": "Alert associated to this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "assignees",
- "description": "Assignees of the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "User that created the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blocked",
- "description": "Indicates the issue is blocked.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blockedByCount",
- "description": "Count of issues blocking this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedAt",
- "description": "Timestamp of when the issue was closed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confidential",
- "description": "Indicates the issue is confidential.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNoteEmail",
- "description": "User specific email address for the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the issue was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designCollection",
- "description": "Collection of design images associated with this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignCollection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussionLocked",
- "description": "Indicates discussion is locked on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downvotes",
- "description": "Number of downvotes the issue has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "emailsDisabled",
- "description": "Indicates if a project has email notifications disabled: `true` if email notifications are disabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "Epic to which this issue belongs.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicIssueId",
- "description": "ID of the epic-issue relation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "healthStatus",
- "description": "Current health status.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "HealthStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "humanTimeEstimate",
- "description": "Human-readable time estimate of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "humanTotalTimeSpent",
- "description": "Human-readable total time reported as spent on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Global ID of the epic-issue relation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "Iteration of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels of the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metricImages",
- "description": "Metric images associated to the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MetricImage",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "Milestone of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "moved",
- "description": "Indicates if issue got moved from other project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "movedTo",
- "description": "Updated Issue after it got moved to another project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "List of participants in the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reference",
- "description": "Internal reference of the issue. Returned in shortened format by default.",
- "args": [
- {
- "name": "full",
- "description": "Boolean option specifying whether the reference should be returned in full.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relationPath",
- "description": "URI path of the epic-issue relation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relativePosition",
- "description": "Relative position of the issue (used for positioning in epic tree and issue boards).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity",
- "description": "Severity level of the incident.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "IssuableSeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "slaDueAt",
- "description": "Timestamp of when the issue SLA expires.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "statusPagePublishedIncident",
- "description": "Indicates whether an issue is published to the status page.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscribed",
- "description": "Indicates the currently logged in user is subscribed to the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "taskCompletionStatus",
- "description": "Task completion status of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TaskCompletionStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timeEstimate",
- "description": "Time estimate of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "titleHtml",
- "description": "The GitLab Flavored Markdown rendering of `title`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalTimeSpent",
- "description": "Total time reported as spent on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the issue was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedBy",
- "description": "User that last updated the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upvotes",
- "description": "Number of upvotes the issue has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userDiscussionsCount",
- "description": "Number of user discussions in the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "Number of user notes of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IssuePermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "Weight of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicIssueConnection",
- "description": "The connection type for EpicIssue.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicIssueEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "Total weight of issues collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicIssueEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicList",
- "description": "Represents an epic board list",
- "fields": [
- {
- "name": "epics",
- "description": "List epics.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Global ID of the board list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardsEpicListID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "Label of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "listType",
- "description": "Type of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "position",
- "description": "Position of the list within the board.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the list.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicListConnection",
- "description": "The connection type for EpicList.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicListEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EpicList",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicListEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicPermissions",
- "description": "Check permissions for the current user on an epic",
- "fields": [
- {
- "name": "adminEpic",
- "description": "Indicates the user can perform `admin_epic` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmoji",
- "description": "Indicates the user can perform `award_emoji` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createEpic",
- "description": "Indicates the user can perform `create_epic` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": "Indicates the user can perform `create_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyEpic",
- "description": "Indicates the user can perform `destroy_epic` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readEpic",
- "description": "Indicates the user can perform `read_epic` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readEpicIid",
- "description": "Indicates the user can perform `read_epic_iid` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateEpic",
- "description": "Indicates the user can perform `update_epic` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicSetSubscriptionInput",
- "description": "Autogenerated input type of EpicSetSubscription",
- "fields": null,
- "inputFields": [
- {
- "name": "iid",
- "description": "The IID of the epic to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "The group the epic to mutate belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "subscribedState",
- "description": "The desired state of the subscription.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicSetSubscriptionPayload",
- "description": "Autogenerated return type of EpicSetSubscription",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "The epic after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "EpicSort",
- "description": "Roadmap sort values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "start_date_desc",
- "description": "Start date at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "start_date_asc",
- "description": "Start date at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "end_date_desc",
- "description": "End date at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "end_date_asc",
- "description": "End date at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "EpicState",
- "description": "State of an epic",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "all",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "opened",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "EpicStateEvent",
- "description": "State event of an epic",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "REOPEN",
- "description": "Reopen the epic",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CLOSE",
- "description": "Close the epic",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicTreeNodeFieldsInputType",
- "description": "A node of an epic tree.",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the epic_issue or epic that is being moved.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "EpicTreeSortingID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "adjacentReferenceId",
- "description": "The ID of the epic_issue or issue that the actual epic or issue is switched with.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicTreeSortingID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "relativePosition",
- "description": "The type of the switch, after or before allowed.",
- "type": {
- "kind": "ENUM",
- "name": "MoveType",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "newParentId",
- "description": "ID of the new parent epic.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "EpicTreeReorderInput",
- "description": "Autogenerated input type of EpicTreeReorder",
- "fields": null,
- "inputFields": [
- {
- "name": "baseEpicId",
- "description": "The ID of the base epic of the tree.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "moved",
- "description": "Parameters for updating the tree positions.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicTreeNodeFieldsInputType",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicTreeReorderPayload",
- "description": "Autogenerated return type of EpicTreeReorder",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "EpicTreeSortingID",
- "description": "Identifier of EpicTreeSorting.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "EpicWildcardId",
- "description": "Epic ID wildcard values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NONE",
- "description": "No epic is assigned",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ANY",
- "description": "Any epic is assigned",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Event",
- "description": "Representing an event",
- "fields": [
- {
- "name": "action",
- "description": "Action of the event.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EventAction",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "Author of this event.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "When this event was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the event.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "When this event was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "EventAction",
- "description": "Event action",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CREATED",
- "description": "Created action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED",
- "description": "Updated action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CLOSED",
- "description": "Closed action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REOPENED",
- "description": "Reopened action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PUSHED",
- "description": "Pushed action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COMMENTED",
- "description": "Commented action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MERGED",
- "description": "Merged action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "JOINED",
- "description": "Joined action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LEFT",
- "description": "Left action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DESTROYED",
- "description": "Destroyed action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EXPIRED",
- "description": "Expired action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "APPROVED",
- "description": "Approved action",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ARCHIVED",
- "description": "Archived action",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EventConnection",
- "description": "The connection type for Event.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "EventEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Event",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "EventEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Event",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "Eventable",
- "description": null,
- "fields": [
- {
- "name": "events",
- "description": "A list of events associated with the object.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EventConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- }
- ]
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ExportRequirementsInput",
- "description": "Autogenerated input type of ExportRequirements",
- "fields": null,
- "inputFields": [
- {
- "name": "sort",
- "description": "List requirements by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "Sort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter requirements by state.",
- "type": {
- "kind": "ENUM",
- "name": "RequirementState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for requirement title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter requirements by author username.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "Full project path the requirements are associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "selectedFields",
- "description": "List of selected requirements fields to be exported.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ExportRequirementsPayload",
- "description": "Autogenerated return type of ExportRequirements",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ExternalIssue",
- "description": "Represents an external issue",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of when the issue was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalTracker",
- "description": "Type of external tracker.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relativeReference",
- "description": "Relative reference of the issue in the external tracker.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the issue in the external tracker.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the issue in the external tracker.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the issue was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "URL to the issue in the external tracker.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Float",
- "description": "Represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GeoNode",
- "description": null,
- "fields": [
- {
- "name": "containerRepositoriesMaxCapacity",
- "description": "The maximum concurrency of container repository sync for this secondary node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enabled",
- "description": "Indicates whether this Geo node is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filesMaxCapacity",
- "description": "The maximum concurrency of LFS/attachment backfill for this secondary node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of this GeoNode.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "internalUrl",
- "description": "The URL defined on the primary node that secondary nodes should use to contact it.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestDiffRegistries",
- "description": "Find merge request diff registries on this Geo node.",
- "args": [
- {
- "name": "ids",
- "description": "Filters registries by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "minimumReverificationInterval",
- "description": "The interval (in days) in which the repository verification is valid. Once expired, it will be reverified.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The unique identifier for this Geo node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageFileRegistries",
- "description": "Package file registries of the GeoNode.",
- "args": [
- {
- "name": "ids",
- "description": "Filters registries by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageFileRegistryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "primary",
- "description": "Indicates whether this Geo node is the primary.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reposMaxCapacity",
- "description": "The maximum concurrency of repository backfill for this secondary node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "selectiveSyncNamespaces",
- "description": "The namespaces that should be synced, if `selective_sync_type` == `namespaces`.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "NamespaceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "selectiveSyncShards",
- "description": "The repository storages whose projects should be synced, if `selective_sync_type` == `shards`.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "selectiveSyncType",
- "description": "Indicates if syncing is limited to only specific groups, or shards.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippetRepositoryRegistries",
- "description": "Find snippet repository registries on this Geo node.",
- "args": [
- {
- "name": "ids",
- "description": "Filters registries by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "syncObjectStorage",
- "description": "Indicates if this secondary node will replicate blobs in Object Storage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformStateVersionRegistries",
- "description": "Find terraform state version registries on this Geo node.",
- "args": [
- {
- "name": "ids",
- "description": "Filters registries by their ID.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "The user-facing URL for this Geo node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "verificationMaxCapacity",
- "description": "The maximum concurrency of repository verification for this secondary node.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "GitlabErrorTrackingDetailedErrorID",
- "description": "Identifier of Gitlab::ErrorTracking::DetailedError.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "GitlabSubscriptionActivateInput",
- "description": "Autogenerated input type of GitlabSubscriptionActivate",
- "fields": null,
- "inputFields": [
- {
- "name": "activationCode",
- "description": "Activation code received after purchasing a GitLab subscription.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GitlabSubscriptionActivatePayload",
- "description": "Autogenerated return type of GitlabSubscriptionActivate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GrafanaIntegration",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of the issue's creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enabled",
- "description": "Indicates whether Grafana integration is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "grafanaUrl",
- "description": "URL for the Grafana host for the Grafana integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Internal ID of the Grafana integration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of the issue's last activity.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Group",
- "description": null,
- "fields": [
- {
- "name": "actualRepositorySizeLimit",
- "description": "Size limit for repositories in the namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "additionalPurchasedStorageSize",
- "description": "Additional storage purchased for the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "autoDevopsEnabled",
- "description": "Indicates whether Auto DevOps is enabled for all projects within this group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "avatarUrl",
- "description": "Avatar URL of the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "board",
- "description": "A single board of the group.",
- "args": [
- {
- "name": "id",
- "description": "The board's ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "boards",
- "description": "Boards of the group.",
- "args": [
- {
- "name": "id",
- "description": "Find a board by its ID.",
- "type": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "codeCoverageActivities",
- "description": "Represents the code coverage activity for this group.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch code coverage activity (maximum time window is set to 90 days).",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CodeCoverageActivityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "complianceFrameworks",
- "description": "Compliance frameworks available to projects in this namespace. Available only when feature flag `ff_custom_compliance_frameworks` is enabled.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "Global ID of a specific compliance framework to return.",
- "type": {
- "kind": "SCALAR",
- "name": "ComplianceManagementFrameworkID",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepositories",
- "description": "Container repositories of the group.",
- "args": [
- {
- "name": "name",
- "description": "Filter the container repositories by their name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort container repositories by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositorySort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepositoriesCount",
- "description": "Number of container repositories in the group.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containsLockedProjects",
- "description": "Includes at least one project where the repository size exceeds the limit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "customEmoji",
- "description": "Custom emoji within this namespace. Available only when feature flag `custom_emoji` is enabled.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CustomEmojiConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "emailsDisabled",
- "description": "Indicates if a group has email notifications disabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "Find a single epic.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the epic, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of epics, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter epics by state.",
- "type": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for epic title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List epics by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "EpicSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter epics by author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Filter epics by labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter epics by milestone title, computed from epic's issues.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iidStartsWith",
- "description": "Filter epics by IID for autocomplete.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeDescendantGroups",
- "description": "Include epics from descendant groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "true"
- },
- {
- "name": "confidential",
- "description": "Filter epics by given confidentiality.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicBoard",
- "description": "Find a single epic board.",
- "args": [
- {
- "name": "id",
- "description": "Find an epic board by ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardsEpicBoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoard",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicBoards",
- "description": "Find epic boards.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoardConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epics",
- "description": "Find epics.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the epic, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of epics, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter epics by state.",
- "type": {
- "kind": "ENUM",
- "name": "EpicState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for epic title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List epics by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "EpicSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter epics by author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Filter epics by labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter epics by milestone title, computed from epic's issues.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iidStartsWith",
- "description": "Filter epics by IID for autocomplete.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeDescendantGroups",
- "description": "Include epics from descendant groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "true"
- },
- {
- "name": "confidential",
- "description": "Filter epics by given confidentiality.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicsEnabled",
- "description": "Indicates if Epics are enabled for namespace",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullName",
- "description": "Full name of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "Full path of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groupMembers",
- "description": "A membership of a user within this group.",
- "args": [
- {
- "name": "search",
- "description": "Search query.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "relations",
- "description": "Filter members by the given member relations.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "GroupMemberRelation",
- "ofType": null
- }
- }
- },
- "defaultValue": "[DIRECT, INHERITED]"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GroupMemberConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groupTimelogsEnabled",
- "description": "Indicates if Group timelogs are enabled for namespace",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "isTemporaryStorageIncreaseEnabled",
- "description": "Status of the temporary storage increase.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issues",
- "description": "Issues for projects in this group.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the issue. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of issues. For example, [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Labels applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Milestone applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "Usernames of users assigned to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "ID of a user assigned to the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdBefore",
- "description": "Issues created before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdAfter",
- "description": "Issues created after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedBefore",
- "description": "Issues updated before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedAfter",
- "description": "Issues updated after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedBefore",
- "description": "Issues closed before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedAfter",
- "description": "Issues closed after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for issue title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "types",
- "description": "Filter issues by the given issue types.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Current state of this issue.",
- "type": {
- "kind": "ENUM",
- "name": "IssuableState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort issues by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "IssueSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "iterationId",
- "description": "Iterations applied to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "ID of an epic associated with the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeSubgroups",
- "description": "Include issues belonging to subgroups",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iterations",
- "description": "Find iterations.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter iterations by state.",
- "type": {
- "kind": "ENUM",
- "name": "IterationState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Fuzzy search by title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "Global ID of the Iteration to look up.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the Iteration to look up.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeAncestors",
- "description": "Whether to include ancestor iterations. Defaults to true.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IterationConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "A label available on this group.",
- "args": [
- {
- "name": "title",
- "description": "Title of the label.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels available on this group.",
- "args": [
- {
- "name": "searchTerm",
- "description": "A search term to find labels with.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeAncestorGroups",
- "description": "Include labels from ancestor groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "includeDescendantGroups",
- "description": "Include labels from descendant groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "onlyGroupLabels",
- "description": "Include only group level labels.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsEnabled",
- "description": "Indicates if Large File Storage (LFS) is enabled for namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mentionsDisabled",
- "description": "Indicates if a group is disabled from getting mentioned.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequests",
- "description": "Merge requests for projects in this group.",
- "args": [
- {
- "name": "iids",
- "description": "Array of IIDs of merge requests, for example `[1, 2]`.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranches",
- "description": "Array of source branch names. All resolved merge requests will have one of these branches as their source.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranches",
- "description": "Array of target branch names. All resolved merge requests will have one of these branches as their target.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "A merge request state. If provided, all resolved merge requests will have this state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Array of label names. All resolved merge requests will have all of these labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "mergedAfter",
- "description": "Merge requests merged after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergedBefore",
- "description": "Merge requests merged before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort merge requests by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "includeSubgroups",
- "description": "Include merge requests belonging to subgroups",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "assigneeUsername",
- "description": "Username of the assignee.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestones",
- "description": "Milestones of the group.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ids",
- "description": "Array of global milestone IDs, e.g., \"gid://gitlab/Milestone/1\".",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter milestones by state.",
- "type": {
- "kind": "ENUM",
- "name": "MilestoneStateEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "The title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "searchTitle",
- "description": "A search string for the title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "containingDate",
- "description": "A date that the milestone contains.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeDescendants",
- "description": "Also return milestones in all subgroups and subprojects.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MilestoneConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageSettings",
- "description": "The package settings for the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageSettings",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "parent",
- "description": "Parent group.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectCreationLevel",
- "description": "The permission level required to create projects in the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projects",
- "description": "Projects within this namespace.",
- "args": [
- {
- "name": "includeSubgroups",
- "description": "Include also subgroup projects.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "search",
- "description": "Search project with most similar names or paths.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "null"
- },
- {
- "name": "sort",
- "description": "Sort projects by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "NamespaceProjectSort",
- "ofType": null
- },
- "defaultValue": "null"
- },
- {
- "name": "hasVulnerabilities",
- "description": "Returns only the projects which have vulnerabilities.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositorySizeExcessProjectCount",
- "description": "Number of projects in the root namespace where the repository size exceeds the limit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requestAccessEnabled",
- "description": "Indicates if users can request access to namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requireTwoFactorAuthentication",
- "description": "Indicates if all users in this group are required to set up two-factor authentication.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rootStorageStatistics",
- "description": "Aggregated storage statistics of the namespace. Only available for root namespaces.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RootStorageStatistics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shareWithGroupLock",
- "description": "Indicates if sharing a project with another group within this group is prevented.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stats",
- "description": "Group statistics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GroupStats",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "storageSizeLimit",
- "description": "Total storage limit of the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subgroupCreationLevel",
- "description": "The permission level required to create subgroups within the group.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "temporaryStorageIncreaseEndsOn",
- "description": "Date until the temporary storage increase is active.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timelogs",
- "description": "Time logged in issues by group members.",
- "args": [
- {
- "name": "startDate",
- "description": "List time logs within a date range where the logged date is equal to or after startDate.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List time logs within a date range where the logged date is equal to or before endDate.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startTime",
- "description": "List time-logs within a time range where the logged time is equal to or after startTime.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endTime",
- "description": "List time-logs within a time range where the logged time is equal to or before endTime.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TimelogConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalRepositorySize",
- "description": "Total repository size of all projects in the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalRepositorySizeExcess",
- "description": "Total excess repository size of all projects in the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "twoFactorGracePeriod",
- "description": "Time before two-factor authentication is enforced.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "GroupPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "visibility",
- "description": "Visibility of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilities",
- "description": "Vulnerabilities reported on the projects in the group and its subgroups.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by VulnerabilityScanner.externalId.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List vulnerabilities by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilitySort",
- "ofType": null
- },
- "defaultValue": "severity_desc"
- },
- {
- "name": "hasResolution",
- "description": "Returns only the vulnerabilities which have been resolved on default branch.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hasIssues",
- "description": "Returns only the vulnerabilities which have linked issues.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCountByDay",
- "description": "Number of vulnerabilities per day for the projects in the group and its subgroups.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "Last day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCountByDayAndSeverity",
- "description": "Number of vulnerabilities per severity level, per day, for the projects in the group and its subgroups. Deprecated in 13.3: Use `vulnerabilitiesCountByDay`.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "Last day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverityConnection",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use `vulnerabilitiesCountByDay`. Deprecated in 13.3."
- },
- {
- "name": "vulnerabilityGrades",
- "description": "Represents vulnerable project counts for each grade.",
- "args": [
- {
- "name": "includeSubgroups",
- "description": "Include grades belonging to subgroups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerableProjectsByGrade",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityScanners",
- "description": "Vulnerability scanners reported on the project vulnerabilities of the group and its subgroups.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitySeveritiesCount",
- "description": "Counts for each vulnerability severity in the group and its subgroups.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by scanner.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitySeveritiesCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the group.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "GroupID",
- "description": "Identifier of Group.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupMember",
- "description": "Represents a Group Membership",
- "fields": [
- {
- "name": "accessLevel",
- "description": "GitLab::Access level.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AccessLevel",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Date and time the membership was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdBy",
- "description": "User that authorized membership.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expiresAt",
- "description": "Date and time the membership expires.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group that a User is a member of.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the member.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Date and time the membership was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "User that is associated with the member object.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "GroupPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "MemberInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupMemberConnection",
- "description": "The connection type for GroupMember.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "GroupMemberEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "GroupMember",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupMemberEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GroupMember",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "GroupMemberRelation",
- "description": "Group member relation",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "DIRECT",
- "description": "Direct members",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INHERITED",
- "description": "Inherited members",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DESCENDANTS",
- "description": "Descendants members",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupPermissions",
- "description": null,
- "fields": [
- {
- "name": "readGroup",
- "description": "Indicates the user can perform `read_group` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupReleaseStats",
- "description": "Contains release-related statistics about a group",
- "fields": [
- {
- "name": "releasesCount",
- "description": "Total number of releases in all descendant projects of the group. Will always return `null` if `group_level_release_statistics` feature flag is disabled",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releasesPercentage",
- "description": "Percentage of the group's descendant projects that have at least one release. Will always return `null` if `group_level_release_statistics` feature flag is disabled",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "GroupStats",
- "description": "Contains statistics about a group",
- "fields": [
- {
- "name": "releaseStats",
- "description": "Statistics related to releases within the group.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GroupReleaseStats",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "HealthStatus",
- "description": "Health status of an issue or epic",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "onTrack",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "needsAttention",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "atRisk",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationCreateInput",
- "description": "Autogenerated input type of HttpIntegrationCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to create the integration in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the integration.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "active",
- "description": "Whether the integration is receiving alerts.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "payloadExample",
- "description": "The example of an alert payload.",
- "type": {
- "kind": "SCALAR",
- "name": "JsonString",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "payloadAttributeMappings",
- "description": "The custom mapping of GitLab alert attributes to fields from the payload_example.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AlertManagementPayloadAlertFieldInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "HttpIntegrationCreatePayload",
- "description": "Autogenerated return type of HttpIntegrationCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The HTTP integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationDestroyInput",
- "description": "Autogenerated input type of HttpIntegrationDestroy",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the integration to remove.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AlertManagementHttpIntegrationID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "HttpIntegrationDestroyPayload",
- "description": "Autogenerated return type of HttpIntegrationDestroy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The HTTP integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationResetTokenInput",
- "description": "Autogenerated input type of HttpIntegrationResetToken",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the integration to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AlertManagementHttpIntegrationID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "HttpIntegrationResetTokenPayload",
- "description": "Autogenerated return type of HttpIntegrationResetToken",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The HTTP integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationUpdateInput",
- "description": "Autogenerated input type of HttpIntegrationUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the integration to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AlertManagementHttpIntegrationID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the integration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "active",
- "description": "Whether the integration is receiving alerts.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "payloadExample",
- "description": "The example of an alert payload.",
- "type": {
- "kind": "SCALAR",
- "name": "JsonString",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "payloadAttributeMappings",
- "description": "The custom mapping of GitLab alert attributes to fields from the payload_example.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AlertManagementPayloadAlertFieldInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "HttpIntegrationUpdatePayload",
- "description": "Autogenerated return type of HttpIntegrationUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The HTTP integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementHttpIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ID",
- "description": "Represents a unique identifier that is Base64 obfuscated. It is often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"VXNlci0xMA==\"`) or integer (such as `4`) input value will be accepted as an ID.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "description": "An ISO 8601-encoded date",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "IncidentManagementOncallParticipantID",
- "description": "Identifier of IncidentManagement::OncallParticipant.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotation",
- "description": "Describes an incident management on-call rotation",
- "fields": [
- {
- "name": "id",
- "description": "ID of the on-call rotation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "IncidentManagementOncallRotationID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "length",
- "description": "Length of the on-call schedule, in the units specified by lengthUnit.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lengthUnit",
- "description": "Unit of the on-call rotation length.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "OncallRotationUnitEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the on-call rotation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "Participants of the on-call rotation.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallParticipantTypeConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shifts",
- "description": "Blocks of time for which a participant is on-call within a given time frame. Time frame cannot exceed one month.",
- "args": [
- {
- "name": "startTime",
- "description": "Start of timeframe to include shifts for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endTime",
- "description": "End of timeframe to include shifts for. Cannot exceed one month after start.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShiftConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startsAt",
- "description": "Start date of the on-call rotation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotationConnection",
- "description": "The connection type for IncidentManagementOncallRotation.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotationEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotation",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotationEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "IncidentManagementOncallRotationID",
- "description": "Identifier of IncidentManagement::OncallRotation.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "description": "Describes an incident management on-call schedule",
- "fields": [
- {
- "name": "description",
- "description": "Description of the on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rotations",
- "description": "On-call rotations for the on-call schedule.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotationConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timezone",
- "description": "Time zone of the on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallScheduleConnection",
- "description": "The connection type for IncidentManagementOncallSchedule.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallScheduleEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallScheduleEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShift",
- "description": "A block of time for which a participant is on-call.",
- "fields": [
- {
- "name": "endsAt",
- "description": "End time of the on-call shift.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participant",
- "description": "Participant assigned to the on-call shift.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallParticipantType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startsAt",
- "description": "Start time of the on-call shift.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShiftConnection",
- "description": "The connection type for IncidentManagementOncallShift.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShiftEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShift",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShiftEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallShift",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "InstanceSecurityDashboard",
- "description": null,
- "fields": [
- {
- "name": "projects",
- "description": "Projects selected in Instance Security Dashboard.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityGrades",
- "description": "Represents vulnerable project counts for each grade.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerableProjectsByGrade",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityScanners",
- "description": "Vulnerability scanners reported on the vulnerabilities from projects selected in Instance Security Dashboard.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitySeveritiesCount",
- "description": "Counts for each vulnerability severity from projects selected in Instance Security Dashboard.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by scanner.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitySeveritiesCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurement",
- "description": "Represents a recorded measurement (object count) for the Admins",
- "fields": [
- {
- "name": "count",
- "description": "Object count.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "identifier",
- "description": "The type of objects being measured.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "MeasurementIdentifier",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "recordedAt",
- "description": "The time the measurement was recorded.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurementConnection",
- "description": "The connection type for InstanceStatisticsMeasurement.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurementEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurement",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurementEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurement",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Int",
- "description": "Represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssuableSeverity",
- "description": "Incident severity",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "UNKNOWN",
- "description": "Unknown severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LOW",
- "description": "Low severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MEDIUM",
- "description": "Medium severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HIGH",
- "description": "High severity",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CRITICAL",
- "description": "Critical severity",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssuableState",
- "description": "State of a GitLab issue or merge request",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "opened",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "locked",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "all",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Issue",
- "description": null,
- "fields": [
- {
- "name": "alertManagementAlert",
- "description": "Alert associated to this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "assignees",
- "description": "Assignees of the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "User that created the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blocked",
- "description": "Indicates the issue is blocked.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blockedByCount",
- "description": "Count of issues blocking this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedAt",
- "description": "Timestamp of when the issue was closed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confidential",
- "description": "Indicates the issue is confidential.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNoteEmail",
- "description": "User specific email address for the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the issue was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designCollection",
- "description": "Collection of design images associated with this issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignCollection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussionLocked",
- "description": "Indicates discussion is locked on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downvotes",
- "description": "Number of downvotes the issue has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "emailsDisabled",
- "description": "Indicates if a project has email notifications disabled: `true` if email notifications are disabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "Epic to which this issue belongs.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "healthStatus",
- "description": "Current health status.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "HealthStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "humanTimeEstimate",
- "description": "Human-readable time estimate of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "humanTotalTimeSpent",
- "description": "Human-readable total time reported as spent on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "Iteration of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels of the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metricImages",
- "description": "Metric images associated to the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MetricImage",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "Milestone of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "moved",
- "description": "Indicates if issue got moved from other project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "movedTo",
- "description": "Updated Issue after it got moved to another project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "List of participants in the issue.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reference",
- "description": "Internal reference of the issue. Returned in shortened format by default.",
- "args": [
- {
- "name": "full",
- "description": "Boolean option specifying whether the reference should be returned in full.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "relativePosition",
- "description": "Relative position of the issue (used for positioning in epic tree and issue boards).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity",
- "description": "Severity level of the incident.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "IssuableSeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "slaDueAt",
- "description": "Timestamp of when the issue SLA expires.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "statusPagePublishedIncident",
- "description": "Indicates whether an issue is published to the status page.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscribed",
- "description": "Indicates the currently logged in user is subscribed to the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "taskCompletionStatus",
- "description": "Task completion status of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TaskCompletionStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timeEstimate",
- "description": "Time estimate of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "titleHtml",
- "description": "The GitLab Flavored Markdown rendering of `title`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalTimeSpent",
- "description": "Total time reported as spent on the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the issue was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedBy",
- "description": "User that last updated the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upvotes",
- "description": "Number of upvotes the issue has received.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userDiscussionsCount",
- "description": "Number of user discussions in the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "Number of user notes of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IssuePermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "Weight of the issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueConnection",
- "description": "The connection type for Issue.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IssueEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "Total weight of issues collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "IssueID",
- "description": "Identifier of Issue.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueMoveInput",
- "description": "Autogenerated input type of IssueMove",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetProjectPath",
- "description": "The project to move the issue to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueMoveListInput",
- "description": "Autogenerated input type of IssueMoveList",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "boardId",
- "description": "Global ID of the board that the issue is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "fromListId",
- "description": "ID of the board list that the issue will be moved from.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "toListId",
- "description": "ID of the board list that the issue will be moved to.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "moveBeforeId",
- "description": "ID of issue that should be placed before the current issue.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "moveAfterId",
- "description": "ID of issue that should be placed after the current issue.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "The ID of the parent epic. NULL when removing the association.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueMoveListPayload",
- "description": "Autogenerated return type of IssueMoveList",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueMovePayload",
- "description": "Autogenerated return type of IssueMove",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssuePermissions",
- "description": "Check permissions for the current user on a issue",
- "fields": [
- {
- "name": "adminIssue",
- "description": "Indicates the user can perform `admin_issue` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createDesign",
- "description": "Indicates the user can perform `create_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": "Indicates the user can perform `create_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyDesign",
- "description": "Indicates the user can perform `destroy_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readDesign",
- "description": "Indicates the user can perform `read_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readIssue",
- "description": "Indicates the user can perform `read_issue` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reopenIssue",
- "description": "Indicates the user can perform `reopen_issue` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateIssue",
- "description": "Indicates the user can perform `update_issue` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetAssigneesInput",
- "description": "Autogenerated input type of IssueSetAssignees",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "The usernames to assign to the resource. Replaces existing assignees by default.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "operationMode",
- "description": "The operation to perform. Defaults to REPLACE.",
- "type": {
- "kind": "ENUM",
- "name": "MutationOperationMode",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetAssigneesPayload",
- "description": "Autogenerated return type of IssueSetAssignees",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetConfidentialInput",
- "description": "Autogenerated input type of IssueSetConfidential",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "Whether or not to set the issue as a confidential.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetConfidentialPayload",
- "description": "Autogenerated return type of IssueSetConfidential",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetDueDateInput",
- "description": "Autogenerated input type of IssueSetDueDate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dueDate",
- "description": "The desired due date for the issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetDueDatePayload",
- "description": "Autogenerated return type of IssueSetDueDate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetEpicInput",
- "description": "Autogenerated input type of IssueSetEpic",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "Global ID of the epic to be assigned to the issue, epic will be removed if absent or set to null",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetEpicPayload",
- "description": "Autogenerated return type of IssueSetEpic",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetIterationInput",
- "description": "Autogenerated input type of IssueSetIteration",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iterationId",
- "description": "The iteration to assign to the issue.\n",
- "type": {
- "kind": "SCALAR",
- "name": "IterationID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetIterationPayload",
- "description": "Autogenerated return type of IssueSetIteration",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetLockedInput",
- "description": "Autogenerated input type of IssueSetLocked",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "locked",
- "description": "Whether or not to lock discussion on the issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetLockedPayload",
- "description": "Autogenerated return type of IssueSetLocked",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetSeverityInput",
- "description": "Autogenerated input type of IssueSetSeverity",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Set the incident severity level.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssuableSeverity",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetSeverityPayload",
- "description": "Autogenerated return type of IssueSetSeverity",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetSubscriptionInput",
- "description": "Autogenerated input type of IssueSetSubscription",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "subscribedState",
- "description": "The desired state of the subscription.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetSubscriptionPayload",
- "description": "Autogenerated return type of IssueSetSubscription",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetWeightInput",
- "description": "Autogenerated input type of IssueSetWeight",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The desired weight for the issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueSetWeightPayload",
- "description": "Autogenerated return type of IssueSetWeight",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssueSort",
- "description": "Values for sorting issues",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "updated_desc",
- "description": "Updated at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "updated_asc",
- "description": "Updated at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "created_desc",
- "description": "Created at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "created_asc",
- "description": "Created at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "UPDATED_DESC",
- "description": "Updated at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_ASC",
- "description": "Updated at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PRIORITY_ASC",
- "description": "Priority by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PRIORITY_DESC",
- "description": "Priority by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LABEL_PRIORITY_ASC",
- "description": "Label priority by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LABEL_PRIORITY_DESC",
- "description": "Label priority by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MILESTONE_DUE_ASC",
- "description": "Milestone due date by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MILESTONE_DUE_DESC",
- "description": "Milestone due date by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DUE_DATE_ASC",
- "description": "Due date by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DUE_DATE_DESC",
- "description": "Due date by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RELATIVE_POSITION_ASC",
- "description": "Relative position by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SEVERITY_ASC",
- "description": "Severity from less critical to more critical",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SEVERITY_DESC",
- "description": "Severity from more critical to less critical",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_ASC",
- "description": "Weight by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEIGHT_DESC",
- "description": "Weight by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PUBLISHED_ASC",
- "description": "Published issues shown last",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PUBLISHED_DESC",
- "description": "Published issues shown first",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SLA_DUE_AT_ASC",
- "description": "Issues with earliest SLA due time shown first",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SLA_DUE_AT_DESC",
- "description": "Issues with latest SLA due time shown first",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssueState",
- "description": "State of a GitLab issue",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "opened",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "locked",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "all",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssueStateEvent",
- "description": "Values for issue state events",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "REOPEN",
- "description": "Reopens the issue",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CLOSE",
- "description": "Closes the issue",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IssueStatusCountsType",
- "description": "Represents total number of issues for the represented statuses",
- "fields": [
- {
- "name": "all",
- "description": "Number of issues with status ALL for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": "Number of issues with status CLOSED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "opened",
- "description": "Number of issues with status OPENED for the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IssueType",
- "description": "Issue type",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ISSUE",
- "description": "Issue issue type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INCIDENT",
- "description": "Incident issue type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TEST_CASE",
- "description": "Test Case issue type",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Iteration",
- "description": "Represents an iteration object",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of iteration creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Timestamp of the iteration due date.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "report",
- "description": "Historically accurate report about the timebox.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxReport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scopedPath",
- "description": "Web path of the iteration, scoped to the query parent. Only valid for Project parents. Returns null in other contexts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scopedUrl",
- "description": "Web URL of the iteration, scoped to the query parent. Only valid for Project parents. Returns null in other contexts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDate",
- "description": "Timestamp of the iteration start date.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IterationState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of last iteration update.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "TimeboxReportInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IterationConnection",
- "description": "The connection type for Iteration.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "IterationEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "IterationEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "IterationID",
- "description": "Identifier of Iteration.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IterationState",
- "description": "State of a GitLab iteration",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "upcoming",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "started",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "opened",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "all",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "IterationWildcardId",
- "description": "Iteration ID wildcard values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "NONE",
- "description": "No iteration is assigned",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ANY",
- "description": "An iteration is assigned",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CURRENT",
- "description": "Current iteration",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "JSON",
- "description": "Represents untyped JSON",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraImport",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of when the Jira import was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "failedToImportCount",
- "description": "Count of issues that failed to import.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "importedIssuesCount",
- "description": "Count of issues that were successfully imported.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraProjectKey",
- "description": "Project key for the imported Jira project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scheduledAt",
- "description": "Timestamp of when the Jira import was scheduled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scheduledBy",
- "description": "User that started the Jira import.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalIssueCount",
- "description": "Total count of issues that were attempted to import.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraImportConnection",
- "description": "The connection type for JiraImport.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "JiraImportEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "JiraImport",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraImportEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraImport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "JiraImportStartInput",
- "description": "Autogenerated input type of JiraImportStart",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to import the Jira project into.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "jiraProjectKey",
- "description": "Project key of the importer Jira project.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "jiraProjectName",
- "description": "Project name of the importer Jira project.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "usersMapping",
- "description": "The mapping of Jira to GitLab users.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "JiraUsersMappingInputType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraImportStartPayload",
- "description": "Autogenerated return type of JiraImportStart",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraImport",
- "description": "The Jira import data after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraImport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "JiraImportUsersInput",
- "description": "Autogenerated input type of JiraImportUsers",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to import the Jira users into.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "startAt",
- "description": "The index of the record the import should started at, default 0 (50 records returned).",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraImportUsersPayload",
- "description": "Autogenerated return type of JiraImportUsers",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraUsers",
- "description": "Users returned from Jira, matched by email and name if possible.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "JiraUser",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraProject",
- "description": null,
- "fields": [
- {
- "name": "key",
- "description": "Key of the Jira project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the Jira project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectId",
- "description": "ID of the Jira project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraProjectConnection",
- "description": "The connection type for JiraProject.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "JiraProjectEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "JiraProject",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraProjectEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraProject",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraService",
- "description": null,
- "fields": [
- {
- "name": "active",
- "description": "Indicates if the service is active.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projects",
- "description": "List of all Jira projects fetched through Jira REST API.",
- "args": [
- {
- "name": "name",
- "description": "Project name or key.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraProjectConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Class name of the service.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Service",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraUser",
- "description": null,
- "fields": [
- {
- "name": "gitlabId",
- "description": "ID of the matched GitLab user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabName",
- "description": "Name of the matched GitLab user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabUsername",
- "description": "Username of the matched GitLab user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraAccountId",
- "description": "Account ID of the Jira user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraDisplayName",
- "description": "Display name of the Jira user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraEmail",
- "description": "Email of the Jira user, returned only for users with public emails.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "JiraUsersMappingInputType",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "jiraAccountId",
- "description": "Jira account ID of the user.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "gitlabId",
- "description": "Id of the GitLab user.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "JobArtifactFileType",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ARCHIVE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "METADATA",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TRACE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "JUNIT",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "METRICS",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "METRICS_REFEREE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NETWORK_REFEREE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DOTENV",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COBERTURA",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CLUSTER_APPLICATIONS",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LSIF",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SECRET_DETECTION",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEPENDENCY_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONTAINER_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LICENSE_MANAGEMENT",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LICENSE_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ACCESSIBILITY",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CODEQUALITY",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PERFORMANCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BROWSER_PERFORMANCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LOAD_PERFORMANCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TERRAFORM",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REQUIREMENTS",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COVERAGE_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "API_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "JsonString",
- "description": "JSON object as raw string",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Label",
- "description": null,
- "fields": [
- {
- "name": "color",
- "description": "Background color of the label.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the label (Markdown rendered as HTML for caching).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "Label ID.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "textColor",
- "description": "Text color of the label.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Content of the label.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "description": "The connection type for Label.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "LabelEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "LabelCreateInput",
- "description": "Autogenerated input type of LabelCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "Full path of the group with which the resource is associated.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the label.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the label.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "color",
- "description": "The color of the label given in 6-digit hex notation with leading '#' sign (e.g. #FFAABB) or one of the CSS color names in https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_keywords.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"#6699cc\""
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "LabelCreatePayload",
- "description": "Autogenerated return type of LabelCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "The label after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "LabelEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "LabelID",
- "description": "Identifier of Label.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ListID",
- "description": "Identifier of List.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ListLimitMetric",
- "description": "List limit metric setting",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "all_metrics",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue_count",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue_weights",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MarkAsSpamSnippetInput",
- "description": "Autogenerated input type of MarkAsSpamSnippet",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the snippet to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MarkAsSpamSnippetPayload",
- "description": "Autogenerated return type of MarkAsSpamSnippet",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippet",
- "description": "The snippet after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MeasurementIdentifier",
- "description": "Possible identifier types for a measurement",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "PROJECTS",
- "description": "Project count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "USERS",
- "description": "User count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ISSUES",
- "description": "Issue count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MERGE_REQUESTS",
- "description": "Merge request count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GROUPS",
- "description": "Group count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES",
- "description": "Pipeline count",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES_SUCCEEDED",
- "description": "Pipeline count with success status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES_FAILED",
- "description": "Pipeline count with failed status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES_CANCELED",
- "description": "Pipeline count with canceled status",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES_SKIPPED",
- "description": "Pipeline count with skipped status",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "MemberInterface",
- "description": null,
- "fields": [
- {
- "name": "accessLevel",
- "description": "GitLab::Access level.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AccessLevel",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Date and time the membership was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdBy",
- "description": "User that authorized membership.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expiresAt",
- "description": "Date and time the membership expires.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the member.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Date and time the membership was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "User that is associated with the member object.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "GroupMember",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectMember",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "MemberInterfaceConnection",
- "description": "The connection type for MemberInterface.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MemberInterfaceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "INTERFACE",
- "name": "MemberInterface",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MemberInterfaceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "INTERFACE",
- "name": "MemberInterface",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "description": null,
- "fields": [
- {
- "name": "allowCollaboration",
- "description": "Indicates if members of the target project can push to the fork.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "approvalsLeft",
- "description": "Number of approvals left.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "approvalsRequired",
- "description": "Number of approvals required.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "approved",
- "description": "Indicates if the merge request has all the required approvals. Returns true if no required approvals are configured.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "approvedBy",
- "description": "Users who approved the merge request.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "assignees",
- "description": "Assignees of the merge request.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "User who created this merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "autoMergeEnabled",
- "description": "Indicates if auto merge is enabled for the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "autoMergeStrategy",
- "description": "Selected auto merge strategy.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "availableAutoMergeStrategies",
- "description": "Array of available auto merge strategies.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commitCount",
- "description": "Number of commits in the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commitsWithoutMergeCommits",
- "description": "Merge request commits excluding merge commits.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CommitConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "conflicts",
- "description": "Indicates if the merge request has conflicts.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the merge request was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUserTodos",
- "description": "To-do items for the current user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the to-do items.",
- "type": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "defaultMergeCommitMessage",
- "description": "Default merge commit message of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "defaultMergeCommitMessageWithDescription",
- "description": "Default merge commit message of the merge request with description.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "defaultSquashCommitMessage",
- "description": "Default squash commit message of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the merge request (Markdown rendered as HTML for caching).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffHeadSha",
- "description": "Diff head SHA of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffRefs",
- "description": "References of the base SHA, the head SHA, and the start SHA for this merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DiffRefs",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffStats",
- "description": "Details about which files were changed in this merge request.",
- "args": [
- {
- "name": "path",
- "description": "A specific file-path.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiffStats",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "diffStatsSummary",
- "description": "Summary of which files were changed in this merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DiffStatsSummary",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussionLocked",
- "description": "Indicates if comments on the merge request are locked to members only.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downvotes",
- "description": "Number of downvotes for the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "forceRemoveSourceBranch",
- "description": "Indicates if the project settings will lead to source branch deletion after merge.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasCi",
- "description": "Indicates if the merge request has CI.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasSecurityReports",
- "description": "Indicates if the source branch has any security reports.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "headPipeline",
- "description": "The pipeline running on the branch HEAD of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "inProgressMergeCommitSha",
- "description": "Commit SHA of the merge request if merge is in progress.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels of the merge request.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeCommitSha",
- "description": "SHA of the merge request commit (set once merged).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeError",
- "description": "Error message due to a merge error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeOngoing",
- "description": "Indicates if a merge is currently occurring.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeStatus",
- "description": "Status of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeTrainsCount",
- "description": "Number of merge requests in the merge train.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeUser",
- "description": "User who merged this merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeWhenPipelineSucceeds",
- "description": "Indicates if the merge has been set to be merged when its pipeline succeeds (MWPS).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeable",
- "description": "Indicates if the merge request is mergeable.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeableDiscussionsState",
- "description": "Indicates if all discussions in the merge request have been resolved, allowing the merge request to be merged.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergedAt",
- "description": "Timestamp of when the merge request was merged, null if not merged.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "The milestone of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "participants",
- "description": "Participants in the merge request. This includes the author, assignees, reviewers, and users mentioned in notes.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelines",
- "description": "Pipelines for the merge request. Note: for performance reasons, no more than the most recent 500 pipelines will be returned.",
- "args": [
- {
- "name": "status",
- "description": "Filter pipelines by their status.",
- "type": {
- "kind": "ENUM",
- "name": "PipelineStatusEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ref",
- "description": "Filter pipelines by the ref they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sha",
- "description": "Filter pipelines by the sha of the commit they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Alias for target_project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectId",
- "description": "ID of the merge request project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rebaseCommitSha",
- "description": "Rebase commit SHA of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rebaseInProgress",
- "description": "Indicates if there is a rebase currently in progress for the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reference",
- "description": "Internal reference of the merge request. Returned in shortened format by default.",
- "args": [
- {
- "name": "full",
- "description": "Boolean option specifying whether the reference should be returned in full.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reviewers",
- "description": "Users from whom a review has been requested.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "securityAutoFix",
- "description": "Indicates if the merge request is created by @GitLab-Security-Bot.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shouldBeRebased",
- "description": "Indicates if the merge request will be rebased.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shouldRemoveSourceBranch",
- "description": "Indicates if the source branch of the merge request will be deleted after merge.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceBranch",
- "description": "Source branch of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceBranchExists",
- "description": "Indicates if the source branch of the merge request exists.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceBranchProtected",
- "description": "Indicates if the source branch is protected.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceProject",
- "description": "Source project of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceProjectId",
- "description": "ID of the merge request source project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "squash",
- "description": "Indicates if squash on merge is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "squashOnMerge",
- "description": "Indicates if squash on merge is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscribed",
- "description": "Indicates if the currently logged in user is subscribed to this merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetBranch",
- "description": "Target branch of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetBranchExists",
- "description": "Indicates if the target branch of the merge request exists.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetProject",
- "description": "Target project of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetProjectId",
- "description": "ID of the merge request target project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "taskCompletionStatus",
- "description": "Completion status of tasks",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TaskCompletionStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timeEstimate",
- "description": "Time estimate of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "titleHtml",
- "description": "The GitLab Flavored Markdown rendering of `title`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalTimeSpent",
- "description": "Total time reported as spent on the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the merge request was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upvotes",
- "description": "Number of upvotes for the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userDiscussionsCount",
- "description": "Number of user discussions in the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "User notes count of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MergeRequestPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the merge request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "workInProgress",
- "description": "Indicates if the merge request is a work in progress (WIP).",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- },
- {
- "kind": "INTERFACE",
- "name": "CurrentUserTodos",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "description": "The connection type for MergeRequest.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MergeRequestEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalTimeToMerge",
- "description": "Total sum of time to merge, in seconds, for the collection of merge requests.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestCreateInput",
- "description": "Autogenerated input type of MergeRequestCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Project full path the merge request is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the merge request.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranch",
- "description": "Source branch of the merge request.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranch",
- "description": "Target branch of the merge request.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the merge request (Markdown rendered as HTML for caching).",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Labels of the merge request.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestCreatePayload",
- "description": "Autogenerated return type of MergeRequestCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistry",
- "description": "Represents the Geo sync and verification state of a Merge Request diff",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp when the MergeRequestDiffRegistry was created",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the MergeRequestDiffRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncFailure",
- "description": "Error message during sync of the MergeRequestDiffRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncedAt",
- "description": "Timestamp of the most recent successful sync of the MergeRequestDiffRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestDiffId",
- "description": "ID of the Merge Request diff.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryAt",
- "description": "Timestamp after which the MergeRequestDiffRegistry should be resynced",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryCount",
- "description": "Number of consecutive failed sync attempts of the MergeRequestDiffRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "Sync state of the MergeRequestDiffRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "RegistryState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistryConnection",
- "description": "The connection type for MergeRequestDiffRegistry.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistry",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestDiffRegistry",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "MergeRequestID",
- "description": "Identifier of MergeRequest.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MergeRequestNewState",
- "description": "New state to apply to a merge request.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "OPEN",
- "description": "Open the merge request if it is closed.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CLOSED",
- "description": "Close the merge request if it is open.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestPermissions",
- "description": "Check permissions for the current user on a merge request",
- "fields": [
- {
- "name": "adminMergeRequest",
- "description": "Indicates the user can perform `admin_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "canMerge",
- "description": "Indicates the user can perform `can_merge` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "cherryPickOnCurrentMergeRequest",
- "description": "Indicates the user can perform `cherry_pick_on_current_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": "Indicates the user can perform `create_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pushToSourceBranch",
- "description": "Indicates the user can perform `push_to_source_branch` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readMergeRequest",
- "description": "Indicates the user can perform `read_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removeSourceBranch",
- "description": "Indicates the user can perform `remove_source_branch` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "revertOnCurrentMergeRequest",
- "description": "Indicates the user can perform `revert_on_current_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateMergeRequest",
- "description": "Indicates the user can perform `update_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestReviewerRereviewInput",
- "description": "Autogenerated input type of MergeRequestReviewerRereview",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "userId",
- "description": "The user ID for the user that has been requested for a new review.\n",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestReviewerRereviewPayload",
- "description": "Autogenerated return type of MergeRequestReviewerRereview",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetAssigneesInput",
- "description": "Autogenerated input type of MergeRequestSetAssignees",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "The usernames to assign to the resource. Replaces existing assignees by default.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "operationMode",
- "description": "The operation to perform. Defaults to REPLACE.",
- "type": {
- "kind": "ENUM",
- "name": "MutationOperationMode",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetAssigneesPayload",
- "description": "Autogenerated return type of MergeRequestSetAssignees",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetLabelsInput",
- "description": "Autogenerated input type of MergeRequestSetLabels",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelIds",
- "description": "The Label IDs to set. Replaces existing labels by default.\n",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "operationMode",
- "description": "Changes the operation mode. Defaults to REPLACE.\n",
- "type": {
- "kind": "ENUM",
- "name": "MutationOperationMode",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetLabelsPayload",
- "description": "Autogenerated return type of MergeRequestSetLabels",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetLockedInput",
- "description": "Autogenerated input type of MergeRequestSetLocked",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "locked",
- "description": "Whether or not to lock the merge request.\n",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetLockedPayload",
- "description": "Autogenerated return type of MergeRequestSetLocked",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetMilestoneInput",
- "description": "Autogenerated input type of MergeRequestSetMilestone",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "The milestone to assign to the merge request.\n",
- "type": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetMilestonePayload",
- "description": "Autogenerated return type of MergeRequestSetMilestone",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetSubscriptionInput",
- "description": "Autogenerated input type of MergeRequestSetSubscription",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "subscribedState",
- "description": "The desired state of the subscription.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetSubscriptionPayload",
- "description": "Autogenerated return type of MergeRequestSetSubscription",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetWipInput",
- "description": "Autogenerated input type of MergeRequestSetWip",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "wip",
- "description": "Whether or not to set the merge request as a WIP.\n",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestSetWipPayload",
- "description": "Autogenerated return type of MergeRequestSetWip",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "description": "Values for sorting merge requests",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "updated_desc",
- "description": "Updated at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "updated_asc",
- "description": "Updated at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "created_desc",
- "description": "Created at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "created_asc",
- "description": "Created at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "UPDATED_DESC",
- "description": "Updated at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_ASC",
- "description": "Updated at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PRIORITY_ASC",
- "description": "Priority by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PRIORITY_DESC",
- "description": "Priority by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LABEL_PRIORITY_ASC",
- "description": "Label priority by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LABEL_PRIORITY_DESC",
- "description": "Label priority by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MILESTONE_DUE_ASC",
- "description": "Milestone due date by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MILESTONE_DUE_DESC",
- "description": "Milestone due date by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MERGED_AT_ASC",
- "description": "Merge time by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MERGED_AT_DESC",
- "description": "Merge time by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "description": "State of a GitLab merge request",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "opened",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "locked",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "all",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "merged",
- "description": "Merge Request has been merged",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestUpdateInput",
- "description": "Autogenerated input type of MergeRequestUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the merge request to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the merge request to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the merge request.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "targetBranch",
- "description": "Target branch of the merge request.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the merge request (Markdown rendered as HTML for caching).",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "The action to perform to change the state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestNewState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequestUpdatePayload",
- "description": "Autogenerated return type of MergeRequestUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "The merge request after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Metadata",
- "description": null,
- "fields": [
- {
- "name": "revision",
- "description": "Revision.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "Version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MetricImage",
- "description": "Represents a metric image upload",
- "fields": [
- {
- "name": "fileName",
- "description": "File name of the metric image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filePath",
- "description": "File path of the metric image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the metric upload.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the metric upload.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "URL of the metric source.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MetricsDashboard",
- "description": null,
- "fields": [
- {
- "name": "annotations",
- "description": "Annotations added to the dashboard.",
- "args": [
- {
- "name": "from",
- "description": "Timestamp marking date and time from which annotations need to be fetched.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "to",
- "description": "Timestamp marking date and time to which annotations need to be fetched.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotationConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path to a file with the dashboard definition.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "schemaValidationWarnings",
- "description": "Dashboard schema validation warnings.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotation",
- "description": null,
- "fields": [
- {
- "name": "description",
- "description": "Description of the annotation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endingAt",
- "description": "Timestamp marking end of annotated time span.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the annotation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "panelId",
- "description": "ID of a dashboard panel to which the annotation should be scoped.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startingAt",
- "description": "Timestamp marking start of annotated time span.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotationConnection",
- "description": "The connection type for MetricsDashboardAnnotation.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotationEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotation",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotationEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MetricsDashboardAnnotation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "MetricsDashboardAnnotationID",
- "description": "Identifier of Metrics::Dashboard::Annotation.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Milestone",
- "description": "Represents a milestone",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp of milestone creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dueDate",
- "description": "Timestamp of the milestone due date.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groupMilestone",
- "description": "Indicates if milestone is at group level.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectMilestone",
- "description": "Indicates if milestone is at project level.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "report",
- "description": "Historically accurate report about the timebox.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxReport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startDate",
- "description": "Timestamp of the milestone start date.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "MilestoneStateEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stats",
- "description": "Milestone statistics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MilestoneStats",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subgroupMilestone",
- "description": "Indicates if milestone is at subgroup level.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of last milestone update.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "TimeboxReportInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MilestoneConnection",
- "description": "The connection type for Milestone.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "MilestoneEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MilestoneEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "description": "Identifier of Milestone.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MilestoneStateEnum",
- "description": "Current state of milestone",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "active",
- "description": "Milestone is currently active",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closed",
- "description": "Milestone is closed",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "MilestoneStats",
- "description": "Contains statistics about a milestone",
- "fields": [
- {
- "name": "closedIssuesCount",
- "description": "Number of closed issues associated with the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalIssuesCount",
- "description": "Total number of issues associated with the milestone.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MoveType",
- "description": "The position to which the adjacent object should be moved",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "before",
- "description": "The adjacent object will be moved before the object that is being moved",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "after",
- "description": "The adjacent object will be moved after the object that is being moved",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Mutation",
- "description": null,
- "fields": [
- {
- "name": "addAwardEmoji",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AddAwardEmojiInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AddAwardEmojiPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use awardEmojiAdd. Deprecated in 13.2."
- },
- {
- "name": "addProjectToSecurityDashboard",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AddProjectToSecurityDashboardInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AddProjectToSecurityDashboardPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminSidekiqQueuesDeleteJobs",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AdminSidekiqQueuesDeleteJobsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AdminSidekiqQueuesDeleteJobsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertSetAssignees",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AlertSetAssigneesInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertSetAssigneesPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertTodoCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AlertTodoCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertTodoCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "apiFuzzingCiConfigurationCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ApiFuzzingCiConfigurationCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ApiFuzzingCiConfigurationCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmojiAdd",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiAddInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmojiAddPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmojiRemove",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiRemoveInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmojiRemovePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmojiToggle",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "AwardEmojiToggleInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmojiTogglePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "boardListCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "BoardListCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardListCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "boardListUpdateLimitMetrics",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "BoardListUpdateLimitMetricsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardListUpdateLimitMetricsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ciCdSettingsUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CiCdSettingsUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiCdSettingsUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgentDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgentTokenCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentTokenCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgentTokenDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ClusterAgentTokenDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentTokenDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commitCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CommitCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CommitCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "configureSast",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ConfigureSastInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ConfigureSastPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createAlertIssue",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateAlertIssueInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateAlertIssuePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createAnnotation",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateAnnotationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateAnnotationPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createBoard",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateBoardInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateBoardPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createBranch",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateBranchInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateBranchPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createClusterAgent",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateClusterAgentInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateClusterAgentPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createComplianceFramework",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateComplianceFrameworkInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateComplianceFrameworkPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createCustomEmoji",
- "description": " Available only when feature flag `custom_emoji` is enabled.",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateCustomEmojiInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateCustomEmojiPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createDevopsAdoptionSegment",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateDevopsAdoptionSegmentInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateDevopsAdoptionSegmentPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createDiffNote",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateDiffNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateDiffNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createEpic",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateEpicInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateEpicPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createImageDiffNote",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateImageDiffNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateImageDiffNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createIssue",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateIssueInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateIssuePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createIteration",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateIterationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateIterationPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createRequirement",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateRequirementInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateRequirementPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createSnippet",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateSnippetInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateSnippetPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createTestCase",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "CreateTestCaseInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CreateTestCasePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastOnDemandScanCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastOnDemandScanCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastOnDemandScanCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfileCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfileCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfileDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfileDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfileRun",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileRunInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfileRunPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfileUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastProfileUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfileUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastScannerProfileCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfileCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastScannerProfileDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfileDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastScannerProfileUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastScannerProfileUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfileUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfileCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfileCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfileDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfileDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfileUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteProfileUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfileUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteTokenCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteTokenCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteTokenCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteValidationCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteValidationCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteValidationCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteValidationRevoke",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DastSiteValidationRevokeInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteValidationRevokePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deleteAnnotation",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DeleteAnnotationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DeleteAnnotationPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deleteDevopsAdoptionSegment",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DeleteDevopsAdoptionSegmentInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DeleteDevopsAdoptionSegmentPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designManagementDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignManagementDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designManagementMove",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementMoveInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignManagementMovePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designManagementUpload",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DesignManagementUploadInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DesignManagementUploadPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyBoard",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyBoardInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyBoardPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyBoardList",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyBoardListInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyBoardListPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyComplianceFramework",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyComplianceFrameworkInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyComplianceFrameworkPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyContainerRepository",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyContainerRepositoryInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyContainerRepositoryPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyContainerRepositoryTags",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyContainerRepositoryTagsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyContainerRepositoryTagsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyNote",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroyNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroyNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroySnippet",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DestroySnippetInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DestroySnippetPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussionToggleResolve",
- "description": "Toggles the resolved state of a discussion",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DiscussionToggleResolveInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DiscussionToggleResolvePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dismissVulnerability",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "DismissVulnerabilityInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DismissVulnerabilityPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use vulnerabilityDismiss. Deprecated in 13.5."
- },
- {
- "name": "environmentsCanaryIngressUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EnvironmentsCanaryIngressUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EnvironmentsCanaryIngressUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicAddIssue",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicAddIssueInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicAddIssuePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicBoardCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicBoardCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoardCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicBoardListCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicBoardListCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicBoardListCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicSetSubscription",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicSetSubscriptionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicSetSubscriptionPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicTreeReorder",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "EpicTreeReorderInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EpicTreeReorderPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "exportRequirements",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ExportRequirementsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ExportRequirementsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabSubscriptionActivate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "GitlabSubscriptionActivateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GitlabSubscriptionActivatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpIntegrationCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "HttpIntegrationCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpIntegrationDestroy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationDestroyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "HttpIntegrationDestroyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpIntegrationResetToken",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationResetTokenInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "HttpIntegrationResetTokenPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpIntegrationUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "HttpIntegrationUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "HttpIntegrationUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueMove",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueMoveInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueMovePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueMoveList",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueMoveListInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueMoveListPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetAssignees",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetAssigneesInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetAssigneesPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetConfidential",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetConfidentialInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetConfidentialPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetDueDate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetDueDateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetDueDatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetEpic",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetEpicInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetEpicPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetIteration",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetIterationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetIterationPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetLocked",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetLockedInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetLockedPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetSeverity",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetSeverityInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetSeverityPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetSubscription",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetSubscriptionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetSubscriptionPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueSetWeight",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "IssueSetWeightInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueSetWeightPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraImportStart",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "JiraImportStartInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraImportStartPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraImportUsers",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "JiraImportUsersInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraImportUsersPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labelCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "LabelCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "markAsSpamSnippet",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MarkAsSpamSnippetInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MarkAsSpamSnippetPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestReviewerRereview",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestReviewerRereviewInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestReviewerRereviewPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetAssignees",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetAssigneesInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetAssigneesPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetLabels",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetLabelsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetLabelsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetLocked",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetLockedInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetLockedPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetMilestone",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetMilestoneInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetMilestonePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetSubscription",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetSubscriptionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetSubscriptionPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestSetWip",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestSetWipInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestSetWipPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestUpdate",
- "description": "Update attributes of a merge request",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "MergeRequestUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "namespaceIncreaseStorageTemporarily",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "NamespaceIncreaseStorageTemporarilyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "NamespaceIncreaseStorageTemporarilyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallRotationCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallRotationCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallRotationDestroy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationDestroyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallRotationDestroyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallScheduleCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallScheduleCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallScheduleDestroy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleDestroyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallScheduleDestroyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallScheduleUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallScheduleUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineCancel",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PipelineCancelInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineCancelPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineDestroy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PipelineDestroyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineDestroyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineRetry",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PipelineRetryInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineRetryPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "prometheusIntegrationCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "prometheusIntegrationResetToken",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationResetTokenInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationResetTokenPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "prometheusIntegrationUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "promoteToEpic",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "PromoteToEpicInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PromoteToEpicPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releaseCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releaseDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releaseUpdate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseUpdateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseUpdatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removeAwardEmoji",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "RemoveAwardEmojiInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RemoveAwardEmojiPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use awardEmojiRemove. Deprecated in 13.2."
- },
- {
- "name": "removeProjectFromSecurityDashboard",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "RemoveProjectFromSecurityDashboardInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RemoveProjectFromSecurityDashboardPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositionImageDiffNote",
- "description": "Repositions a DiffNote on an image (a `Note` where the `position.positionType` is `\"image\"`)",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "RepositionImageDiffNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RepositionImageDiffNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "revertVulnerabilityToDetected",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "RevertVulnerabilityToDetectedInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RevertVulnerabilityToDetectedPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use vulnerabilityRevertToDetected. Deprecated in 13.5."
- },
- {
- "name": "runDastScan",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "RunDASTScanInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunDASTScanPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use DastOnDemandScanCreate. Deprecated in 13.4."
- },
- {
- "name": "terraformStateDelete",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateDeleteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateDeletePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformStateLock",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateLockInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateLockPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformStateUnlock",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateUnlockInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateUnlockPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todoCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TodoCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodoCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todoMarkDone",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TodoMarkDoneInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodoMarkDonePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todoRestore",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TodoRestoreInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodoRestorePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todoRestoreMany",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TodoRestoreManyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodoRestoreManyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todosMarkAllDone",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "TodosMarkAllDoneInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TodosMarkAllDonePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "toggleAwardEmoji",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ToggleAwardEmojiInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ToggleAwardEmojiPayload",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use awardEmojiToggle. Deprecated in 13.2."
- },
- {
- "name": "updateAlertStatus",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateAlertStatusInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateAlertStatusPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateBoard",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateBoardPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateBoardEpicUserPreferences",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardEpicUserPreferencesInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateBoardEpicUserPreferencesPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateBoardList",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardListInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateBoardListPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateComplianceFramework",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateComplianceFrameworkInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateComplianceFrameworkPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateContainerExpirationPolicy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateContainerExpirationPolicyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateContainerExpirationPolicyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateEpic",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateEpicInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateEpicPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateImageDiffNote",
- "description": "Updates a DiffNote on an image (a `Note` where the `position.positionType` is `\"image\"`). If the body of the Note contains only quick actions, the Note will be destroyed during the update, and no Note will be returned",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateImageDiffNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateImageDiffNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateIssue",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateIssueInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateIssuePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateIteration",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateIterationInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateIterationPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateNamespacePackageSettings",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateNamespacePackageSettingsInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateNamespacePackageSettingsPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateNote",
- "description": "Updates a Note. If the body of the Note contains only quick actions, the Note will be destroyed during the update, and no Note will be returned",
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateNoteInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateNotePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateRequirement",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateRequirementInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateRequirementPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateSnippet",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateSnippetInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UpdateSnippetPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityConfirm",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityConfirmInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityConfirmPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityDismiss",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityDismissInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityDismissPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityExternalIssueLinkCreate",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityExternalIssueLinkCreateInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkCreatePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityExternalIssueLinkDestroy",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityExternalIssueLinkDestroyInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkDestroyPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityResolve",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityResolveInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityResolvePayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityRevertToDetected",
- "description": null,
- "args": [
- {
- "name": "input",
- "description": null,
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityRevertToDetectedInput",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityRevertToDetectedPayload",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "MutationOperationMode",
- "description": "Different toggles for changing mutator behavior",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "REPLACE",
- "description": "Performs a replace operation",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "APPEND",
- "description": "Performs an append operation",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REMOVE",
- "description": "Performs a removal operation",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Namespace",
- "description": null,
- "fields": [
- {
- "name": "actualRepositorySizeLimit",
- "description": "Size limit for repositories in the namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "additionalPurchasedStorageSize",
- "description": "Additional storage purchased for the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "complianceFrameworks",
- "description": "Compliance frameworks available to projects in this namespace. Available only when feature flag `ff_custom_compliance_frameworks` is enabled.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "Global ID of a specific compliance framework to return.",
- "type": {
- "kind": "SCALAR",
- "name": "ComplianceManagementFrameworkID",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containsLockedProjects",
- "description": "Includes at least one project where the repository size exceeds the limit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullName",
- "description": "Full name of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "Full path of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "isTemporaryStorageIncreaseEnabled",
- "description": "Status of the temporary storage increase.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsEnabled",
- "description": "Indicates if Large File Storage (LFS) is enabled for namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageSettings",
- "description": "The package settings for the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageSettings",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projects",
- "description": "Projects within this namespace.",
- "args": [
- {
- "name": "includeSubgroups",
- "description": "Include also subgroup projects.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "search",
- "description": "Search project with most similar names or paths.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "null"
- },
- {
- "name": "sort",
- "description": "Sort projects by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "NamespaceProjectSort",
- "ofType": null
- },
- "defaultValue": "null"
- },
- {
- "name": "hasVulnerabilities",
- "description": "Returns only the projects which have vulnerabilities.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositorySizeExcessProjectCount",
- "description": "Number of projects in the root namespace where the repository size exceeds the limit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requestAccessEnabled",
- "description": "Indicates if users can request access to namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rootStorageStatistics",
- "description": "Aggregated storage statistics of the namespace. Only available for root namespaces.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RootStorageStatistics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "storageSizeLimit",
- "description": "Total storage limit of the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "temporaryStorageIncreaseEndsOn",
- "description": "Date until the temporary storage increase is active.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalRepositorySize",
- "description": "Total repository size of all projects in the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "totalRepositorySizeExcess",
- "description": "Total excess repository size of all projects in the root namespace in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "visibility",
- "description": "Visibility of the namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NamespaceConnection",
- "description": "The connection type for Namespace.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NamespaceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NamespaceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "NamespaceID",
- "description": "Identifier of Namespace.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "NamespaceIncreaseStorageTemporarilyInput",
- "description": "Autogenerated input type of NamespaceIncreaseStorageTemporarily",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the namespace to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NamespaceID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NamespaceIncreaseStorageTemporarilyPayload",
- "description": "Autogenerated return type of NamespaceIncreaseStorageTemporarily",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "namespace",
- "description": "The namespace after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "NamespaceProjectSort",
- "description": "Values for sorting projects",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SIMILARITY",
- "description": "Most similar to the search query",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STORAGE",
- "description": "Sort by storage size",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "NegatedBoardIssueInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "labelName",
- "description": "Filter by label name.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Filter by milestone title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Filter by assignee username.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter by author username.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "releaseTag",
- "description": "Filter by release tag.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "myReactionEmoji",
- "description": "Filter by reaction emoji.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "Filter by epic ID. Incompatible with epicWildcardId.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationTitle",
- "description": "Filter by iteration title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "Filter by weight.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Note",
- "description": null,
- "fields": [
- {
- "name": "author",
- "description": "User who wrote this note.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "bodyHtml",
- "description": "The GitLab Flavored Markdown rendering of `note`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confidential",
- "description": "Indicates if this note is confidential.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of the note creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussion",
- "description": "The discussion this note is a part of.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Discussion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the note.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "position",
- "description": "The position of this note on a diff.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DiffPosition",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project associated with the note.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvable",
- "description": "Indicates if the object can be resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolved",
- "description": "Indicates if the object is resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedAt",
- "description": "Timestamp of when the object was resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedBy",
- "description": "User who resolved the object.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "system",
- "description": "Indicates whether this note was created by the system or by a user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "systemNoteIconName",
- "description": "Name of the icon corresponding to a system note.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of the note's last activity.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "URL to view this Note in the Web UI.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NotePermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "ResolvableInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "description": "The connection type for Note.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NoteEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "NoteID",
- "description": "Identifier of Note.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "NotePermissions",
- "description": null,
- "fields": [
- {
- "name": "adminNote",
- "description": "Indicates the user can perform `admin_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmoji",
- "description": "Indicates the user can perform `award_emoji` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": "Indicates the user can perform `create_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readNote",
- "description": "Indicates the user can perform `read_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositionNote",
- "description": "Indicates the user can perform `reposition_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolveNote",
- "description": "Indicates the user can perform `resolve_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "description": null,
- "fields": [
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "BoardEpic",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Design",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "EpicIssue",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- }
- ]
- },
- {
- "kind": "SCALAR",
- "name": "NoteableID",
- "description": "Identifier of Noteable.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallParticipantType",
- "description": "The rotation participant and color palette",
- "fields": [
- {
- "name": "colorPalette",
- "description": "The color palette to assign to the on-call user. For example \"blue\".",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "colorWeight",
- "description": "The color weight to assign to for the on-call user, for example \"500\". Max 4 chars. For easy identification of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the on-call participant.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "IncidentManagementOncallParticipantID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "The user who is participating.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallParticipantTypeConnection",
- "description": "The connection type for OncallParticipantType.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "OncallParticipantTypeEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "OncallParticipantType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallParticipantTypeEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "OncallParticipantType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationCreateInput",
- "description": "Autogenerated input type of OncallRotationCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to create the on-call schedule in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "scheduleIid",
- "description": "The IID of the on-call schedule to create the on-call rotation in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the on-call rotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "startsAt",
- "description": "The start date and time of the on-call rotation, in the timezone of the on-call schedule.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationDateInputType",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "rotationLength",
- "description": "The rotation length of the on-call rotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationLengthInputType",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "participants",
- "description": "The usernames of users participating in the on-call rotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "OncallUserInputType",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallRotationCreatePayload",
- "description": "Autogenerated return type of OncallRotationCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallRotation",
- "description": "The on-call rotation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationDateInputType",
- "description": "Date input type for on-call rotation",
- "fields": null,
- "inputFields": [
- {
- "name": "date",
- "description": "The date component of the date in YYYY-MM-DD format.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "time",
- "description": "The time component of the date in 24hr HH:MM format.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationDestroyInput",
- "description": "Autogenerated input type of OncallRotationDestroy",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to remove the on-call schedule from.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "scheduleIid",
- "description": "The IID of the on-call schedule to the on-call rotation belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "The ID of the on-call rotation to remove.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "IncidentManagementOncallRotationID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallRotationDestroyPayload",
- "description": "Autogenerated return type of OncallRotationDestroy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallRotation",
- "description": "The on-call rotation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallRotation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallRotationLengthInputType",
- "description": "The rotation length of the on-call rotation",
- "fields": null,
- "inputFields": [
- {
- "name": "length",
- "description": "The rotation length of the on-call rotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "unit",
- "description": "The unit of the rotation length of the on-call rotation.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "OncallRotationUnitEnum",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "OncallRotationUnitEnum",
- "description": "Rotation length unit of an on-call rotation",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "HOURS",
- "description": "Hours",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DAYS",
- "description": "Days",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEEKS",
- "description": "Weeks",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleCreateInput",
- "description": "Autogenerated input type of OncallScheduleCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to create the on-call schedule in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the on-call schedule.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the on-call schedule.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timezone",
- "description": "The timezone of the on-call schedule.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallScheduleCreatePayload",
- "description": "Autogenerated return type of OncallScheduleCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallSchedule",
- "description": "The on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleDestroyInput",
- "description": "Autogenerated input type of OncallScheduleDestroy",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to remove the on-call schedule from.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The on-call schedule internal ID to remove.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallScheduleDestroyPayload",
- "description": "Autogenerated return type of OncallScheduleDestroy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallSchedule",
- "description": "The on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallScheduleUpdateInput",
- "description": "Autogenerated input type of OncallScheduleUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to update the on-call schedule in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The on-call schedule internal ID to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The name of the on-call schedule.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the on-call schedule.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timezone",
- "description": "The timezone of the on-call schedule.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "OncallScheduleUpdatePayload",
- "description": "Autogenerated return type of OncallScheduleUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "oncallSchedule",
- "description": "The on-call schedule.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallSchedule",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "OncallUserInputType",
- "description": "The rotation user and color palette",
- "fields": null,
- "inputFields": [
- {
- "name": "username",
- "description": "The username of the user to participate in the on-call rotation, such as `user_one`.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "colorPalette",
- "description": "A value of DataVisualizationColorEnum. The color from the palette to assign to the on-call user.",
- "type": {
- "kind": "ENUM",
- "name": "DataVisualizationColorEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "colorWeight",
- "description": "A value of DataVisualizationWeightEnum. The color weight to assign to for the on-call user.",
- "type": {
- "kind": "ENUM",
- "name": "DataVisualizationWeightEnum",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Package",
- "description": "Represents a package in the Package Registry",
- "fields": [
- {
- "name": "createdAt",
- "description": "Date of creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the package.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "PackagesPackageID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metadata",
- "description": "Package metadata.",
- "args": [
-
- ],
- "type": {
- "kind": "UNION",
- "name": "PackageMetadata",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the package.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageType",
- "description": "Package type.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "PackageTypeEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelines",
- "description": "Pipelines that built the package.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project where the package is stored.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tags",
- "description": "Package tags.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageTagConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Date of most recent update.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "Version string.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "versions",
- "description": "The other versions of the package.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageWithoutVersionsConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageComposerJsonType",
- "description": "Represents a composer JSON file",
- "fields": [
- {
- "name": "license",
- "description": "The license set in the Composer JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The name set in the Composer JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "The type set in the Composer JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "The version set in the Composer JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageConnection",
- "description": "The connection type for Package.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Package",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Package",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageFileRegistry",
- "description": "Represents the Geo sync and verification state of a package file",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp when the PackageFileRegistry was created",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the PackageFileRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncFailure",
- "description": "Error message during sync of the PackageFileRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncedAt",
- "description": "Timestamp of the most recent successful sync of the PackageFileRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageFileId",
- "description": "ID of the PackageFile.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryAt",
- "description": "Timestamp after which the PackageFileRegistry should be resynced",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryCount",
- "description": "Number of consecutive failed sync attempts of the PackageFileRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "Sync state of the PackageFileRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "RegistryState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageFileRegistryConnection",
- "description": "The connection type for PackageFileRegistry.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageFileRegistryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageFileRegistry",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageFileRegistryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageFileRegistry",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "UNION",
- "name": "PackageMetadata",
- "description": "Represents metadata associated with a Package",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "ComposerMetadata",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "PackageSettings",
- "description": "Namespace-level Package Registry settings",
- "fields": [
- {
- "name": "mavenDuplicateExceptionRegex",
- "description": "When maven_duplicates_allowed is false, you can publish duplicate packages with names that match this regex. Otherwise, this setting has no effect.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mavenDuplicatesAllowed",
- "description": "Indicates whether duplicate Maven packages are allowed for this namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageTag",
- "description": "Represents a package tag",
- "fields": [
- {
- "name": "createdAt",
- "description": "The created date.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "The ID of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "The name of the tag.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "The updated date.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageTagConnection",
- "description": "The connection type for PackageTag.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageTagEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageTag",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageTagEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageTag",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "PackageTypeEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "MAVEN",
- "description": "Packages from the Maven package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NPM",
- "description": "Packages from the npm package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONAN",
- "description": "Packages from the Conan package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NUGET",
- "description": "Packages from the Nuget package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PYPI",
- "description": "Packages from the PyPI package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COMPOSER",
- "description": "Packages from the Composer package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GENERIC",
- "description": "Packages from the Generic package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GOLANG",
- "description": "Packages from the Golang package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEBIAN",
- "description": "Packages from the Debian package manager",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RUBYGEMS",
- "description": "Packages from the Rubygems package manager",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageWithoutVersions",
- "description": "Represents a version of a package in the Package Registry",
- "fields": [
- {
- "name": "createdAt",
- "description": "Date of creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the package.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "PackagesPackageID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metadata",
- "description": "Package metadata.",
- "args": [
-
- ],
- "type": {
- "kind": "UNION",
- "name": "PackageMetadata",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the package.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageType",
- "description": "Package type.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "PackageTypeEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelines",
- "description": "Pipelines that built the package.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project where the package is stored.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tags",
- "description": "Package tags.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageTagConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Date of most recent update.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "Version string.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageWithoutVersionsConnection",
- "description": "The connection type for PackageWithoutVersions.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageWithoutVersionsEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PackageWithoutVersions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PackageWithoutVersionsEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageWithoutVersions",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "PackagesPackageID",
- "description": "Identifier of Packages::Package.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PageInfo",
- "description": "Information about pagination in a connection.",
- "fields": [
- {
- "name": "endCursor",
- "description": "When paginating forwards, the cursor to continue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasNextPage",
- "description": "When paginating forwards, are there more items?",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasPreviousPage",
- "description": "When paginating backwards, are there more items?",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startCursor",
- "description": "When paginating backwards, the cursor to continue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Pipeline",
- "description": null,
- "fields": [
- {
- "name": "active",
- "description": "Indicates if the pipeline is active.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "beforeSha",
- "description": "Base SHA of the source branch.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "cancelable",
- "description": "Specifies if a pipeline can be canceled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "committedAt",
- "description": "Timestamp of the pipeline's commit.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "configSource",
- "description": "Configuration source of the pipeline (UNKNOWN_SOURCE, REPOSITORY_SOURCE, AUTO_DEVOPS_SOURCE, WEBIDE_SOURCE, REMOTE_SOURCE, EXTERNAL_PROJECT_SOURCE, BRIDGE_SOURCE, PARAMETER_SOURCE, COMPLIANCE_SOURCE)",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "PipelineConfigSourceEnum",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "coverage",
- "description": "Coverage percentage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of the pipeline's creation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detailedStatus",
- "description": "Detailed status of the pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DetailedStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downstream",
- "description": "Pipelines this pipeline will trigger.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "duration",
- "description": "Duration of the pipeline in seconds.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "finishedAt",
- "description": "Timestamp of the pipeline's completion.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jobs",
- "description": "Jobs belonging to the pipeline.",
- "args": [
- {
- "name": "securityReportTypes",
- "description": "Filter jobs by the type of security report they produce.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SecurityReportTypeEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJobConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Relative path to the pipeline's page.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project the pipeline belongs to.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryable",
- "description": "Specifies if a pipeline can be retried.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "securityReportSummary",
- "description": "Vulnerability and scanned resource counts for each security scanner of the pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummary",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "SHA of the pipeline's commit.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sourceJob",
- "description": "Job where pipeline was triggered from.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stages",
- "description": "Stages of the pipeline.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiStageConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startedAt",
- "description": "Timestamp when the pipeline was started.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the pipeline (CREATED, WAITING_FOR_RESOURCE, PREPARING, PENDING, RUNNING, FAILED, SUCCESS, CANCELED, SKIPPED, MANUAL, SCHEDULED)",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "PipelineStatusEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of the pipeline's last activity.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upstream",
- "description": "Pipeline that triggered the pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "Pipeline user.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PipelinePermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "warnings",
- "description": "Indicates if a pipeline has warnings.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineAnalytics",
- "description": null,
- "fields": [
- {
- "name": "monthPipelinesLabels",
- "description": "Labels for the monthly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "monthPipelinesSuccessful",
- "description": "Total monthly successful pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "monthPipelinesTotals",
- "description": "Total monthly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineTimesLabels",
- "description": "Pipeline times labels.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineTimesValues",
- "description": "Pipeline times.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weekPipelinesLabels",
- "description": "Labels for the weekly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weekPipelinesSuccessful",
- "description": "Total weekly successful pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weekPipelinesTotals",
- "description": "Total weekly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "yearPipelinesLabels",
- "description": "Labels for the yearly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "yearPipelinesSuccessful",
- "description": "Total yearly successful pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "yearPipelinesTotals",
- "description": "Total yearly pipeline count.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PipelineCancelInput",
- "description": "Autogenerated input type of PipelineCancel",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the pipeline to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "CiPipelineID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineCancelPayload",
- "description": "Autogenerated return type of PipelineCancel",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "PipelineConfigSourceEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "UNKNOWN_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REPOSITORY_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "AUTO_DEVOPS_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEBIDE_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REMOTE_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EXTERNAL_PROJECT_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BRIDGE_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PARAMETER_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COMPLIANCE_SOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "description": "The connection type for Pipeline.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PipelineEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PipelineDestroyInput",
- "description": "Autogenerated input type of PipelineDestroy",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the pipeline to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "CiPipelineID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineDestroyPayload",
- "description": "Autogenerated return type of PipelineDestroy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelinePermissions",
- "description": null,
- "fields": [
- {
- "name": "adminPipeline",
- "description": "Indicates the user can perform `admin_pipeline` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyPipeline",
- "description": "Indicates the user can perform `destroy_pipeline` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatePipeline",
- "description": "Indicates the user can perform `update_pipeline` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PipelineRetryInput",
- "description": "Autogenerated input type of PipelineRetry",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the pipeline to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "CiPipelineID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PipelineRetryPayload",
- "description": "Autogenerated return type of PipelineRetry",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipeline",
- "description": "The pipeline after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "PipelineStatusEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CREATED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WAITING_FOR_RESOURCE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PREPARING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PENDING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RUNNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FAILED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SUCCESS",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CANCELED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SKIPPED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MANUAL",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SCHEDULED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Project",
- "description": null,
- "fields": [
- {
- "name": "actualRepositorySizeLimit",
- "description": "Size limit for the repository in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertManagementAlert",
- "description": "A single Alert Management alert of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the alert. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "statuses",
- "description": "Alerts with the specified statues. For example, [TRIGGERED].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementStatus",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort alerts by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "AlertManagementAlertSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "domain",
- "description": "Filter query for given domain.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementDomainFilter",
- "ofType": null
- }
- },
- "defaultValue": "operations"
- },
- {
- "name": "search",
- "description": "Search query for title, description, service, or monitoring_tool.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertManagementAlertStatusCounts",
- "description": "Counts of alerts by status for the project.",
- "args": [
- {
- "name": "search",
- "description": "Search query for title, description, service, or monitoring_tool.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlertStatusCountsType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertManagementAlerts",
- "description": "Alert Management alerts of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the alert. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "statuses",
- "description": "Alerts with the specified statues. For example, [TRIGGERED].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementStatus",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort alerts by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "AlertManagementAlertSort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "domain",
- "description": "Filter query for given domain.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementDomainFilter",
- "ofType": null
- }
- },
- "defaultValue": "operations"
- },
- {
- "name": "search",
- "description": "Search query for title, description, service, or monitoring_tool.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlertConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertManagementIntegrations",
- "description": "Integrations which can receive alerts for the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementIntegrationConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "alertManagementPayloadFields",
- "description": "Extract alert fields from payload for custom mapping.",
- "args": [
- {
- "name": "payloadExample",
- "description": "Sample payload for extracting alert fields for custom mappings.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "AlertManagementPayloadAlertField",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "allowMergeOnSkippedPipeline",
- "description": "If `only_allow_merge_if_pipeline_succeeds` is true, indicates if merge requests of the project can also be merged with skipped jobs.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "apiFuzzingCiConfiguration",
- "description": "API fuzzing configuration for the project. Available only when feature flag `api_fuzzing_configuration_ui` is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ApiFuzzingCiConfiguration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "archived",
- "description": "Indicates the archived status of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "autocloseReferencedIssues",
- "description": "Indicates if issues referenced by merge requests and commits within the default branch are closed automatically.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "avatarUrl",
- "description": "URL to avatar image file of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "board",
- "description": "A single board of the project.",
- "args": [
- {
- "name": "id",
- "description": "The board's ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "boards",
- "description": "Boards of the project.",
- "args": [
- {
- "name": "id",
- "description": "Find a board by its ID.",
- "type": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ciCdSettings",
- "description": "CI/CD settings for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectCiCdSetting",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgent",
- "description": "Find a single cluster agent by name.",
- "args": [
- {
- "name": "name",
- "description": "Name of the cluster agent.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgent",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clusterAgents",
- "description": "Cluster agents associated with the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ClusterAgentConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "codeCoverageSummary",
- "description": "Code coverage summary associated with the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CodeCoverageSummary",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "complianceFrameworks",
- "description": "Compliance frameworks associated with the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFrameworkConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerExpirationPolicy",
- "description": "The container expiration policy of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerExpirationPolicy",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRegistryEnabled",
- "description": "Indicates if the project stores Docker container images in a container registry.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepositories",
- "description": "Container repositories of the project.",
- "args": [
- {
- "name": "name",
- "description": "Filter the container repositories by their name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort container repositories by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "ContainerRepositorySort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepositoriesCount",
- "description": "Number of container repositories in the project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of the project creation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastProfiles",
- "description": "DAST Profiles associated with the project. Always returns no nodes if `dast_saved_scans` is disabled.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastProfileConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastScannerProfiles",
- "description": "The DAST scanner profiles associated with the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastScannerProfileConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfile",
- "description": "DAST Site Profile associated with the project.",
- "args": [
- {
- "name": "id",
- "description": "ID of the site profile.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DastSiteProfileID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfile",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteProfiles",
- "description": "DAST Site Profiles associated with the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteProfileConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dastSiteValidations",
- "description": "DAST Site Validations associated with the project. Always returns no nodes if `security_on_demand_scans_site_validation` is disabled.",
- "args": [
- {
- "name": "normalizedTargetUrls",
- "description": "Normalized URL of the target to be scanned.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DastSiteValidationConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Short description of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "environment",
- "description": "A single environment of the project.",
- "args": [
- {
- "name": "name",
- "description": "Name of the environment.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for environment name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "states",
- "description": "States of environments that should be included in result.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Environment",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "environments",
- "description": "Environments of the project.",
- "args": [
- {
- "name": "name",
- "description": "Name of the environment.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for environment name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "states",
- "description": "States of environments that should be included in result.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "EnvironmentConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "forksCount",
- "description": "Number of times the project has been forked.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fullPath",
- "description": "Full path of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "grafanaIntegration",
- "description": "Grafana integration details for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GrafanaIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpUrlToRepo",
- "description": "URL to connect to the project via HTTPS.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "importStatus",
- "description": "Status of import background job of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "incidentManagementOncallSchedules",
- "description": "Incident Management On-call schedules of the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IncidentManagementOncallScheduleConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "A single issue of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the issue. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of issues. For example, [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Labels applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Milestone applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "Usernames of users assigned to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "ID of a user assigned to the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdBefore",
- "description": "Issues created before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdAfter",
- "description": "Issues created after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedBefore",
- "description": "Issues updated before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedAfter",
- "description": "Issues updated after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedBefore",
- "description": "Issues closed before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedAfter",
- "description": "Issues closed after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for issue title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "types",
- "description": "Filter issues by the given issue types.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Current state of this issue.",
- "type": {
- "kind": "ENUM",
- "name": "IssuableState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort issues by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "IssueSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "iterationId",
- "description": "Iterations applied to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "ID of an epic associated with the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueStatusCounts",
- "description": "Counts of issues by status for the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the issue. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of issues. For example, [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Labels applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Milestone applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "Usernames of users assigned to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "ID of a user assigned to the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdBefore",
- "description": "Issues created before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdAfter",
- "description": "Issues created after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedBefore",
- "description": "Issues updated before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedAfter",
- "description": "Issues updated after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedBefore",
- "description": "Issues closed before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedAfter",
- "description": "Issues closed after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for issue title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "types",
- "description": "Filter issues by the given issue types.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueStatusCountsType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issues",
- "description": "Issues of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the issue. For example, \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of issues. For example, [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelName",
- "description": "Labels applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Milestone applied to this issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of a user assigned to the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsernames",
- "description": "Usernames of users assigned to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "ID of a user assigned to the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdBefore",
- "description": "Issues created before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "createdAfter",
- "description": "Issues created after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedBefore",
- "description": "Issues updated before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "updatedAfter",
- "description": "Issues updated after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedBefore",
- "description": "Issues closed before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "closedAfter",
- "description": "Issues closed after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for issue title or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "types",
- "description": "Filter issues by the given issue types.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "IssueType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Current state of this issue.",
- "type": {
- "kind": "ENUM",
- "name": "IssuableState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort issues by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "IssueSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "iterationId",
- "description": "Iterations applied to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "ID of an epic associated with the issues, \"none\" and \"any\" values are supported.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IssueConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issuesEnabled",
- "description": "Indicates if Issues are enabled for the current user",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iterations",
- "description": "Find iterations.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter iterations by state.",
- "type": {
- "kind": "ENUM",
- "name": "IterationState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Fuzzy search by title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "Global ID of the Iteration to look up.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the Iteration to look up.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeAncestors",
- "description": "Whether to include ancestor iterations. Defaults to true.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "IterationConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraImportStatus",
- "description": "Status of Jira import background job of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jiraImports",
- "description": "Jira imports into the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "JiraImportConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "jobsEnabled",
- "description": "Indicates if CI/CD pipeline jobs are enabled for the current user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "A label available on this project.",
- "args": [
- {
- "name": "title",
- "description": "Title of the label.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Label",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "labels",
- "description": "Labels available on this project.",
- "args": [
- {
- "name": "searchTerm",
- "description": "A search term to find labels with.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeAncestorGroups",
- "description": "Include labels from ancestor groups.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "LabelConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastActivityAt",
- "description": "Timestamp of the project last activity.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsEnabled",
- "description": "Indicates if the project has Large File Storage (LFS) enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "A single merge request of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the merge request, for example `1`.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequests",
- "description": "Merge requests of the project.",
- "args": [
- {
- "name": "iids",
- "description": "Array of IIDs of merge requests, for example `[1, 2]`.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranches",
- "description": "Array of source branch names. All resolved merge requests will have one of these branches as their source.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranches",
- "description": "Array of target branch names. All resolved merge requests will have one of these branches as their target.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "A merge request state. If provided, all resolved merge requests will have this state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Array of label names. All resolved merge requests will have all of these labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "mergedAfter",
- "description": "Merge requests merged after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergedBefore",
- "description": "Merge requests merged before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort merge requests by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "assigneeUsername",
- "description": "Username of the assignee.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "reviewerUsername",
- "description": "Username of the reviewer.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestsEnabled",
- "description": "Indicates if Merge Requests are enabled for the current user",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequestsFfOnlyEnabled",
- "description": "Indicates if no merge commits should be created and all merges should instead be fast-forwarded, which means that merging is only allowed if the branch could be fast-forwarded.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestones",
- "description": "Milestones of the project.",
- "args": [
- {
- "name": "startDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.start.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "List items overlapping a time frame defined by startDate..endDate (if one date is provided, both must be present) Deprecated in 13.5: Use timeframe.end.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "timeframe",
- "description": "List items overlapping the given timeframe.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ids",
- "description": "Array of global milestone IDs, e.g., \"gid://gitlab/Milestone/1\".",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter milestones by state.",
- "type": {
- "kind": "ENUM",
- "name": "MilestoneStateEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "The title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "searchTitle",
- "description": "A search string for the title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "containingDate",
- "description": "A date that the milestone contains.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "includeAncestors",
- "description": "Also return milestones in the project's parent group and its ancestors.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MilestoneConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the project (without namespace).",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nameWithNamespace",
- "description": "Full name of the project with its namespace.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "namespace",
- "description": "Namespace of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "onlyAllowMergeIfAllDiscussionsAreResolved",
- "description": "Indicates if merge requests of the project can only be merged when all the discussions are resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "onlyAllowMergeIfPipelineSucceeds",
- "description": "Indicates if merge requests of the project can only be merged with successful jobs.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openIssuesCount",
- "description": "Number of open issues for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packages",
- "description": "Packages of the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipeline",
- "description": "Build pipeline of the project.",
- "args": [
- {
- "name": "iid",
- "description": "IID of the Pipeline, e.g., \"1\".",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Pipeline",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineAnalytics",
- "description": "Pipeline analytics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineAnalytics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelines",
- "description": "Build pipelines of the project.",
- "args": [
- {
- "name": "status",
- "description": "Filter pipelines by their status.",
- "type": {
- "kind": "ENUM",
- "name": "PipelineStatusEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ref",
- "description": "Filter pipelines by the ref they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sha",
- "description": "Filter pipelines by the sha of the commit they are run for.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PipelineConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "printingMergeRequestLinkEnabled",
- "description": "Indicates if a link to create or view a merge request should display after a push to Git repositories of the project from the command line.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectMembers",
- "description": "Members of the project.",
- "args": [
- {
- "name": "search",
- "description": "Search query.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "relations",
- "description": "Filter members by the given member relations.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "ProjectMemberRelation",
- "ofType": null
- }
- }
- },
- "defaultValue": "[DIRECT, INHERITED]"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MemberInterfaceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "publicJobs",
- "description": "Indicates if there is public access to pipelines and job details of the project, including output logs and artifacts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "release",
- "description": "A single release of the project.",
- "args": [
- {
- "name": "tagName",
- "description": "The name of the tag associated to the release.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releases",
- "description": "Releases of the project.",
- "args": [
- {
- "name": "sort",
- "description": "Sort releases by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "ReleaseSort",
- "ofType": null
- },
- "defaultValue": "RELEASED_AT_DESC"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removeSourceBranchAfterMerge",
- "description": "Indicates if `Delete source branch` option should be enabled by default for all new merge requests of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repository",
- "description": "Git repository of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Repository",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositorySizeExcess",
- "description": "Size of repository that exceeds the limit in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requestAccessEnabled",
- "description": "Indicates if users can request member access to the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requirement",
- "description": "Find a single requirement.",
- "args": [
- {
- "name": "sort",
- "description": "List requirements by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "Sort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter requirements by state.",
- "type": {
- "kind": "ENUM",
- "name": "RequirementState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for requirement title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter requirements by author username.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the requirement, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of requirements, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "lastTestReportState",
- "description": "The state of latest requirement test report.",
- "type": {
- "kind": "ENUM",
- "name": "TestReportState",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Requirement",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requirementStatesCount",
- "description": "Number of requirements for the project by their state.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RequirementStatesCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requirements",
- "description": "Find requirements.",
- "args": [
- {
- "name": "sort",
- "description": "List requirements by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "Sort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter requirements by state.",
- "type": {
- "kind": "ENUM",
- "name": "RequirementState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for requirement title.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Filter requirements by author username.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "IID of the requirement, e.g., \"1\".",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iids",
- "description": "List of IIDs of requirements, e.g., [1, 2].",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "lastTestReportState",
- "description": "The state of latest requirement test report.",
- "type": {
- "kind": "ENUM",
- "name": "TestReportState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RequirementConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sastCiConfiguration",
- "description": "SAST CI configuration for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfiguration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "securityDashboardPath",
- "description": "Path to project's security dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "securityScanners",
- "description": "Information about security analyzers used in the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityScanners",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryDetailedError",
- "description": "Detailed version of a Sentry error on the project.",
- "args": [
- {
- "name": "id",
- "description": "ID of the Sentry issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "GitlabErrorTrackingDetailedErrorID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryDetailedError",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryErrors",
- "description": "Paginated collection of Sentry errors on the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryErrorCollection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "serviceDeskAddress",
- "description": "E-mail address of the service desk.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "serviceDeskEnabled",
- "description": "Indicates if the project has service desk enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "services",
- "description": "Project services.",
- "args": [
- {
- "name": "active",
- "description": "Indicates if the service is active.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "Class name of the service.",
- "type": {
- "kind": "ENUM",
- "name": "ServiceType",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ServiceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sharedRunnersEnabled",
- "description": "Indicates if shared runners are enabled for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippets",
- "description": "Snippets of the project.",
- "args": [
- {
- "name": "ids",
- "description": "Array of global snippet ids, e.g., \"gid://gitlab/ProjectSnippet/1\".",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "visibility",
- "description": "The visibility of the snippet.",
- "type": {
- "kind": "ENUM",
- "name": "VisibilityScopesEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippetsEnabled",
- "description": "Indicates if Snippets are enabled for the current user",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "squashReadOnly",
- "description": "Indicates if `squashReadOnly` is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sshUrlToRepo",
- "description": "URL to connect to the project via SSH.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "starCount",
- "description": "Number of times the project has been starred.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "statistics",
- "description": "Statistics of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectStatistics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "suggestionCommitMessage",
- "description": "The commit message used to apply merge request suggestions.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tagList",
- "description": "List of project topics (not Git tags).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformState",
- "description": "Find a single Terraform state by name.",
- "args": [
- {
- "name": "name",
- "description": "Name of the Terraform state.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformStates",
- "description": "Terraform states associated with the project.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "visibility",
- "description": "Visibility of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilities",
- "description": "Vulnerabilities reported on the project.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by VulnerabilityScanner.externalId.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List vulnerabilities by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilitySort",
- "ofType": null
- },
- "defaultValue": "severity_desc"
- },
- {
- "name": "hasResolution",
- "description": "Returns only the vulnerabilities which have been resolved on default branch.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hasIssues",
- "description": "Returns only the vulnerabilities which have linked issues.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCountByDay",
- "description": "Number of vulnerabilities per day for the project.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "Last day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityScanners",
- "description": "Vulnerability scanners reported on the project vulnerabilities.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitySeveritiesCount",
- "description": "Counts for each vulnerability severity in the project.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by scanner.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitySeveritiesCount",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "wikiEnabled",
- "description": "Indicates if Wikis are enabled for the current user",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectCiCdSetting",
- "description": null,
- "fields": [
- {
- "name": "keepLatestArtifact",
- "description": "Whether to keep the latest builds artifacts.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergePipelinesEnabled",
- "description": "Whether merge pipelines are enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeTrainsEnabled",
- "description": "Whether merge trains are enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project the CI/CD settings belong to.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "description": "The connection type for Project.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "ProjectID",
- "description": "Identifier of Project.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectMember",
- "description": "Represents a Project Membership",
- "fields": [
- {
- "name": "accessLevel",
- "description": "GitLab::Access level.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AccessLevel",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Date and time the membership was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdBy",
- "description": "User that authorized membership.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "expiresAt",
- "description": "Date and time the membership expires.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the member.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project that User is a member of.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Date and time the membership was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "User that is associated with the member object.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "MemberInterface",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectMemberConnection",
- "description": "The connection type for ProjectMember.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectMemberEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectMember",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectMemberEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectMember",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ProjectMemberRelation",
- "description": "Project member relation",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "DIRECT",
- "description": "Direct members",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INHERITED",
- "description": "Inherited members",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DESCENDANTS",
- "description": "Descendants members",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INVITED_GROUPS",
- "description": "Invited Groups members",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectPermissions",
- "description": null,
- "fields": [
- {
- "name": "adminOperations",
- "description": "Indicates the user can perform `admin_operations` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminProject",
- "description": "Indicates the user can perform `admin_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminRemoteMirror",
- "description": "Indicates the user can perform `admin_remote_mirror` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminWiki",
- "description": "Indicates the user can perform `admin_wiki` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "archiveProject",
- "description": "Indicates the user can perform `archive_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "changeNamespace",
- "description": "Indicates the user can perform `change_namespace` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "changeVisibilityLevel",
- "description": "Indicates the user can perform `change_visibility_level` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createDeployment",
- "description": "Indicates the user can perform `create_deployment` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createDesign",
- "description": "Indicates the user can perform `create_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createIssue",
- "description": "Indicates the user can perform `create_issue` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createLabel",
- "description": "Indicates the user can perform `create_label` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createMergeRequestFrom",
- "description": "Indicates the user can perform `create_merge_request_from` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createMergeRequestIn",
- "description": "Indicates the user can perform `create_merge_request_in` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createPages",
- "description": "Indicates the user can perform `create_pages` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createPipeline",
- "description": "Indicates the user can perform `create_pipeline` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createPipelineSchedule",
- "description": "Indicates the user can perform `create_pipeline_schedule` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createSnippet",
- "description": "Indicates the user can perform `create_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createWiki",
- "description": "Indicates the user can perform `create_wiki` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyDesign",
- "description": "Indicates the user can perform `destroy_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyPages",
- "description": "Indicates the user can perform `destroy_pages` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyWiki",
- "description": "Indicates the user can perform `destroy_wiki` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downloadCode",
- "description": "Indicates the user can perform `download_code` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downloadWikiCode",
- "description": "Indicates the user can perform `download_wiki_code` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "forkProject",
- "description": "Indicates the user can perform `fork_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pushCode",
- "description": "Indicates the user can perform `push_code` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pushToDeleteProtectedBranch",
- "description": "Indicates the user can perform `push_to_delete_protected_branch` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readCommitStatus",
- "description": "Indicates the user can perform `read_commit_status` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readCycleAnalytics",
- "description": "Indicates the user can perform `read_cycle_analytics` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readDesign",
- "description": "Indicates the user can perform `read_design` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readMergeRequest",
- "description": "Indicates the user can perform `read_merge_request` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readPagesContent",
- "description": "Indicates the user can perform `read_pages_content` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readProject",
- "description": "Indicates the user can perform `read_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readProjectMember",
- "description": "Indicates the user can perform `read_project_member` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readWiki",
- "description": "Indicates the user can perform `read_wiki` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removeForkProject",
- "description": "Indicates the user can perform `remove_fork_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removePages",
- "description": "Indicates the user can perform `remove_pages` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "removeProject",
- "description": "Indicates the user can perform `remove_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "renameProject",
- "description": "Indicates the user can perform `rename_project` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requestAccess",
- "description": "Indicates the user can perform `request_access` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatePages",
- "description": "Indicates the user can perform `update_pages` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateWiki",
- "description": "Indicates the user can perform `update_wiki` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "uploadFile",
- "description": "Indicates the user can perform `upload_file` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ProjectStatistics",
- "description": null,
- "fields": [
- {
- "name": "buildArtifactsSize",
- "description": "Build artifacts size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commitCount",
- "description": "Commit count of the project.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsObjectsSize",
- "description": "Large File Storage (LFS) object size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packagesSize",
- "description": "Packages size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositorySize",
- "description": "Repository size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippetsSize",
- "description": "Snippets size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "storageSize",
- "description": "Storage size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "uploadsSize",
- "description": "Uploads size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "wikiSize",
- "description": "Wiki size of the project in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PrometheusAlert",
- "description": "The alert condition for Prometheus",
- "fields": [
- {
- "name": "humanizedText",
- "description": "The human-readable text of the alert condition.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the alert condition.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationCreateInput",
- "description": "Autogenerated input type of PrometheusIntegrationCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project to create the integration in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "active",
- "description": "Whether the integration is receiving alerts.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "apiUrl",
- "description": "Endpoint at which prometheus can be queried.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationCreatePayload",
- "description": "Autogenerated return type of PrometheusIntegrationCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The newly created integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementPrometheusIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationResetTokenInput",
- "description": "Autogenerated input type of PrometheusIntegrationResetToken",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the integration to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "PrometheusServiceID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationResetTokenPayload",
- "description": "Autogenerated return type of PrometheusIntegrationResetToken",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The newly created integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementPrometheusIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PrometheusIntegrationUpdateInput",
- "description": "Autogenerated input type of PrometheusIntegrationUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The ID of the integration to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "PrometheusServiceID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "active",
- "description": "Whether the integration is receiving alerts.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "apiUrl",
- "description": "Endpoint at which prometheus can be queried.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PrometheusIntegrationUpdatePayload",
- "description": "Autogenerated return type of PrometheusIntegrationUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "integration",
- "description": "The newly created integration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementPrometheusIntegration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "PrometheusServiceID",
- "description": "Identifier of PrometheusService.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "PromoteToEpicInput",
- "description": "Autogenerated input type of PromoteToEpic",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "The group the promoted epic will belong to.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "PromoteToEpicPayload",
- "description": "Autogenerated return type of PromoteToEpic",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "The epic after issue promotion.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Query",
- "description": null,
- "fields": [
- {
- "name": "ciApplicationSettings",
- "description": "CI related settings that apply to the entire instance.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiApplicationSettings",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ciConfig",
- "description": "Get linted and processed contents of a CI config. Should not be requested more than once per request.",
- "args": [
- {
- "name": "projectPath",
- "description": "The project of the CI config.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "content",
- "description": "Contents of '.gitlab-ci.yml'.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "dryRun",
- "description": "Run pipeline creation simulation, or only do static check.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiConfig",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerRepository",
- "description": "Find a container repository.",
- "args": [
- {
- "name": "id",
- "description": "The global ID of the container repository.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ContainerRepositoryID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerRepositoryDetails",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "currentUser",
- "description": "Get information about current user.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "designManagement",
- "description": "Fields related to design management.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DesignManagement",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "devopsAdoptionSegments",
- "description": "Get configured DevOps adoption segments on the instance.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "DevopsAdoptionSegmentConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "echo",
- "description": "Text to echo back.",
- "args": [
- {
- "name": "text",
- "description": "Text to echo back.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "geoNode",
- "description": "Find a Geo node.",
- "args": [
- {
- "name": "name",
- "description": "The name of the Geo node. Defaults to the current Geo node name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GeoNode",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Find a group.",
- "args": [
- {
- "name": "fullPath",
- "description": "The full path of the project, group or namespace, e.g., \"gitlab-org/gitlab-foss\".",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "instanceSecurityDashboard",
- "description": "Fields related to Instance Security Dashboard.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "InstanceSecurityDashboard",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "instanceStatisticsMeasurements",
- "description": "Get statistics on the instance.",
- "args": [
- {
- "name": "identifier",
- "description": "The type of measurement/statistics to retrieve.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "MeasurementIdentifier",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "recordedAfter",
- "description": "Measurement recorded after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "recordedBefore",
- "description": "Measurement recorded before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "InstanceStatisticsMeasurementConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "Find an issue.",
- "args": [
- {
- "name": "id",
- "description": "The global ID of the Issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "IssueID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "Find an iteration.",
- "args": [
- {
- "name": "id",
- "description": "Find an iteration by its ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "IterationID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "metadata",
- "description": "Metadata about GitLab.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Metadata",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestone",
- "description": "Find a milestone.",
- "args": [
- {
- "name": "id",
- "description": "Find a milestone by its ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "namespace",
- "description": "Find a namespace.",
- "args": [
- {
- "name": "fullPath",
- "description": "The full path of the project, group or namespace, e.g., \"gitlab-org/gitlab-foss\".",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Namespace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "package",
- "description": "Find a package.",
- "args": [
- {
- "name": "id",
- "description": "The global ID of the package.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "PackagesPackageID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Package",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Find a project.",
- "args": [
- {
- "name": "fullPath",
- "description": "The full path of the project, group or namespace, e.g., \"gitlab-org/gitlab-foss\".",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projects",
- "description": "Find projects visible to the current user.",
- "args": [
- {
- "name": "membership",
- "description": "Limit projects that the current user is a member of.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "search",
- "description": "Search query for project name, path, or description.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "ids",
- "description": "Filter projects by IDs.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "searchNamespaces",
- "description": "Include namespace in project search.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort order of results.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "runnerPlatforms",
- "description": "Supported runner platforms.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunnerPlatformConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "runnerSetup",
- "description": "Get runner setup instructions.",
- "args": [
- {
- "name": "platform",
- "description": "Platform to generate the instructions for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "architecture",
- "description": "Architecture to generate the instructions for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "Project to register the runner for.",
- "type": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "groupId",
- "description": "Group to register the runner for.",
- "type": {
- "kind": "SCALAR",
- "name": "GroupID",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunnerSetup",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippets",
- "description": "Find Snippets visible to the current user.",
- "args": [
- {
- "name": "ids",
- "description": "Array of global snippet ids, e.g., \"gid://gitlab/ProjectSnippet/1\".",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "visibility",
- "description": "The visibility of the snippet.",
- "type": {
- "kind": "ENUM",
- "name": "VisibilityScopesEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorId",
- "description": "The ID of an author.",
- "type": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The ID of a project.",
- "type": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "The type of snippet.",
- "type": {
- "kind": "ENUM",
- "name": "TypeEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "explore",
- "description": "Explore personal snippets.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "Find a user.",
- "args": [
- {
- "name": "id",
- "description": "ID of the User.",
- "type": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "username",
- "description": "Username of the User.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "users",
- "description": "Find users.",
- "args": [
- {
- "name": "ids",
- "description": "List of user Global IDs.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "usernames",
- "description": "List of usernames.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort users by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "Sort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "search",
- "description": "Query to search users by name, username, or primary email.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "admins",
- "description": "Return only admin users.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilities",
- "description": "Vulnerabilities reported on projects on the current user's instance security dashboard.",
- "args": [
- {
- "name": "projectId",
- "description": "Filter vulnerabilities by project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "reportType",
- "description": "Filter vulnerabilities by report type.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "severity",
- "description": "Filter vulnerabilities by severity.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "Filter vulnerabilities by state.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanner",
- "description": "Filter vulnerabilities by VulnerabilityScanner.externalId.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "List vulnerabilities by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilitySort",
- "ofType": null
- },
- "defaultValue": "severity_desc"
- },
- {
- "name": "hasResolution",
- "description": "Returns only the vulnerabilities which have been resolved on default branch.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hasIssues",
- "description": "Returns only the vulnerabilities which have linked issues.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCountByDay",
- "description": "Number of vulnerabilities per day for the projects on the current user's instance security dashboard.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "Last day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCountByDayAndSeverity",
- "description": "Number of vulnerabilities per severity level, per day, for the projects on the current user's instance security dashboard. Deprecated in 13.3: Use `vulnerabilitiesCountByDay`.",
- "args": [
- {
- "name": "startDate",
- "description": "First day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "endDate",
- "description": "Last day for which to fetch vulnerability history.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverityConnection",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use `vulnerabilitiesCountByDay`. Deprecated in 13.3."
- },
- {
- "name": "vulnerability",
- "description": "Find a vulnerability.",
- "args": [
- {
- "name": "id",
- "description": "The Global ID of the Vulnerability.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "RegistryState",
- "description": "State of a Geo registry",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "PENDING",
- "description": "Registry waiting to be synced",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "STARTED",
- "description": "Registry currently syncing",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SYNCED",
- "description": "Registry that is synced",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FAILED",
- "description": "Registry that failed to sync",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Release",
- "description": "Represents a release",
- "fields": [
- {
- "name": "assets",
- "description": "Assets of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseAssets",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "User that created the release.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "commit",
- "description": "The commit associated with the release.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the release was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description (also known as \"release notes\") of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "evidences",
- "description": "Evidence for the release.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseEvidenceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "links",
- "description": "Links of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseLinks",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "milestones",
- "description": "Milestones associated to the release.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MilestoneConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "releasedAt",
- "description": "Timestamp of when the release was released.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tagName",
- "description": "Name of the tag associated with the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tagPath",
- "description": "Relative web path to the tag associated with the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "upcomingRelease",
- "description": "Indicates the release is an upcoming release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseAssetLink",
- "description": "Represents an asset link associated with a release",
- "fields": [
- {
- "name": "directAssetUrl",
- "description": "Direct asset URL of the link.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "external",
- "description": "Indicates the link points to an external resource.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "linkType",
- "description": "Type of the link: `other`, `runbook`, `image`, `package`; defaults to `other`.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "ReleaseAssetLinkType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the link.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "URL of the link.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseAssetLinkConnection",
- "description": "The connection type for ReleaseAssetLink.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseAssetLinkEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseAssetLink",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseAssetLinkEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseAssetLink",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseAssetLinkInput",
- "description": "Fields that are available when modifying a release asset link",
- "fields": null,
- "inputFields": [
- {
- "name": "name",
- "description": "Name of the asset link.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "url",
- "description": "URL of the asset link.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "directAssetPath",
- "description": "Relative path for a direct asset link.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "linkType",
- "description": "The type of the asset link.",
- "type": {
- "kind": "ENUM",
- "name": "ReleaseAssetLinkType",
- "ofType": null
- },
- "defaultValue": "OTHER"
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ReleaseAssetLinkType",
- "description": "Type of the link: `other`, `runbook`, `image`, `package`",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "OTHER",
- "description": "Other link type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RUNBOOK",
- "description": "Runbook link type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PACKAGE",
- "description": "Package link type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "IMAGE",
- "description": "Image link type",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseAssets",
- "description": "A container for all assets associated with a release",
- "fields": [
- {
- "name": "count",
- "description": "Number of assets of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "links",
- "description": "Asset links of the release.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseAssetLinkConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sources",
- "description": "Sources of the release.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseSourceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseAssetsInput",
- "description": "Fields that are available when modifying release assets",
- "fields": null,
- "inputFields": [
- {
- "name": "links",
- "description": "A list of asset links to associate to the release.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseAssetLinkInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseConnection",
- "description": "The connection type for Release.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseCreateInput",
- "description": "Autogenerated input type of ReleaseCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project the release is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "tagName",
- "description": "Name of the tag to associate with the release.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "ref",
- "description": "The commit SHA or branch name to use if creating a new tag.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "Name of the release.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description (also known as \"release notes\") of the release.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "releasedAt",
- "description": "The date when the release will be/was ready. Defaults to the current time.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestones",
- "description": "The title of each milestone the release is associated with. GitLab Premium customers can specify group milestones.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "assets",
- "description": "Assets associated to the release.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseAssetsInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseCreatePayload",
- "description": "Autogenerated return type of ReleaseCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "release",
- "description": "The release after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseDeleteInput",
- "description": "Autogenerated input type of ReleaseDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project the release is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "tagName",
- "description": "Name of the tag associated with the release to delete.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseDeletePayload",
- "description": "Autogenerated return type of ReleaseDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "release",
- "description": "The deleted release.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseEvidence",
- "description": "Evidence for a release",
- "fields": [
- {
- "name": "collectedAt",
- "description": "Timestamp when the evidence was collected.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "filepath",
- "description": "URL from where the evidence can be downloaded.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the evidence.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "SHA1 ID of the evidence hash.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseEvidenceConnection",
- "description": "The connection type for ReleaseEvidence.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseEvidenceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseEvidence",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseEvidenceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseEvidence",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseLinks",
- "description": null,
- "fields": [
- {
- "name": "closedIssuesUrl",
- "description": "HTTP URL of the issues page, filtered by this release and `state=closed`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "closedMergeRequestsUrl",
- "description": "HTTP URL of the merge request page , filtered by this release and `state=closed`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "editUrl",
- "description": "HTTP URL of the release's edit page.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergedMergeRequestsUrl",
- "description": "HTTP URL of the merge request page , filtered by this release and `state=merged`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openedIssuesUrl",
- "description": "HTTP URL of the issues page, filtered by this release and `state=open`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "openedMergeRequestsUrl",
- "description": "HTTP URL of the merge request page, filtered by this release and `state=open`.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "selfUrl",
- "description": "HTTP URL of the release.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ReleaseSort",
- "description": "Values for sorting releases",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RELEASED_AT_DESC",
- "description": "Released at by descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RELEASED_AT_ASC",
- "description": "Released at by ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseSource",
- "description": "Represents the source code attached to a release in a particular format",
- "fields": [
- {
- "name": "format",
- "description": "Format of the source.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "Download URL of the source.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseSourceConnection",
- "description": "The connection type for ReleaseSource.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseSourceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ReleaseSource",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseSourceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ReleaseSource",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ReleaseUpdateInput",
- "description": "Autogenerated input type of ReleaseUpdate",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "Full path of the project the release is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "tagName",
- "description": "Name of the tag associated with the release.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "Name of the release.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description (release notes) of the release.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "releasedAt",
- "description": "The release date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestones",
- "description": "The title of each milestone the release is associated with. GitLab Premium customers can specify group milestones.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ReleaseUpdatePayload",
- "description": "Autogenerated return type of ReleaseUpdate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "release",
- "description": "The release after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Release",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "RemoveAwardEmojiInput",
- "description": "Autogenerated input type of RemoveAwardEmoji",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RemoveAwardEmojiPayload",
- "description": "Autogenerated return type of RemoveAwardEmoji",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "RemoveProjectFromSecurityDashboardInput",
- "description": "Autogenerated input type of RemoveProjectFromSecurityDashboard",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the project to remove from the Instance Security Dashboard.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RemoveProjectFromSecurityDashboardPayload",
- "description": "Autogenerated return type of RemoveProjectFromSecurityDashboard",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "RepositionImageDiffNoteInput",
- "description": "Autogenerated input type of RepositionImageDiffNote",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the DiffNote to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "DiffNoteID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "position",
- "description": "The position of this note on a diff.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateDiffImagePositionInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RepositionImageDiffNotePayload",
- "description": "Autogenerated return type of RepositionImageDiffNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Repository",
- "description": null,
- "fields": [
- {
- "name": "empty",
- "description": "Indicates repository has no visible content.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "exists",
- "description": "Indicates a corresponding Git repository exists on disk.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rootRef",
- "description": "Default branch of the repository.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tree",
- "description": "Tree of the repository.",
- "args": [
- {
- "name": "path",
- "description": "The path to get the tree for. Default value is the root of the repository.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"\""
- },
- {
- "name": "ref",
- "description": "The commit ref to get the tree for. Default value is HEAD.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"head\""
- },
- {
- "name": "recursive",
- "description": "Used to get a recursive tree. Default is false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Tree",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Requirement",
- "description": "Represents a requirement",
- "fields": [
- {
- "name": "author",
- "description": "Author of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the requirement was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iid",
- "description": "Internal ID of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastTestReportManuallyCreated",
- "description": "Indicates if latest test report was created by user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastTestReportState",
- "description": "Latest requirement test report state.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "TestReportState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "Project to which the requirement belongs.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "RequirementState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "testReports",
- "description": "Test reports of the requirement.",
- "args": [
- {
- "name": "sort",
- "description": "List test reports by sort order.",
- "type": {
- "kind": "ENUM",
- "name": "Sort",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TestReportConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the requirement.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "titleHtml",
- "description": "The GitLab Flavored Markdown rendering of `title`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp of when the requirement was last updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RequirementPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RequirementConnection",
- "description": "The connection type for Requirement.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RequirementEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Requirement",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RequirementEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Requirement",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RequirementPermissions",
- "description": "Check permissions for the current user on a requirement",
- "fields": [
- {
- "name": "adminRequirement",
- "description": "Indicates the user can perform `admin_requirement` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createRequirement",
- "description": "Indicates the user can perform `create_requirement` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyRequirement",
- "description": "Indicates the user can perform `destroy_requirement` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readRequirement",
- "description": "Indicates the user can perform `read_requirement` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateRequirement",
- "description": "Indicates the user can perform `update_requirement` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "RequirementState",
- "description": "State of a requirement",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "OPENED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ARCHIVED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RequirementStatesCount",
- "description": "Counts of requirements by their state",
- "fields": [
- {
- "name": "archived",
- "description": "Number of archived requirements.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "opened",
- "description": "Number of opened requirements.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "ResolvableInterface",
- "description": null,
- "fields": [
- {
- "name": "resolvable",
- "description": "Indicates if the object can be resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolved",
- "description": "Indicates if the object is resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedAt",
- "description": "Timestamp of when the object was resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedBy",
- "description": "User who resolved the object.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "Discussion",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- }
- ]
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "RevertVulnerabilityToDetectedInput",
- "description": "Autogenerated input type of RevertVulnerabilityToDetected",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be reverted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RevertVulnerabilityToDetectedPayload",
- "description": "Autogenerated return type of RevertVulnerabilityToDetected",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after revert.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RootStorageStatistics",
- "description": null,
- "fields": [
- {
- "name": "buildArtifactsSize",
- "description": "The CI artifacts size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lfsObjectsSize",
- "description": "The LFS objects size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packagesSize",
- "description": "The packages size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineArtifactsSize",
- "description": "The CI pipeline artifacts size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "repositorySize",
- "description": "The Git repository size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippetsSize",
- "description": "The snippets size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "storageSize",
- "description": "The total storage in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "uploadsSize",
- "description": "The uploads size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "wikiSize",
- "description": "The wiki size in bytes.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Float",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "RunDASTScanInput",
- "description": "Autogenerated input type of RunDASTScan",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the DAST scan belongs to.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetUrl",
- "description": "The URL of the target to be scanned.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "branch",
- "description": "The branch to be associated with the scan.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "scanType",
- "description": "The type of scan to be run.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "DastScanTypeEnum",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunDASTScanPayload",
- "description": "Autogenerated return type of RunDASTScan",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineUrl",
- "description": "URL of the pipeline that was created.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerArchitecture",
- "description": null,
- "fields": [
- {
- "name": "downloadLocation",
- "description": "Download location for the runner for the platform architecture.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the runner platform architecture.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerArchitectureConnection",
- "description": "The connection type for RunnerArchitecture.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RunnerArchitectureEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RunnerArchitecture",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerArchitectureEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunnerArchitecture",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerPlatform",
- "description": null,
- "fields": [
- {
- "name": "architectures",
- "description": "Runner architectures supported for the platform.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunnerArchitectureConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "humanReadableName",
- "description": "Human readable name of the runner platform.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name slug of the runner platform.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerPlatformConnection",
- "description": "The connection type for RunnerPlatform.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RunnerPlatformEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "RunnerPlatform",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerPlatformEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "RunnerPlatform",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "RunnerSetup",
- "description": null,
- "fields": [
- {
- "name": "installInstructions",
- "description": "Instructions for installing the runner on the specified architecture.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "registerInstructions",
- "description": "Instructions for registering the runner.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfiguration",
- "description": "Represents a CI configuration of SAST",
- "fields": [
- {
- "name": "analyzers",
- "description": "List of analyzers entities attached to SAST configuration.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "global",
- "description": "List of global entities related to SAST configuration.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipeline",
- "description": "List of pipeline entities related to SAST configuration.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntity",
- "description": "Represents an analyzer entity in SAST CI configuration",
- "fields": [
- {
- "name": "description",
- "description": "Analyzer description that is displayed on the form.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enabled",
- "description": "Indicates whether an analyzer is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "Analyzer label used in the config UI.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the analyzer.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "variables",
- "description": "List of supported variables.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityConnection",
- "description": "The connection type for SastCiConfigurationAnalyzersEntity.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntity",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationAnalyzersEntity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityInput",
- "description": "Represents the analyzers entity in SAST CI configuration",
- "fields": null,
- "inputFields": [
- {
- "name": "name",
- "description": "Name of analyzer.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "enabled",
- "description": "State of the analyzer.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "variables",
- "description": "List of variables for the analyzer.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationEntityInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntity",
- "description": "Represents an entity in SAST CI configuration",
- "fields": [
- {
- "name": "defaultValue",
- "description": "Default value that is used if value is empty.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Entity description that is displayed on the form.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "field",
- "description": "CI keyword of entity.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "label",
- "description": "Label for entity used in the form.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "options",
- "description": "Different possible values of the field.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntityConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "size",
- "description": "Size of the UI component.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "SastUiComponentSize",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the field value.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Current value of the entity.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityConnection",
- "description": "The connection type for SastCiConfigurationEntity.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntity",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationEntity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationEntityInput",
- "description": "Represents an entity in SAST CI configuration",
- "fields": null,
- "inputFields": [
- {
- "name": "field",
- "description": "CI keyword of entity.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "defaultValue",
- "description": "Default value that is used if value is empty.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "value",
- "description": "Current value of the entity.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationInput",
- "description": "Represents a CI configuration of SAST",
- "fields": null,
- "inputFields": [
- {
- "name": "global",
- "description": "List of global entities related to SAST configuration.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationEntityInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "pipeline",
- "description": "List of pipeline entities related to SAST configuration.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationEntityInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "analyzers",
- "description": "List of analyzers and related variables for the SAST configuration.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SastCiConfigurationAnalyzersEntityInput",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntity",
- "description": "Represents an entity for options in SAST CI configuration",
- "fields": [
- {
- "name": "label",
- "description": "Label of option entity.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Value of option entity.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntityConnection",
- "description": "The connection type for SastCiConfigurationOptionsEntity.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntity",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SastCiConfigurationOptionsEntity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "SastUiComponentSize",
- "description": "Size of UI component in SAST configuration page",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SMALL",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MEDIUM",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LARGE",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ScannedResource",
- "description": "Represents a resource scanned by a security scan",
- "fields": [
- {
- "name": "requestMethod",
- "description": "The HTTP request method used to access the URL.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "The URL scanned by the scanner.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ScannedResourceConnection",
- "description": "The connection type for ScannedResource.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ScannedResourceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ScannedResource",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ScannedResourceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ScannedResource",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SecurityReportSummary",
- "description": "Represents summary of a security report",
- "fields": [
- {
- "name": "apiFuzzing",
- "description": "Aggregated counts for the `api_fuzzing` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerScanning",
- "description": "Aggregated counts for the `container_scanning` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "coverageFuzzing",
- "description": "Aggregated counts for the `coverage_fuzzing` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dast",
- "description": "Aggregated counts for the `dast` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dependencyScanning",
- "description": "Aggregated counts for the `dependency_scanning` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sast",
- "description": "Aggregated counts for the `sast` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "secretDetection",
- "description": "Aggregated counts for the `secret_detection` scan",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SecurityReportSummarySection",
- "description": "Represents a section of a summary of a security report",
- "fields": [
- {
- "name": "scannedResources",
- "description": "A list of the first 20 scanned resources.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ScannedResourceConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scannedResourcesCount",
- "description": "Total number of scanned resources.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scannedResourcesCsvPath",
- "description": "Path to download all the scanned resources in CSV format.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilitiesCount",
- "description": "Total number of vulnerabilities.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "SecurityReportTypeEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SAST",
- "description": "SAST scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DAST",
- "description": "DAST scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEPENDENCY_SCANNING",
- "description": "DEPENDENCY SCANNING scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONTAINER_SCANNING",
- "description": "CONTAINER SCANNING scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SECRET_DETECTION",
- "description": "SECRET DETECTION scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COVERAGE_FUZZING",
- "description": "COVERAGE FUZZING scan report",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "API_FUZZING",
- "description": "API FUZZING scan report",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "SecurityScannerType",
- "description": "The type of the security scanner",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEPENDENCY_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONTAINER_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SECRET_DETECTION",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COVERAGE_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "API_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SecurityScanners",
- "description": "Represents a list of security scanners",
- "fields": [
- {
- "name": "available",
- "description": "List of analyzers which are available for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SecurityScannerType",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enabled",
- "description": "List of analyzers which are enabled for the project.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SecurityScannerType",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pipelineRun",
- "description": "List of analyzers which ran successfully in the latest pipeline.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SecurityScannerType",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryDetailedError",
- "description": "A Sentry error",
- "fields": [
- {
- "name": "count",
- "description": "Count of occurrences.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "culprit",
- "description": "Culprit of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalBaseUrl",
- "description": "External Base URL of the Sentry Instance.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalUrl",
- "description": "External URL of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "firstReleaseLastCommit",
- "description": "Commit the error was first seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "firstReleaseShortVersion",
- "description": "Release short version the error was first seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "firstReleaseVersion",
- "description": "Release version the error was first seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "firstSeen",
- "description": "Timestamp when the error was first seen.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "frequency",
- "description": "Last 24hr stats of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorFrequency",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabCommit",
- "description": "GitLab commit SHA attributed to the Error based on the release version.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabCommitPath",
- "description": "Path to the GitLab page for the GitLab commit attributed to the error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "gitlabIssuePath",
- "description": "URL of GitLab Issue.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID (global ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastReleaseLastCommit",
- "description": "Commit the error was last seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastReleaseShortVersion",
- "description": "Release short version the error was last seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastReleaseVersion",
- "description": "Release version the error was last seen.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSeen",
- "description": "Timestamp when the error was last seen.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "message",
- "description": "Sentry metadata message of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryId",
- "description": "ID (Sentry ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectId",
- "description": "ID of the project (Sentry project).",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectName",
- "description": "Name of the project affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectSlug",
- "description": "Slug of the project affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shortId",
- "description": "Short ID (Sentry ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SentryErrorStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tags",
- "description": "Tags associated with the Sentry Error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorTags",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userCount",
- "description": "Count of users affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryError",
- "description": "A Sentry error. A simplified version of SentryDetailedError",
- "fields": [
- {
- "name": "count",
- "description": "Count of occurrences.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "culprit",
- "description": "Culprit of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalUrl",
- "description": "External URL of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "firstSeen",
- "description": "Timestamp when the error was first seen.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "frequency",
- "description": "Last 24hr stats of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorFrequency",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID (global ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSeen",
- "description": "Timestamp when the error was last seen.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "message",
- "description": "Sentry metadata message of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryId",
- "description": "ID (Sentry ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectId",
- "description": "ID of the project (Sentry project).",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectName",
- "description": "Name of the project affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sentryProjectSlug",
- "description": "Slug of the project affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "shortId",
- "description": "Short ID (Sentry ID) of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "Status of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SentryErrorStatus",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userCount",
- "description": "Count of users affected by the error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorCollection",
- "description": "An object containing a collection of Sentry errors, and a detailed error",
- "fields": [
- {
- "name": "detailedError",
- "description": "Detailed version of a Sentry error on the project.",
- "args": [
- {
- "name": "id",
- "description": "ID of the Sentry issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "GitlabErrorTrackingDetailedErrorID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryDetailedError",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errorStackTrace",
- "description": "Stack Trace of Sentry Error.",
- "args": [
- {
- "name": "id",
- "description": "ID of the Sentry issue.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "GitlabErrorTrackingDetailedErrorID",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryErrorStackTrace",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Collection of Sentry Errors.",
- "args": [
- {
- "name": "searchTerm",
- "description": "Search query for the Sentry error details.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Attribute to sort on. Options are frequency, first_seen, last_seen. last_seen is default.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryErrorConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalUrl",
- "description": "External URL for Sentry.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorConnection",
- "description": "The connection type for SentryError.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryError",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SentryError",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorFrequency",
- "description": null,
- "fields": [
- {
- "name": "count",
- "description": "Count of errors received since the previously recorded time.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "time",
- "description": "Time the error frequency stats were recorded.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorStackTrace",
- "description": "An object containing a stack trace entry for a Sentry error",
- "fields": [
- {
- "name": "dateReceived",
- "description": "Time the stack trace was received by Sentry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueId",
- "description": "ID of the Sentry error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stackTraceEntries",
- "description": "Stack trace entries for the Sentry error.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorStackTraceEntry",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorStackTraceContext",
- "description": "An object context for a Sentry error stack trace",
- "fields": [
- {
- "name": "code",
- "description": "Code number of the context.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "line",
- "description": "Line number of the context.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorStackTraceEntry",
- "description": "An object containing a stack trace entry for a Sentry error",
- "fields": [
- {
- "name": "col",
- "description": "Function in which the Sentry error occurred.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileName",
- "description": "File in which the Sentry error occurred.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "function",
- "description": "Function in which the Sentry error occurred.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "line",
- "description": "Function in which the Sentry error occurred.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "traceContext",
- "description": "Context of the Sentry error.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SentryErrorStackTraceContext",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "SentryErrorStatus",
- "description": "State of a Sentry error",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "RESOLVED",
- "description": "Error has been resolved",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RESOLVED_IN_NEXT_RELEASE",
- "description": "Error has been ignored until next release",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNRESOLVED",
- "description": "Error is unresolved",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "IGNORED",
- "description": "Error has been ignored",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SentryErrorTags",
- "description": "State of a Sentry error",
- "fields": [
- {
- "name": "level",
- "description": "Severity level of the Sentry Error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "logger",
- "description": "Logger of the Sentry Error.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "Service",
- "description": null,
- "fields": [
- {
- "name": "active",
- "description": "Indicates if the service is active.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Class name of the service.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "BaseService",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "JiraService",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "ServiceConnection",
- "description": "The connection type for Service.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ServiceEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "INTERFACE",
- "name": "Service",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ServiceEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "INTERFACE",
- "name": "Service",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "ServiceType",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ASANA_SERVICE",
- "description": "AsanaService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ASSEMBLA_SERVICE",
- "description": "AssemblaService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BAMBOO_SERVICE",
- "description": "BambooService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BUGZILLA_SERVICE",
- "description": "BugzillaService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "BUILDKITE_SERVICE",
- "description": "BuildkiteService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CAMPFIRE_SERVICE",
- "description": "CampfireService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONFLUENCE_SERVICE",
- "description": "ConfluenceService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CUSTOM_ISSUE_TRACKER_SERVICE",
- "description": "CustomIssueTrackerService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DATADOG_SERVICE",
- "description": "DatadogService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DISCORD_SERVICE",
- "description": "DiscordService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DRONE_CI_SERVICE",
- "description": "DroneCiService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EMAILS_ON_PUSH_SERVICE",
- "description": "EmailsOnPushService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EWM_SERVICE",
- "description": "EwmService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EXTERNAL_WIKI_SERVICE",
- "description": "ExternalWikiService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FLOWDOCK_SERVICE",
- "description": "FlowdockService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "GITHUB_SERVICE",
- "description": "GithubService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HANGOUTS_CHAT_SERVICE",
- "description": "HangoutsChatService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HIPCHAT_SERVICE",
- "description": "HipchatService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "IRKER_SERVICE",
- "description": "IrkerService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "JENKINS_SERVICE",
- "description": "JenkinsService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "JIRA_SERVICE",
- "description": "JiraService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MATTERMOST_SERVICE",
- "description": "MattermostService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MATTERMOST_SLASH_COMMANDS_SERVICE",
- "description": "MattermostSlashCommandsService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MICROSOFT_TEAMS_SERVICE",
- "description": "MicrosoftTeamsService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PACKAGIST_SERVICE",
- "description": "PackagistService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIPELINES_EMAIL_SERVICE",
- "description": "PipelinesEmailService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PIVOTALTRACKER_SERVICE",
- "description": "PivotaltrackerService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PROMETHEUS_SERVICE",
- "description": "PrometheusService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "PUSHOVER_SERVICE",
- "description": "PushoverService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "REDMINE_SERVICE",
- "description": "RedmineService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SLACK_SERVICE",
- "description": "SlackService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SLACK_SLASH_COMMANDS_SERVICE",
- "description": "SlackSlashCommandsService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "TEAMCITY_SERVICE",
- "description": "TeamcityService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNIFY_CIRCUIT_SERVICE",
- "description": "UnifyCircuitService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "WEBEX_TEAMS_SERVICE",
- "description": "WebexTeamsService type",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "YOUTRACK_SERVICE",
- "description": "YoutrackService type",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Snippet",
- "description": "Represents a snippet entry",
- "fields": [
- {
- "name": "author",
- "description": "The owner of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blob",
- "description": "Snippet blob. Deprecated in 13.3: Use `blobs`.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetBlob",
- "ofType": null
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use `blobs`. Deprecated in 13.3."
- },
- {
- "name": "blobs",
- "description": "Snippet blobs.",
- "args": [
- {
- "name": "paths",
- "description": "Paths of the blobs.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetBlobConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp this snippet was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "descriptionHtml",
- "description": "The GitLab Flavored Markdown rendering of `description`",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileName",
- "description": "File Name of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "httpUrlToRepo",
- "description": "HTTP URL to the snippet repository.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project the snippet is associated with.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rawUrl",
- "description": "Raw URL of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sshUrlToRepo",
- "description": "SSH URL to the snippet repository.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp this snippet was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "visibilityLevel",
- "description": "Visibility Level of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VisibilityLevelsEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the snippet.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetBlob",
- "description": "Represents the snippet blob",
- "fields": [
- {
- "name": "binary",
- "description": "Shows whether the blob is binary.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalStorage",
- "description": "Blob external storage.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mode",
- "description": "Blob mode.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Blob name.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Blob path.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "plainData",
- "description": "Blob plain highlighted data.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rawPath",
- "description": "Blob raw content endpoint path.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "renderedAsText",
- "description": "Shows whether the blob is rendered as text.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "richData",
- "description": "Blob highlighted data.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "richViewer",
- "description": "Blob content rich viewer.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetBlobViewer",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "simpleViewer",
- "description": "Blob content simple viewer.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetBlobViewer",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "size",
- "description": "Blob size.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "SnippetBlobActionEnum",
- "description": "Type of a snippet blob input action",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "create",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "update",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "delete",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "move",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "SnippetBlobActionInputType",
- "description": "Represents an action to perform over a snippet file",
- "fields": null,
- "inputFields": [
- {
- "name": "action",
- "description": "Type of input action.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "SnippetBlobActionEnum",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "previousPath",
- "description": "Previous path of the snippet file.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "filePath",
- "description": "Path of the snippet file.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "content",
- "description": "Snippet file content.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetBlobConnection",
- "description": "The connection type for SnippetBlob.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetBlobEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetBlob",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetBlobEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetBlob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetBlobViewer",
- "description": "Represents how the blob content should be displayed",
- "fields": [
- {
- "name": "collapsed",
- "description": "Shows whether the blob should be displayed collapsed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileType",
- "description": "Content file type.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "loadAsync",
- "description": "Shows whether the blob content is loaded asynchronously.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "loadingPartialName",
- "description": "Loading partial name.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "renderError",
- "description": "Error rendering the blob content.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "tooLarge",
- "description": "Shows whether the blob too large to be displayed.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of blob viewer.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "BlobViewersType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetConnection",
- "description": "The connection type for Snippet.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "SnippetID",
- "description": "Identifier of Snippet.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetPermissions",
- "description": null,
- "fields": [
- {
- "name": "adminSnippet",
- "description": "Indicates the user can perform `admin_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "awardEmoji",
- "description": "Indicates the user can perform `award_emoji` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createNote",
- "description": "Indicates the user can perform `create_note` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readSnippet",
- "description": "Indicates the user can perform `read_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reportSnippet",
- "description": "Indicates the user can perform `report_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateSnippet",
- "description": "Indicates the user can perform `update_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistry",
- "description": "Represents the Geo sync and verification state of a snippet repository",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp when the SnippetRepositoryRegistry was created",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the SnippetRepositoryRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncFailure",
- "description": "Error message during sync of the SnippetRepositoryRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncedAt",
- "description": "Timestamp of the most recent successful sync of the SnippetRepositoryRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryAt",
- "description": "Timestamp after which the SnippetRepositoryRegistry should be resynced",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryCount",
- "description": "Number of consecutive failed sync attempts of the SnippetRepositoryRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippetRepositoryId",
- "description": "ID of the Snippet Repository.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "Sync state of the SnippetRepositoryRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "RegistryState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistryConnection",
- "description": "The connection type for SnippetRepositoryRegistry.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistry",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetRepositoryRegistry",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "Sort",
- "description": "Common sort values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "updated_desc",
- "description": "Updated at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "updated_asc",
- "description": "Updated at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use UPDATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "created_desc",
- "description": "Created at descending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_DESC. Deprecated in 13.5."
- },
- {
- "name": "created_asc",
- "description": "Created at ascending order",
- "isDeprecated": true,
- "deprecationReason": "Use CREATED_ASC. Deprecated in 13.5."
- },
- {
- "name": "UPDATED_DESC",
- "description": "Updated at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UPDATED_ASC",
- "description": "Updated at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_DESC",
- "description": "Created at descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED_ASC",
- "description": "Created at ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "StatusAction",
- "description": null,
- "fields": [
- {
- "name": "buttonTitle",
- "description": "Title for the button, for example: Retry this job.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "icon",
- "description": "Icon used in the action button.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "method",
- "description": "Method for the action, for example: :post.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path for the action.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title for the action, for example: Retry.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "String",
- "description": "Represents textual data as UTF-8 character sequences. This type is most often used by GraphQL to represent free-form human-readable text.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Submodule",
- "description": null,
- "fields": [
- {
- "name": "flatPath",
- "description": "Flat path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "Last commit SHA for the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "treeUrl",
- "description": "Tree URL for the sub-module.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of tree entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EntryType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL for the sub-module.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Entry",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SubmoduleConnection",
- "description": "The connection type for Submodule.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SubmoduleEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Submodule",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "SubmoduleEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Submodule",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TaskCompletionStatus",
- "description": "Completion status of tasks",
- "fields": [
- {
- "name": "completedCount",
- "description": "Number of completed tasks.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "count",
- "description": "Number of total tasks.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformState",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp the Terraform state was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the Terraform state.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "latestVersion",
- "description": "The latest version of the Terraform state.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateVersion",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lockedAt",
- "description": "Timestamp the Terraform state was locked.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lockedByUser",
- "description": "The user currently holding a lock on the Terraform state.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the Terraform state.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp the Terraform state was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateConnection",
- "description": "The connection type for TerraformState.",
- "fields": [
- {
- "name": "count",
- "description": "Total count of collection.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TerraformStateEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TerraformState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateDeleteInput",
- "description": "Autogenerated input type of TerraformStateDelete",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the Terraform state.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TerraformStateID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateDeletePayload",
- "description": "Autogenerated return type of TerraformStateDelete",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "TerraformStateID",
- "description": "Identifier of Terraform::State.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateLockInput",
- "description": "Autogenerated input type of TerraformStateLock",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the Terraform state.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TerraformStateID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateLockPayload",
- "description": "Autogenerated return type of TerraformStateLock",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TerraformStateUnlockInput",
- "description": "Autogenerated input type of TerraformStateUnlock",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "Global ID of the Terraform state.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TerraformStateID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateUnlockPayload",
- "description": "Autogenerated return type of TerraformStateUnlock",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateVersion",
- "description": null,
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp the version was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdByUser",
- "description": "The user that created this version.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "downloadPath",
- "description": "URL for downloading the version's JSON file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the Terraform state version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "job",
- "description": "The job that created this version.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "CiJob",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "serial",
- "description": "Serial number of the version.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedAt",
- "description": "Timestamp the version was updated.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistry",
- "description": "Represents the Geo sync and verification state of a terraform state version",
- "fields": [
- {
- "name": "createdAt",
- "description": "Timestamp when the TerraformStateVersionRegistry was created",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the TerraformStateVersionRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncFailure",
- "description": "Error message during sync of the TerraformStateVersionRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastSyncedAt",
- "description": "Timestamp of the most recent successful sync of the TerraformStateVersionRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryAt",
- "description": "Timestamp after which the TerraformStateVersionRegistry should be resynced",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "retryCount",
- "description": "Number of consecutive failed sync attempts of the TerraformStateVersionRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "Sync state of the TerraformStateVersionRegistry",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "RegistryState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "terraformStateVersionId",
- "description": "ID of the terraform state version.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistryConnection",
- "description": "The connection type for TerraformStateVersionRegistry.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistry",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TerraformStateVersionRegistry",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TestReport",
- "description": "Represents a requirement test report",
- "fields": [
- {
- "name": "author",
- "description": "Author of the test report.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp of when the test report was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the test report.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the test report.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TestReportState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TestReportConnection",
- "description": "The connection type for TestReport.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TestReportEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TestReport",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TestReportEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TestReport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "TestReportState",
- "description": "State of a test report",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "PASSED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FAILED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Time",
- "description": "Time represented in ISO 8601",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TimeReportStats",
- "description": "Represents the time report stats for timeboxes",
- "fields": [
- {
- "name": "complete",
- "description": "Completed issues metrics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxMetrics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "incomplete",
- "description": "Incomplete issues metrics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxMetrics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "total",
- "description": "Total issues metrics.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxMetrics",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TimeboxMetrics",
- "description": "Represents measured stats metrics for timeboxes",
- "fields": [
- {
- "name": "count",
- "description": "The count metric.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "weight",
- "description": "The weight metric.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TimeboxReport",
- "description": "Represents a historically accurate report about the timebox",
- "fields": [
- {
- "name": "burnupTimeSeries",
- "description": "Daily scope and completed totals for burnup charts.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BurnupChartDailyTotals",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "stats",
- "description": "Represents the time report stats for the timebox.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeReportStats",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INTERFACE",
- "name": "TimeboxReportInterface",
- "description": null,
- "fields": [
- {
- "name": "report",
- "description": "Historically accurate report about the timebox.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TimeboxReport",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "Milestone",
- "ofType": null
- }
- ]
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "Timeframe",
- "description": "A time-frame defined as a closed inclusive range of two dates",
- "fields": null,
- "inputFields": [
- {
- "name": "start",
- "description": "The start of the range.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Date",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "end",
- "description": "The end of the range.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Date",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Timelog",
- "description": null,
- "fields": [
- {
- "name": "issue",
- "description": "The issue that logged time was added to.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note where the quick action to add the logged time was executed.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spentAt",
- "description": "Timestamp of when the time tracked was spent at.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "timeSpent",
- "description": "The time spent displayed in seconds.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "user",
- "description": "The user that logged the time.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TimelogConnection",
- "description": "The connection type for Timelog.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TimelogEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Timelog",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TimelogEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Timelog",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Todo",
- "description": "Representing a to-do entry",
- "fields": [
- {
- "name": "action",
- "description": "Action of the to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoActionEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "author",
- "description": "The author of this to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "body",
- "description": "Body of the to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createdAt",
- "description": "Timestamp this to-do item was created.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "group",
- "description": "Group this to-do item is associated with.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Group",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project this to-do item is associated with.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "targetType",
- "description": "Target type of the to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoTargetEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "TodoActionEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "assigned",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mentioned",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "build_failed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "marked",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "approval_required",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "unmergeable",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "directly_addressed",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "description": "The connection type for Todo.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TodoCreateInput",
- "description": "Autogenerated input type of TodoCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "targetId",
- "description": "The global ID of the to-do item's parent. Issues, merge requests, designs and epics are supported.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoCreatePayload",
- "description": "Autogenerated return type of TodoCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The to-do item created.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "TodoID",
- "description": "Identifier of Todo.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TodoMarkDoneInput",
- "description": "Autogenerated input type of TodoMarkDone",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the to-do item to mark as done.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoMarkDonePayload",
- "description": "Autogenerated return type of TodoMarkDone",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The requested to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TodoRestoreInput",
- "description": "Autogenerated input type of TodoRestore",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the to-do item to restore.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TodoRestoreManyInput",
- "description": "Autogenerated input type of TodoRestoreMany",
- "fields": null,
- "inputFields": [
- {
- "name": "ids",
- "description": "The global IDs of the to-do items to restore (a maximum of 50 is supported at once).",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoID",
- "ofType": null
- }
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoRestoreManyPayload",
- "description": "Autogenerated return type of TodoRestoreMany",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todos",
- "description": "Updated to-do items.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedIds",
- "description": "The IDs of the updated to-do items. Deprecated in 13.2: Use to-do items.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoID",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use to-do items. Deprecated in 13.2."
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodoRestorePayload",
- "description": "Autogenerated return type of TodoRestore",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The requested to-do item.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "pending",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "done",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "TodoTargetEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "COMMIT",
- "description": "A Commit",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ISSUE",
- "description": "An Issue",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MERGEREQUEST",
- "description": "A MergeRequest",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DESIGN",
- "description": "A Design",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ALERT",
- "description": "An Alert",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "EPIC",
- "description": "An Epic",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "TodoableID",
- "description": "Identifier of Todoable.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "TodosMarkAllDoneInput",
- "description": "Autogenerated input type of TodosMarkAllDone",
- "fields": null,
- "inputFields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TodosMarkAllDonePayload",
- "description": "Autogenerated return type of TodosMarkAllDone",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todos",
- "description": "Updated to-do items.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updatedIds",
- "description": "IDs of the updated to-do items. Deprecated in 13.2: Use to-do items.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "TodoID",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use to-do items. Deprecated in 13.2."
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "ToggleAwardEmojiInput",
- "description": "Autogenerated input type of ToggleAwardEmoji",
- "fields": null,
- "inputFields": [
- {
- "name": "awardableId",
- "description": "The global ID of the awardable resource.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "AwardableID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "name",
- "description": "The emoji name.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "ToggleAwardEmojiPayload",
- "description": "Autogenerated return type of ToggleAwardEmoji",
- "fields": [
- {
- "name": "awardEmoji",
- "description": "The award emoji after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AwardEmoji",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "toggledOn",
- "description": "Indicates the status of the emoji. True if the toggle awarded the emoji, and false if the toggle removed the emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Tree",
- "description": null,
- "fields": [
- {
- "name": "blobs",
- "description": "Blobs of the tree.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "BlobConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lastCommit",
- "description": "Last commit for the tree.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Commit",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "submodules",
- "description": "Sub-modules of the tree.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "SubmoduleConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "trees",
- "description": "Trees of the tree.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TreeEntryConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TreeEntry",
- "description": "Represents a directory",
- "fields": [
- {
- "name": "flatPath",
- "description": "Flat path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "Path of the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "sha",
- "description": "Last commit SHA for the entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": "Type of tree entry.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "EntryType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path for the tree entry (directory).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL for the tree entry (directory).",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Entry",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TreeEntryConnection",
- "description": "The connection type for TreeEntry.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TreeEntryEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TreeEntry",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "TreeEntryEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "TreeEntry",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "TypeEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "personal",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "description": "A regexp containing patterns sourced from user input",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateAlertStatusInput",
- "description": "Autogenerated input type of UpdateAlertStatus",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the alert to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the alert to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "status",
- "description": "The status to set the alert.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AlertManagementStatus",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateAlertStatusPayload",
- "description": "Autogenerated return type of UpdateAlertStatus",
- "fields": [
- {
- "name": "alert",
- "description": "The alert after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "AlertManagementAlert",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue created after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todo",
- "description": "The to-do item after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Todo",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardEpicUserPreferencesInput",
- "description": "Autogenerated input type of UpdateBoardEpicUserPreferences",
- "fields": null,
- "inputFields": [
- {
- "name": "boardId",
- "description": "The board global ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "ID of an epic to set preferences for.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "collapsed",
- "description": "Whether the epic should be collapsed in the board.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateBoardEpicUserPreferencesPayload",
- "description": "Autogenerated return type of UpdateBoardEpicUserPreferences",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epicUserPreferences",
- "description": "User preferences for the epic in the board after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardEpicUserPreferences",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardInput",
- "description": "Autogenerated input type of UpdateBoard",
- "fields": null,
- "inputFields": [
- {
- "name": "name",
- "description": "The board name.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideBacklogList",
- "description": "Whether or not backlog list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "hideClosedList",
- "description": "Whether or not closed list is hidden.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "The board global ID.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "BoardID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "assigneeId",
- "description": "The ID of user to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "UserID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "The ID of milestone to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "MilestoneID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iterationId",
- "description": "The ID of iteration to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "IterationID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The weight value to be assigned to the board.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Labels of the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "labelIds",
- "description": "The IDs of labels to be added to the board.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "LabelID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateBoardListInput",
- "description": "Autogenerated input type of UpdateBoardList",
- "fields": null,
- "inputFields": [
- {
- "name": "listId",
- "description": "Global ID of the list.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ListID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "position",
- "description": "Position of list within the board.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "collapsed",
- "description": "Indicates if list is collapsed for this user.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateBoardListPayload",
- "description": "Autogenerated return type of UpdateBoardList",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "list",
- "description": "Mutated list.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "BoardList",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateBoardPayload",
- "description": "Autogenerated return type of UpdateBoard",
- "fields": [
- {
- "name": "board",
- "description": "The board after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Board",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateComplianceFrameworkInput",
- "description": "Autogenerated input type of UpdateComplianceFramework",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the compliance framework to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ComplianceManagementFrameworkID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "params",
- "description": "Parameters to update the compliance framework with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "ComplianceFrameworkInput",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateComplianceFrameworkPayload",
- "description": "Autogenerated return type of UpdateComplianceFramework",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "complianceFramework",
- "description": "The compliance framework after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ComplianceFramework",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateContainerExpirationPolicyInput",
- "description": "Autogenerated input type of UpdateContainerExpirationPolicy",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project path where the container expiration policy is located.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "enabled",
- "description": "Indicates whether this container expiration policy is enabled.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "cadence",
- "description": "This container expiration policy schedule.",
- "type": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyCadenceEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "olderThan",
- "description": "Tags older that this will expire.",
- "type": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyOlderThanEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "keepN",
- "description": "Number of tags to retain.",
- "type": {
- "kind": "ENUM",
- "name": "ContainerExpirationPolicyKeepEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "nameRegex",
- "description": "Tags with names matching this regex pattern will expire.",
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "nameRegexKeep",
- "description": "Tags with names matching this regex pattern will be preserved.",
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateContainerExpirationPolicyPayload",
- "description": "Autogenerated return type of UpdateContainerExpirationPolicy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "containerExpirationPolicy",
- "description": "The container expiration policy after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ContainerExpirationPolicy",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateDiffImagePositionInput",
- "description": null,
- "fields": null,
- "inputFields": [
- {
- "name": "x",
- "description": "X position of the note.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "y",
- "description": "Y position of the note.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "width",
- "description": "Total width of the image.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "height",
- "description": "Total height of the image.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateEpicInput",
- "description": "Autogenerated input type of UpdateEpic",
- "fields": null,
- "inputFields": [
- {
- "name": "iid",
- "description": "The IID of the epic to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupPath",
- "description": "The group the epic to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "The title of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "The description of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "Indicates if the epic is confidential.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDateFixed",
- "description": "The start date of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDateFixed",
- "description": "The end date of the epic.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDateIsFixed",
- "description": "Indicates start date should be sourced from start_date_fixed field not the issue milestones.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDateIsFixed",
- "description": "Indicates end date should be sourced from due_date_fixed field not the issue milestones.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "addLabelIds",
- "description": "The IDs of labels to be added to the epic.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "removeLabelIds",
- "description": "The IDs of labels to be removed from the epic.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "stateEvent",
- "description": "State event for the epic.",
- "type": {
- "kind": "ENUM",
- "name": "EpicStateEvent",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateEpicPayload",
- "description": "Autogenerated return type of UpdateEpic",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "epic",
- "description": "The epic after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Epic",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateImageDiffNoteInput",
- "description": "Autogenerated input type of UpdateImageDiffNote",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the note to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "position",
- "description": "The position of this note on a diff.",
- "type": {
- "kind": "INPUT_OBJECT",
- "name": "UpdateDiffImagePositionInput",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateImageDiffNotePayload",
- "description": "Autogenerated return type of UpdateImageDiffNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateIssueInput",
- "description": "Autogenerated input type of UpdateIssue",
- "fields": null,
- "inputFields": [
- {
- "name": "projectPath",
- "description": "The project the issue to mutate is in.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the issue to mutate.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDate",
- "description": "Due date of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "Indicates the issue is confidential.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "locked",
- "description": "Indicates discussion is locked on the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneId",
- "description": "The ID of the milestone to assign to the issue. On update milestone will be removed if set to null.",
- "type": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "addLabelIds",
- "description": "The IDs of labels to be added to the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "removeLabelIds",
- "description": "The IDs of labels to be removed from the issue.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "stateEvent",
- "description": "Close or reopen an issue.",
- "type": {
- "kind": "ENUM",
- "name": "IssueStateEvent",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "healthStatus",
- "description": "The desired health status.",
- "type": {
- "kind": "ENUM",
- "name": "HealthStatus",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "weight",
- "description": "The weight of the issue.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "epicId",
- "description": "The ID of the parent epic. NULL when removing the association.",
- "type": {
- "kind": "SCALAR",
- "name": "EpicID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateIssuePayload",
- "description": "Autogenerated return type of UpdateIssue",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateIterationInput",
- "description": "Autogenerated input type of UpdateIteration",
- "fields": null,
- "inputFields": [
- {
- "name": "groupPath",
- "description": "Group of the iteration.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "Global ID of the iteration.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "startDate",
- "description": "Start date of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dueDate",
- "description": "End date of the iteration.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateIterationPayload",
- "description": "Autogenerated return type of UpdateIteration",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "iteration",
- "description": "Updated iteration.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Iteration",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateNamespacePackageSettingsInput",
- "description": "Autogenerated input type of UpdateNamespacePackageSettings",
- "fields": null,
- "inputFields": [
- {
- "name": "namespacePath",
- "description": "The namespace path where the namespace package setting is located.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "mavenDuplicatesAllowed",
- "description": "Indicates whether duplicate Maven packages are allowed for this namespace.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mavenDuplicateExceptionRegex",
- "description": "When maven_duplicates_allowed is false, you can publish duplicate packages with names that match this regex. Otherwise, this setting has no effect.",
- "type": {
- "kind": "SCALAR",
- "name": "UntrustedRegexp",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateNamespacePackageSettingsPayload",
- "description": "Autogenerated return type of UpdateNamespacePackageSettings",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "packageSettings",
- "description": "The namespace package setting after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "PackageSettings",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateNoteInput",
- "description": "Autogenerated input type of UpdateNote",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the note to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "NoteID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "body",
- "description": "Content of the note.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "confidential",
- "description": "The confidentiality flag of a note. Default is false.",
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateNotePayload",
- "description": "Autogenerated return type of UpdateNote",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "note",
- "description": "The note after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Note",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateRequirementInput",
- "description": "Autogenerated input type of UpdateRequirement",
- "fields": null,
- "inputFields": [
- {
- "name": "title",
- "description": "Title of the requirement.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the requirement.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectPath",
- "description": "Full project path the requirement is associated with.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "State of the requirement.",
- "type": {
- "kind": "ENUM",
- "name": "RequirementState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "iid",
- "description": "The IID of the requirement to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "lastTestReportState",
- "description": "Creates a test report for the requirement with the given state.",
- "type": {
- "kind": "ENUM",
- "name": "TestReportState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateRequirementPayload",
- "description": "Autogenerated return type of UpdateRequirement",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requirement",
- "description": "Requirement after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Requirement",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "UpdateSnippetInput",
- "description": "Autogenerated input type of UpdateSnippet",
- "fields": null,
- "inputFields": [
- {
- "name": "captchaResponse",
- "description": "A valid CAPTCHA response value obtained by using the provided captchaSiteKey with a CAPTCHA API to present a challenge to be solved on the client. Required to resubmit if the previous operation returned \"NeedsCaptchaResponse: true\".",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "spamLogId",
- "description": "The spam log ID which must be passed along with a valid CAPTCHA response for the operation to be completed. Required to resubmit if the previous operation returned \"NeedsCaptchaResponse: true\".",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "id",
- "description": "The global ID of the snippet to update.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "title",
- "description": "Title of the snippet.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "description",
- "description": "Description of the snippet.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "visibilityLevel",
- "description": "The visibility level of the snippet.",
- "type": {
- "kind": "ENUM",
- "name": "VisibilityLevelsEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "blobActions",
- "description": "Actions to perform over the snippet repository and blobs.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "INPUT_OBJECT",
- "name": "SnippetBlobActionInputType",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UpdateSnippetPayload",
- "description": "Autogenerated return type of UpdateSnippet",
- "fields": [
- {
- "name": "captchaSiteKey",
- "description": "The CAPTCHA site key which must be used to render a challenge for the user to solve to obtain a valid captchaResponse value. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "needsCaptchaResponse",
- "description": "Indicates whether the operation was detected as possible spam and not completed. If CAPTCHA is enabled, the request must be resubmitted with a valid CAPTCHA response and spam_log_id included for the operation to be completed. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippet",
- "description": "The snippet after mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Snippet",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spam",
- "description": "Indicates whether the operation was detected as definite spam. There is no option to resubmit the request with a CAPTCHA response.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "spamLogId",
- "description": "The spam log ID which must be passed along with a valid CAPTCHA response for an operation to be completed. Included only when an operation was not completed because \"NeedsCaptchaResponse\" is true.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "Upload",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "User",
- "description": null,
- "fields": [
- {
- "name": "assignedMergeRequests",
- "description": "Merge Requests assigned to the user.",
- "args": [
- {
- "name": "iids",
- "description": "Array of IIDs of merge requests, for example `[1, 2]`.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranches",
- "description": "Array of source branch names. All resolved merge requests will have one of these branches as their source.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranches",
- "description": "Array of target branch names. All resolved merge requests will have one of these branches as their target.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "A merge request state. If provided, all resolved merge requests will have this state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Array of label names. All resolved merge requests will have all of these labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "mergedAfter",
- "description": "Merge requests merged after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergedBefore",
- "description": "Merge requests merged before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort merge requests by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "projectPath",
- "description": "The full-path of the project the authored merge requests should be in. Incompatible with projectId.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The global ID of the project the authored merge requests should be in. Incompatible with projectPath.",
- "type": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "reviewerUsername",
- "description": "Username of the reviewer.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "authoredMergeRequests",
- "description": "Merge Requests authored by the user.",
- "args": [
- {
- "name": "iids",
- "description": "Array of IIDs of merge requests, for example `[1, 2]`.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranches",
- "description": "Array of source branch names. All resolved merge requests will have one of these branches as their source.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranches",
- "description": "Array of target branch names. All resolved merge requests will have one of these branches as their target.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "A merge request state. If provided, all resolved merge requests will have this state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Array of label names. All resolved merge requests will have all of these labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "mergedAfter",
- "description": "Merge requests merged after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergedBefore",
- "description": "Merge requests merged before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort merge requests by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "projectPath",
- "description": "The full-path of the project the authored merge requests should be in. Incompatible with projectId.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The global ID of the project the authored merge requests should be in. Incompatible with projectPath.",
- "type": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of the assignee.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "reviewerUsername",
- "description": "Username of the reviewer.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "avatarUrl",
- "description": "URL of the user's avatar.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "bot",
- "description": "Indicates if the user is a bot.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "email",
- "description": "User email. Deprecated in 13.7: Use public_email.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": true,
- "deprecationReason": "Use public_email. Deprecated in 13.7."
- },
- {
- "name": "groupCount",
- "description": "Group count for the user. Available only when feature flag `user_group_counts` is enabled.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "groupMemberships",
- "description": "Group memberships of the user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "GroupMemberConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "ID of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "location",
- "description": "The location of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Human-readable name of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projectMemberships",
- "description": "Project memberships of the user.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectMemberConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "publicEmail",
- "description": "User's public email.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reviewRequestedMergeRequests",
- "description": "Merge Requests assigned to the user for review.",
- "args": [
- {
- "name": "iids",
- "description": "Array of IIDs of merge requests, for example `[1, 2]`.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "sourceBranches",
- "description": "Array of source branch names. All resolved merge requests will have one of these branches as their source.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "targetBranches",
- "description": "Array of target branch names. All resolved merge requests will have one of these branches as their target.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "A merge request state. If provided, all resolved merge requests will have this state.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestState",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "labels",
- "description": "Array of label names. All resolved merge requests will have all of these labels.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "mergedAfter",
- "description": "Merge requests merged after this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "mergedBefore",
- "description": "Merge requests merged before this date.",
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "milestoneTitle",
- "description": "Title of the milestone.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "sort",
- "description": "Sort merge requests by this criteria.",
- "type": {
- "kind": "ENUM",
- "name": "MergeRequestSort",
- "ofType": null
- },
- "defaultValue": "created_desc"
- },
- {
- "name": "projectPath",
- "description": "The full-path of the project the authored merge requests should be in. Incompatible with projectId.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The global ID of the project the authored merge requests should be in. Incompatible with projectPath.",
- "type": {
- "kind": "SCALAR",
- "name": "ProjectID",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "authorUsername",
- "description": "Username of the author.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "assigneeUsername",
- "description": "Username of the assignee.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequestConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "snippets",
- "description": "Snippets authored by the user.",
- "args": [
- {
- "name": "ids",
- "description": "Array of global snippet ids, e.g., \"gid://gitlab/ProjectSnippet/1\".",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "SnippetID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "visibility",
- "description": "The visibility of the snippet.",
- "type": {
- "kind": "ENUM",
- "name": "VisibilityScopesEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "The type of snippet.",
- "type": {
- "kind": "ENUM",
- "name": "TypeEnum",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "SnippetConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "starredProjects",
- "description": "Projects starred by the user.",
- "args": [
- {
- "name": "search",
- "description": "Search query.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "UserState",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "status",
- "description": "User status.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "UserStatus",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "todos",
- "description": "To-do items of the user.",
- "args": [
- {
- "name": "action",
- "description": "The action to be filtered.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoActionEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "authorId",
- "description": "The ID of an author.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "projectId",
- "description": "The ID of a project.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "groupId",
- "description": "The ID of a group.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "state",
- "description": "The state of the todo.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoStateEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "type",
- "description": "The type of the todo.",
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "TodoTargetEnum",
- "ofType": null
- }
- }
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "TodoConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "UserPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "username",
- "description": "Username of the user. Unique within this instance of GitLab.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webPath",
- "description": "Web path of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "webUrl",
- "description": "Web URL of the user.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UserConnection",
- "description": "The connection type for User.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "UserEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UserEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "UserID",
- "description": "Identifier of User.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UserPermissions",
- "description": null,
- "fields": [
- {
- "name": "createSnippet",
- "description": "Indicates the user can perform `create_snippet` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "UserState",
- "description": "Possible states of a user",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "active",
- "description": "The user is active and is able to use the system",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "blocked",
- "description": "The user has been blocked and is prevented from using the system",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deactivated",
- "description": "The user is no longer active and is unable to use the system",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "UserStatus",
- "description": null,
- "fields": [
- {
- "name": "availability",
- "description": "User availability status.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "AvailabilityEnum",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "emoji",
- "description": "String representation of emoji.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "message",
- "description": "User status message.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "messageHtml",
- "description": "HTML of the user status message",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VisibilityLevelsEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "private",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "internal",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "public",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VisibilityScopesEnum",
- "description": null,
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "private",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "internal",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "public",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDay",
- "description": "Represents the count of vulnerabilities by severity on a particular day. This data is retained for 365 days",
- "fields": [
- {
- "name": "critical",
- "description": "Total number of vulnerabilities on a particular day with critical severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "date",
- "description": "Date for the count.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "high",
- "description": "Total number of vulnerabilities on a particular day with high severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "info",
- "description": "Total number of vulnerabilities on a particular day with info severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "low",
- "description": "Total number of vulnerabilities on a particular day with low severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "medium",
- "description": "Total number of vulnerabilities on a particular day with medium severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "total",
- "description": "Total number of vulnerabilities on a particular day.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "unknown",
- "description": "Total number of vulnerabilities on a particular day with unknown severity",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverity",
- "description": "Represents the number of vulnerabilities for a particular severity on a particular day. This data is retained for 365 days",
- "fields": [
- {
- "name": "count",
- "description": "Number of vulnerabilities.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "day",
- "description": "Date for the count.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "ISO8601Date",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity",
- "description": "Severity of the counted vulnerabilities.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverityConnection",
- "description": "The connection type for VulnerabilitiesCountByDayAndSeverity.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverity",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayAndSeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayConnection",
- "description": "The connection type for VulnerabilitiesCountByDay.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDay",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDayEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilitiesCountByDay",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "VulnerabilitiesExternalIssueLinkID",
- "description": "Identifier of Vulnerabilities::ExternalIssueLink.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "description": "Represents a vulnerability",
- "fields": [
- {
- "name": "confirmedAt",
- "description": "Timestamp of when the vulnerability state was changed to confirmed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "confirmedBy",
- "description": "The user that confirmed the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "details",
- "description": "Details of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "UNION",
- "name": "VulnerabilityDetail",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detectedAt",
- "description": "Timestamp of when the vulnerability was first detected.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "discussions",
- "description": "All discussions on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "DiscussionConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dismissedAt",
- "description": "Timestamp of when the vulnerability state was changed to dismissed.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dismissedBy",
- "description": "The user that dismissed the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalIssueLinks",
- "description": "List of external issue links related to the vulnerability.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "hasSolutions",
- "description": "Indicates whether there is a solution available for this vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "GraphQL ID of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "identifiers",
- "description": "Identifiers of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityIdentifier",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issueLinks",
- "description": "List of issue links related to the vulnerability.",
- "args": [
- {
- "name": "linkType",
- "description": "Filter issue links by link type.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityIssueLinkType",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLinkConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "location",
- "description": "Location metadata for the vulnerability. Its fields depend on the type of security scan that found the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "UNION",
- "name": "VulnerabilityLocation",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mergeRequest",
- "description": "Merge request that fixes the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "MergeRequest",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "notes",
- "description": "All notes on this noteable.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "NoteConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "primaryIdentifier",
- "description": "Primary identifier of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityIdentifier",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "project",
- "description": "The project on which the vulnerability was found.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Project",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reportType",
- "description": "Type of the security report that found the vulnerability (SAST, DEPENDENCY_SCANNING, CONTAINER_SCANNING, DAST, SECRET_DETECTION, COVERAGE_FUZZING, API_FUZZING)",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedAt",
- "description": "Timestamp of when the vulnerability state was changed to resolved.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Time",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedBy",
- "description": "The user that resolved the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "User",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "resolvedOnDefaultBranch",
- "description": "Indicates whether the vulnerability is fixed on the default branch or not.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "scanner",
- "description": "Scanner metadata for the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityScanner",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity",
- "description": "Severity of the vulnerability (INFO, UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL)",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state",
- "description": "State of the vulnerability (DETECTED, CONFIRMED, RESOLVED, DISMISSED)",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title",
- "description": "Title of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userNotesCount",
- "description": "Number of user notes attached to the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "userPermissions",
- "description": "Permissions for the current user on the resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityPermissions",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerabilityPath",
- "description": "URL to the vulnerability's details page.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
- {
- "kind": "INTERFACE",
- "name": "Noteable",
- "ofType": null
- }
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityConfirmInput",
- "description": "Autogenerated input type of VulnerabilityConfirm",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be confirmed.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityConfirmPayload",
- "description": "Autogenerated return type of VulnerabilityConfirm",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after state change.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityConnection",
- "description": "The connection type for Vulnerability.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "UNION",
- "name": "VulnerabilityDetail",
- "description": "Represents a vulnerability detail field. The fields with data will depend on the vulnerability detail type",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailBase",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailBoolean",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailCode",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailCommit",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailDiff",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailFileLocation",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailInt",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailList",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailMarkdown",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailModuleLocation",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailTable",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailText",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailUrl",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailBase",
- "description": "Represents the vulnerability details base",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailBoolean",
- "description": "Represents the vulnerability details boolean value",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Value of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailCode",
- "description": "Represents the vulnerability details code field",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lang",
- "description": "Language of the code.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Source code.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailCommit",
- "description": "Represents the vulnerability details commit field",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "The commit SHA value.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailDiff",
- "description": "Represents the vulnerability details diff field",
- "fields": [
- {
- "name": "after",
- "description": "Value of the field after the change.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "before",
- "description": "Value of the field before the change.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailFileLocation",
- "description": "Represents the vulnerability details location within a file in the project",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fileName",
- "description": "File name.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lineEnd",
- "description": "End line number of the file location.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "lineStart",
- "description": "Start line number of the file location.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailInt",
- "description": "Represents the vulnerability details integer value",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Value of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailList",
- "description": "Represents the vulnerability details list value",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "items",
- "description": "List of details.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "UNION",
- "name": "VulnerabilityDetail",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailMarkdown",
- "description": "Represents the vulnerability details Markdown field",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Value of the Markdown field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailModuleLocation",
- "description": "Represents the vulnerability details location within a file in the project",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "moduleName",
- "description": "Module name.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "offset",
- "description": "Offset of the module location.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailTable",
- "description": "Represents the vulnerability details table value",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "headers",
- "description": "Table headers.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "UNION",
- "name": "VulnerabilityDetail",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "rows",
- "description": "Table rows.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "UNION",
- "name": "VulnerabilityDetail",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailText",
- "description": "Represents the vulnerability details text field",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "value",
- "description": "Value of the text field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDetailUrl",
- "description": "Represents the vulnerability details URL field",
- "fields": [
- {
- "name": "description",
- "description": "Description of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fieldName",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "href",
- "description": "Href of the URL.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the field.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "text",
- "description": "Text of the URL.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityDismissInput",
- "description": "Autogenerated input type of VulnerabilityDismiss",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be dismissed.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "comment",
- "description": "Comment why vulnerability should be dismissed.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "dismissalReason",
- "description": "Reason why vulnerability should be dismissed.",
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityDismissalReason",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityDismissPayload",
- "description": "Autogenerated return type of VulnerabilityDismiss",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after dismissal.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityDismissalReason",
- "description": "The dismissal reason of the Vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "ACCEPTABLE_RISK",
- "description": "The likelihood of the Vulnerability occurring and its impact are deemed acceptable",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FALSE_POSITIVE",
- "description": "The Vulnerability was incorrectly identified as being present",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MITIGATING_CONTROL",
- "description": "There is a mitigating control that eliminates the Vulnerability or makes its risk acceptable",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "USED_IN_TESTS",
- "description": "The Vulnerability is used in tests and does not pose an actual risk",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NOT_APPLICABLE",
- "description": "Other reasons for dismissal",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLink",
- "description": "Represents an external issue link of a vulnerability",
- "fields": [
- {
- "name": "externalIssue",
- "description": "The external issue attached to the issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "ExternalIssue",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "id",
- "description": "GraphQL ID of the external issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilitiesExternalIssueLinkID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "linkType",
- "description": "Type of the external issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityExternalIssueLinkType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkConnection",
- "description": "The connection type for VulnerabilityExternalIssueLink.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLink",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityExternalIssueLinkCreateInput",
- "description": "Autogenerated input type of VulnerabilityExternalIssueLinkCreate",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "linkType",
- "description": "Type of the external issue link.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityExternalIssueLinkType",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "externalTracker",
- "description": "External tracker type of the external issue link.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityExternalIssueLinkExternalTracker",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkCreatePayload",
- "description": "Autogenerated return type of VulnerabilityExternalIssueLinkCreate",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalIssueLink",
- "description": "The created external issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLink",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityExternalIssueLinkDestroyInput",
- "description": "Autogenerated input type of VulnerabilityExternalIssueLinkDestroy",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "The global ID of the vulnerability external issue link.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilitiesExternalIssueLinkID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkDestroyPayload",
- "description": "Autogenerated return type of VulnerabilityExternalIssueLinkDestroy",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLinkEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityExternalIssueLink",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityExternalIssueLinkExternalTracker",
- "description": "The external tracker of the external issue link related to a vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "JIRA",
- "description": "Jira external tracker",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityExternalIssueLinkType",
- "description": "The type of the external issue link related to a vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "CREATED",
- "description": "Created link type",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityGrade",
- "description": "The grade of the vulnerable project",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "A",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "B",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "C",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "D",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "F",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "description": "Identifier of Vulnerability.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityIdentifier",
- "description": "Represents a vulnerability identifier",
- "fields": [
- {
- "name": "externalId",
- "description": "External ID of the vulnerability identifier.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "externalType",
- "description": "External type of the vulnerability identifier.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the vulnerability identifier.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "url",
- "description": "URL of the vulnerability identifier.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLink",
- "description": "Represents an issue link of a vulnerability",
- "fields": [
- {
- "name": "id",
- "description": "GraphQL ID of the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "ID",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "issue",
- "description": "The issue attached to issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "Issue",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "linkType",
- "description": "Type of the issue link.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityIssueLinkType",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLinkConnection",
- "description": "The connection type for VulnerabilityIssueLink.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLinkEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLink",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLinkEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityIssueLink",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityIssueLinkType",
- "description": "The type of the issue link related to a vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "RELATED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CREATED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "UNION",
- "name": "VulnerabilityLocation",
- "description": "Represents a vulnerability location. The fields with data will depend on the vulnerability report type",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": [
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationContainerScanning",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationCoverageFuzzing",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationDast",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationDependencyScanning",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationSast",
- "ofType": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationSecretDetection",
- "ofType": null
- }
- ]
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationContainerScanning",
- "description": "Represents the location of a vulnerability found by a container security scan",
- "fields": [
- {
- "name": "dependency",
- "description": "Dependency containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerableDependency",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "image",
- "description": "Name of the vulnerable container image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "operatingSystem",
- "description": "Operating system that runs on the vulnerable container image.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationCoverageFuzzing",
- "description": "Represents the location of a vulnerability found by a Coverage Fuzzing scan",
- "fields": [
- {
- "name": "blobPath",
- "description": "Blob path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endLine",
- "description": "Number of the last relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "file",
- "description": "Path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startLine",
- "description": "Number of the first relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableClass",
- "description": "Class containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableMethod",
- "description": "Method containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationDast",
- "description": "Represents the location of a vulnerability found by a DAST scan",
- "fields": [
- {
- "name": "hostname",
- "description": "Domain name of the vulnerable request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "param",
- "description": "Query parameter for the URL on which the vulnerability occurred.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "path",
- "description": "URL path and query string of the vulnerable request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "requestMethod",
- "description": "HTTP method of the vulnerable request.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationDependencyScanning",
- "description": "Represents the location of a vulnerability found by a dependency security scan",
- "fields": [
- {
- "name": "blobPath",
- "description": "Blob path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "dependency",
- "description": "Dependency containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerableDependency",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "file",
- "description": "Path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationSast",
- "description": "Represents the location of a vulnerability found by a SAST scan",
- "fields": [
- {
- "name": "blobPath",
- "description": "Blob path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endLine",
- "description": "Number of the last relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "file",
- "description": "Path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startLine",
- "description": "Number of the first relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableClass",
- "description": "Class containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableMethod",
- "description": "Method containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityLocationSecretDetection",
- "description": "Represents the location of a vulnerability found by a secret detection scan",
- "fields": [
- {
- "name": "blobPath",
- "description": "Blob path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "endLine",
- "description": "Number of the last relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "file",
- "description": "Path to the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "startLine",
- "description": "Number of the first relevant line in the vulnerable file.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableClass",
- "description": "Class containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerableMethod",
- "description": "Method containing the vulnerability.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityPermissions",
- "description": "Check permissions for the current user on a vulnerability",
- "fields": [
- {
- "name": "adminVulnerability",
- "description": "Indicates the user can perform `admin_vulnerability` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminVulnerabilityExternalIssueLink",
- "description": "Indicates the user can perform `admin_vulnerability_external_issue_link` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "adminVulnerabilityIssueLink",
- "description": "Indicates the user can perform `admin_vulnerability_issue_link` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createVulnerability",
- "description": "Indicates the user can perform `create_vulnerability` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createVulnerabilityExport",
- "description": "Indicates the user can perform `create_vulnerability_export` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "createVulnerabilityFeedback",
- "description": "Indicates the user can perform `create_vulnerability_feedback` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "destroyVulnerabilityFeedback",
- "description": "Indicates the user can perform `destroy_vulnerability_feedback` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "readVulnerabilityFeedback",
- "description": "Indicates the user can perform `read_vulnerability_feedback` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "updateVulnerabilityFeedback",
- "description": "Indicates the user can perform `update_vulnerability_feedback` on this resource",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "description": "The type of the security scan that found the vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DEPENDENCY_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONTAINER_SCANNING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DAST",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SECRET_DETECTION",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "COVERAGE_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "API_FUZZING",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityResolveInput",
- "description": "Autogenerated input type of VulnerabilityResolve",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be resolved.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityResolvePayload",
- "description": "Autogenerated return type of VulnerabilityResolve",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after state change.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "INPUT_OBJECT",
- "name": "VulnerabilityRevertToDetectedInput",
- "description": "Autogenerated input type of VulnerabilityRevertToDetected",
- "fields": null,
- "inputFields": [
- {
- "name": "id",
- "description": "ID of the vulnerability to be reverted.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "VulnerabilityID",
- "ofType": null
- }
- },
- "defaultValue": null
- },
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "interfaces": null,
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityRevertToDetectedPayload",
- "description": "Autogenerated return type of VulnerabilityRevertToDetected",
- "fields": [
- {
- "name": "clientMutationId",
- "description": "A unique identifier for the client performing the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "errors",
- "description": "Errors encountered during execution of the mutation.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vulnerability",
- "description": "The vulnerability after revert.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "Vulnerability",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityScanner",
- "description": "Represents a vulnerability scanner",
- "fields": [
- {
- "name": "externalId",
- "description": "External ID of the vulnerability scanner.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": "Name of the vulnerability scanner.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "reportType",
- "description": "Type of the vulnerability report.",
- "args": [
-
- ],
- "type": {
- "kind": "ENUM",
- "name": "VulnerabilityReportType",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "vendor",
- "description": "Vendor of the vulnerability scanner.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerConnection",
- "description": "The connection type for VulnerabilityScanner.",
- "fields": [
- {
- "name": "edges",
- "description": "A list of edges.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerEdge",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "nodes",
- "description": "A list of nodes.",
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "VulnerabilityScanner",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "pageInfo",
- "description": "Information to aid in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "PageInfo",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilityScannerEdge",
- "description": "An edge in a connection.",
- "fields": [
- {
- "name": "cursor",
- "description": "A cursor for use in pagination.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "node",
- "description": "The item at the end of the edge.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerabilityScanner",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerabilitySeveritiesCount",
- "description": "Represents vulnerability counts by severity",
- "fields": [
- {
- "name": "critical",
- "description": "Number of vulnerabilities of CRITICAL severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "high",
- "description": "Number of vulnerabilities of HIGH severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "info",
- "description": "Number of vulnerabilities of INFO severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "low",
- "description": "Number of vulnerabilities of LOW severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "medium",
- "description": "Number of vulnerabilities of MEDIUM severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "unknown",
- "description": "Number of vulnerabilities of UNKNOWN severity of the project",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilitySeverity",
- "description": "The severity of the vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "INFO",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNKNOWN",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LOW",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MEDIUM",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "HIGH",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CRITICAL",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilitySort",
- "description": "Vulnerability sort values",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "severity_desc",
- "description": "Severity in descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "severity_asc",
- "description": "Severity in ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title_desc",
- "description": "Title in descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "title_asc",
- "description": "Title in ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detected_desc",
- "description": "Detection timestamp in descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "detected_asc",
- "description": "Detection timestamp in ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "report_type_desc",
- "description": "Report Type in descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "report_type_asc",
- "description": "Report Type in ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state_desc",
- "description": "State in descending order",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "state_asc",
- "description": "State in ascending order",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "VulnerabilityState",
- "description": "The state of the vulnerability",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "DETECTED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "CONFIRMED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "RESOLVED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "DISMISSED",
- "description": null,
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerableDependency",
- "description": "Represents a vulnerable dependency. Used in vulnerability location data",
- "fields": [
- {
- "name": "package",
- "description": "The package associated with the vulnerable dependency.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "VulnerablePackage",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "version",
- "description": "The version of the vulnerable dependency.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerablePackage",
- "description": "Represents a vulnerable package. Used in vulnerability dependency data",
- "fields": [
- {
- "name": "name",
- "description": "The name of the vulnerable package.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "VulnerableProjectsByGrade",
- "description": "Represents vulnerability letter grades with associated projects",
- "fields": [
- {
- "name": "count",
- "description": "Number of projects within this grade.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "grade",
- "description": "Grade based on the highest severity vulnerability present.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "VulnerabilityGrade",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "projects",
- "description": "Projects within this grade.",
- "args": [
- {
- "name": "after",
- "description": "Returns the elements in the list that come after the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "before",
- "description": "Returns the elements in the list that come before the specified cursor.",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "first",
- "description": "Returns the first _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- },
- {
- "name": "last",
- "description": "Returns the last _n_ elements from the list.",
- "type": {
- "kind": "SCALAR",
- "name": "Int",
- "ofType": null
- },
- "defaultValue": null
- }
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "ProjectConnection",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__Directive",
- "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.",
- "fields": [
- {
- "name": "args",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__InputValue",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "locations",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "__DirectiveLocation",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "onField",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use `locations`."
- },
- {
- "name": "onFragment",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use `locations`."
- },
- {
- "name": "onOperation",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": true,
- "deprecationReason": "Use `locations`."
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "__DirectiveLocation",
- "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "QUERY",
- "description": "Location adjacent to a query operation.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "MUTATION",
- "description": "Location adjacent to a mutation operation.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SUBSCRIPTION",
- "description": "Location adjacent to a subscription operation.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FIELD",
- "description": "Location adjacent to a field.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FRAGMENT_DEFINITION",
- "description": "Location adjacent to a fragment definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FRAGMENT_SPREAD",
- "description": "Location adjacent to a fragment spread.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INLINE_FRAGMENT",
- "description": "Location adjacent to an inline fragment.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SCHEMA",
- "description": "Location adjacent to a schema definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "SCALAR",
- "description": "Location adjacent to a scalar definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "OBJECT",
- "description": "Location adjacent to an object type definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "FIELD_DEFINITION",
- "description": "Location adjacent to a field definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ARGUMENT_DEFINITION",
- "description": "Location adjacent to an argument definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INTERFACE",
- "description": "Location adjacent to an interface definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNION",
- "description": "Location adjacent to a union definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ENUM",
- "description": "Location adjacent to an enum definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ENUM_VALUE",
- "description": "Location adjacent to an enum value definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INPUT_OBJECT",
- "description": "Location adjacent to an input object type definition.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INPUT_FIELD_DEFINITION",
- "description": "Location adjacent to an input object field definition.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__EnumValue",
- "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.",
- "fields": [
- {
- "name": "deprecationReason",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "isDeprecated",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__Field",
- "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.",
- "fields": [
- {
- "name": "args",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__InputValue",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "deprecationReason",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "isDeprecated",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__InputValue",
- "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.",
- "fields": [
- {
- "name": "defaultValue",
- "description": "A GraphQL-formatted string representing the default value for this input value.",
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "description",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "type",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__Schema",
- "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.",
- "fields": [
- {
- "name": "directives",
- "description": "A list of all directives supported by this server.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Directive",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "mutationType",
- "description": "If this server supports mutation, the type that mutation operations will be rooted at.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "queryType",
- "description": "The type that query operations will be rooted at.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "subscriptionType",
- "description": "If this server support subscription, the type that subscription operations will be rooted at.",
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "types",
- "description": "A list of all types supported by this server.",
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "OBJECT",
- "name": "__Type",
- "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name and description, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.",
- "fields": [
- {
- "name": "description",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "enumValues",
- "description": null,
- "args": [
- {
- "name": "includeDeprecated",
- "description": null,
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__EnumValue",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "fields",
- "description": null,
- "args": [
- {
- "name": "includeDeprecated",
- "description": null,
- "type": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- },
- "defaultValue": "false"
- }
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Field",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "inputFields",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__InputValue",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "interfaces",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "kind",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "ENUM",
- "name": "__TypeKind",
- "ofType": null
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "name",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ofType",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- },
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "possibleTypes",
- "description": null,
- "args": [
-
- ],
- "type": {
- "kind": "LIST",
- "name": null,
- "ofType": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "OBJECT",
- "name": "__Type",
- "ofType": null
- }
- }
- },
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "inputFields": null,
- "interfaces": [
-
- ],
- "enumValues": null,
- "possibleTypes": null
- },
- {
- "kind": "ENUM",
- "name": "__TypeKind",
- "description": "An enum describing what kind of type a given `__Type` is.",
- "fields": null,
- "inputFields": null,
- "interfaces": null,
- "enumValues": [
- {
- "name": "SCALAR",
- "description": "Indicates this type is a scalar.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "OBJECT",
- "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INTERFACE",
- "description": "Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "UNION",
- "description": "Indicates this type is a union. `possibleTypes` is a valid field.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "ENUM",
- "description": "Indicates this type is an enum. `enumValues` is a valid field.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "INPUT_OBJECT",
- "description": "Indicates this type is an input object. `inputFields` is a valid field.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "LIST",
- "description": "Indicates this type is a list. `ofType` is a valid field.",
- "isDeprecated": false,
- "deprecationReason": null
- },
- {
- "name": "NON_NULL",
- "description": "Indicates this type is a non-null. `ofType` is a valid field.",
- "isDeprecated": false,
- "deprecationReason": null
- }
- ],
- "possibleTypes": null
- }
- ],
- "directives": [
- {
- "name": "include",
- "description": "Directs the executor to include this field or fragment only when the `if` argument is true.",
- "locations": [
- "FIELD",
- "FRAGMENT_SPREAD",
- "INLINE_FRAGMENT"
- ],
- "args": [
- {
- "name": "if",
- "description": "Included when true.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ]
- },
- {
- "name": "skip",
- "description": "Directs the executor to skip this field or fragment when the `if` argument is true.",
- "locations": [
- "FIELD",
- "FRAGMENT_SPREAD",
- "INLINE_FRAGMENT"
- ],
- "args": [
- {
- "name": "if",
- "description": "Skipped when true.",
- "type": {
- "kind": "NON_NULL",
- "name": null,
- "ofType": {
- "kind": "SCALAR",
- "name": "Boolean",
- "ofType": null
- }
- },
- "defaultValue": null
- }
- ]
- },
- {
- "name": "deprecated",
- "description": "Marks an element of a GraphQL schema as no longer supported.",
- "locations": [
- "FIELD_DEFINITION",
- "ENUM_VALUE"
- ],
- "args": [
- {
- "name": "reason",
- "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted in [Markdown](https://daringfireball.net/projects/markdown/).",
- "type": {
- "kind": "SCALAR",
- "name": "String",
- "ofType": null
- },
- "defaultValue": "\"No longer supported\""
- }
- ]
- }
- ]
- }
- }
-} \ No newline at end of file
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index f49a12568ed..c6ad2cb82c7 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -26,6 +26,150 @@ in [Removed Items](../removed_items.md).
<!-- vale gitlab.Spelling = NO -->
+## Queries
+
+Queries are used to get the resources, filter or query them.
+
+For more information, visit [Queries and Mutations](https://graphql.org/learn/queries/).
+
+### CiApplicationSettings
+
+CI related settings that apply to the entire instance.
+
+### CiConfig
+
+Get linted and processed contents of a CI config. Should not be requested more than once per request.
+
+| Name | Description | Type |
+| ----- | ---- | ----------- |
+| `content` | Contents of `.gitlab-ci.yml`. | String! |
+| `dryRun` | Run pipeline creation simulation, or only do static check. | Boolean |
+| `projectPath` | The project of the CI config. | ID! |
+
+### ContainerRepository
+
+Find a container repository.
+
+| Name | Description | Type |
+| ----- | ---- | ----------- |
+| `id` | The global ID of the container repository. | ContainerRepositoryID! |
+
+### CurrentUser
+
+Get information about current user.
+
+### DesignManagement
+
+Fields related to design management.
+
+### Echo
+
+Text to echo back.
+
+| Name | Description | Type |
+| ----- | ---- | ----------- |
+| `text` | Text to echo back. | String! |
+
+### GeoNode
+
+Find a Geo node.
+
+| Name | Description | Type |
+| ----- | ---- | ----------- |
+| `name` | The name of the Geo node. Defaults to the current Geo node name. | String |
+
+### Group
+
+Find a group.
+
+| Name | Description | Type |
+| ----- | ---- | ----------- |
+| `fullPath` | The full path of the project, group or namespace, e.g., `gitlab-org/gitlab-foss`. | ID! |
+
+### InstanceSecurityDashboard
+
+Fields related to Instance Security Dashboard.
+
+### Issue
+
+Find an Issue.
+
+| Name | Description | Type |
+| ----- | ---- | ----------- |
+| `id` | The global ID of the Issue. | IssueID! |
+
+### Iteration
+
+Find an iteration.
+
+| Name | Description | Type |
+| ----- | ---- | ----------- |
+| `id` | Find an iteration by its ID. | IterationID! |
+
+### Metadata
+
+Metadata about GitLab.
+
+### Milestone
+
+Find a milestone.
+
+| Name | Description | Type |
+| ----- | ---- | ----------- |
+| `id` | Find a milestone by its ID. | MilestoneID! |
+
+### Namespace
+
+Find a namespace.
+
+| Name | Description | Type |
+| ----- | ---- | ----------- |
+| `fullPath` | The full path of the project, group or namespace, e.g., `gitlab-org/gitlab-foss`. | ID! |
+
+### Package
+
+Find a package.
+
+| Name | Description | Type |
+| ----- | ---- | ----------- |
+| `id` | The global ID of the package. | PackagesPackageID! |
+
+### Project
+
+Find a project.
+
+| Name | Description | Type |
+| ----- | ---- | ----------- |
+| `fullPath` | The full path of the project, group or namespace, e.g., `gitlab-org/gitlab-foss`. | ID! |
+
+### RunnerSetup
+
+Get runner setup instructions.
+
+| Name | Description | Type |
+| ----- | ---- | ----------- |
+| `architecture` | Architecture to generate the instructions for. | String! |
+| `groupId` | Group to register the runner for. | GroupID |
+| `platform` | Platform to generate the instructions for. | String! |
+| `projectId` | Project to register the runner for. | ProjectID |
+
+### User
+
+Find a user.
+
+| Name | Description | Type |
+| ----- | ---- | ----------- |
+| `id` | ID of the User. | UserID |
+| `username` | Username of the User. | String |
+
+### Vulnerability
+
+Find a vulnerability.
+
+| Name | Description | Type |
+| ----- | ---- | ----------- |
+| `id` | The Global ID of the Vulnerability. | VulnerabilityID! |
+
## Object types
Object types represent the resources that the GitLab GraphQL API can return.
@@ -130,6 +274,9 @@ An endpoint and credentials used to accept alerts for a project.
| `apiUrl` | String | URL at which Prometheus metrics can be queried to populate the metrics dashboard. |
| `id` | ID! | ID of the integration. |
| `name` | String | Name of the integration. |
+| `payloadAlertFields` | AlertManagementPayloadAlertField! => Array | Extract alert fields from payload example for custom mapping. |
+| `payloadAttributeMappings` | AlertManagementPayloadAlertMappingField! => Array | The custom mapping of GitLab alert attributes to fields from the payload_example. |
+| `payloadExample` | JsonString | The example of an alert payload. |
| `token` | String | Token used to authenticate alert notification requests. |
| `type` | AlertManagementIntegrationType! | Type of integration. |
| `url` | String | Endpoint which accepts alert notifications. |
@@ -144,6 +291,17 @@ Parsed field from an alert used for custom mappings.
| `path` | String! => Array | Path to value inside payload JSON. |
| `type` | AlertManagementPayloadAlertFieldType | Type of the parsed value. |
+### AlertManagementPayloadAlertMappingField
+
+Parsed field (with its name) from an alert used for custom mappings.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `fieldName` | AlertManagementPayloadAlertFieldName | A GitLab alert field name. |
+| `label` | String | Human-readable label of the payload path. |
+| `path` | String! => Array | Path to value inside payload JSON. |
+| `type` | AlertManagementPayloadAlertFieldType | Type of the parsed value. |
+
### AlertManagementPrometheusIntegration
An endpoint and credentials used to accept Prometheus alerts for a project.
@@ -204,7 +362,7 @@ Autogenerated return type of ApiFuzzingCiConfigurationCreate.
### ApiFuzzingScanProfile
-An API Fuzzing scan profile..
+An API Fuzzing scan profile.
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -280,7 +438,7 @@ Autogenerated return type of AwardEmojiToggle.
### Board
-Represents a project or group board.
+Represents a project or group issue board.
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -559,6 +717,7 @@ Autogenerated return type of ClusterAgentDelete.
| `clusterAgent` | ClusterAgent | Cluster agent this token is associated with. |
| `createdAt` | Time | Timestamp the token was created. |
| `createdByUser` | User | The user who created the token. |
+| `description` | String | Description of the token. |
| `id` | ClustersAgentTokenID! | Global ID of the token. |
### ClusterAgentTokenCreatePayload
@@ -643,7 +802,7 @@ Represents a ComplianceFramework associated with a Project.
| `description` | String! | Description of the compliance framework. |
| `id` | ID! | Compliance framework ID. |
| `name` | String! | Name of the compliance framework. |
-| `pipelineConfigurationFullPath` | String | Full path of the compliance pipeline configuration stored in a project repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hippa`. |
+| `pipelineConfigurationFullPath` | String | Full path of the compliance pipeline configuration stored in a project repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hipaa` **(ULTIMATE)**. |
### ComposerMetadata
@@ -1539,9 +1698,13 @@ Represents an epic board.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `id` | BoardsEpicBoardID! | Global ID of the board. |
+| `hideBacklogList` | Boolean | Whether or not backlog list is hidden. |
+| `hideClosedList` | Boolean | Whether or not closed list is hidden. |
+| `id` | BoardsEpicBoardID! | Global ID of the epic board. |
| `lists` | EpicListConnection | Epic board lists. |
-| `name` | String | Name of the board. |
+| `name` | String | Name of the epic board. |
+| `webPath` | String! | Web path of the epic board. |
+| `webUrl` | String! | Web URL of the epic board. |
### EpicBoardCreatePayload
@@ -1955,7 +2118,7 @@ Describes an incident management on-call schedule.
### IncidentManagementOncallShift
-A block of time for which a participant is on-call..
+A block of time for which a participant is on-call.
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -1972,16 +2135,6 @@ A block of time for which a participant is on-call..
| `vulnerabilityScanners` | VulnerabilityScannerConnection | Vulnerability scanners reported on the vulnerabilities from projects selected in Instance Security Dashboard. |
| `vulnerabilitySeveritiesCount` | VulnerabilitySeveritiesCount | Counts for each vulnerability severity from projects selected in Instance Security Dashboard. |
-### InstanceStatisticsMeasurement
-
-Represents a recorded measurement (object count) for the Admins.
-
-| Field | Type | Description |
-| ----- | ---- | ----------- |
-| `count` | Int! | Object count. |
-| `identifier` | MeasurementIdentifier! | The type of objects being measured. |
-| `recordedAt` | Time | The time the measurement was recorded. |
-
### Issue
| Field | Type | Description |
@@ -2262,11 +2415,13 @@ Autogenerated return type of JiraImportUsers.
| Field | Type | Description |
| ----- | ---- | ----------- |
| `color` | String! | Background color of the label. |
+| `createdAt` | Time! | When this label was created. |
| `description` | String | Description of the label (Markdown rendered as HTML for caching). |
| `descriptionHtml` | String | The GitLab Flavored Markdown rendering of `description` |
| `id` | ID! | Label ID. |
| `textColor` | String! | Text color of the label. |
| `title` | String! | Content of the label. |
+| `updatedAt` | Time! | When this label was last updated. |
### LabelCreatePayload
@@ -2780,7 +2935,7 @@ Represents a version of a package in the Package Registry.
### PageInfo
-Information about pagination in a connection..
+Information about pagination in a connection.
| Field | Type | Description |
| ----- | ---- | ----------- |
@@ -2810,6 +2965,7 @@ Information about pagination in a connection..
| `path` | String | Relative path to the pipeline's page. |
| `project` | Project | Project the pipeline belongs to. |
| `retryable` | Boolean! | Specifies if a pipeline can be retried. |
+| `securityReportFindings` | PipelineSecurityReportFindingConnection | Vulnerability findings reported on the pipeline. |
| `securityReportSummary` | SecurityReportSummary | Vulnerability and scanned resource counts for each security scanner of the pipeline. |
| `sha` | String! | SHA of the pipeline's commit. |
| `sourceJob` | CiJob | Job where pipeline was triggered from. |
@@ -2874,6 +3030,25 @@ Autogenerated return type of PipelineRetry.
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `pipeline` | Pipeline | The pipeline after mutation. |
+### PipelineSecurityReportFinding
+
+Represents vulnerability finding of a security report on the pipeline.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `confidence` | String | Type of the security report that found the vulnerability. |
+| `description` | String | Description of the vulnerability finding. |
+| `identifiers` | VulnerabilityIdentifier! => Array | Identifiers of the vulnerabilit finding. |
+| `location` | VulnerabilityLocation | Location metadata for the vulnerability. Its fields depend on the type of security scan that found the vulnerability. |
+| `name` | String | Name of the vulnerability finding. |
+| `project` | Project | The project on which the vulnerability finding was found. |
+| `projectFingerprint` | String | Name of the vulnerability finding. |
+| `reportType` | VulnerabilityReportType | Type of the security report that found the vulnerability finding. |
+| `scanner` | VulnerabilityScanner | Scanner metadata for the vulnerability. |
+| `severity` | VulnerabilitySeverity | Severity of the vulnerability finding. |
+| `solution` | String | URL to the vulnerability's details page. |
+| `uuid` | String | Name of the vulnerability finding. |
+
### Project
| Field | Type | Description |
@@ -2882,6 +3057,7 @@ Autogenerated return type of PipelineRetry.
| `alertManagementAlert` | AlertManagementAlert | A single Alert Management alert of the project. |
| `alertManagementAlertStatusCounts` | AlertManagementAlertStatusCountsType | Counts of alerts by status for the project. |
| `alertManagementAlerts` | AlertManagementAlertConnection | Alert Management alerts of the project. |
+| `alertManagementHttpIntegrations` | AlertManagementHttpIntegrationConnection | HTTP Integrations which can receive alerts for the project. |
| `alertManagementIntegrations` | AlertManagementIntegrationConnection | Integrations which can receive alerts for the project. |
| `alertManagementPayloadFields` | AlertManagementPayloadAlertField! => Array | Extract alert fields from payload for custom mapping. |
| `allowMergeOnSkippedPipeline` | Boolean | If `only_allow_merge_if_pipeline_succeeds` is true, indicates if merge requests of the project can also be merged with skipped jobs. |
@@ -4053,6 +4229,16 @@ Autogenerated return type of UpdateSnippet.
| `spam` | Boolean | Indicates whether the operation was detected as definite spam. There is no option to resubmit the request with a CAPTCHA response. |
| `spamLogId` | Int | The spam log ID which must be passed along with a valid CAPTCHA response for an operation to be completed. Included only when an operation was not completed because "NeedsCaptchaResponse" is true. |
+### UsageTrendsMeasurement
+
+Represents a recorded measurement (object count) for the Admins.
+
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+| `count` | Int! | Object count. |
+| `identifier` | MeasurementIdentifier! | The type of objects being measured. |
+| `recordedAt` | Time | The time the measurement was recorded. |
+
### User
| Field | Type | Description |
@@ -4172,9 +4358,9 @@ Represents the vulnerability details base.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
### VulnerabilityDetailBoolean
@@ -4182,9 +4368,9 @@ Represents the vulnerability details boolean value.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `value` | Boolean! | Value of the field. |
### VulnerabilityDetailCode
@@ -4193,10 +4379,10 @@ Represents the vulnerability details code field.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
| `lang` | String | Language of the code. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `value` | String! | Source code. |
### VulnerabilityDetailCommit
@@ -4205,9 +4391,9 @@ Represents the vulnerability details commit field.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `value` | String! | The commit SHA value. |
### VulnerabilityDetailDiff
@@ -4218,9 +4404,9 @@ Represents the vulnerability details diff field.
| ----- | ---- | ----------- |
| `after` | String! | Value of the field after the change. |
| `before` | String! | Value of the field before the change. |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
### VulnerabilityDetailFileLocation
@@ -4228,12 +4414,12 @@ Represents the vulnerability details location within a file in the project.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
| `fileName` | String! | File name. |
| `lineEnd` | Int! | End line number of the file location. |
| `lineStart` | Int! | Start line number of the file location. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
### VulnerabilityDetailInt
@@ -4241,9 +4427,9 @@ Represents the vulnerability details integer value.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `value` | Int! | Value of the field. |
### VulnerabilityDetailList
@@ -4252,10 +4438,10 @@ Represents the vulnerability details list value.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
| `items` | VulnerabilityDetail! => Array | List of details. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
### VulnerabilityDetailMarkdown
@@ -4263,9 +4449,9 @@ Represents the vulnerability details Markdown field.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `value` | String! | Value of the Markdown field. |
### VulnerabilityDetailModuleLocation
@@ -4274,10 +4460,10 @@ Represents the vulnerability details location within a file in the project.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
| `moduleName` | String! | Module name. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `offset` | Int! | Offset of the module location. |
### VulnerabilityDetailTable
@@ -4286,10 +4472,10 @@ Represents the vulnerability details table value.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
| `headers` | VulnerabilityDetail! => Array | Table headers. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `rows` | VulnerabilityDetail! => Array | Table rows. |
### VulnerabilityDetailText
@@ -4298,9 +4484,9 @@ Represents the vulnerability details text field.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `value` | String! | Value of the text field. |
### VulnerabilityDetailUrl
@@ -4309,10 +4495,10 @@ Represents the vulnerability details URL field.
| Field | Type | Description |
| ----- | ---- | ----------- |
-| `description` | String! | Description of the field. |
+| `description` | String | Description of the field. |
| `fieldName` | String | Name of the field. |
| `href` | String! | Href of the URL. |
-| `name` | String! | Name of the field. |
+| `name` | String | Name of the field. |
| `text` | String | Text of the URL. |
### VulnerabilityDismissPayload
@@ -5116,7 +5302,7 @@ Possible identifier types for a measurement.
### MergeRequestNewState
-New state to apply to a merge request..
+New state to apply to a merge request.
| Value | Description |
| ----- | ----------- |
@@ -5309,9 +5495,9 @@ Size of UI component in SAST configuration page.
| Value | Description |
| ----- | ----------- |
-| `LARGE` | |
-| `MEDIUM` | |
-| `SMALL` | |
+| `LARGE` | The size of UI component in SAST configuration page is large. |
+| `MEDIUM` | The size of UI component in SAST configuration page is medium. |
+| `SMALL` | The size of UI component in SAST configuration page is small. |
### SecurityReportTypeEnum
diff --git a/doc/api/invitations.md b/doc/api/invitations.md
index 7259dddec8c..e9b09ba9708 100644
--- a/doc/api/invitations.md
+++ b/doc/api/invitations.md
@@ -38,7 +38,7 @@ POST /projects/:id/invitations
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user |
-| `email` | integer/string | yes | The email of the new member or multiple emails separated by commas |
+| `email` | string | yes | The email of the new member or multiple emails separated by commas |
| `access_level` | integer | yes | A valid access level |
| `expires_at` | string | no | A date string in the format YEAR-MONTH-DAY |
diff --git a/doc/api/merge_request_context_commits.md b/doc/api/merge_request_context_commits.md
index 0b4b96b889b..cd38d972320 100644
--- a/doc/api/merge_request_context_commits.md
+++ b/doc/api/merge_request_context_commits.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
type: reference, api
---
diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md
index d9bcba96fdc..7fec630b3eb 100644
--- a/doc/api/merge_requests.md
+++ b/doc/api/merge_requests.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
type: reference, api
---
diff --git a/doc/api/notification_settings.md b/doc/api/notification_settings.md
index a85c6475331..57eac61de46 100644
--- a/doc/api/notification_settings.md
+++ b/doc/api/notification_settings.md
@@ -39,6 +39,7 @@ If the `custom` level is used, specific email events can be controlled. Availabl
- `fixed_pipeline`
- `success_pipeline`
- `moved_project`
+- `merge_when_pipeline_succeeds`
- `new_epic` **(ULTIMATE)**
## Global notification settings
@@ -94,6 +95,7 @@ curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab
| `fixed_pipeline` | boolean | no | Enable/disable this notification |
| `success_pipeline` | boolean | no | Enable/disable this notification |
| `moved_project` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30371) in GitLab 13.3) |
+| `merge_when_pipeline_succeeds` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/244840) in GitLab 13.9) |
| `new_epic` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5863) in GitLab 11.3) **(ULTIMATE)** |
Example response:
@@ -165,6 +167,7 @@ curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab
| `fixed_pipeline` | boolean | no | Enable/disable this notification |
| `success_pipeline` | boolean | no | Enable/disable this notification |
| `moved_project` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30371) in GitLab 13.3) |
+| `merge_when_pipeline_succeeds` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/244840) in GitLab 13.9) |
| `new_epic` | boolean | no | Enable/disable this notification ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5863) in GitLab 11.3) **(ULTIMATE)** |
Example responses:
diff --git a/doc/api/openapi/openapi_interactive.md b/doc/api/openapi/openapi_interactive.md
index 0f1544b139d..95d7bba8081 100644
--- a/doc/api/openapi/openapi_interactive.md
+++ b/doc/api/openapi/openapi_interactive.md
@@ -27,7 +27,7 @@ and example server responses. Some parameters include a default or a list of all
![API viewer screenshot](img/apiviewer04-fs8.png)
-## Starting an interactive sesssion
+## Starting an interactive session
A [Personal access token](../../user/profile/personal_access_tokens.md) (PAT) is one way to
start an interactive session. To do this, select **Authorize** from the main page, and a
diff --git a/doc/api/project_snippets.md b/doc/api/project_snippets.md
index c5adf361fb6..b07a4a4addf 100644
--- a/doc/api/project_snippets.md
+++ b/doc/api/project_snippets.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference, api
---
-# Project snippets
+# Project snippets **(FREE)**
## Snippet visibility level
diff --git a/doc/api/project_templates.md b/doc/api/project_templates.md
index 6251d31660c..459bd8baff2 100644
--- a/doc/api/project_templates.md
+++ b/doc/api/project_templates.md
@@ -34,7 +34,7 @@ GET /projects/:id/templates/:type
| Attribute | Type | Required | Description |
| ---------- | ------ | -------- | ----------- |
| `id` | integer / string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
-| `type` | string | yes | The type `(dockerfiles|gitignores|gitlab_ci_ymls|licenses|issues|merge_requests)` of the template |
+| `type` | string | yes | The type of the template. Accepted values are: `dockerfiles`, `gitignores`, `gitlab_ci_ymls`, `licenses`, `issues`, `merge_requests` |
Example response (licenses):
@@ -100,7 +100,7 @@ GET /projects/:id/templates/:type/:name
| Attribute | Type | Required | Description |
| ---------- | ------ | -------- | ----------- |
| `id` | integer / string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
-| `type` | string | yes| The type `(dockerfiles|gitignores|gitlab_ci_ymls|licenses|issues|merge_requests)` of the template |
+| `type` | string | yes| The type of the template. One of: `dockerfiles`, `gitignores`, `gitlab_ci_ymls`, `licenses`, `issues`, or `merge_requests`. |
| `name` | string | yes | The key of the template, as obtained from the collection endpoint |
| `source_template_project_id` | integer | no | The project ID where a given template is being stored. This is useful when multiple templates from different projects have the same name. If multiple templates have the same name, the match from `closest ancestor` is returned if `source_template_project_id` is not specified |
| `project` | string | no | The project name to use when expanding placeholders in the template. Only affects licenses |
diff --git a/doc/api/projects.md b/doc/api/projects.md
index 321a95af8b5..b8687314697 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -1061,7 +1061,7 @@ POST /projects
| `avatar` | mixed | **{dotted-circle}** No | Image file for avatar of the project. |
| `build_coverage_regex` | string | **{dotted-circle}** No | Test coverage parsing. |
| `build_git_strategy` | string | **{dotted-circle}** No | The Git strategy. Defaults to `fetch`. |
-| `build_timeout` | integer | **{dotted-circle}** No | The maximum amount of time in minutes that a job is able run (in seconds). |
+| `build_timeout` | integer | **{dotted-circle}** No | The maximum amount of time, in seconds, that a job can run. |
| `builds_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
| `ci_config_path` | string | **{dotted-circle}** No | The path to CI configuration file. |
| `container_expiration_policy_attributes` | hash | **{dotted-circle}** No | Update the image cleanup policy for this project. Accepts: `cadence` (string), `keep_n` (integer), `older_than` (string), `name_regex` (string), `name_regex_delete` (string), `name_regex_keep` (string), `enabled` (boolean). |
diff --git a/doc/api/services.md b/doc/api/services.md
index 16431937c7a..64daca1793a 100644
--- a/doc/api/services.md
+++ b/doc/api/services.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Services API
+# Services API **(FREE)**
NOTE:
This API requires an access token with Maintainer or Owner permissions
@@ -814,7 +814,7 @@ Parameters:
| `username` | string | yes | The username of the user created to be used with GitLab/Jira. |
| `password` | string | yes | The password of the user created to be used with GitLab/Jira. |
| `active` | boolean | no | Activates or deactivates the service. Defaults to false (deactivated). |
-| `jira_issue_transition_id` | string | no | The ID of a transition that moves issues to a closed state. You can find this number under the Jira workflow administration (**Administration > Issues > Workflows**) by selecting **View** under **Operations** of the desired workflow of your project. The ID of each state can be found inside the parenthesis of each transition name under the transitions ID column. By default, this ID is set to `2`. |
+| `jira_issue_transition_id` | string | no | The ID of one or more transitions to move issues to a closed state. Read [custom issue transitions](../user/project/integrations/jira.md#custom-issue-transitions) for details. Defaults to a blank string, which enables [automatic issue transitions](../user/project/integrations/jira.md#automatic-issue-transitions). |
| `commit_events` | boolean | false | Enable notifications for commit events |
| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
| `comment_on_event_enabled` | boolean | false | Enable comments inside Jira issues on each GitLab event (commit / merge request) |
diff --git a/doc/api/snippets.md b/doc/api/snippets.md
index 670045df66d..3b7184c9933 100644
--- a/doc/api/snippets.md
+++ b/doc/api/snippets.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference, api
---
-# Snippets API
+# Snippets API **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/6373) in GitLab 8.15.
@@ -230,7 +230,7 @@ curl --request POST "https://gitlab.example.com/api/v4/snippets" \
"content": "Hello world",
"file_path": "test.txt"
}
- ]
+ ]
}
```
diff --git a/doc/api/wikis.md b/doc/api/wikis.md
index 43587da9473..1b8d091e3fd 100644
--- a/doc/api/wikis.md
+++ b/doc/api/wikis.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference, api
---
-# Project wikis API
+# Project wikis API **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/13372) in GitLab 10.0.
diff --git a/doc/ci/README.md b/doc/ci/README.md
index 9b555c0ee68..b1bcb578daf 100644
--- a/doc/ci/README.md
+++ b/doc/ci/README.md
@@ -37,6 +37,9 @@ the development cycle, ensuring that all the code deployed to
production complies with the code standards you established for
your app.
+GitLab can also automatically detect, build, test, deploy, and
+monitor your applications by using [Auto DevOps](../topics/autodevops/index.md).
+
For a complete overview of these methodologies and GitLab CI/CD,
read the [Introduction to CI/CD with GitLab](introduction/index.md).
diff --git a/doc/ci/ci_cd_for_external_repos/github_integration.md b/doc/ci/ci_cd_for_external_repos/github_integration.md
index 2a8b050b224..deadc4458a2 100644
--- a/doc/ci/ci_cd_for_external_repos/github_integration.md
+++ b/doc/ci/ci_cd_for_external_repos/github_integration.md
@@ -22,7 +22,7 @@ cannot be used to authenticate with GitHub as an external CI/CD repository.
## Connect with Personal Access Token
Personal access tokens can only be used to connect GitHub.com
-repositories to GitLab, and the GitHub user must have the [owner role](https://docs.github.com/en/free-pro-team@latest/github/getting-started-with-github/access-permissions-on-github).
+repositories to GitLab, and the GitHub user must have the [owner role](https://docs.github.com/en/github/getting-started-with-github/access-permissions-on-github).
To perform a one-off authorization with GitHub to grant GitLab access your
repositories:
diff --git a/doc/ci/cloud_deployment/ecs/img/container-name.png b/doc/ci/cloud_deployment/ecs/img/container-name.png
new file mode 100644
index 00000000000..c2b4f23454b
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/container-name.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/container-port-mapping.png b/doc/ci/cloud_deployment/ecs/img/container-port-mapping.png
new file mode 100644
index 00000000000..ca390bf68a0
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/container-port-mapping.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/ecs-launch-status.png b/doc/ci/cloud_deployment/ecs/img/ecs-launch-status.png
new file mode 100644
index 00000000000..3a8a249af1b
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/ecs-launch-status.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/ecs-policy.png b/doc/ci/cloud_deployment/ecs/img/ecs-policy.png
new file mode 100644
index 00000000000..088a45bb065
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/ecs-policy.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/ecs-task-definitions.png b/doc/ci/cloud_deployment/ecs/img/ecs-task-definitions.png
new file mode 100644
index 00000000000..9404e721d5c
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/ecs-task-definitions.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/initial-pipeline.png b/doc/ci/cloud_deployment/ecs/img/initial-pipeline.png
new file mode 100644
index 00000000000..7072f550586
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/initial-pipeline.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/rails-template.png b/doc/ci/cloud_deployment/ecs/img/rails-template.png
new file mode 100644
index 00000000000..02c67f8dd21
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/rails-template.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/registry.png b/doc/ci/cloud_deployment/ecs/img/registry.png
new file mode 100644
index 00000000000..694d83fd0ce
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/registry.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/service-parameter.png b/doc/ci/cloud_deployment/ecs/img/service-parameter.png
new file mode 100644
index 00000000000..b659b18d0b6
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/service-parameter.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/service-running.png b/doc/ci/cloud_deployment/ecs/img/service-running.png
new file mode 100644
index 00000000000..2b78960d5f4
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/service-running.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/view-running-app-2.png b/doc/ci/cloud_deployment/ecs/img/view-running-app-2.png
new file mode 100644
index 00000000000..e64a378e11c
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/view-running-app-2.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/img/view-running-app.png b/doc/ci/cloud_deployment/ecs/img/view-running-app.png
new file mode 100644
index 00000000000..360dd285182
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/img/view-running-app.png
Binary files differ
diff --git a/doc/ci/cloud_deployment/ecs/quick_start_guide.md b/doc/ci/cloud_deployment/ecs/quick_start_guide.md
new file mode 100644
index 00000000000..9b1d46351e2
--- /dev/null
+++ b/doc/ci/cloud_deployment/ecs/quick_start_guide.md
@@ -0,0 +1,250 @@
+---
+stage: Release
+group: Release
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Getting started with Continuous Deployment to AWS Elastic Container Service **(FREE)**
+
+This step-by-step guide helps you use [Continuous Deployment to ECS](../index.md#deploy-your-application-to-the-aws-elastic-container-service-ecs)
+that deploys a project hosted on GitLab.com to [Elastic Container Service](https://aws.amazon.com/ecs)
+(ECS) on AWS.
+
+In this guide, you begin by creating an ECS cluster manually using the AWS console. You create and
+deploy a simple application that you create from a GitLab template.
+
+These instructions work for both SaaS and self-managed GitLab instances.
+Ensure your own [runners are configured](../../runners/README.md).
+
+## Prerequisites
+
+- An [AWS account](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/).
+ Sign in with an existing AWS account or create a new one.
+- In this guide, you create an infrastructure in [`us-east-2` region](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html).
+ You can use any region, but do not change it after you begin.
+
+## Create an infrastructure and initial deployment on AWS
+
+For deploying an application from GitLab, you must first create an infrastructure and initial
+deployment on AWS.
+This includes an [ECS cluster](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html)
+and related components, such as
+[ECS task definitions](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html),
+[ECS services](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html),
+and containerized application image.
+
+For the first step here, you create a demo application from a project template.
+
+### Create a new project from a template
+
+Use a GitLab project template to get started. As the name suggests, these projects provide a
+bare-bones application built on some well-known frameworks.
+
+1. In GitLab, click the plus icon (**{plus-square}**) at the top of the navigation bar, and select
+ **New project**.
+
+1. Click the **Create from template** button, where you can choose from a Ruby on Rails, Spring, or
+ NodeJS Express project. For this guide, use the Ruby on Rails template.
+
+ ![Select project template](img/rails-template.png)
+
+1. Give your project a name. In this example, it's named `ecs-demo`. Make it public so that you can
+ take advantage of the features available in the
+ [GitLab Ultimate plan](https://about.gitlab.com/pricing/).
+
+1. Click **Create project**.
+
+Now that you created a demo project, you must containerize the application and push it to the
+container registry.
+
+### Push a containerized application image to GitLab Container Registry
+
+[ECS](https://aws.amazon.com/ecs) is a container orchestration service, meaning that you must
+provide a containerized application image during the infrastructure build. To do so, you can use
+GitLab [Auto Build](../../../topics/autodevops/stages.md#auto-build)
+and [Container Registry](../../../user/packages/container_registry/index.md).
+
+1. Go to **ecs-demo** project on GitLab.
+1. Click **Setup up CI/CD**. It brings you to a [`.gitlab-ci.yml`](../../README.md#getting-started)
+ creation form.
+1. Copy and paste the following content into the empty `.gitlab-ci.yml`. This defines
+ [a pipeline for continuous deployment to ECS](../index.md#deploy-your-application-to-the-aws-elastic-container-service-ecs).
+
+ ```yaml
+ include:
+ - template: AWS/Deploy-ECS.gitlab-ci.yml
+ ```
+
+1. Click **Commit Changes**. It automatically triggers a new pipeline. In this pipeline, the `build`
+ job containerizes the application and pushes the image to [GitLab Container Registry](../../../user/packages/container_registry/index.md).
+
+ ![Create project](img/initial-pipeline.png)
+
+1. Visit **Packages & Registries > Container Registry**. Make sure the application image has been
+ pushed.
+
+ ![Create project](img/registry.png)
+
+Now you have a containerized application image that can be pulled from AWS. Next, you define the
+spec of how this application image is used in AWS.
+
+Note that the `production_ecs` job fails because ECS Cluster is not connected yet. You'll fix this
+later.
+
+### Create an ECS task definition
+
+[ECS Task definitions](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html)
+is a specification about how the application image is started by an [ECS service](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html).
+
+1. Go to **ECS > Task Definitions** on [AWS console](https://aws.amazon.com/).
+1. Click **Create new Task Definition**.
+
+ ![Create project](img/ecs-task-definitions.png)
+
+1. Choose **EC2** as the launch type. Click **Next Step**.
+1. Set `ecs_demo` to **Task Definition Name**.
+1. Set `512` to **Task Size > Task memory** and **Task CPU**.
+1. Click **Container Definitions > Add container**. This opens a container registration form.
+1. Set `web` to **Container name**.
+1. Set `registry.gitlab.com/<your-namespace>/ecs-demo/master:latest` to **Image**.
+ Alternatively, you can copy and paste the image path from the [GitLab Container Registry page](#push-a-containerized-application-image-to-gitlab-container-registry).
+
+ ![Create project](img/container-name.png)
+
+1. Add a port mapping. Set `80` to **Host Port** and `5000` to **Container port**.
+
+ ![Create project](img/container-port-mapping.png)
+
+1. Click **Create**.
+
+Now you have the initial task definition. Next, you create an actual infrastructure to run the
+application image.
+
+### Create an ECS cluster
+
+An [ECS cluster](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html)
+is a virtual group of [ECS services](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html).
+It's also associated with EC2 or Fargate as the computation resource.
+
+1. Go to **ECS > Clusters** on [AWS console](https://aws.amazon.com/).
+1. Click **Create Cluster**.
+1. Select **EC2 Linux + Networking** as the cluster template. Click **Next Step**.
+1. Set `ecs-demo` to **Cluster Name**.
+1. Choose the default [VPC](https://aws.amazon.com/vpc/?vpc-blogs.sort-by=item.additionalFields.createdDate&vpc-blogs.sort-order=desc)
+ in **Networking**. If there are no existing VPCs, you can leave it as-is to create a new one.
+1. Set all available subnets of the VPC to **Subnets**.
+1. Click **Create**.
+1. Make sure that the ECS cluster has been successfully created.
+
+ ![Create project](img/ecs-launch-status.png)
+
+Now you can register an ECS service to the ECS cluster in the next step.
+
+Note the following:
+
+- Optionally, you can set a SSH key pair in the creation form. This allows you to SSH to the EC2
+ instance for debugging.
+- If you don't choose an existing VPC, it creates a new VPC by default. This could cause an error if
+ it reaches the maximum allowed number of internet gateways on your account.
+- The cluster requires an EC2 instance, meaning it costs you [according to the instance-type](https://aws.amazon.com/ec2/pricing/on-demand/).
+
+### Create an ECS Service
+
+[ECS service](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html)
+is a daemon to create an application container based on the [ECS task definition](#create-an-ecs-task-definition).
+
+1. Go to **ECS > Clusters > ecs-demo > Services** on the [AWS console](https://aws.amazon.com/)
+1. Click **Deploy**. This opens a service creation form.
+1. Select `EC2` in **Launch Type**.
+1. Set `ecs_demo` to **Task definition**. This corresponds to [the task definition you created above](#create-an-ecs-task-definition).
+1. Set `ecs_demo` to **Service name**.
+1. Set `1` to **Desired tasks**.
+
+ ![Create project](img/service-parameter.png)
+
+1. Click **Deploy**.
+1. Make sure that the created service is active.
+
+ ![Create project](img/service-running.png)
+
+Note that AWS's console UI changes from time to time. If you can't find a relevant component in the
+instructions, select the closest one.
+
+### View the demo application
+
+Now, the demo application is accessible from the internet.
+
+1. Go to **EC2 > Instances** on the [AWS console](https://aws.amazon.com/)
+1. Search by `ECS Instance` to find the corresponding EC2 instance that [the ECS cluster created](#create-an-ecs-cluster).
+1. Click the ID of the EC2 instance. This brings you to the instance detail page.
+1. Copy **Public IPv4 address** and paste it in the browser. Now you can see the demo application
+ running.
+
+ ![Create project](img/view-running-app.png)
+
+In this guide, HTTPS/SSL is **NOT** configured. You can access to the application through HTTP only
+(for example, `http://<ec2-ipv4-address>`).
+
+## Setup Continuous Deployment from GitLab
+
+Now that you have an application running on ECS, you can set up continuous deployment from GitLab.
+
+### Create a new IAM user as a deployer
+
+For GitLab to access the ECS cluster, service, and task definition that you created above, You must
+create a deployer user on AWS:
+
+1. Go to **IAM > Users** on [AWS console](https://aws.amazon.com/).
+1. Click **Add user**.
+1. Set `ecs_demo` to **User name**.
+1. Enable **Programmatic access** checkbox. Click **Next: Permissions**.
+1. Select `Attach existing policies directly` in **Set permissions**.
+1. Select `AmazonECS_FullAccess` from the policy list. Click **Next: Tags** and **Next: Review**.
+
+ ![Create project](img/ecs-policy.png)
+
+1. Click **Create user**.
+1. Take note of the **Access key ID** and **Secret access key** of the created user.
+
+NOTE:
+Do not share the secret access key in a public place. You must save it in a secure place.
+
+### Setup credentials in GitLab to let pipeline jobs access to ECS
+
+You can register the access information in [GitLab Environment Variables](../../variables/README.md#create-a-custom-variable-in-the-ui).
+These variables are injected into the pipeline jobs and can access the ECS API.
+
+1. Go to **ecs-demo** project on GitLab.
+1. Go to **Settings > CI/CD > Variables**.
+1. Click **Add Variable** and set the following key-value pairs.
+
+ |Key|Value|Note|
+ |---|---|---|
+ |`AWS_ACCESS_KEY_ID`|`<Access key ID of the deployer>`| For authenticating `aws` CLI. |
+ |`AWS_SECRET_ACCESS_KEY`|`<Secret access key of the deployer>`| For authenticating `aws` CLI. |
+ |`AWS_DEFAULT_REGION`|`us-east-2`| For authenticating `aws` CLI. |
+ |`CI_AWS_ECS_CLUSTER`|`ecs-demo`| The ECS cluster is accessed by `production_ecs` job. |
+ |`CI_AWS_ECS_SERVICE`|`ecs_demo`| The ECS service of the cluster is updated by `production_ecs` job. |
+ |`CI_AWS_ECS_TASK_DEFINITION`|`ecs_demo`| The ECS task definition is updated by `production_ecs` job. |
+
+### Make a change to the demo application
+
+Change a file in the project and see if it's reflected in the demo application on ECS:
+
+1. Go to **ecs-demo** project on GitLab.
+1. Open the file at **app > views > welcome > index.html.erb**.
+1. Click **Edit**.
+1. Change the text to `You're on ECS!`.
+1. Click **Commit Changes**. This automatically triggers a new pipeline. Wait until it finishes.
+1. [Access the running application on the ECS cluster](#view-the-demo-application). You should see
+ this:
+
+ ![Create project](img/view-running-app-2.png)
+
+Congratulations! You successfully set up continuous deployment to ECS.
+
+## Further reading
+
+- If you're interested in more of the continuous deployments to clouds, see [cloud deployments](../index.md).
+- If you want to quickly set up DevSecOps in your project, see [Auto DevOps](../../../topics/autodevops/index.md).
+- If you want to quickly set up the production-grade environment, see [the 5 Minute Production App](https://gitlab.com/gitlab-org/5-minute-production-app/deploy-template/-/blob/master/README.md).
diff --git a/doc/ci/cloud_deployment/index.md b/doc/ci/cloud_deployment/index.md
index ccacb3c61d3..4f1f7d6d4ff 100644
--- a/doc/ci/cloud_deployment/index.md
+++ b/doc/ci/cloud_deployment/index.md
@@ -20,6 +20,11 @@ CI/CD pipeline, you can interact with your chosen cloud provider more easily.
GitLab provides Docker images that you can use to [run AWS commands from GitLab CI/CD](#run-aws-commands-from-gitlab-cicd), and a template to make
it easier to [deploy to AWS](#deploy-your-application-to-the-aws-elastic-container-service-ecs).
+### Quick start
+
+If you're using GitLab.com, see the [quick start guide](ecs/quick_start_guide.md)
+for setting up Continuous Deployment to [AWS Elastic Container Service](https://aws.amazon.com/ecs) (ECS).
+
### Run AWS commands from GitLab CI/CD
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31167) in GitLab 12.6.
@@ -319,4 +324,4 @@ For a video walkthrough of this configuration process, see [Auto Deploy to EC2](
## Deploy to Google Cloud
-- [Deploying with GitLab on Google Cloud](https://about.gitlab.com/solutions/google-cloud-platform/)
+- [Deploying with GitLab on Google Cloud](https://about.gitlab.com/partners/technology-partners/google-cloud-platform/)
diff --git a/doc/ci/docker/index.md b/doc/ci/docker/index.md
index 18a9d63b694..0897bb183e5 100644
--- a/doc/ci/docker/index.md
+++ b/doc/ci/docker/index.md
@@ -8,11 +8,18 @@ type: index
# Docker integration
-GitLab CI/CD can be combined with [Docker](https://www.docker.com) to enable
-integration between the two.
+There are two primary ways to incorporate [Docker](https://www.docker.com) in your CI/CD workflow.
-The following documentation is available for using GitLab CI/CD with Docker:
+- **[Run your CI/CD jobs](using_docker_images.md) in Docker containers.**
-- [Building Docker images with GitLab CI/CD](using_docker_build.md).
-- [Using Docker images](using_docker_images.md).
-- [Building images with kaniko and GitLab CI/CD](using_kaniko.md).
+ You can create CI/CD jobs to do things like test, build, or publish
+ an application. These jobs can run in Docker containers.
+
+ For example, you can tell GitLab CI/CD to use a Node image that's hosted on Docker Hub
+ or in the GitLab Container Registry. Your job then runs in a container that's based on the image.
+ The container has all the Node dependencies you need to build your app.
+
+- **Use [Docker](using_docker_build.md) or [kaniko](using_kaniko.md) to build Docker images.**
+
+ You can create CI/CD jobs to build Docker images and publish
+ them to a container registry.
diff --git a/doc/ci/docker/using_docker_build.md b/doc/ci/docker/using_docker_build.md
index 46ced9b4d6d..01a58fa73f6 100644
--- a/doc/ci/docker/using_docker_build.md
+++ b/doc/ci/docker/using_docker_build.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: concepts, howto
---
-# Building Docker images with GitLab CI/CD
+# Use Docker to build Docker images
You can use GitLab CI/CD with Docker Engine to build and test Docker-based projects.
@@ -872,4 +872,4 @@ If:
- This is the first time setting it up, carefully read
[using Docker in Docker workflow](#use-the-docker-executor-with-the-docker-image-docker-in-docker).
- You are upgrading from v18.09 or earlier, read our
- [upgrade guide](https://about.gitlab.com/releases/2019/07/31/docker-in-docker-with-docker-19-dot-03/).
+ [upgrade guide](https://about.gitlab.com/blog/2019/07/31/docker-in-docker-with-docker-19-dot-03/).
diff --git a/doc/ci/docker/using_docker_images.md b/doc/ci/docker/using_docker_images.md
index 67450d442a9..c382e40a966 100644
--- a/doc/ci/docker/using_docker_images.md
+++ b/doc/ci/docker/using_docker_images.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: concepts, howto
---
-# Using Docker images
+# Run your CI/CD jobs in Docker containers
GitLab CI/CD in conjunction with [GitLab Runner](../runners/README.md) can use
[Docker Engine](https://www.docker.com/) to test and build any application.
diff --git a/doc/ci/docker/using_kaniko.md b/doc/ci/docker/using_kaniko.md
index 2122cf2bf16..0344e736dd4 100644
--- a/doc/ci/docker/using_kaniko.md
+++ b/doc/ci/docker/using_kaniko.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# Building images with kaniko and GitLab CI/CD
+# Use kaniko to build Docker images
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/45512) in GitLab 11.2. Requires GitLab Runner 11.2 and above.
diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md
index b49fcd72172..c11643c2405 100644
--- a/doc/ci/environments/index.md
+++ b/doc/ci/environments/index.md
@@ -1069,7 +1069,7 @@ Re-using variables defined inside `script` as part of the environment name doesn
Below are some links you may find interesting:
- [The `.gitlab-ci.yml` definition of environments](../yaml/README.md#environment)
-- [A blog post on Deployments & Environments](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/)
+- [A blog post on Deployments & Environments](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/)
- [Review Apps - Use dynamic environments to deploy your code for every branch](../review_apps/index.md)
- [Deploy Boards for your applications running on Kubernetes](../../user/project/deploy_boards.md)
diff --git a/doc/ci/environments/protected_environments.md b/doc/ci/environments/protected_environments.md
index 2636e59723a..b52c2701daf 100644
--- a/doc/ci/environments/protected_environments.md
+++ b/doc/ci/environments/protected_environments.md
@@ -70,7 +70,7 @@ Alternatively, you can use the API to protect an environment:
name: ${CI_JOB_NAME}
```
-1. Use the UI to [create a new group](../../user/group/index.md#create-a-new-group).
+1. Use the UI to [create a new group](../../user/group/index.md#create-a-group).
For example, this group is called `protected-access-group` and has the group ID `9899826`. Note
that the rest of the examples in these steps use this group.
diff --git a/doc/ci/examples/authenticating-with-hashicorp-vault/index.md b/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
index 2d8c92a1a74..a5024e8a65f 100644
--- a/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
+++ b/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
@@ -53,7 +53,9 @@ The JWT's payload looks like this:
"job_id": "1212", #
"ref": "auto-deploy-2020-04-01", # Git ref for this job
"ref_type": "branch", # Git ref type, branch or tag
- "ref_protected": "true" # true if this git ref is protected, false otherwise
+ "ref_protected": "true", # true if this git ref is protected, false otherwise
+ "environment": "production", # Environment this job deploys to, if present (GitLab 13.9 and later)
+ "environment_protected": "true" # true if deployed environment is protected, false otherwise (GitLab 13.9 and later)
}
```
diff --git a/doc/ci/examples/end_to_end_testing_webdriverio/index.md b/doc/ci/examples/end_to_end_testing_webdriverio/index.md
index e20e86e8936..1b375a3cac8 100644
--- a/doc/ci/examples/end_to_end_testing_webdriverio/index.md
+++ b/doc/ci/examples/end_to_end_testing_webdriverio/index.md
@@ -10,6 +10,7 @@ description: 'Confidence checking your entire app every time a new feature is ad
---
<!-- vale off -->
+<!-- Needs review for fixing the broken Webdriver links, which link to a deprecated version of Webdriver. -->
# End-to-end testing with GitLab CI/CD and WebdriverIO
@@ -83,7 +84,7 @@ multiple tests, such as making sure you are logged in.
The function `it` defines an individual test.
[The `browser` object](https://webdriver.io/guide/testrunner/browserobject.html) is WebdriverIO's
-special sauce. It provides most of [the WebdriverIO API methods](https://webdriver.io/api.html) that are the key to
+special sauce. It provides most of [the WebdriverIO API methods](https://webdriver.io/docs/api/) that are the key to
steering the browser. In this case, we can use
[`browser.url`](https://webdriver.io/api/protocol/url.html) to visit `/page-that-does-not-exist` to
hit our 404 page. We can then use [`browser.getUrl`](https://webdriver.io/api/property/getUrl.html)
diff --git a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md b/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
index a02a5347734..2acd7315630 100644
--- a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
+++ b/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
@@ -128,7 +128,7 @@ We'll use this variable in the `.gitlab-ci.yml` later, to easily connect to our
![variables page](img/variables_page.png)
-We also need to add the public key to **Project** > **Settings** > **Repository** as a [Deploy Key](../../../ssh/README.md#deploy-keys), which gives us the ability to access our repository from the server through [SSH protocol](../../../gitlab-basics/command-line-commands.md#start-working-on-your-project).
+We also need to add the public key to **Project** > **Settings** > **Repository** as a [Deploy Key](../../../user/project/deploy_keys/index.md), which gives us the ability to access our repository from the server through [SSH protocol](../../../gitlab-basics/command-line-commands.md#start-working-on-your-project).
```shell
# As the deployer user on the server
@@ -619,7 +619,7 @@ deploy_production:
- master
```
-You may also want to add another job for [staging environment](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/), to final test your application before deploying to production.
+You may also want to add another job for [staging environment](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/), to final test your application before deploying to production.
### Turn on GitLab CI/CD
diff --git a/doc/ci/jobs/index.md b/doc/ci/jobs/index.md
index d1fe6db3ee4..3eed9526e80 100644
--- a/doc/ci/jobs/index.md
+++ b/doc/ci/jobs/index.md
@@ -153,7 +153,7 @@ Job grouping is evaluated with an improved regular expression to group jobs by n
The new implementation removes one or more `: [...]`, `X Y`, `X/Y`, or `X\Y` sequences
from the **end** of job names only.
-Matching substrings occuring at the beginning or in the middle of build names are
+Matching substrings occurring at the beginning or in the middle of build names are
no longer removed.
## Specifying variables when running manual jobs
diff --git a/doc/ci/pipelines/settings.md b/doc/ci/pipelines/settings.md
index 32221b78039..7c84cba7fe3 100644
--- a/doc/ci/pipelines/settings.md
+++ b/doc/ci/pipelines/settings.md
@@ -133,19 +133,21 @@ averaged.
<!-- vale gitlab.Spelling = NO -->
-| Coverage Tool | Sample regular expression |
-|------------------------------------------------|---------------------------|
-| Simplecov (Ruby) | `\(\d+.\d+\%\) covered` |
-| pytest-cov (Python) | `^TOTAL.+?(\d+\%)$` |
+| Coverage Tool | Sample regular expression |
+|------------------------------------------------|-----------------------------------------------|
+| Simplecov (Ruby) | `\(\d+.\d+\%\) covered` |
+| pytest-cov (Python) | `^TOTAL.+?(\d+\%)$` |
| Scoverage (Scala) | `Statement coverage[A-Za-z\.*]\s*:\s*([^%]+)` |
-| `phpunit --coverage-text --colors=never` (PHP) | `^\s*Lines:\s*\d+.\d+\%` |
-| gcovr (C/C++) | `^TOTAL.*\s+(\d+\%)$` |
-| `tap --coverage-report=text-summary` (NodeJS) | `^Statements\s*:\s*([^%]+)` |
-| `nyc npm test` (NodeJS) | `All files[^|]*\|[^|]*\s+([\d\.]+)` |
-| excoveralls (Elixir) | `\[TOTAL\]\s+(\d+\.\d+)%` |
-| `mix test --cover` (Elixir) | `\d+.\d+\%\s+\|\s+Total` |
-| JaCoCo (Java/Kotlin) | `Total.*?([0-9]{1,3})%` |
-| `go test -cover` (Go) | `coverage: \d+.\d+% of statements` |
+| `phpunit --coverage-text --colors=never` (PHP) | `^\s*Lines:\s*\d+.\d+\%` |
+| gcovr (C/C++) | `^TOTAL.*\s+(\d+\%)$` |
+| `tap --coverage-report=text-summary` (NodeJS) | `^Statements\s*:\s*([^%]+)` |
+| `nyc npm test` (NodeJS) | `All files[^|]*\|[^|]*\s+([\d\.]+)` |
+| excoveralls (Elixir) | `\[TOTAL\]\s+(\d+\.\d+)%` |
+| `mix test --cover` (Elixir) | `\d+.\d+\%\s+\|\s+Total` |
+| JaCoCo (Java/Kotlin) | `Total.*?([0-9]{1,3})%` |
+| `go test -cover` (Go) | `coverage: \d+.\d+% of statements` |
+| .Net (OpenCover) | `(Visited Points).*\((.*)\)` |
+| .Net (`dotnet test` line coverage) | `Total\s*\|\s*(\d+\.?\d+)` |
<!-- vale gitlab.Spelling = YES -->
@@ -157,11 +159,13 @@ averaged.
To see the evolution of your project code coverage over time,
you can view a graph or download a CSV file with this data. From your project:
-1. Go to **{chart}** **Project Analytics > Repository** to see the historic data for each job listed in the dropdown above the graph.
+1. Go to **Project Analytics > Repository** to see the historic data for each job listed in the dropdown above the graph.
1. If you want a CSV file of that data, click **Download raw data (`.csv`)**
![Code coverage graph of a project over time](img/code_coverage_graph_v13_1.png)
+Code coverage data is also [available at the group level](../../user/group/repositories_analytics/index.md).
+
### Removing color codes
Some test coverage tools output with ANSI color codes that aren't
diff --git a/doc/ci/quick_start/index.md b/doc/ci/quick_start/index.md
index 711bf0c0e7a..7ae76ad3a84 100644
--- a/doc/ci/quick_start/index.md
+++ b/doc/ci/quick_start/index.md
@@ -117,15 +117,22 @@ The pipeline starts when the commit is committed.
#### `.gitlab-ci.yml` tips
-- If you want the runner to use a Docker image to run the jobs, edit the `.gitlab-ci.yml` file
- to include your image name:
+- If you want the runner to [use a Docker container to run the jobs](../docker/using_docker_images.md),
+ edit the `.gitlab-ci.yml` file
+ to include an image name:
```yaml
default:
image: ruby:2.7.2
```
- This command tells the runner to use a Ruby image from Docker Hub.
+ This command tells the runner to use a Ruby image from Docker Hub
+ and to run the jobs in a container that's generated from the image.
+
+ This process is different than
+ [building an application as a Docker container](../docker/using_docker_build.md).
+ Your application does not need to be built as a Docker container to
+ run CI/CD jobs in Docker containers.
- To validate your `.gitlab-ci.yml` file, use the
[CI Lint tool](../lint.md), which is available in every project.
diff --git a/doc/ci/review_apps/index.md b/doc/ci/review_apps/index.md
index 9de6a1162bd..b44526135a1 100644
--- a/doc/ci/review_apps/index.md
+++ b/doc/ci/review_apps/index.md
@@ -12,6 +12,10 @@ type: reference
Review Apps is a collaboration tool that takes the hard work out of providing an environment to showcase product changes.
+NOTE:
+If you have a Kubernetes cluster, you can automate this feature in your applications
+by using [Auto DevOps](../../topics/autodevops/index.md).
+
## Introduction
Review Apps:
diff --git a/doc/ci/ssh_keys/index.md b/doc/ci/ssh_keys/index.md
index 2cdef176a22..72a99efc9bc 100644
--- a/doc/ci/ssh_keys/index.md
+++ b/doc/ci/ssh_keys/index.md
@@ -33,7 +33,7 @@ with any type of [executor](https://docs.gitlab.com/runner/executors/)
1. Run the [`ssh-agent`](https://linux.die.net/man/1/ssh-agent) during job to load
the private key.
1. Copy the public key to the servers you want to have access to (usually in
- `~/.ssh/authorized_keys`) or add it as a [deploy key](../../ssh/README.md#deploy-keys)
+ `~/.ssh/authorized_keys`) or add it as a [deploy key](../../user/project/deploy_keys/index.md)
if you are accessing a private GitLab repository.
The private key is displayed in the job log, unless you enable
@@ -101,7 +101,7 @@ to access it. This is where an SSH key pair comes in handy.
1. As a final step, add the _public_ key from the one you created in the first
step to the services that you want to have an access to from within the build
environment. If you are accessing a private GitLab repository you need to add
- it as a [deploy key](../../ssh/README.md#deploy-keys).
+ it as a [deploy key](../../user/project/deploy_keys/index.md).
That's it! You can now have access to private servers or repositories in your
build environment.
@@ -130,7 +130,7 @@ on, and use that key for all projects that are run on this machine.
1. As a final step, add the _public_ key from the one you created earlier to the
services that you want to have an access to from within the build environment.
If you are accessing a private GitLab repository you need to add it as a
- [deploy key](../../ssh/README.md#deploy-keys).
+ [deploy key](../../user/project/deploy_keys/index.md).
After generating the key, try to sign in to the remote server to accept the
fingerprint:
diff --git a/doc/ci/triggers/README.md b/doc/ci/triggers/README.md
index b4cea48a362..fa97cbdfcec 100644
--- a/doc/ci/triggers/README.md
+++ b/doc/ci/triggers/README.md
@@ -188,10 +188,10 @@ source repository. Be sure to URL-encode `ref` if it contains slashes.
### Using webhook payload in the triggered pipeline
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31197) in GitLab 13.9.
-> - It's [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
-> - It's disabled on GitLab.com.
-> - It's not recommended for production use.
-> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-the-trigger_payload-variable). **(FREE SELF)**
+> - It's [deployed behind a feature flag](../../user/feature_flags.md), enabled by default.
+> - It's enabled on GitLab.com.
+> - It's recommended for production use.
+> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-the-trigger_payload-variable). **(FREE SELF)**
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
@@ -203,21 +203,21 @@ so you can access the data with `cat $TRIGGER_PAYLOAD` or a similar command.
#### Enable or disable the `TRIGGER_PAYLOAD` variable
-The `TRIGGER_PAYLOAD` CI/CD variable is under development and not ready for production use. It is
-deployed behind a feature flag that is **disabled by default**.
+The `TRIGGER_PAYLOAD` CI/CD variable is under development but ready for production use.
+It is deployed behind a feature flag that is **enabled by default**.
[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
-can enable it.
+can opt to disable it.
-To enable it:
+To disable it:
```ruby
-Feature.enable(:ci_trigger_payload_into_pipeline)
+Feature.disable(:ci_trigger_payload_into_pipeline)
```
-To disable it:
+To enable it:
```ruby
-Feature.disable(:ci_trigger_payload_into_pipeline)
+Feature.enable(:ci_trigger_payload_into_pipeline)
```
## Making use of trigger variables
diff --git a/doc/ci/unit_test_reports.md b/doc/ci/unit_test_reports.md
index ee060f33d01..c1720675d6a 100644
--- a/doc/ci/unit_test_reports.md
+++ b/doc/ci/unit_test_reports.md
@@ -197,7 +197,7 @@ There are a few tools that can produce JUnit report format XML files in C/C++.
#### GoogleTest
In the following example, `gtest` is used to generate the test reports.
-If there are multiple gtest executables created for different architectures (`x86`, `x64` or `arm`),
+If there are multiple `gtest` executables created for different architectures (`x86`, `x64` or `arm`),
you will be required to run each test providing a unique filename. The results
will then be aggregated together.
diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md
index 2abfbd3a5b4..77c63e7ee98 100644
--- a/doc/ci/yaml/README.md
+++ b/doc/ci/yaml/README.md
@@ -267,14 +267,14 @@ Some example `if` clauses for `workflow: rules`:
See the [common `if` clauses for `rules`](#common-if-clauses-for-rules) for more examples.
For example, in the following configuration, pipelines run for all `push` events (changes to
-branches and new tags). Pipelines for push events with `-wip` in the commit message
+branches and new tags). Pipelines for push events with `-draft` in the commit message
don't run, because they are set to `when: never`. Pipelines for schedules or merge requests
don't run either, because no rules evaluate to true for them:
```yaml
workflow:
rules:
- - if: $CI_COMMIT_MESSAGE =~ /-wip$/
+ - if: $CI_COMMIT_MESSAGE =~ /-draft$/
when: never
- if: '$CI_PIPELINE_SOURCE == "push"'
```
@@ -2627,14 +2627,18 @@ to change the job without overriding the global variables.
The `stop_review_app` job is **required** to have the following keywords defined:
-- `when` - [reference](#when)
+- `when`, defined at either:
+ - [The job level](#when).
+ - [In a rules clause](#rules). If you use `rules:` and `when: manual`, you should
+ also set [`allow_failure: true`](#allow_failure) so the pipeline can complete
+ even if the job doesn't run.
- `environment:name`
- `environment:action`
Additionally, both jobs should have matching [`rules`](../yaml/README.md#onlyexcept-basic)
or [`only/except`](../yaml/README.md#onlyexcept-basic) configuration.
-In the example above, if the configuration is not identical:
+In the examples above, if the configuration is not identical:
- The `stop_review_app` job might not be included in all pipelines that include the `review_app` job.
- It is not possible to trigger the `action: stop` to stop the environment automatically.
diff --git a/doc/development/agent/user_stories.md b/doc/development/agent/user_stories.md
index 609be47a3cb..ab135cad9d3 100644
--- a/doc/development/agent/user_stories.md
+++ b/doc/development/agent/user_stories.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Kubernetes Agent user stories **(PREMIUM SELF)**
-The [personas in action](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#user-personas)
+The [personas in action](https://about.gitlab.com/handbook/marketing/strategic-marketing/roles-personas/#user-personas)
for the Kubernetes Agent are:
- [Sasha, the Software Developer](https://about.gitlab.com/handbook/marketing/strategic-marketing/roles-personas/#sasha-software-developer).
diff --git a/doc/development/api_graphql_styleguide.md b/doc/development/api_graphql_styleguide.md
index 85098689392..f32aaf6ffa8 100644
--- a/doc/development/api_graphql_styleguide.md
+++ b/doc/development/api_graphql_styleguide.md
@@ -13,7 +13,7 @@ This document outlines the style guide for the GitLab [GraphQL API](../api/graph
<!-- vale gitlab.Spelling = NO -->
We use the [GraphQL Ruby gem](https://graphql-ruby.org/) written by [Robert Mosolgo](https://github.com/rmosolgo/).
<!-- vale gitlab.Spelling = YES -->
-In addition, we have a subscription to [GraphQL Pro](https://www.graphql.pro). For details see [GraphQL Pro subscription](graphql_guide/graphql_pro.md).
+In addition, we have a subscription to [GraphQL Pro](https://graphql.pro/). For details see [GraphQL Pro subscription](graphql_guide/graphql_pro.md).
All GraphQL queries are directed to a single endpoint
([`app/controllers/graphql_controller.rb#execute`](https://gitlab.com/gitlab-org/gitlab/blob/master/app%2Fcontrollers%2Fgraphql_controller.rb)),
diff --git a/doc/development/architecture.md b/doc/development/architecture.md
index 69055131ae8..b577b4e93b7 100644
--- a/doc/development/architecture.md
+++ b/doc/development/architecture.md
@@ -224,17 +224,7 @@ Component statuses are linked to configuration documentation for each component.
### Component list
-Table description links:
-
-- [Omnibus GitLab](https://docs.gitlab.com/omnibus/)
-- [GitLab Environment Toolkit (GET)](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit)
-- [GitLab chart](https://docs.gitlab.com/charts/)
-- [Minikube Minimal](https://docs.gitlab.com/charts/development/minikube/#deploying-gitlab-with-minimal-settings)
-- [GitLab.com](https://gitlab.com)
-- [Source](../install/installation.md)
-- [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit)
-
-| Component | Description | Omnibus GitLab | GitLab Environment Toolkit (GET) | GitLab chart | Minikube Minimal | GitLab.com | Source | GDK | CE/EE |
+| Component | Description | [Omnibus GitLab](https://docs.gitlab.com/omnibus/) | [GitLab Environment Toolkit (GET)](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit) | [GitLab chart](https://docs.gitlab.com/charts/) | [Minikube Minimal](https://docs.gitlab.com/charts/development/minikube/#deploying-gitlab-with-minimal-settings) | [GitLab.com](https://gitlab.com) | [Source](../install/installation.md) | [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit) | [CE/EE](https://about.gitlab.com/install/ce-or-ee/) |
|-------------------------------------------------------|----------------------------------------------------------------------|:--------------:|:--------------:|:------------:|:----------------:|:----------:|:------:|:---:|:-------:|
| [Certificate Management](#certificate-management) | TLS Settings, Let's Encrypt | ✅ | ✅ | ✅ | ⚙ | ✅ | ⚙ | ⚙ | CE & EE |
| [Consul](#consul) | Database node discovery, failover | ⚙ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | EE Only |
diff --git a/doc/development/auto_devops.md b/doc/development/auto_devops.md
index eaf1d712f17..d11587a864d 100644
--- a/doc/development/auto_devops.md
+++ b/doc/development/auto_devops.md
@@ -47,8 +47,8 @@ found in
## Development environment
-Configuring [GDK for Auto
-DevOps](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/doc/howto/auto_devops.md).
+See the [Simple way to develop/test Kubernetes workflows with a local cluster](https://gitlab.com/gitlab-org/gitlab-development-kit/-/issues/1064)
+issue for discussion around setting up Auto DevOps development environments.
## Monitoring on GitLab.com
diff --git a/doc/development/cicd/templates.md b/doc/development/cicd/templates.md
index 94b03634e25..df32c310899 100644
--- a/doc/development/cicd/templates.md
+++ b/doc/development/cicd/templates.md
@@ -88,7 +88,7 @@ for example `Jobs/Deploy.gitlab-ci.yml`.
You can make a new stable template by copying [the latest template](#latest-version)
available in a major milestone release of GitLab like `13.0`. All breaking changes
must be announced in a blog post before the official release, for example
-[GitLab.com is moving to 13.0, with narrow breaking changes](https://about.gitlab.com/releases/2020/05/06/gitlab-com-13-0-breaking-changes/)
+[GitLab.com is moving to 13.0, with narrow breaking changes](https://about.gitlab.com/blog/2020/05/06/gitlab-com-13-0-breaking-changes/)
You can change a stable template version in a minor GitLab release like `13.1` if:
diff --git a/doc/development/code_intelligence/index.md b/doc/development/code_intelligence/index.md
index ac962e3ae3e..790ba1539b7 100644
--- a/doc/development/code_intelligence/index.md
+++ b/doc/development/code_intelligence/index.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/development/code_review.md b/doc/development/code_review.md
index dada6adcce7..9f18cbaff25 100644
--- a/doc/development/code_review.md
+++ b/doc/development/code_review.md
@@ -283,6 +283,8 @@ first time.
you forget to remove any debugging code?
- Consider providing instructions on how to test the merge request. This can be
helpful for reviewers not familiar with the product feature or area of the codebase.
+- If you know your change depends on another being merged first, note it in the
+ description and set an [merge request dependency](../user/project/merge_requests/merge_request_dependencies.md).
- Be grateful for the reviewer's suggestions. (`Good call. I'll make that change.`)
- Don't take it personally. The review is of the code, not of you.
- Explain why the code exists. ("It's like that because of these reasons. Would
@@ -345,6 +347,8 @@ experience, refactors the existing code). Then:
- For non-mandatory suggestions, decorate with (non-blocking) so the author knows they can
optionally resolve within the merge request or follow-up at a later stage.
- There's a [Chrome/Firefox add-on](https://gitlab.com/conventionalcomments/conventional-comments-button) which you can use to apply [Conventional Comment](https://conventionalcomments.org/) prefixes.
+- Ensure there are no open dependencies. Check [related issues](../user/project/issues/related_issues.md) for blockers. Clarify with the author(s)
+if necessary. If blocked by one or more open MRs, set an [MR dependency](../user/project/merge_requests/merge_request_dependencies.md).
- After a round of line notes, it can be helpful to post a summary note such as
"Looks good to me", or "Just a couple things to address."
- Assign the merge request to the author if changes are required following your
diff --git a/doc/development/contributing/issue_workflow.md b/doc/development/contributing/issue_workflow.md
index da38d1e73b4..25ab931e236 100644
--- a/doc/development/contributing/issue_workflow.md
+++ b/doc/development/contributing/issue_workflow.md
@@ -181,7 +181,7 @@ For instance, the "DevOps Report" category is represented by the
`devops_reports.name` value is "DevOps Reports".
If a category's label doesn't respect this naming convention, it should be specified
-with [the `label` attribute](https://about.gitlab.com/handbook/marketing/website/#category-attributes)
+with [the `label` attribute](https://about.gitlab.com/handbook/marketing/inbound-marketing/digital-experience/website/#category-attributes)
in <https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/categories.yml>.
### Feature labels
diff --git a/doc/development/contributing/style_guides.md b/doc/development/contributing/style_guides.md
index 2a2cfebe964..db1d01383ad 100644
--- a/doc/development/contributing/style_guides.md
+++ b/doc/development/contributing/style_guides.md
@@ -56,10 +56,10 @@ The current Lefthook configuration can be found in [`lefthook.yml`](https://gitl
Before you push your changes, Lefthook automatically runs the following checks:
- Danger: Runs a subset of checks that `danger-review` runs on your merge requests.
-- ES lint: Run `yarn eslint` checks (with the [`.eslintrc.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.eslintrc.yml) configuration) on the modified `*.{js,vue}` files. Tags: `frontend`, `style`.
+- ES lint: Run `yarn run internal:eslint` checks (with the [`.eslintrc.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.eslintrc.yml) configuration) on the modified `*.{js,vue}` files. Tags: `frontend`, `style`.
- HAML lint: Run `bundle exec haml-lint` checks (with the [`.haml-lint.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.haml-lint.yml) configuration) on the modified `*.html.haml` files. Tags: `view`, `haml`, `style`.
- Markdown lint: Run `yarn markdownlint` checks on the modified `*.md` files. Tags: `documentation`, `style`.
-- SCSS lint: Run `bundle exec scss-lint` checks (with the [`.scss-lint.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.scss-lint.yml) configuration) on the modified `*.scss{,.css}` files. Tags: `stylesheet`, `css`, `style`.
+- SCSS lint: Run `yarn stylelint` checks (with the [`.stylelintrc`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.stylelintrc) configuration) on the modified `*.scss{,.css}` files. Tags: `stylesheet`, `css`, `style`.
- RuboCop: Run `bundle exec rubocop` checks (with the [`.rubocop.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.rubocop.yml) configuration) on the modified `*.rb` files. Tags: `backend`, `style`.
- Vale: Run `vale` checks (with the [`.vale.ini`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.vale.ini) configuration) on the modified `*.md` files. Tags: `documentation`, `style`.
@@ -154,6 +154,16 @@ resolved and place it in the `.rubocop_manual_todo.yml`. In this scenario, do no
changes to the `.rubocop_todo.yml` as an `exclude limit` that is higher than 15 will make the
`.rubocop_todo.yml` hard to parse.
+### Reveal existing RuboCop exceptions
+
+To reveal existing RuboCop exceptions in the code that have been excluded via `.rubocop_todo.yml` and
+`.rubocop_manual_todo.yml`, set the environment variable `REVEAL_RUBOCOP_TODO` to `1`.
+
+This allows you to reveal existing RuboCop exceptions during your daily work cycle and fix them along the way.
+
+NOTE:
+Permanent `Exclude`s should be defined in `.rubocop.yml` instead of `.rubocop_manual_todo.yml`.
+
## Database migrations
See the dedicated [Database Migrations Style Guide](../migration_style_guide.md).
diff --git a/doc/development/database_query_comments.md b/doc/development/database_query_comments.md
index 8a5abad3815..39b14074073 100644
--- a/doc/development/database_query_comments.md
+++ b/doc/development/database_query_comments.md
@@ -39,24 +39,11 @@ Examples of queries with comments as observed in `development.log`:
1. Rails:
```sql
- SELECT "project_features".* FROM "project_features" WHERE "project_features"."project_id" = $1 LIMIT $2 [["project_id", 5], ["LIMIT", 1]] /*application:web,controller:jobs,action:trace,correlation_id:rYF4mey9CH3,line:/app/policies/project_policy.rb:504:in `feature_available?'*/
+ /*application:web,controller:jobs,action:trace,correlation_id:rYF4mey9CH3,line:/app/policies/project_policy.rb:504:in `feature_available?'*/ SELECT "project_features".* FROM "project_features" WHERE "project_features"."project_id" = $1 LIMIT $2 [["project_id", 5], ["LIMIT", 1]]
```
1. Sidekiq:
```sql
- SELECT "ci_pipelines".* FROM "ci_pipelines" WHERE "ci_pipelines"."id" = $1 LIMIT $2 [["id", 64], ["LIMIT", 1]] /*application:sidekiq,jid:e7d6668a39a991e323009833,job_class:ExpireJobCacheWorker,correlation_id:rYF4mey9CH3,line:/app/workers/expire_job_cache_worker.rb:14:in `perform'*/
+ /*application:sidekiq,jid:e7d6668a39a991e323009833,job_class:ExpireJobCacheWorker,correlation_id:rYF4mey9CH3,line:/app/workers/expire_job_cache_worker.rb:14:in `perform'*/ SELECT "ci_pipelines".* FROM "ci_pipelines" WHERE "ci_pipelines"."id" = $1 LIMIT $2 [["id", 64], ["LIMIT", 1]]
```
-
-## Enable/Disable the feature
-
-Enabling or disabling the feature requires a **restart/SIGHUP** of the Web and
-Sidekiq workers, as the feature flag's state is memoized upon starting up.
-
-The `feature_flag` for this feature is **disabled** by default. You can enable
-or disable it with:
-
-```ruby
-Feature.enable(:marginalia)
-Feature.disable(:marginalia)
-```
diff --git a/doc/development/distributed_tracing.md b/doc/development/distributed_tracing.md
index eb20e721e46..17967c5f63c 100644
--- a/doc/development/distributed_tracing.md
+++ b/doc/development/distributed_tracing.md
@@ -206,7 +206,7 @@ If `GITLAB_TRACING` is not configured correctly, this issue is logged:
By default, GitLab ships with the Jaeger tracer, but other tracers can be included at compile time.
Details of how this can be done are included in the [LabKit tracing
-documentation](https://godoc.org/gitlab.com/gitlab-org/labkit/tracing).
+documentation](https://pkg.go.dev/gitlab.com/gitlab-org/labkit/tracing).
If no log messages about tracing are emitted, the `GITLAB_TRACING` environment variable is likely
not set.
diff --git a/doc/development/documentation/testing.md b/doc/development/documentation/testing.md
index f3d6e0a5c71..eed544911cb 100644
--- a/doc/development/documentation/testing.md
+++ b/doc/development/documentation/testing.md
@@ -272,7 +272,11 @@ To configure Vale in your editor, install one of the following as appropriate:
In the extension's settings:
- Select the **Use CLI** checkbox.
- - In the **Config** setting, enter an absolute path to [`.vale.ini`](https://gitlab.com/gitlab-org/gitlab/blob/master/.vale.ini) in one of the cloned GitLab repositories on your computer.
+ - In the <!-- vale gitlab.Spelling = NO --> **Config** setting, enter an absolute
+ path to [`.vale.ini`](https://gitlab.com/gitlab-org/gitlab/blob/master/.vale.ini)
+ in one of the cloned GitLab repositories on your computer.
+ <!-- vale gitlab.Spelling = YES -->
+
- In the **Path** setting, enter the absolute path to the Vale binary. In most
cases, `vale` should work. To find the location, run `which vale` in a terminal.
diff --git a/doc/development/elasticsearch.md b/doc/development/elasticsearch.md
index 3392bd1fbf6..e5d69acc2e5 100644
--- a/doc/development/elasticsearch.md
+++ b/doc/development/elasticsearch.md
@@ -219,7 +219,9 @@ Any update to the Elastic index mappings should be replicated in [`Elastic::Late
Migrations can be built with a retry limit and have the ability to be [failed and marked as halted](https://gitlab.com/gitlab-org/gitlab/-/blob/66e899b6637372a4faf61cfd2f254cbdd2fb9f6d/ee/lib/elastic/migration.rb#L40).
Any data or index cleanup needed to support migration retries should be handled within the migration.
-### Migration options supported by the [`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/workers/elastic/migration_worker.rb)
+### Migration options supported by the `Elastic::MigrationWorker`
+
+[`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/workers/elastic/migration_worker.rb) supports the following migration options:
- `batched!` - Allow the migration to run in batches. If set, the [`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/workers/elastic/migration_worker.rb)
will re-enqueue itself with a delay which is set using the `throttle_delay` option described below. The batching
@@ -230,6 +232,9 @@ enough time to finish. Additionally, the time should be less than 30 minutes sin
[`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/workers/elastic/migration_worker.rb)
cron worker runs. Default value is 5 minutes.
+- `pause_indexing!` - Pause indexing while the migration runs. This setting will record the indexing setting before
+the migration runs and set it back to that value when the migration is completed.
+
```ruby
# frozen_string_literal: true
@@ -242,6 +247,45 @@ class BatchedMigrationName < Elastic::Migration
end
```
+### Multi-version compatibility
+
+These Elasticsearch migrations, like any other GitLab changes, need to support the case where
+[multiple versions of the application are running at the same time](multi_version_compatibility.md).
+
+Depending on the order of deployment, it's possible that the migration
+has started or finished and there's still a server running the application code from before the
+migration. We need to take this into consideration until we can [ensure all Elasticsearch migrations
+start after the deployment has finished](https://gitlab.com/gitlab-org/gitlab/-/issues/321619).
+
+### Reverting a migration
+
+Because Elasticsearch does not support transactions, we always need to design our
+migrations to accommodate a situation where the application
+code is reverted after the migration has started or after it is finished.
+
+For this reason we generally defer destructive actions (for example, deletions after
+some data is moved) to a later merge request after the migrations have
+completed successfully. To be safe, for self-managed customers we should also
+defer it to another release if there is risk of important data loss.
+
+### Best practices for Elasticsearch migrations
+
+Follow these best practices for best results:
+
+- When working in batches, keep the batch size under 9,000 documents
+ and `throttle_delay` over 3 minutes. The bulk indexer is set to run
+ every 1 minute and process a batch of 10,000 documents. These limits
+ allow the bulk indexer time to process records before another migration
+ batch is attempted.
+- To ensure that document counts are up to date, it is recommended to refresh
+ the index before checking if a migration is completed.
+- Add logging statements to each migration when the migration starts, when a
+ completion check occurs, and when the migration is completed. These logs
+ are helpful when debugging issues with migrations.
+- Pause indexing if you're using any Elasticsearch Reindex API operations.
+- Consider adding a retry limit if there is potential for the migration to fail.
+ This ensures that migrations can be halted if an issue occurs.
+
## Performance Monitoring
### Prometheus
diff --git a/doc/development/fe_guide/accessibility.md b/doc/development/fe_guide/accessibility.md
index 5ad1a701fac..081812d41ce 100644
--- a/doc/development/fe_guide/accessibility.md
+++ b/doc/development/fe_guide/accessibility.md
@@ -4,14 +4,195 @@ group: unassigned
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Accessibility & Readability
+# Accessibility
+
+Accessibility is important for users who use screen readers or rely on keyboard-only functionality
+to ensure they have an equivalent experience to sighted mouse users.
+
+This page contains guidelines we should follow.
+
+## Quick summary
+
+Since [no ARIA is better than bad ARIA](https://www.w3.org/TR/wai-aria-practices/#no_aria_better_bad_aria),
+review the following recommendations before using `aria-*`, `role`, and `tabindex`.
+Use semantic HTML, which typically has accessibility semantics baked in, but always be sure to test with
+[relevant combinations of screen readers and browsers](https://www.accessibility-developer-guide.com/knowledge/screen-readers/relevant-combinations/).
+
+In [WebAIM's accessibility analysis of the top million home pages](https://webaim.org/projects/million/#aria),
+they found that "ARIA correlated to higher detectable errors".
+It is likely that *misuse* of ARIA is a big cause of increased errors,
+so when in doubt don't use `aria-*`, `role`, and `tabindex`, and stick with semantic HTML.
+
+## Provide accessible names to screen readers
+
+To provide markup with accessible names, ensure every:
+
+- `input` has an associated `label`.
+- `button` and `a` have child text, or `aria-label` when text isn’t present.
+ For example, an icon button with no visible text.
+- `img` has an `alt` attribute.
+- `fieldset` has `legend` as its first child.
+- `figure` has `figcaption` as its first child.
+- `table` has `caption` as its first child.
+
+If the `label`, child text, or child element is not visually desired,
+use `.gl-sr-only` to hide the element from everything but screen readers.
+
+Ensure the accessible name is descriptive enough to be understood in isolation.
+
+```html
+// bad
+<button>Submit</button>
+<a href="url">page</a>
+
+// good
+<button>Submit review</button>
+<a href="url">GitLab's accessibility page</a>
+```
+
+## Role
+
+In general, avoid using `role`.
+Use semantic HTML elements that implicitly have a `role` instead.
+
+| Bad | Good |
+| --- | --- |
+| `<div role="button">` | `<button>` |
+| `<div role="img">` | `<img>` |
+| `<div role="link">` | `<a>` |
+| `<div role="header">` | `<h1>` to `<h6>` |
+| `<div role="textbox">` | `<input>` or `<textarea>` |
+| `<div role="article">` | `<article>` |
+| `<div role="list">` | `<ol>` or `<ul>` |
+| `<div role="listitem">` | `<li>` |
+| `<div role="table">` | `<table>` |
+| `<div role="rowgroup">` | `<thead>`, `<tbody>`, or `<tfoot>` |
+| `<div role="row">` | `<tr>` |
+| `<div role="columnheader">` | `<th>` |
+| `<div role="cell">` | `<td>` |
+
+## Support keyboard-only use
+
+Keyboard users rely on focus outlines to understand where they are on the page. Therefore, if an
+element is interactive you must ensure:
+
+- It can receive keyboard focus.
+- It has a visible focus state.
+
+Use semantic HTML, such as `a` and `button`, which provides these behaviours by default.
+
+See the [Pajamas Keyboard-only page](https://design.gitlab.com/accessibility-audits/2-keyboard-only/) for more detail.
+
+## Tabindex
+
+Prefer **no** `tabindex` to using `tabindex`, since:
+
+- Using semantic HTML such as `button` implicitly provides `tabindex="0"`
+- Tabbing order should match the visual reading order and positive `tabindex`s interfere with this
+
+### Avoid using `tabindex="0"` to make an element interactive
+
+Use interactive elements instead of `div`s and `span`s.
+For example:
+
+- If the element should be clickable, use a `button`
+- If the element should be text editable, use an `input` or `textarea`
+
+Once the markup is semantically complete, use CSS to update it to its desired visual state.
+
+```html
+// bad
+<div role="button" tabindex="0" @click="expand">Expand</div>
+
+// good
+<button @click="expand">Expand</button>
+```
+
+### Do not use `tabindex="0"` on interactive elements
+
+Interactive elements are already tab accessible so adding `tabindex` is redundant.
+
+```html
+// bad
+<a href="help" tabindex="0">Help</a>
+<button tabindex="0">Submit</button>
+
+// good
+<a href="help">Help</a>
+<button>Submit</button>
+```
+
+### Do not use `tabindex="0"` on elements for screen readers to read
+
+Screen readers can read text that is not tab accessible.
+The use of `tabindex="0"` is unnecessary and can cause problems,
+as screen reader users then expect to be able to interact with it.
+
+```html
+// bad
+<span tabindex="0" :aria-label="message">{{ message }}</span>
+
+// good
+<p>{{ message }}</p>
+```
+
+### Do not use a positive `tabindex`
+
+[Always avoid using `tabindex="1"`](https://webaim.org/techniques/keyboard/tabindex#overview)
+or greater.
+
+## Hiding elements
+
+Use the following table to hide elements from users, when appropriate.
+
+| Hide from sighted users | Hide from screen readers | Hide from both sighted and screen reader users |
+| --- | --- | --- |
+| `.gl-sr-only` | `aria-hidden="true"` | `display: none`, `visibility: hidden`, or `hidden` attribute |
+
+### Hide decorative images from screen readers
+
+To reduce noise for screen reader users, hide decorative images using `alt=""`.
+If the image is not an `img` element, such as an inline SVG, you can hide it by adding both `role="img"` and `alt=""`.
+
+`gl-icon` components automatically hide their icons from screen readers so `aria-hidden="true"` is
+unnecessary when using `gl-icon`.
+
+```html
+// good - decorative images hidden from screen readers
+<img src="decorative.jpg" alt="">
+<svg role="img" alt="">
+<gl-icon name="epic"/>
+```
+
+## When should ARIA be used
+
+No ARIA is required when using semantic HTML because it incorporates accessibility.
+
+However, there are some UI patterns and widgets that do not have semantic HTML equivalents.
+Building such widgets require ARIA to make them understandable to screen readers.
+Proper research and testing should be done to ensure compliance with ARIA.
+
+Ideally, these widgets would exist only in [GitLab UI](https://gitlab-org.gitlab.io/gitlab-ui/).
+Use of ARIA would then only occur in [GitLab UI](https://gitlab.com/gitlab-org/gitlab-ui/) and not [GitLab](https://gitlab.com/gitlab-org/gitlab/).
## Resources
-[Chrome Accessibility Developer Tools](https://github.com/GoogleChrome/accessibility-developer-tools)
-assist with testing for potential accessibility problems in GitLab.
+### Viewing the browser accessibility tree
+
+- [Firefox DevTools guide](https://developer.mozilla.org/en-US/docs/Tools/Accessibility_inspector#accessing_the_accessibility_inspector)
+- [Chrome DevTools guide](https://developers.google.com/web/tools/chrome-devtools/accessibility/reference#pane)
+
+### Browser extensions
+
+We have two options for Web accessibility testing:
+
+- [axe](https://www.deque.com/axe/) for [Firefox](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/)
+- [axe](https://www.deque.com/axe/) for [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd)
-The [axe](https://www.deque.com/axe/) browser extension (available for [Firefox](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/) and [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd)) provides running audits and feedback on markup, CSS, and even potentially problematic color usages.
+### Other links
-Accessibility best-practices and more in-depth information are available on
-[the Audit Rules page](https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules) for the Chrome Accessibility Developer Tools. The [Awesome Accessibility](https://github.com/brunopulis/awesome-a11y) list is a compilation of accessibility-related material.
+- [The A11Y Project](https://www.a11yproject.com/) is a good resource for accessibility
+- [Awesome Accessibility](https://github.com/brunopulis/awesome-a11y)
+ is a compilation of accessibility-related material
+- You can read [Chrome Accessibility Developer Tools'](https://github.com/GoogleChrome/accessibility-developer-tools)
+ rules on its [Audit Rules page](https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules)
diff --git a/doc/development/fe_guide/dark_mode.md b/doc/development/fe_guide/dark_mode.md
index dd7ffd1ee6c..34901bbb1e6 100644
--- a/doc/development/fe_guide/dark_mode.md
+++ b/doc/development/fe_guide/dark_mode.md
@@ -17,7 +17,7 @@ Note the following:
- The dark mode palette is defined in `app/assets/stylesheets/themes/_dark.scss`.
This is loaded _before_ application.scss to generate `application_dark.css`
- We define two types of variables in `_dark.scss`:
- - SCSS variables are used in framework, components, and utitlity classes.
+ - SCSS variables are used in framework, components, and utility classes.
- CSS variables are used for any colors within the `app/assets/stylesheets/page_bundles` directory.
- `app/views/layouts/_head.html.haml` then loads application or application_dark based on the user's theme preference.
@@ -68,7 +68,7 @@ We [plan to add](https://gitlab.com/gitlab-org/gitlab/-/issues/301147) the CSS v
## When to use SCSS variables
There are a few things we do in SCSS that we cannot (easily) do with CSS, such as the following
-functions:
+functions:
- `lighten`
- `darken`
diff --git a/doc/development/fe_guide/editor_lite.md b/doc/development/fe_guide/editor_lite.md
index f783a97fbd3..8154f0ee5c6 100644
--- a/doc/development/fe_guide/editor_lite.md
+++ b/doc/development/fe_guide/editor_lite.md
@@ -4,7 +4,7 @@ group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Editor Lite
+# Editor Lite **(FREE)**
## Background
diff --git a/doc/development/fe_guide/graphql.md b/doc/development/fe_guide/graphql.md
index a53d9fee029..0b26115b94f 100644
--- a/doc/development/fe_guide/graphql.md
+++ b/doc/development/fe_guide/graphql.md
@@ -63,6 +63,7 @@ see [Immutability and cache updates](#immutability-and-cache-updates) for more i
If you use VS Code, the Apollo GraphQL extension supports autocompletion in `.graphql` files. To set up
the GraphQL extension, follow these steps:
+1. Generate the schema: `bundle exec rake gitlab:graphql:schema:dump`
1. Add an `apollo.config.js` file to the root of your `gitlab` local directory.
1. Populate the file with the following content:
@@ -72,7 +73,7 @@ the GraphQL extension, follow these steps:
includes: ['./app/assets/javascripts/**/*.graphql', './ee/app/assets/javascripts/**/*.graphql'],
service: {
name: 'GitLab',
- localSchemaFile: './doc/api/graphql/reference/gitlab_schema.graphql',
+ localSchemaFile: './tmp/tests/graphql/gitlab_schema.graphql',
},
},
};
@@ -768,6 +769,23 @@ export default {
### Testing
+#### Generating the GraphQL schema
+
+Some of our tests load the schema JSON files. To generate these files, run:
+
+```shell
+bundle exec rake gitlab:graphql:schema:dump
+```
+
+You should run this task after pulling from upstream, or when rebasing your
+branch. This is run automatically as part of `gdk update`.
+
+NOTE:
+If you use the RubyMine IDE, and have marked the `tmp` directory as
+"Excluded", you should "Mark Directory As -> Not Excluded" for
+`gitlab/tmp/tests/graphql`. This will allow the **JS GraphQL** plugin to
+automatically find and index the schema.
+
#### Mocking response as component data
<!-- vale gitlab.Spelling = NO -->
diff --git a/doc/development/fe_guide/index.md b/doc/development/fe_guide/index.md
index 711c6a5f875..1315520342e 100644
--- a/doc/development/fe_guide/index.md
+++ b/doc/development/fe_guide/index.md
@@ -104,7 +104,7 @@ See the relevant style guides for our guidelines and for information on linting:
- [JavaScript](style/javascript.md). Our guide is based on
the excellent [Airbnb](https://github.com/airbnb/javascript) style guide with a few small
changes.
-- [SCSS](style/scss.md): our SCSS conventions which are enforced through [`scss-lint`](https://github.com/sds/scss-lint).
+- [SCSS](style/scss.md): [our SCSS conventions](https://gitlab.com/gitlab-org/frontend/gitlab-stylelint-config) which are enforced through [`stylelint`](https://stylelint.io).
- [HTML](style/html.md). Guidelines for writing HTML code consistent with the rest of the codebase.
- [Vue](style/vue.md). Guidelines and conventions for Vue code may be found here.
diff --git a/doc/development/fe_guide/style/html.md b/doc/development/fe_guide/style/html.md
index e53686de1a0..18f72a9655c 100644
--- a/doc/development/fe_guide/style/html.md
+++ b/doc/development/fe_guide/style/html.md
@@ -6,6 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# HTML style guide
+See also our [accessibility page](../accessibility.md).
+
## Semantic elements
[Semantic elements](https://developer.mozilla.org/en-US/docs/Glossary/Semantics) are HTML tags that
@@ -52,30 +54,27 @@ Button tags requires a `type` attribute according to the [W3C HTML specification
<button type="button"></button>
```
-### Button role
-
-If an HTML element has an `onClick` handler but is not a button, it should have `role="button"`. This is [more accessible](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/button_role).
-
-```html
-// bad
-<div onClick="doSomething"></div>
-
-// good
-<div role="button" onClick="doSomething"></div>
-```
-
## Links
### Blank target
+Avoid forcing links to open in a new window as this reduces the control the user has over the link.
+However, it might be a good idea to use a blank target when replacing the current page with
+the link makes the user lose content or progress.
+
Use `rel="noopener noreferrer"` whenever your links open in a new window, i.e. `target="_blank"`. This prevents a security vulnerability [documented by JitBit](https://www.jitbit.com/alexblog/256-targetblank---the-most-underestimated-vulnerability-ever/).
+When using `gl-link`, using `target="_blank"` is sufficient as it automatically adds `rel="noopener noreferrer"` to the link.
+
```html
// bad
<a href="url" target="_blank"></a>
// good
<a href="url" target="_blank" rel="noopener noreferrer"></a>
+
+// good
+<gl-link href="url" target="_blank"></gl-link>
```
### Fake links
diff --git a/doc/development/fe_guide/style/index.md b/doc/development/fe_guide/style/index.md
index 89a3d874184..f3da78647be 100644
--- a/doc/development/fe_guide/style/index.md
+++ b/doc/development/fe_guide/style/index.md
@@ -16,7 +16,7 @@ changes.
## SCSS style guide
-Our [SCSS conventions](scss.md) which are enforced through [`scss-lint`](https://github.com/sds/scss-lint).
+Our [SCSS conventions](scss.md) which are enforced through [`stylelint`](https://stylelint.io).
## HTML style guide
diff --git a/doc/development/fe_guide/style/javascript.md b/doc/development/fe_guide/style/javascript.md
index 5c35b880eab..87054f7db86 100644
--- a/doc/development/fe_guide/style/javascript.md
+++ b/doc/development/fe_guide/style/javascript.md
@@ -14,7 +14,7 @@ In addition to the style guidelines set by Airbnb, we also have a few specific r
listed below.
NOTE:
-You can run ESLint locally by running `yarn eslint`
+You can run ESLint locally by running `yarn run lint:eslint`
## Avoid forEach
diff --git a/doc/development/fe_guide/style/scss.md b/doc/development/fe_guide/style/scss.md
index 1d0b3c2b7fc..13c44a098bc 100644
--- a/doc/development/fe_guide/style/scss.md
+++ b/doc/development/fe_guide/style/scss.md
@@ -132,16 +132,14 @@ Before adding a new variable for a color or a size, guarantee:
## Linting
-We use [SCSS Lint](https://github.com/sds/scss-lint) to check for style guide conformity. It uses the
-ruleset in `.scss-lint.yml`, which is located in the home directory of the
-project.
+We use [stylelint](https://stylelint.io) to check for style guide conformity. It uses the
+ruleset in `.stylelintrc` and rules from [our SCSS configuration](https://gitlab.com/gitlab-org/frontend/gitlab-stylelint-config). `.stylelintrc` is located in the home directory of the project.
-To check if any warnings are produced by your changes, run `rake
-scss_lint` in the GitLab directory. SCSS Lint also runs in GitLab CI/CD to
+To check if any warnings are produced by your changes, run `yarn stylelint` in the GitLab directory. Stylelint also runs in GitLab CI/CD to
catch any warnings.
If the Rake task is throwing warnings you don't understand, SCSS Lint's
-documentation includes [a full list of their linters](https://github.com/sds/scss-lint/blob/master/lib/scss_lint/linter/README.md).
+documentation includes [a full list of their rules](https://stylelint.io/user-guide/rules/list).
### Fixing issues
diff --git a/doc/development/fe_guide/style/vue.md b/doc/development/fe_guide/style/vue.md
index 0288238a9e5..d62145b4a4c 100644
--- a/doc/development/fe_guide/style/vue.md
+++ b/doc/development/fe_guide/style/vue.md
@@ -432,41 +432,7 @@ must be unique. It's advised to use `kebab-case` namespaces.
Useful links:
1. [`key`](https://vuejs.org/v2/guide/list.html#key)
-1. [Vue Style Guide: Keyed v-for](https://vuejs.org/v2/style-guide/#Keyed-v-for-essential )
-
-## Vue and Bootstrap
-
-1. Tooltips: Do not rely on `has-tooltip` class name for Vue components
-
- ```html
- // bad
- <span
- class="has-tooltip"
- title="Some tooltip text">
- Text
- </span>
-
- // good
- <span
- v-tooltip
- title="Some tooltip text">
- Text
- </span>
- ```
-
-1. Tooltips: When using a tooltip, include the tooltip directive, `./app/assets/javascripts/vue_shared/directives/tooltip.js`
-
-1. Don't change `data-original-title`.
-
- ```html
- // bad
- <span data-original-title="tooltip text">Foo</span>
-
- // good
- <span title="tooltip text">Foo</span>
-
- $('span').tooltip('_fixTitle');
- ```
+1. [Vue Style Guide: Keyed v-for](https://vuejs.org/v2/style-guide/#Keyed-v-for-essential)
## Vue testing
diff --git a/doc/development/fe_guide/tooling.md b/doc/development/fe_guide/tooling.md
index 7a2d8fccdbf..c493ab9a206 100644
--- a/doc/development/fe_guide/tooling.md
+++ b/doc/development/fe_guide/tooling.md
@@ -17,7 +17,7 @@ This section describes yarn scripts that are available to validate and apply aut
To check all staged files (based on `git diff`) with ESLint, run the following script:
```shell
-yarn eslint-staged
+yarn run lint:eslint:staged
```
A list of problems found are logged to the console.
@@ -25,7 +25,7 @@ A list of problems found are logged to the console.
To apply automatic ESLint fixes to all staged files (based on `git diff`), run the following script:
```shell
-yarn eslint-staged-fix
+yarn run lint:eslint:staged:fix
```
If manual changes are required, a list of changes are sent to the console.
@@ -33,7 +33,7 @@ If manual changes are required, a list of changes are sent to the console.
To check **all** files in the repository with ESLint, run the following script:
```shell
-yarn eslint
+yarn run lint:eslint
```
A list of problems found are logged to the console.
@@ -41,7 +41,7 @@ A list of problems found are logged to the console.
To apply automatic ESLint fixes to **all** files in the repository, run the following script:
```shell
-yarn eslint-fix
+yarn run lint:eslint:fix
```
If manual changes are required, a list of changes are sent to the console.
@@ -98,6 +98,57 @@ When declaring multiple globals, always use one `/* global [name] */` line per v
/* global jQuery */
```
+### Deprecating functions with `import/no-deprecated`
+
+Our `@gitlab/eslint-plugin` Node module contains the [`eslint-plugin-import`](https://gitlab.com/gitlab-org/frontend/eslint-plugin) package.
+
+We can use the [`import/no-deprecated`](https://github.com/benmosher/eslint-plugin-import/blob/HEAD/docs/rules/no-deprecated.md) rule to deprecate functions using a JSDoc block with a `@deprecated` tag:
+
+```javascript
+/**
+ * Convert search query into an object
+ *
+ * @param {String} query from "document.location.search"
+ * @param {Object} options
+ * @param {Boolean} options.gatherArrays - gather array values into an Array
+ * @returns {Object}
+ *
+ * ex: "?one=1&two=2" into {one: 1, two: 2}
+ * @deprecated Please use `queryToObject` instead. See https://gitlab.com/gitlab-org/gitlab/-/issues/283982 for more information
+ */
+export function queryToObject(query, options = {}) {
+ ...
+}
+```
+
+It is strongly encouraged that you:
+
+- Put in an **alternative path for developers** looking to use this function.
+- **Provide a link to the issue** that tracks the migration process.
+
+NOTE:
+Uses are detected if you import the deprecated function into another file. They are not detected when the function is used in the same file.
+
+Running `$ yarn eslint` after this will give us the list of deprecated usages:
+
+```shell
+$ yarn eslint
+
+./app/assets/javascripts/issuable_form.js
+ 9:10 error Deprecated: Please use `queryToObject` instead. See https://gitlab.com/gitlab-org/gitlab/-/issues/283982 for more information import/no-deprecated
+ 33:23 error Deprecated: Please use `queryToObject` instead. See https://gitlab.com/gitlab-org/gitlab/-/issues/283982 for more information import/no-deprecated
+...
+```
+
+Grep for disabled cases of this rule to generate a working list to create issues from, so you can track the effort of removing deprecated uses:
+
+```shell
+$ grep "eslint-disable.*import/no-deprecated" -r .
+
+./app/assets/javascripts/issuable_form.js:import { queryToObject, objectToQuery } from './lib/utils/url_utility'; // eslint-disable-line import/no-deprecate
+./app/assets/javascripts/issuable_form.js: // eslint-disable-next-line import/no-deprecated
+```
+
## Formatting with Prettier
> Support for `.graphql` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227280) in GitLab 13.2.
@@ -125,44 +176,28 @@ Please take care that you only let Prettier format the same file types as the gl
The following yarn scripts are available to do global formatting:
```shell
-yarn prettier-staged-save
+yarn run lint:prettier:staged:fix
```
Updates all staged files (based on `git diff`) with Prettier and saves the needed changes.
```shell
-yarn prettier-staged
+yarn run lint:prettier:staged
```
Checks all staged files (based on `git diff`) with Prettier and log which files would need manual updating to the console.
```shell
-yarn prettier-all
+yarn run lint:prettier
```
Checks all files with Prettier and logs which files need manual updating to the console.
```shell
-yarn prettier-all-save
-```
-
-Formats all files in the repository with Prettier. (This should only be used to test global rule updates otherwise you would end up with huge MR's).
-
-The source of these Yarn scripts can be found in `/scripts/frontend/prettier.js`.
-
-#### Scripts during Conversion period
-
-```shell
-node ./scripts/frontend/prettier.js check-all ./vendor/
-```
-
-This iterates over all files in a specific folder, and checks them.
-
-```shell
-node ./scripts/frontend/prettier.js save-all ./vendor/
+yarn run lint:prettier:fix
```
-This iterates over all files in a specific folder and saves them.
+Formats all files in the repository with Prettier.
### VSCode Settings
diff --git a/doc/development/feature_flags/controls.md b/doc/development/feature_flags/controls.md
index 21ac152c469..df98996158e 100644
--- a/doc/development/feature_flags/controls.md
+++ b/doc/development/feature_flags/controls.md
@@ -276,17 +276,19 @@ and reduces confidence in our testing suite covering all possible combinations.
Additionally, a feature flag overwritten in some of the environments can result
in undefined and untested system behavior.
-To remove a feature flag:
+To remove a feature flag, open **one merge request** to make the changes. In the MR:
-1. Open a new merge request with the ~"feature flag" label so
- release managers are aware the changes are hidden behind a feature flag.
+1. Add the ~"feature flag" label so release managers are aware the changes are hidden behind a feature flag.
1. If the merge request has to be picked into a stable branch, add the
appropriate `~"Pick into X.Y"` label, for example `~"Pick into 13.0"`.
See [the feature flag process](process.md#including-a-feature-behind-feature-flag-in-the-final-release)
for further details.
-1. Remove all references to the feature flag from the codebase.
+1. Remove all references to the feature flag from the codebase, including tests.
1. Remove the YAML definition for the feature from the repository.
-1. Clean up the feature flag from all environments with `/chatops run feature delete some_feature`.
+
+Once the above MR has been merged, you should:
+
+1. [Clean up the feature flag from all environments](#cleanup-chatops) with `/chatops run feature delete some_feature`.
1. Close the rollout issue for the feature flag after the feature flag is removed from the codebase.
### Cleanup ChatOps
diff --git a/doc/development/features_inside_dot_gitlab.md b/doc/development/features_inside_dot_gitlab.md
index 08adb7faeb2..36b9064bbc4 100644
--- a/doc/development/features_inside_dot_gitlab.md
+++ b/doc/development/features_inside_dot_gitlab.md
@@ -10,8 +10,8 @@ We have implemented standard features that depend on configuration files in the
When implementing new features, please refer to these existing features to avoid conflicts:
- [Custom Dashboards](../operations/metrics/dashboards/index.md#add-a-new-dashboard-to-your-project): `.gitlab/dashboards/`.
-- [Issue Templates](../user/project/description_templates.md#creating-issue-templates): `.gitlab/issue_templates/`.
-- [Merge Request Templates](../user/project/description_templates.md#creating-merge-request-templates): `.gitlab/merge_request_templates/`.
+- [Issue Templates](../user/project/description_templates.md#create-an-issue-template): `.gitlab/issue_templates/`.
+- [Merge Request Templates](../user/project/description_templates.md#create-a-merge-request-template): `.gitlab/merge_request_templates/`.
- [GitLab Kubernetes Agents](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/configuration_repository.md#layout): `.gitlab/agents/`.
- [CODEOWNERS](../user/project/code_owners.md#how-to-set-up-code-owners): `.gitlab/CODEOWNERS`.
- [Route Maps](../ci/review_apps/#route-maps): `.gitlab/route-map.yml`.
diff --git a/doc/development/go_guide/index.md b/doc/development/go_guide/index.md
index f352db918ed..a6d9ba861b0 100644
--- a/doc/development/go_guide/index.md
+++ b/doc/development/go_guide/index.md
@@ -202,9 +202,9 @@ code readability and test output.
### Better output in tests
When comparing expected and actual values in tests, use
-[`testify/require.Equal`](https://godoc.org/github.com/stretchr/testify/require#Equal),
-[`testify/require.EqualError`](https://godoc.org/github.com/stretchr/testify/require#EqualError),
-[`testify/require.EqualValues`](https://godoc.org/github.com/stretchr/testify/require#EqualValues),
+[`testify/require.Equal`](https://pkg.go.dev/github.com/stretchr/testify/require#Equal),
+[`testify/require.EqualError`](https://pkg.go.dev/github.com/stretchr/testify/require#EqualError),
+[`testify/require.EqualValues`](https://pkg.go.dev/github.com/stretchr/testify/require#EqualValues),
and others to improve readability when comparing structs, errors,
large portions of text, or JSON documents:
@@ -363,12 +363,12 @@ There are a few guidelines one should follow when using the
[Logrus](https://github.com/sirupsen/logrus) package:
- When printing an error use
- [WithError](https://godoc.org/github.com/sirupsen/logrus#WithError). For
+ [WithError](https://pkg.go.dev/github.com/sirupsen/logrus#WithError). For
example, `logrus.WithError(err).Error("Failed to do something")`.
- Since we use [structured logging](#structured-json-logging) we can log
fields in the context of that code path, such as the URI of the request using
- [`WithField`](https://godoc.org/github.com/sirupsen/logrus#WithField) or
- [`WithFields`](https://godoc.org/github.com/sirupsen/logrus#WithFields). For
+ [`WithField`](https://pkg.go.dev/github.com/sirupsen/logrus#WithField) or
+ [`WithFields`](https://pkg.go.dev/github.com/sirupsen/logrus#WithFields). For
example, `logrus.WithField("file", "/app/go").Info("Opening dir")`. If you
have to log multiple keys, always use `WithFields` instead of calling
`WithField` more than once.
@@ -488,7 +488,7 @@ The following are some style guidelines that are specific to the Secure Team.
### Code style and format
Use `goimports -local gitlab.com/gitlab-org` before committing.
-[`goimports`](https://godoc.org/golang.org/x/tools/cmd/goimports)
+[`goimports`](https://pkg.go.dev/golang.org/x/tools/cmd/goimports)
is a tool that automatically formats Go source code using
[`Gofmt`](https://golang.org/cmd/gofmt/), in addition to formatting import lines,
adding missing ones and removing unreferenced ones.
diff --git a/doc/development/graphql_guide/index.md b/doc/development/graphql_guide/index.md
index fd6d8992f94..4ecb34835aa 100644
--- a/doc/development/graphql_guide/index.md
+++ b/doc/development/graphql_guide/index.md
@@ -17,6 +17,6 @@ feedback, and suggestions.
- [GraphQL API documentation style guide](../documentation/graphql_styleguide.md): documentation
style guide for GraphQL.
- [GraphQL API](../../api/graphql/index.md): user documentation for the GitLab GraphQL API.
-- [GraphQL BatchLoader](batchloader.md): development documentation on the batchloader.
+- [GraphQL BatchLoader](batchloader.md): development documentation on the BatchLoader.
- [GraphQL pagination](pagination.md): development documentation on pagination.
- [GraphQL Pro](graphql_pro.md): information on our GraphQL Pro subscription.
diff --git a/doc/development/image_scaling.md b/doc/development/image_scaling.md
index d447b6baf57..79687b66711 100644
--- a/doc/development/image_scaling.md
+++ b/doc/development/image_scaling.md
@@ -73,7 +73,7 @@ we simply follow the path we take to serve any ordinary upload.
### Workhorse
Assuming Rails decided the request to be valid, Workhorse will take over. Upon receiving the `send-scaled-image`
-instruction through the Rails response, a [special response injecter](https://gitlab.com/gitlab-org/gitlab-workhorse/-/blob/master/internal/imageresizer/image_resizer.go)
+instruction through the Rails response, a [special response injector](https://gitlab.com/gitlab-org/gitlab-workhorse/-/blob/master/internal/imageresizer/image_resizer.go)
will be invoked that knows how to rescale images. The only inputs it requires are the location of the image
(a path if the image resides in block storage, or a URL to remote storage otherwise) and the desired width.
Workhorse will handle the location transparently so Rails does not need to be concerned with where the image
diff --git a/doc/development/integrations/jira_connect.md b/doc/development/integrations/jira_connect.md
index bfe523ee390..860fd88612f 100644
--- a/doc/development/integrations/jira_connect.md
+++ b/doc/development/integrations/jira_connect.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Set up a development environment
+# Set up a development environment **(FREE)**
The following are required to install and test the app:
diff --git a/doc/development/integrations/secure.md b/doc/development/integrations/secure.md
index 1d5aced5869..9eae964b86a 100644
--- a/doc/development/integrations/secure.md
+++ b/doc/development/integrations/secure.md
@@ -263,14 +263,14 @@ and what `bundle audit` writes to the standard output.
If the command line fails, then it should be logged with the `error` log level;
this makes it possible to debug the problem without having to change the log level to `debug` and rerun the scanning job.
-#### common logutil package
+#### common `logutil` package
If you are using [go](https://golang.org/) and
[common](https://gitlab.com/gitlab-org/security-products/analyzers/common),
-then it is suggested that you use [logrus](https://github.com/Sirupsen/logrus)
-and [common's logutil package](https://gitlab.com/gitlab-org/security-products/analyzers/common/-/tree/master/logutil)
-to configure the formatter for [logrus](https://github.com/Sirupsen/logrus).
-See the [logutil README.md](https://gitlab.com/gitlab-org/security-products/analyzers/common/-/tree/master/logutil/README.md)
+then it is suggested that you use [Logrus](https://github.com/Sirupsen/logrus)
+and [common's `logutil` package](https://gitlab.com/gitlab-org/security-products/analyzers/common/-/tree/master/logutil)
+to configure the formatter for [Logrus](https://github.com/Sirupsen/logrus).
+See the [`logutil` README](https://gitlab.com/gitlab-org/security-products/analyzers/common/-/tree/master/logutil/README.md)
## Report
diff --git a/doc/development/integrations/secure_partner_integration.md b/doc/development/integrations/secure_partner_integration.md
index 364e18ad015..9c7dc752e4f 100644
--- a/doc/development/integrations/secure_partner_integration.md
+++ b/doc/development/integrations/secure_partner_integration.md
@@ -13,7 +13,7 @@ guidelines so you can build an integration that fits with the workflow GitLab
users are already familiar with.
This page also provides resources for the technical work associated
-with [onboarding as a partner](https://about.gitlab.com/partners/integrate/).
+with [onboarding as a partner](https://about.gitlab.com/partners/technology-partners/integrate/).
The steps below are a high-level view of what needs to be done to complete an
integration as well as linking to more detailed resources for how to do so.
diff --git a/doc/development/internal_api.md b/doc/development/internal_api.md
index dce0877b1b7..78b59940613 100644
--- a/doc/development/internal_api.md
+++ b/doc/development/internal_api.md
@@ -470,7 +470,7 @@ curl --request POST --header "Gitlab-Kas-Api-Request: <JWT token>" --header "A
## Subscriptions
-The subscriptions endpoint is used by `[customers.gitlab.com](https://gitlab.com/gitlab-org/customers-gitlab-com)` (CustomersDot)
+The subscriptions endpoint is used by [CustomersDot](https://gitlab.com/gitlab-org/customers-gitlab-com) (`customers.gitlab.com`)
in order to apply subscriptions including trials, and add-on purchases, for personal namespaces or top-level groups within GitLab.com.
### Creating a subscription
diff --git a/doc/development/namespaces_storage_statistics.md b/doc/development/namespaces_storage_statistics.md
index 373b1e38dfc..587e1091e77 100644
--- a/doc/development/namespaces_storage_statistics.md
+++ b/doc/development/namespaces_storage_statistics.md
@@ -140,7 +140,7 @@ Even though this approach would make aggregating much easier, it has some major
- We'd have to migrate **all namespaces** by adding and filling a new column. Because of the size of the table, dealing with time/cost would be significant. The background migration would take approximately `153h`, see <https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/29772>.
- Background migration has to be shipped one release before, delaying the functionality by another milestone.
-### Attempt E (final): Update the namespace storage statistics in async way
+### Attempt E (final): Update the namespace storage statistics asynchronously
This approach consists of continuing to use the incremental statistics updates we already have,
but we refresh them through Sidekiq jobs and in different transactions:
@@ -149,7 +149,7 @@ but we refresh them through Sidekiq jobs and in different transactions:
1. Whenever the statistics of a project changes, insert a row into `namespace_aggregation_schedules`
- We don't insert a new row if there's already one related to the root namespace.
- Keeping in mind the length of the transaction that involves updating `project_statistics`(<https://gitlab.com/gitlab-org/gitlab/-/issues/29070>), the insertion should be done in a different transaction and through a Sidekiq Job.
-1. After inserting the row, we schedule another worker to be executed async at two different moments:
+1. After inserting the row, we schedule another worker to be executed asynchronously at two different moments:
- One enqueued for immediate execution and another one scheduled in `1.5h` hours.
- We only schedule the jobs, if we can obtain a `1.5h` lease on Redis on a key based on the root namespace ID.
- If we can't obtain the lease, it indicates there's another aggregation already in progress, or scheduled in no more than `1.5h`.
@@ -161,7 +161,7 @@ but we refresh them through Sidekiq jobs and in different transactions:
This implementation has the following benefits:
-- All the updates are done async, so we're not increasing the length of the transactions for `project_statistics`.
+- All the updates are done asynchronously, so we're not increasing the length of the transactions for `project_statistics`.
- We're doing the update in a single SQL query.
- It is compatible with PostgreSQL and MySQL.
- No background migration required.
diff --git a/doc/development/new_fe_guide/development/components.md b/doc/development/new_fe_guide/development/components.md
index 1d56419028e..ec714c9c26f 100644
--- a/doc/development/new_fe_guide/development/components.md
+++ b/doc/development/new_fe_guide/development/components.md
@@ -19,7 +19,7 @@ D3 is very popular across many projects outside of GitLab:
- [The New York Times](https://archive.nytimes.com/www.nytimes.com/interactive/2012/02/13/us/politics/2013-budget-proposal-graphic.html)
- [plot.ly](https://plotly.com/)
-- [Droptask](https://www.ayoa.com/previously-droptask/)
+- [Ayoa](https://www.ayoa.com/previously-droptask/)
Within GitLab, D3 has been used for the following notable features
diff --git a/doc/development/performance.md b/doc/development/performance.md
index 3b4525dc8ee..f2e3bcf2877 100644
--- a/doc/development/performance.md
+++ b/doc/development/performance.md
@@ -256,7 +256,7 @@ The following configuration options can be configured:
- `STACKPROF_MODE`: See [sampling modes](https://github.com/tmm1/stackprof#sampling).
Defaults to `cpu`.
- `STACKPROF_INTERVAL`: Sampling interval. Unit semantics depend on `STACKPROF_MODE`.
- For `object` mode this is a per-event interval (every `n`th event is sampled)
+ For `object` mode this is a per-event interval (every `nth` event is sampled)
and defaults to `1000`.
For other modes such as `cpu` this is a frequency and defaults to `10000` μs (100hz).
- `STACKPROF_FILE_PREFIX`: File path prefix where profiles are stored. Defaults
@@ -293,7 +293,7 @@ worker processes), selecting the latter.
For Sidekiq, the signal can be sent to the `sidekiq-cluster` process via `pkill
-USR2 bin/sidekiq-cluster`, which forwards the signal to all Sidekiq
-children. Alternatively, you can also select a specific pid of interest.
+children. Alternatively, you can also select a specific PID of interest.
Production profiles can be especially noisy. It can be helpful to visualize them
as a [flame graph](https://github.com/brendangregg/FlameGraph). This can be done
@@ -306,7 +306,7 @@ bundle exec stackprof --stackcollapse /tmp/stackprof.55769.c6c3906452.profile |
## RSpec profiling
The GitLab development environment also includes the
-[rspec_profiling](https://github.com/foraker/rspec_profiling) gem, which is used
+[`rspec_profiling`](https://github.com/foraker/rspec_profiling) gem, which is used
to collect data on spec execution times. This is useful for analyzing the
performance of the test suite itself, or seeing how the performance of a spec
may have changed over time.
@@ -409,7 +409,7 @@ Fragmented Ruby heap snapshot could look like this:
![Ruby heap fragmentation](img/memory_ruby_heap_fragmentation.png)
-Memory fragmentation could be reduced by tuning GC parameters as described in [this post by Nate Berkopec](https://www.speedshop.co/2017/12/04/malloc-doubles-ruby-memory.html). This should be considered as a tradeoff, as it may affect overall performance of memory allocation and GC cycles.
+Memory fragmentation could be reduced by tuning GC parameters [as described in this post](https://www.speedshop.co/2017/12/04/malloc-doubles-ruby-memory.html). This should be considered as a tradeoff, as it may affect overall performance of memory allocation and GC cycles.
## Importance of Changes
diff --git a/doc/development/pipelines.md b/doc/development/pipelines.md
index 4d931899da6..ca5bf1671f4 100644
--- a/doc/development/pipelines.md
+++ b/doc/development/pipelines.md
@@ -426,7 +426,7 @@ We are using a custom mapping between source file to test files, maintained in t
### PostgreSQL versions testing
-Even though [Omnibus defaults to PG12 for new installs and upgrades](https://docs.gitlab.com/omnibus/package-information/postgresql_versions.md),
+Even though [Omnibus defaults to PG12 for new installs and upgrades](https://docs.gitlab.com/omnibus/package-information/postgresql_versions.html),
our test suite is currently running against PG11, since GitLab.com still runs on PG11.
We do run our test suite against PG12 on nightly scheduled pipelines as well as upon specific
@@ -704,13 +704,13 @@ and included in `rules` definitions via [YAML anchors](../ci/yaml/README.md#anch
| `if-not-canonical-namespace` | Matches if the project isn't in the canonical (`gitlab-org/`) or security (`gitlab-org/security`) namespace. | Use to create a job for forks (by using `when: on_success|manual`), or **not** create a job for forks (by using `when: never`). |
| `if-not-ee` | Matches if the project isn't EE (i.e. project name isn't `gitlab` or `gitlab-ee`). | Use to create a job only in the FOSS project (by using `when: on_success|manual`), or **not** create a job if the project is EE (by using `when: never`). |
| `if-not-foss` | Matches if the project isn't FOSS (i.e. project name isn't `gitlab-foss`, `gitlab-ce`, or `gitlabhq`). | Use to create a job only in the EE project (by using `when: on_success|manual`), or **not** create a job if the project is FOSS (by using `when: never`). |
-| `if-default-refs` | Matches if the pipeline is for `master`, `/^[\d-]+-stable(-ee)?$/` (stable branches), `/^\d+-\d+-auto-deploy-\d+$/` (auto-deploy branches), `/^security\//` (security branches), merge requests, and tags. | Note that jobs aren't created for branches with this default configuration. |
-| `if-master-refs` | Matches if the current branch is `master`. | |
-| `if-master-push` | Matches if the current branch is `master` and pipeline source is `push`. | |
-| `if-master-schedule-2-hourly` | Matches if the current branch is `master` and pipeline runs on a 2-hourly schedule. | |
-| `if-master-schedule-nightly` | Matches if the current branch is `master` and pipeline runs on a nightly schedule. | |
+| `if-default-refs` | Matches if the pipeline is for `master`, `main`, `/^[\d-]+-stable(-ee)?$/` (stable branches), `/^\d+-\d+-auto-deploy-\d+$/` (auto-deploy branches), `/^security\//` (security branches), merge requests, and tags. | Note that jobs aren't created for branches with this default configuration. |
+| `if-master-refs` | Matches if the current branch is `master` or `main`. | |
+| `if-master-push` | Matches if the current branch is `master` or `main` and pipeline source is `push`. | |
+| `if-master-schedule-2-hourly` | Matches if the current branch is `master` or `main` and pipeline runs on a 2-hourly schedule. | |
+| `if-master-schedule-nightly` | Matches if the current branch is `master` or `main` and pipeline runs on a nightly schedule. | |
| `if-auto-deploy-branches` | Matches if the current branch is an auto-deploy one. | |
-| `if-master-or-tag` | Matches if the pipeline is for the `master` branch or for a tag. | |
+| `if-master-or-tag` | Matches if the pipeline is for the `master` or `main` branch or for a tag. | |
| `if-merge-request` | Matches if the pipeline is for a merge request. | |
| `if-merge-request-title-as-if-foss` | Matches if the pipeline is for a merge request and the MR title includes "RUN AS-IF-FOSS". | |
| `if-merge-request-title-update-caches` | Matches if the pipeline is for a merge request and the MR title includes "UPDATE CACHE". | |
@@ -719,7 +719,7 @@ and included in `rules` definitions via [YAML anchors](../ci/yaml/README.md#anch
| `if-security-schedule` | Matches if the pipeline is for a security scheduled pipeline. | |
| `if-nightly-master-schedule` | Matches if the pipeline is for a `master` scheduled pipeline with `$NIGHTLY` set. | |
| `if-dot-com-gitlab-org-schedule` | Limits jobs creation to scheduled pipelines for the `gitlab-org` group on GitLab.com. | |
-| `if-dot-com-gitlab-org-master` | Limits jobs creation to the `master` branch for the `gitlab-org` group on GitLab.com. | |
+| `if-dot-com-gitlab-org-master` | Limits jobs creation to the `master` or `main` branch for the `gitlab-org` group on GitLab.com. | |
| `if-dot-com-gitlab-org-merge-request` | Limits jobs creation to merge requests for the `gitlab-org` group on GitLab.com. | |
| `if-dot-com-gitlab-org-and-security-tag` | Limits job creation to tags for the `gitlab-org` and `gitlab-org/security` groups on GitLab.com. | |
| `if-dot-com-gitlab-org-and-security-merge-request` | Limit jobs creation to merge requests for the `gitlab-org` and `gitlab-org/security` groups on GitLab.com. | |
diff --git a/doc/development/prometheus.md b/doc/development/prometheus.md
deleted file mode 100644
index 62f30871f54..00000000000
--- a/doc/development/prometheus.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-redirect_to: '../user/project/integrations/prometheus.md'
----
-
-This document was moved to [another location](../user/project/integrations/prometheus.md).
-
-<!-- This redirect file can be deleted after February 1, 2021. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/query_performance.md b/doc/development/query_performance.md
index 3cb1b10c417..80c4d8c1fd0 100644
--- a/doc/development/query_performance.md
+++ b/doc/development/query_performance.md
@@ -25,7 +25,7 @@ When you are optimizing your SQL queries, there are two dimensions to pay attent
- When analyzing your query's performance, pay attention to if the time you are seeing is on a [cold or warm cache](#cold-and-warm-cache). These guidelines apply for both cache types.
- When working with batched queries, change the range and batch size to see how it effects the query timing and caching.
-- If an existing query is already underperforming, make an effort to improve it. If it is too complex or would stall development, create a follow-up so it can be addressed in a timely manner. You can always ask the database reviewer or maintainer for help and guidance.
+- If an existing query is not performing well, make an effort to improve it. If it is too complex or would stall development, create a follow-up so it can be addressed in a timely manner. You can always ask the database reviewer or maintainer for help and guidance.
## Cold and warm cache
diff --git a/doc/development/redis.md b/doc/development/redis.md
index 9f90c5ee760..c7111db0cdc 100644
--- a/doc/development/redis.md
+++ b/doc/development/redis.md
@@ -120,14 +120,13 @@ This shows commands that have taken a long time and may be a performance
concern.
The
-[fluent-plugin-redis-slowlog](https://gitlab.com/gitlab-org/fluent-plugin-redis-slowlog)
-project is responsible for taking the slowlog entries from Redis and
-passing to fluentd (and ultimately Elasticsearch).
+[`fluent-plugin-redis-slowlog`](https://gitlab.com/gitlab-org/fluent-plugin-redis-slowlog)
+project is responsible for taking the `slowlog` entries from Redis and
+passing to Fluentd (and ultimately Elasticsearch).
## Analyzing the entire keyspace
-The [Redis Keyspace
-Analyzer](https://gitlab.com/gitlab-com/gl-infra/redis-keyspace-analyzer)
+The [Redis Keyspace Analyzer](https://gitlab.com/gitlab-com/gl-infra/redis-keyspace-analyzer)
project contains tools for dumping the full key list and memory usage of a Redis
instance, and then analyzing those lists while eliminating potentially sensitive
data from the results. It can be used to find the most frequent key patterns, or
diff --git a/doc/development/secure_coding_guidelines.md b/doc/development/secure_coding_guidelines.md
index 41a7defbc26..e9c95a14236 100644
--- a/doc/development/secure_coding_guidelines.md
+++ b/doc/development/secure_coding_guidelines.md
@@ -195,7 +195,7 @@ Go's [`regexp`](https://golang.org/pkg/regexp/) package uses `re2` and isn't vul
- [Rubular](https://rubular.com/) is a nice online tool to fiddle with Ruby Regexps.
- [Runaway Regular Expressions](https://www.regular-expressions.info/catastrophic.html)
- [The impact of regular expression denial of service (ReDoS) in practice: an empirical study at the ecosystem scale](https://people.cs.vt.edu/~davisjam/downloads/publications/DavisCoghlanServantLee-EcosystemREDOS-ESECFSE18.pdf). This research paper discusses approaches to automatically detect ReDoS vulnerabilities.
-- [Freezing the web: A study of redos vulnerabilities in JavaScript-based web servers](https://www.usenix.org/system/files/conference/usenixsecurity18/sec18-staicu.pdf). Another research paper about detecting ReDoS vulnerabilities.
+- [Freezing the web: A study of ReDoS vulnerabilities in JavaScript-based web servers](https://www.usenix.org/system/files/conference/usenixsecurity18/sec18-staicu.pdf). Another research paper about detecting ReDoS vulnerabilities.
## Server Side Request Forgery (SSRF)
diff --git a/doc/development/sidekiq_style_guide.md b/doc/development/sidekiq_style_guide.md
index ce00934b35c..cff199c8b1d 100644
--- a/doc/development/sidekiq_style_guide.md
+++ b/doc/development/sidekiq_style_guide.md
@@ -588,7 +588,7 @@ the `.with_route` scope defined on all `Routable`s.
### Cron workers
-The context is automatically cleared for workers in the Cronjob queue
+The context is automatically cleared for workers in the cronjob queue
(`include CronjobQueue`), even when scheduling them from
requests. We do this to avoid incorrect metadata when other jobs are
scheduled from the cron worker.
diff --git a/doc/development/snowplow.md b/doc/development/snowplow.md
index a56e85ba50d..c9b76014c74 100644
--- a/doc/development/snowplow.md
+++ b/doc/development/snowplow.md
@@ -358,6 +358,7 @@ There are several tools for developing and testing Snowplow Event
1. For frontend events, in the MR description section, add a screenshot of the event's relevant section using the [Snowplow Analytics Debugger](https://chrome.google.com/webstore/detail/snowplow-analytics-debugg/jbnlcgeengmijcghameodeaenefieedm) Chrome browser extension.
1. For backend events, please use Snowplow Micro and add the output of the Snowplow Micro good events `GET http://localhost:9090/micro/good`.
+1. Include a member of the Product Intelligence team as a reviewer of your MR. Mention `@gitlab-org/growth/product_intelligence/engineers` in your MR to request a review.
### Snowplow Analytics Debugger Chrome Extension
@@ -484,9 +485,9 @@ For GitLab.com, we're setting up a [QA and Testing environment](https://gitlab.c
### `gitlab_standard`
-We are currently working towards including the [`gitlab_standard` schema](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_standard/jsonschema/) with every event. See [Standardize Snowplow Schema](https://gitlab.com/groups/gitlab-org/-/epics/5218) for details.
+We are including the [`gitlab_standard` schema](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_standard/jsonschema/) with every event. See [Standardize Snowplow Schema](https://gitlab.com/groups/gitlab-org/-/epics/5218) for details.
-The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/tracking/standard_context.rb) class represents this schema in the application.
+The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/tracking/standard_context.rb) class represents this schema in the application.
| Field Name | Required | Type | Description |
|----------------|---------------------|-----------------------|---------------------------------------------------------------------------------------------|
diff --git a/doc/development/sql.md b/doc/development/sql.md
index f68ca44efa8..8726c1331e8 100644
--- a/doc/development/sql.md
+++ b/doc/development/sql.md
@@ -12,13 +12,13 @@ either using ActiveRecord/Arel or raw SQL queries.
## Using LIKE Statements
The most common way to search for data is using the `LIKE` statement. For
-example, to get all issues with a title starting with "WIP:" you'd write the
+example, to get all issues with a title starting with "Draft:" you'd write the
following query:
```sql
SELECT *
FROM issues
-WHERE title LIKE 'WIP:%';
+WHERE title LIKE 'Draft:%';
```
On PostgreSQL the `LIKE` statement is case-sensitive. To perform a case-insensitive
@@ -28,13 +28,13 @@ To handle this automatically you should use `LIKE` queries using Arel instead
of raw SQL fragments, as Arel automatically uses `ILIKE` on PostgreSQL.
```ruby
-Issue.where('title LIKE ?', 'WIP:%')
+Issue.where('title LIKE ?', 'Draft:%')
```
You'd write this instead:
```ruby
-Issue.where(Issue.arel_table[:title].matches('WIP:%'))
+Issue.where(Issue.arel_table[:title].matches('Draft:%'))
```
Here `matches` generates the correct `LIKE` / `ILIKE` statement depending on the
@@ -45,7 +45,7 @@ If you need to chain multiple `OR` conditions you can also do this using Arel:
```ruby
table = Issue.arel_table
-Issue.where(table[:title].matches('WIP:%').or(table[:foo].matches('WIP:%')))
+Issue.where(table[:title].matches('Draft:%').or(table[:foo].matches('Draft:%')))
```
On PostgreSQL, this produces:
@@ -53,7 +53,7 @@ On PostgreSQL, this produces:
```sql
SELECT *
FROM issues
-WHERE (title ILIKE 'WIP:%' OR foo ILIKE 'WIP:%')
+WHERE (title ILIKE 'Draft:%' OR foo ILIKE 'Draft:%')
```
## LIKE & Indexes
@@ -64,7 +64,7 @@ the start. For example, this will not use any indexes:
```sql
SELECT *
FROM issues
-WHERE title ILIKE '%WIP:%';
+WHERE title ILIKE '%Draft:%';
```
Because the value for `ILIKE` starts with a wildcard the database is not able to
diff --git a/doc/development/testing_guide/best_practices.md b/doc/development/testing_guide/best_practices.md
index 79ff46ae352..b2f15c22429 100644
--- a/doc/development/testing_guide/best_practices.md
+++ b/doc/development/testing_guide/best_practices.md
@@ -168,7 +168,7 @@ can be used:
```ruby
RSpec.describe API::Search, factory_default: :keep do
- let_it_be(:namespace) { create_default(:namespace) }
+ let_it_be(:namespace) { create_default(:namespace).freeze }
```
Then every project we create uses this `namespace`, without us having to pass
@@ -176,13 +176,17 @@ it as `namespace: namespace`. In order to make it work along with `let_it_be`, `
must be explicitly specified. That keeps the default factory for every example in a suite instead of
recreating it for each example.
+Objects created inside a `factory_default: :keep`, and using
+`create_default` inside a `let_it_be` should be frozen to prevent accidental reliance
+between test examples.
+
Maybe we don't need to create 208 different projects - we
can create one and reuse it. In addition, we can see that only about 1/3 of the
projects we create are ones we ask for (76/208). There is benefit in setting
a default value for projects as well:
```ruby
- let_it_be(:project) { create_default(:project) }
+ let_it_be(:project) { create_default(:project).freeze }
```
In this case, the `total time` and `top-level time` numbers match more closely:
@@ -796,10 +800,11 @@ end
```
WARNING:
-Only use simple values as input in the `where` block. Using procs, stateful
+Only use simple values as input in the `where` block. Using
+<!-- vale gitlab.Spelling = NO --> procs, stateful
objects, FactoryBot-created objects, and similar items can lead to
[unexpected results](https://github.com/tomykaira/rspec-parameterized/issues/8).
-
+<!-- vale gitlab.Spelling = YES -->
### Prometheus tests
Prometheus metrics may be preserved from one test run to another. To ensure that metrics are
diff --git a/doc/development/testing_guide/frontend_testing.md b/doc/development/testing_guide/frontend_testing.md
index 73fce3a38d7..65c4275d0fd 100644
--- a/doc/development/testing_guide/frontend_testing.md
+++ b/doc/development/testing_guide/frontend_testing.md
@@ -193,7 +193,7 @@ When it comes to querying DOM elements in your tests, it is best to uniquely and
the element.
Preferentially, this is done by targeting what the user actually sees using [DOM Testing Library](https://testing-library.com/docs/dom-testing-library/intro/).
-When selecting by text it is best to use [`getByRole` or `findByRole`](https://testing-library.com/docs/dom-testing-library/api-queries/#byrole)
+When selecting by text it is best to use [`getByRole` or `findByRole`](https://testing-library.com/docs/queries/byrole)
as these enforce accessibility best practices as well. The examples below demonstrate the order of preference.
When writing Vue component unit tests, it can be wise to query children by component, so that the unit test can focus on comprehensive value coverage
@@ -687,7 +687,7 @@ Similarly, if you really need to use the real `Date` class, then you can import
```javascript
import { useRealDate } from 'helpers/fake_date';
-// NOTE: `useRealDate` cannot be called during test execution (i.e. inside `it`, `beforeEach`, `beforeAll`, etc.).
+// NOTE: `useRealDate` cannot be called during test execution (i.e. inside `it`, `beforeEach`, `beforeAll`, etc.).
describe('with real date', () => {
useRealDate();
});
@@ -1034,7 +1034,7 @@ describe "Admin::AbuseReports", :js do
end
```
-### Jest test timeout due to async imports
+### Jest test timeout due to asynchronous imports
If a module asynchronously imports some other modules at runtime, these modules must be
transpiled by the Jest loaders at runtime. It's possible that this can cause [Jest to timeout](https://gitlab.com/gitlab-org/gitlab/-/issues/280809).
diff --git a/doc/development/usage_ping.md b/doc/development/usage_ping.md
index 3618d18b1bb..f75db08597e 100644
--- a/doc/development/usage_ping.md
+++ b/doc/development/usage_ping.md
@@ -15,7 +15,7 @@ For more information about Product Intelligence, see:
- [Product Intelligence Guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
- [Snowplow Guide](snowplow.md)
-More useful links:
+More links:
- [Product Intelligence Direction](https://about.gitlab.com/direction/product-intelligence/)
- [Data Analysis Process](https://about.gitlab.com/handbook/business-ops/data-team/#data-analysis-process/)
@@ -25,7 +25,7 @@ More useful links:
## What is Usage Ping?
- GitLab sends a weekly payload containing usage data to GitLab Inc. Usage Ping provides high-level data to help our product, support, and sales teams. It does not send any project names, usernames, or any other specific data. The information from the usage ping is not anonymous, it is linked to the hostname of the instance. Sending usage ping is optional, and any instance can disable analytics.
-- The usage data is primarily composed of row counts for different tables in the instance’s database. By comparing these counts month over month (or week over week), we can get a rough sense for how an instance is using the different features within the product. In addition to counts, other facts
+- The usage data is primarily composed of row counts for different tables in the instance’s database. By comparing these counts month over month (or week over week), we can get a rough sense for how an instance is using the different features in the product. In addition to counts, other facts
that help us classify and understand GitLab installations are collected.
- Usage ping is important to GitLab as we use it to calculate our Stage Monthly Active Users (SMAU) which helps us measure the success of our stages and features.
- While usage ping is enabled, GitLab gathers data from the other instances and can show usage statistics of your instance to your users.
@@ -170,7 +170,7 @@ and update existing business analysis artefacts to use `example_metric_without_a
### 3. Metrics deprecation and removal
-The process for deprecating and removing metrics is currently under development. For
+The process for deprecating and removing metrics is under development. For
more information, see the following [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/284637).
## Implementing Usage Ping
@@ -206,10 +206,10 @@ For GitLab.com, there are extremely large tables with 15 second query timeouts,
We have several batch counting methods available:
-- `Ordinary Batch Counters`
-- `Distinct Batch Counters`
-- `Sum Batch Counters`
-- `Estimated Batch Counters`
+- [Ordinary Batch Counters](#ordinary-batch-counters)
+- [Distinct Batch Counters](#distinct-batch-counters)
+- [Sum Batch Counters](#sum-batch-counters)
+- [Estimated Batch Counters](#estimated-batch-counters)
Batch counting requires indexes on columns to calculate max, min, and range queries. In some cases,
you may need to add a specialized index on the columns involved in a counter.
@@ -218,7 +218,7 @@ you may need to add a specialized index on the columns involved in a counter.
Handles `ActiveRecord::StatementInvalid` error
-Simple count of a given ActiveRecord_Relation, does a non-distinct batch count, smartly reduces batch_size and handles errors.
+Simple count of a given `ActiveRecord_Relation`, does a non-distinct batch count, smartly reduces `batch_size`, and handles errors.
Method: `count(relation, column = nil, batch: true, start: nil, finish: nil)`
@@ -242,7 +242,7 @@ count(::Clusters::Cluster.aws_installed.enabled, :cluster_id, start: ::Clusters:
Handles `ActiveRecord::StatementInvalid` error
-Distinct count of a given ActiveRecord_Relation on given column, a distinct batch count, smartly reduces batch_size and handles errors.
+Distinct count of a given `ActiveRecord_Relation` on given column, a distinct batch count, smartly reduces `batch_size`, and handles errors.
Method: `distinct_count(relation, column = nil, batch: true, batch_size: nil, start: nil, finish: nil)`
@@ -324,13 +324,16 @@ The highest encountered error rate is 4.9%.
When correctly used, the `estimate_batch_distinct_count` method enables efficient counting over
columns that contain non-unique values, which can not be assured by other counters.
-Method: [`estimate_batch_distinct_count(relation, column = nil, batch_size: nil, start: nil, finish: nil)`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/utils/usage_data.rb#L63)
+#### estimate_batch_distinct_count method
-The method includes the following arguments:
+Method: `estimate_batch_distinct_count(relation, column = nil, batch_size: nil, start: nil, finish: nil)`
+
+The [method](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/utils/usage_data.rb#L63)
+includes the following arguments:
- `relation`: The ActiveRecord_Relation to perform the count.
- `column`: The column to perform the distinct count. The default is the primary key.
-- `batch_size`: The default is 10,000, from `Gitlab::Database::PostgresHll::BatchDistinctCounter::DEFAULT_BATCH_SIZE`.
+- `batch_size`: From `Gitlab::Database::PostgresHll::BatchDistinctCounter::DEFAULT_BATCH_SIZE`. Default value: 10,000.
- `start`: The custom start of the batch count, to avoid complex minimum calculations.
- `finish`: The custom end of the batch count to avoid complex maximum calculations.
@@ -658,7 +661,7 @@ Events are tracked behind [feature flags](feature_flags/index.md) due to concern
For a full list of events and corresponding feature flags see, [known_events](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/) files.
-To enable or disable tracking for specific event within <https://gitlab.com> or <https://about.staging.gitlab.com>, run commands such as the following to
+To enable or disable tracking for specific event in <https://gitlab.com> or <https://about.staging.gitlab.com>, run commands such as the following to
[enable or disable the corresponding feature](feature_flags/index.md).
```shell
@@ -674,7 +677,7 @@ For each event we add metrics for the weekly and monthly time frames, and totals
- `#{event_name}_weekly`: Data for 7 days for daily [aggregation](#adding-new-events) events and data for the last complete week for weekly [aggregation](#adding-new-events) events.
- `#{event_name}_monthly`: Data for 28 days for daily [aggregation](#adding-new-events) events and data for the last 4 complete weeks for weekly [aggregation](#adding-new-events) events.
-Redis HLL implementation calculates automatic total metrics, if there are more than one metric for the same category, aggregation and Redis slot.
+Redis HLL implementation calculates automatic total metrics, if there are more than one metric for the same category, aggregation, and Redis slot.
- `#{category}_total_unique_counts_weekly`: Total unique counts for events in the same category for the last 7 days or the last complete week, if events are in the same Redis slot and we have more than one metric.
- `#{category}_total_unique_counts_monthly`: Total unique counts for events in same category for the last 28 days or the last 4 complete weeks, if events are in the same Redis slot and we have more than one metric.
@@ -750,7 +753,7 @@ alt_usage_data(999)
### Prometheus Queries
In those cases where operational metrics should be part of Usage Ping, a database or Redis query is unlikely
-to provide useful data. Instead, Prometheus might be more appropriate, since most GitLab architectural
+to provide useful data. Instead, Prometheus might be more appropriate, because most GitLab architectural
components publish metrics to it that can be queried back, aggregated, and included as usage data.
NOTE:
@@ -831,13 +834,15 @@ We also use `#database-lab` and [explain.depesz.com](https://explain.depesz.com/
#### Optimization recommendations and examples
- Use specialized indexes [example 1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26871), [example 2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26445).
-- Use defined `start` and `finish`, and simple queries, because these values can be memoized and reused, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37155).
+- Use defined `start` and `finish`, and simple queries. These values can be memoized and reused, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37155).
- Avoid joins and write the queries as simply as possible, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36316).
- Set a custom `batch_size` for `distinct_count`, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38000).
### 5. Add the metric definition
-When adding, changing, or updating metrics, please update the [Event Dictionary's **Usage Ping** table](https://about.gitlab.com/handbook/product/product-intelligence-guide/#event-dictionary).
+[Check Metrics Dictionary Guide](usage_ping/metrics_dictionary.md)
+
+When adding, updating, or removing metrics, please update the [Metrics Dictionary](usage_ping/dictionary.md).
### 6. Add new metric to Versions Application
@@ -864,9 +869,9 @@ On GitLab.com, the Product Intelligence team regularly monitors Usage Ping. They
If the data submitted includes metrics [queried from Prometheus](#prometheus-queries) that you would like to inspect and verify,
then you need to ensure that a Prometheus server is running locally, and that furthermore the respective GitLab components
are exporting metrics to it. If you do not need to test data coming from Prometheus, no further action
-is necessary, since Usage Ping should degrade gracefully in the absence of a running Prometheus server.
+is necessary. Usage Ping should degrade gracefully in the absence of a running Prometheus server.
-There are currently three kinds of components that may export data to Prometheus, and which are included in Usage Ping:
+There are three kinds of components that may export data to Prometheus, and which are included in Usage Ping:
- [`node_exporter`](https://github.com/prometheus/node_exporter) - Exports node metrics from the host machine
- [`gitlab-exporter`](https://gitlab.com/gitlab-org/gitlab-exporter) - Exports process metrics from various GitLab components
@@ -890,20 +895,20 @@ build in a [downstream pipeline of the `omnibus-gitlab-mirror` project](https://
#### Test with GitLab development toolkits
-This is the less recommended approach, since it comes with a number of difficulties when emulating a real GitLab deployment.
+This is the less recommended approach, because it comes with a number of difficulties when emulating a real GitLab deployment.
-The [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit) is not currently set up to run a Prometheus server or `node_exporter` alongside other GitLab components. If you would
+The [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit) is not set up to run a Prometheus server or `node_exporter` alongside other GitLab components. If you would
like to do so, [Monitoring the GDK with Prometheus](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/master/doc/howto/prometheus/index.md#monitoring-the-gdk-with-prometheus) is a good start.
The [GCK](https://gitlab.com/gitlab-org/gitlab-compose-kit) has limited support for testing Prometheus based Usage Ping.
By default, it already comes with a fully configured Prometheus service that is set up to scrape a number of components,
but with the following limitations:
-- It does not currently run a `gitlab-exporter` instance, so several `process_*` metrics from services such as Gitaly may be missing.
+- It does not run a `gitlab-exporter` instance, so several `process_*` metrics from services such as Gitaly may be missing.
- While it runs a `node_exporter`, `docker-compose` services emulate hosts, meaning that it would normally report itself to not be associated
with any of the other services that are running. That is not how node metrics are reported in a production setup, where `node_exporter`
always runs as a process alongside other GitLab components on any given node. From Usage Ping's perspective none of the node data would therefore
-appear to be associated to any of the services running, since they all appear to be running on different hosts. To alleviate this problem, the `node_exporter` in GCK was arbitrarily "assigned" to the `web` service, meaning only for this service `node_*` metrics appears in Usage Ping.
+appear to be associated to any of the services running, because they all appear to be running on different hosts. To alleviate this problem, the `node_exporter` in GCK was arbitrarily "assigned" to the `web` service, meaning only for this service `node_*` metrics appears in Usage Ping.
## Aggregated metrics
@@ -914,24 +919,33 @@ This feature is intended solely for internal GitLab use.
To add data for aggregated metrics into Usage Ping payload you should add corresponding definition in [`aggregated_metrics`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/aggregated_metrics/). Each aggregate definition includes following parts:
-- name: unique name under which aggregate metric is added to Usage Ping payload
-- operator: operator that defines how aggregated metric data is counted. Available operators are:
- - `OR`: removes duplicates and counts all entries that triggered any of listed events
- - `AND`: removes duplicates and counts all elements that were observed triggering all of following events
-- events: list of events names (from [`known_events/`](#known-events-are-added-automatically-in-usage-data-payload)) to aggregate into metric. All events in this list must have the same `redis_slot` and `aggregation` attributes.
-- feature_flag: name of [development feature flag](feature_flags/development.md#development-type) that is checked before
-metrics aggregation is performed. Corresponding feature flag should have `default_enabled` attribute set to `false`.
-`feature_flag` attribute is **OPTIONAL** and can be omitted, when `feature_flag` is missing no feature flag is checked.
+- `name`: Unique name under which the aggregate metric is added to the Usage Ping payload.
+- `operator`: Operator that defines how the aggregated metric data is counted. Available operators are:
+ - `OR`: Removes duplicates and counts all entries that triggered any of listed events.
+ - `AND`: Removes duplicates and counts all elements that were observed triggering all of following events.
+- `source`: Data source used to collect all events data included in aggregated metric. Valid data sources are:
+ - [`database`](#database-sourced-aggregated-metrics)
+ - [`redis`](#redis-sourced-aggregated-metrics)
+- `events`: list of events names to aggregate into metric. All events in this list must
+ relay on the same data source. Additional data source requirements are described in the
+ [Database sourced aggregated metrics](#database-sourced-aggregated-metrics) and
+ [Redis sourced aggregated metrics](#redis-sourced-aggregated-metrics) sections.
+- `feature_flag`: Name of [development feature flag](feature_flags/development.md#development-type)
+ that is checked before metrics aggregation is performed. Corresponding feature flag
+ should have `default_enabled` attribute set to `false`. The `feature_flag` attribute
+ is optional and can be omitted. When `feature_flag` is missing, no feature flag is checked.
Example aggregated metric entries:
```yaml
-- name: product_analytics_test_metrics_union
+- name: product_analytics_test_metrics_union_redis_sourced
operator: OR
events: ['i_search_total', 'i_search_advanced', 'i_search_paid']
-- name: product_analytics_test_metrics_intersection_with_feautre_flag
+ source: redis
+- name: product_analytics_test_metrics_intersection_with_feautre_flag_database_sourced
operator: AND
- events: ['i_search_total', 'i_search_advanced', 'i_search_paid']
+ source: database
+ events: ['dependency_scanning_pipeline_all_time', 'container_scanning_pipeline_all_time']
feature_flag: example_aggregated_metric
```
@@ -956,6 +970,89 @@ Aggregated metrics are added under `aggregated_metrics` key in both `counts_week
}
```
+### Redis sourced aggregated metrics
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45979) in GitLab 13.6.
+
+To declare the aggregate of events collected with [Redis HLL Counters](#redis-hll-counters),
+you must fulfill the following requirements:
+
+1. All events listed at `events` attribute must come from
+ [`known_events/*.yml`](#known-events-are-added-automatically-in-usage-data-payload) files.
+1. All events listed at `events` attribute must have the same `redis_slot` attribute.
+1. All events listed at `events` attribute must have the same `aggregation` attribute.
+
+### Database sourced aggregated metrics
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52784) in GitLab 13.9.
+> - It's [deployed behind a feature flag](../user/feature_flags.md), disabled by default.
+> - It's enabled on GitLab.com.
+
+To declare an aggregate of metrics based on events collected from database, follow
+these steps:
+
+1. [Persist the metrics for aggregation](#persist-metrics-for-aggregation).
+1. [Add new aggregated metric definition](#add-new-aggregated-metric-definition).
+
+#### Persist metrics for aggregation
+
+Only metrics calculated with [Estimated Batch Counters](#estimated-batch-counters)
+can be persisted for database sourced aggregated metrics. To persist a metric,
+inject a Ruby block into the
+[estimate_batch_distinct_count](#estimate_batch_distinct_count-method) method.
+This block should invoke the
+`Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll.save_aggregated_metrics`
+[method](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll.rb#L21),
+which stores `estimate_batch_distinct_count` results for future use in aggregated metrics.
+
+The `Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll.save_aggregated_metrics`
+method accepts the following arguments:
+
+- `metric_name`: The name of metric to use for aggregations. Should be the same
+ as the key under which the metric is added into Usage Ping.
+- `recorded_at_timestamp`: The timestamp representing the moment when a given
+ Usage Ping payload was collected. You should use the convenience method `recorded_at`
+ to fill `recorded_at_timestamp` argument, like this: `recorded_at_timestamp: recorded_at`
+- `time_period`: The time period used to build the `relation` argument passed into
+ `estimate_batch_distinct_count`. To collect the metric with all available historical
+ data, set a `nil` value as time period: `time_period: nil`.
+- `data`: HyperLogLog buckets structure representing unique entries in `relation`.
+ The `estimate_batch_distinct_count` method always passes the correct argument
+ into the block, so `data` argument must always have a value equal to block argument,
+ like this: `data: result`
+
+Example metrics persistence:
+
+```ruby
+class UsageData
+ def count_secure_pipelines(time_period)
+ ...
+ relation = ::Security::Scan.latest_successful_by_build.by_scan_types(scan_type).where(security_scans: time_period)
+
+ pipelines_with_secure_jobs['dependency_scanning_pipeline'] = estimate_batch_distinct_count(relation, :commit_id, batch_size: 1000, start: start_id, finish: finish_id) do |result|
+ ::Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll
+ .save_aggregated_metrics(metric_name: 'dependency_scanning_pipeline', recorded_at_timestamp: recorded_at, time_period: time_period, data: result)
+ end
+ end
+end
+```
+
+#### Add new aggregated metric definition
+
+After all metrics are persisted, you can add an aggregated metric definition at
+[`aggregated_metrics/`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/aggregated_metrics/). When adding definitions for metrics names listed in the
+`events:` attribute, use the same names you passed in the `metric_name` argument
+while persisting metrics in previous step.
+
+Example definition:
+
+```yaml
+- name: product_analytics_test_metrics_intersection_database_sourced
+ operator: AND
+ source: database
+ events: ['dependency_scanning_pipeline', 'container_scanning_pipeline']
+```
+
## Example Usage Ping payload
The following is example content of the Usage Ping payload.
diff --git a/doc/development/usage_ping/dictionary.md b/doc/development/usage_ping/dictionary.md
index ca3e0f1aae6..035b1832104 100644
--- a/doc/development/usage_ping/dictionary.md
+++ b/doc/development/usage_ping/dictionary.md
@@ -39,7 +39,7 @@ This is named the instance_user_count in the Versions application.
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
@@ -48,6 +48,481 @@ This is named the instance_user_count in the Versions application.
| `tier` | free, premium, ultimate |
| `skip_validation` | true |
+## `analytics_unique_visits.analytics_unique_visits_for_any_target`
+
+Visits to any of the pages listed above per week
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.analytics_unique_visits_for_any_target`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.analytics_unique_visits_for_any_target_monthly`
+
+Visits to any of the pages listed above per month
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.analytics_unique_visits_for_any_target_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.g_analytics_contribution`
+
+Visits to /groups/:group/-/contribution_analytics
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.g_analytics_contribution`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.g_analytics_insights`
+
+Visits to /groups/:group/-/insights
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.g_analytics_insights`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.g_analytics_issues`
+
+Visits to /groups/:group/-/issues_analytics
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.g_analytics_issues`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.g_analytics_merge_request`
+
+Visits to /groups/:group/-/analytics/merge_request_analytics
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.g_analytics_merge_request`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.g_analytics_productivity`
+
+Visits to /groups/:group/-/analytics/productivity_analytics
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.g_analytics_productivity`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.g_analytics_valuestream`
+
+Visits to /groups/:group/-/analytics/value_stream_analytics
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.g_analytics_valuestream`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.i_analytics_cohorts`
+
+Visits to /-/instance_statistics/cohorts
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.i_analytics_cohorts`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.i_analytics_dev_ops_score`
+
+Visits to /-/instance_statistics/dev_ops_score
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.i_analytics_dev_ops_score`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.i_analytics_instance_statistics`
+
+Visit to /admin/instance_statistics
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.i_analytics_instance_statistics`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.p_analytics_code_reviews`
+
+Visits to /:group/:project/-/analytics/code_reviews
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.p_analytics_code_reviews`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.p_analytics_insights`
+
+Visits to /:group/:project/insights
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.p_analytics_insights`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.p_analytics_issues`
+
+Visits to /:group/:project/-/analytics/issues_analytics
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.p_analytics_issues`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.p_analytics_merge_request`
+
+Visits to /:group/:project/-/analytics/merge_request_analytics
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.p_analytics_merge_request`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.p_analytics_pipelines`
+
+Visits to /:group/:project/pipelines/charts
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.p_analytics_pipelines`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.p_analytics_repo`
+
+Visits to /:group/:project/-/graphs/master/charts
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.p_analytics_repo`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `analytics_unique_visits.p_analytics_valuestream`
+
+Visits to /:group/:project/-/value_stream_analytics
+
+| field | value |
+| --- | --- |
+| `key_path` | **`analytics_unique_visits.p_analytics_valuestream`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `compliance_unique_visits.a_compliance_audit_events_api`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`compliance_unique_visits.a_compliance_audit_events_api`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `compliance_unique_visits.compliance_unique_visits_for_any_target`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`compliance_unique_visits.compliance_unique_visits_for_any_target`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `compliance_unique_visits.compliance_unique_visits_for_any_target_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`compliance_unique_visits.compliance_unique_visits_for_any_target_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `compliance_unique_visits.g_compliance_audit_events`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`compliance_unique_visits.g_compliance_audit_events`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `compliance_unique_visits.g_compliance_dashboard`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`compliance_unique_visits.g_compliance_dashboard`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `compliance_unique_visits.i_compliance_audit_events`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`compliance_unique_visits.i_compliance_audit_events`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `compliance_unique_visits.i_compliance_credential_inventory`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`compliance_unique_visits.i_compliance_credential_inventory`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
## `container_registry_enabled`
Whether container registry is enabled
@@ -58,15 +533,869 @@ Whether container registry is enabled
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `container_registry_server.vendor`
+
+Identifies if a user is using an external container registry and what type
+
+| field | value |
+| --- | --- |
+| `key_path` | **`container_registry_server.vendor`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `container_registry_server.version`
+
+Identifies the version of the external registry being used
+
+| field | value |
+| --- | --- |
+| `key_path` | **`container_registry_server.version`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | string |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.alert_bot_incident_issues`
+
+Count of issues created by the alert bot automatically
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.alert_bot_incident_issues`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.all_searches`
+
+Total Searches for All Basic Search and Advanced Search in self-managed and SaaS
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.all_searches`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::global search` |
+| `product_category` | `global_search` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Redis |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+
+## `counts.api_fuzzing_dnd_jobs`
+
+Count of API Fuzzing `docker-in-docker` jobs run by job name
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.api_fuzzing_dnd_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::fuzz testing` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.api_fuzzing_jobs`
+
+Count of API Fuzzing jobs run by job name
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.api_fuzzing_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::fuzz testing` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.assignee_lists`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.assignee_lists`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
| `tier` | |
| `skip_validation` | true |
+## `counts.auto_devops_disabled`
+
+Projects with Auto DevOps template disabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.auto_devops_disabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `auto_devops` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.auto_devops_enabled`
+
+Projects with Auto DevOps template enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.auto_devops_enabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `auto_devops` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.boards`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.boards`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.ci_builds`
+
+Unique builds in project
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ci_builds`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.ci_external_pipelines`
+
+Total pipelines in external repositories
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ci_external_pipelines`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.ci_internal_pipelines`
+
+Total pipelines in GitLab repositories
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ci_internal_pipelines`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.ci_pipeline_config_auto_devops`
+
+Total pipelines from an Auto DevOps template
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ci_pipeline_config_auto_devops`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.ci_pipeline_config_repository`
+
+Total Pipelines from templates in repository
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ci_pipeline_config_repository`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.ci_pipeline_schedules`
+
+Pipeline schedules in GitLab
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ci_pipeline_schedules`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.ci_runners`
+
+Total configured Runners in project
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ci_runners`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.ci_triggers`
+
+Total configured Triggers in project
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ci_triggers`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.clusters`
+
+Total GitLab Managed clusters both enabled and disabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.clusters_applications_cert_managers`
+
+Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters_applications_cert_managers`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.clusters_applications_cilium`
+
+Total GitLab Managed clusters with GitLab Managed App:Cilium installed
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters_applications_cilium`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.clusters_applications_crossplane`
+
+Total GitLab Managed clusters with GitLab Managed App:Crossplane installed
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters_applications_crossplane`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.clusters_applications_elastic_stack`
+
+Total GitLab Managed clusters with GitLab Managed App:Elastic Stack installed
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters_applications_elastic_stack`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.clusters_applications_helm`
+
+Total GitLab Managed clusters with GitLab Managed App:Helm enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters_applications_helm`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.clusters_applications_ingress`
+
+Total GitLab Managed clusters with GitLab Managed App:Ingress installed
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters_applications_ingress`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.clusters_applications_jupyter`
+
+Total GitLab Managed clusters with GitLab Managed App:Jupyter installed
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters_applications_jupyter`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.clusters_applications_knative`
+
+Total GitLab Managed clusters with GitLab Managed App:Knative installed
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters_applications_knative`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.clusters_applications_prometheus`
+
+Total GitLab Managed clusters with GitLab Managed App:Prometheus installed
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters_applications_prometheus`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.clusters_applications_runner`
+
+Total GitLab Managed clusters with GitLab Managed App:Runner installed
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters_applications_runner`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.clusters_disabled`
+
+Total GitLab Managed disabled clusters
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters_disabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.clusters_enabled`
+
+Total GitLab Managed clusters currently enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters_enabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.clusters_management_project`
+
+Total GitLab Managed clusters with defined cluster management project
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters_management_project`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.clusters_platforms_eks`
+
+Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters_platforms_eks`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.clusters_platforms_gke`
+
+Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters_platforms_gke`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.clusters_platforms_user`
+
+Total GitLab Managed clusters that are user provisioned
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.clusters_platforms_user`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.commit_comment`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.commit_comment`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.confidential_epics`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.confidential_epics`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::portfolio management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.container_scanning_jobs`
+
+Count of Container Scanning jobs run
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.container_scanning_jobs`** |
+| `product_section` | sec |
+| `product_stage` | protect |
+| `product_group` | `group::container security` |
+| `product_category` | `container_scanning` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `counts.coverage_fuzzing_jobs`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.coverage_fuzzing_jobs`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.cycle_analytics_views`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.cycle_analytics_views`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.dast_jobs`
+
+Count of DAST jobs run
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.dast_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::dynamic analysis` |
+| `product_category` | `dynamic_application_security_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.dast_on_demand_pipelines`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.dast_on_demand_pipelines`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.dependency_list_usages_total`
+
+Count to Dependency List page views
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.dependency_list_usages_total`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::composition analysis` |
+| `product_category` | `dependency_scanning` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `counts.dependency_scanning_jobs`
+
+Count of Dependency Scanning jobs run
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.dependency_scanning_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::composition analysis` |
+| `product_category` | `dependency_scanning` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `counts.deploy_keys`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.deploy_keys`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
## `counts.deployments`
Total deployments count
@@ -86,6 +1415,196 @@ Total deployments count
| `distribution` | ee, ce |
| `tier` | free, premium, ultimate |
+## `counts.design_management_designs_create`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.design_management_designs_create`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::knowledge` |
+| `product_category` | `design_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.design_management_designs_delete`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.design_management_designs_delete`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::knowledge` |
+| `product_category` | `design_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.design_management_designs_update`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.design_management_designs_update`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::knowledge` |
+| `product_category` | `design_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.environments`
+
+Total available and stopped environments
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.environments`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.epic_issues`
+
+Count of issues that are assigned to an epic
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.epic_issues`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::portfolio management` |
+| `product_category` | `epics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.epics`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.epics`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::portfolio management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.epics_deepest_relationship_level`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.epics_deepest_relationship_level`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::portfolio management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `counts.failed_deployments`
+
+Total failed deployments
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.failed_deployments`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.feature_flags`
+
+Number of feature flag toggles
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.feature_flags`** |
+| `product_section` | ops |
+| `product_stage` | release |
+| `product_group` | `group::progressive delivery` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.geo_event_log_max_id`
+
+Number of replication events on a Geo primary
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.geo_event_log_max_id`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::geo` |
+| `product_category` | `disaster_recovery` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
## `counts.geo_nodes`
Total number of sites in a Geo deployment
@@ -96,8 +1615,8 @@ Total number of sites in a Geo deployment
| `product_section` | enablement |
| `product_stage` | enablement |
| `product_group` | `group::geo` |
-| `product_category` | disaster_recovery |
-| `value_type` | integer |
+| `product_category` | `disaster_recovery` |
+| `value_type` | number |
| `status` | data_available |
| `milestone` | 11.2 |
| `time_frame` | all |
@@ -105,6 +1624,2894 @@ Total number of sites in a Geo deployment
| `distribution` | ee |
| `tier` | premium, ultimate |
+## `counts.grafana_integrated_projects`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.grafana_integrated_projects`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.group_clusters_disabled`
+
+Total GitLab Managed disabled clusters previously attached to groups
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.group_clusters_disabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.group_clusters_enabled`
+
+Total GitLab Managed clusters attached to groups
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.group_clusters_enabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups`
+
+Total count of groups as of usage ping snapshot
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | `subgroups` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_asana_active`
+
+Count of groups with active integrations for Asana
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_asana_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_assembla_active`
+
+Count of groups with active integrations for Assembla
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_assembla_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_bamboo_active`
+
+Count of groups with active integrations for Bamboo CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_bamboo_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_bugzilla_active`
+
+Count of groups with active integrations for Bugzilla
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_bugzilla_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_buildkite_active`
+
+Count of groups with active integrations for Buildkite
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_buildkite_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_campfire_active`
+
+Count of groups with active integrations for Campfire
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_campfire_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_confluence_active`
+
+Count of groups with active integrations for Confluence
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_confluence_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_custom_issue_tracker_active`
+
+Count of groups with active integrations for a Custom Issue Tracker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_custom_issue_tracker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_datadog_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_datadog_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.groups_discord_active`
+
+Count of groups with active integrations for Discord
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_discord_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_drone_ci_active`
+
+Count of groups with active integrations for Drone CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_drone_ci_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_emails_on_push_active`
+
+Count of groups with active integrations for Emails on Push
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_emails_on_push_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_ewm_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_ewm_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.groups_external_wiki_active`
+
+Count of groups with active integrations for External Wiki
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_external_wiki_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_flowdock_active`
+
+Count of groups with active integrations for Flowdock
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_flowdock_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_github_active`
+
+Count of groups with active integrations for GitHub
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_github_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_hangouts_chat_active`
+
+Count of groups with active integrations for Hangouts Chat
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_hangouts_chat_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_hipchat_active`
+
+Count of groups with active integrations for HipChat
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_hipchat_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_asana_active`
+
+Count of active groups inheriting integrations for Asana
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_asana_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_assembla_active`
+
+Count of active groups inheriting integrations for Assembla
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_assembla_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_bamboo_active`
+
+Count of active groups inheriting integrations for Bamboo CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_bamboo_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_bugzilla_active`
+
+Count of active groups inheriting integrations for Bugzilla
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_bugzilla_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_buildkite_active`
+
+Count of active groups inheriting integrations for Buildkite
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_buildkite_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_campfire_active`
+
+Count of active groups inheriting integrations for Campfire
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_campfire_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_confluence_active`
+
+Count of active groups inheriting integrations for Confluence
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_confluence_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_custom_issue_tracker_active`
+
+Count of active groups inheriting integrations for a Custom Issue Tracker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_custom_issue_tracker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_datadog_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_datadog_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_discord_active`
+
+Count of active groups inheriting integrations for Discord
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_discord_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_drone_ci_active`
+
+Count of active groups inheriting integrations for Drone CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_drone_ci_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_emails_on_push_active`
+
+Count of active groups inheriting integrations for Emails on Push
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_emails_on_push_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_ewm_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_ewm_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_external_wiki_active`
+
+Count of active groups inheriting integrations for External Wiki
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_external_wiki_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_flowdock_active`
+
+Count of active groups inheriting integrations for Flowdock
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_flowdock_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_github_active`
+
+Count of active groups inheriting integrations for GitHub
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_github_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_hangouts_chat_active`
+
+Count of active groups inheriting integrations for Hangouts Chat
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_hangouts_chat_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_hipchat_active`
+
+Count of active groups inheriting integrations for HipChat
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_hipchat_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_irker_active`
+
+Count of active groups inheriting integrations for Irker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_irker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_jenkins_active`
+
+Count of active groups inheriting integrations for Jenkins
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_jenkins_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_jira_active`
+
+Count of active groups inheriting integrations for Jira
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_jira_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_mattermost_active`
+
+Count of active groups inheriting integrations for Mattermost
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_mattermost_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_mattermost_slash_commands_active`
+
+Count of active groups inheriting integrations for Mattermost (slash commands)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_mattermost_slash_commands_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_microsoft_teams_active`
+
+Count of active groups inheriting integrations for Microsoft Teams
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_microsoft_teams_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_mock_ci_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_mock_ci_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_mock_monitoring_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_mock_monitoring_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_packagist_active`
+
+Count of active groups inheriting integrations for Packagist
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_packagist_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_pipelines_email_active`
+
+Count of active groups inheriting integrations for Pipeline Emails
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_pipelines_email_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_pivotaltracker_active`
+
+Count of active groups inheriting integrations for Pivotal Tracker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_pivotaltracker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_prometheus_active`
+
+Count of active groups inheriting integrations for Prometheus
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_prometheus_active`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | `metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_pushover_active`
+
+Count of active groups inheriting integrations for Pushover
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_pushover_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_redmine_active`
+
+Count of active groups inheriting integrations for Redmine
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_redmine_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_slack_active`
+
+Count of active groups inheriting integrations for Slack
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_slack_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_slack_slash_commands_active`
+
+Count of active groups inheriting integrations for Slack (slash commands)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_slack_slash_commands_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_teamcity_active`
+
+Count of active groups inheriting integrations for Teamcity CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_teamcity_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_unify_circuit_active`
+
+Count of active groups inheriting integrations for Unifiy Circuit
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_unify_circuit_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_webex_teams_active`
+
+Count of active groups inheriting integrations for Webex Teams
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_webex_teams_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_inheriting_youtrack_active`
+
+Count of active groups inheriting integrations for YouTrack
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_inheriting_youtrack_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_irker_active`
+
+Count of groups with active integrations for Irker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_irker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_jenkins_active`
+
+Count of groups with active integrations for Jenkins
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_jenkins_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_jira_active`
+
+Count of groups with active integrations for Jira
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_jira_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_mattermost_active`
+
+Count of groups with active integrations for Mattermost
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_mattermost_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_mattermost_slash_commands_active`
+
+Count of groups with active integrations for Mattermost (slash commands)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_mattermost_slash_commands_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_microsoft_teams_active`
+
+Count of groups with active integrations for Microsoft Teams
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_microsoft_teams_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_mock_ci_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_mock_ci_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.groups_mock_monitoring_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_mock_monitoring_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.groups_packagist_active`
+
+Count of groups with active integrations for Packagist
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_packagist_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_pipelines_email_active`
+
+Count of groups with active integrations for Pipeline Emails
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_pipelines_email_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_pivotaltracker_active`
+
+Count of groups with active integrations for Pivotal Tracker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_pivotaltracker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_prometheus_active`
+
+Count of groups with active integrations for Prometheus
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_prometheus_active`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | `metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_pushover_active`
+
+Count of groups with active integrations for Pushover
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_pushover_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_redmine_active`
+
+Count of groups with active integrations for Redmine
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_redmine_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_slack_active`
+
+Count of groups with active integrations for Slack
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_slack_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_slack_slash_commands_active`
+
+Count of groups with active integrations for Slack (slash commands)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_slack_slash_commands_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_teamcity_active`
+
+Count of groups with active integrations for Teamcity CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_teamcity_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_unify_circuit_active`
+
+Count of groups with active integrations for Unifiy Circuit
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_unify_circuit_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_webex_teams_active`
+
+Count of groups with active integrations for Webex Teams
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_webex_teams_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.groups_youtrack_active`
+
+Count of groups with active integrations for YouTrack
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.groups_youtrack_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.in_review_folder`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.in_review_folder`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.incident_issues`
+
+Count of incidents (issues where issue_type=incident)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.incident_issues`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.incident_labeled_issues`
+
+Count of all issues with the label=incident
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.incident_labeled_issues`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.ingress_modsecurity_blocking`
+
+Whether or not ModSecurity is set to blocking mode
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ingress_modsecurity_blocking`** |
+| `product_section` | sec |
+| `product_stage` | protect |
+| `product_group` | `group::container security` |
+| `product_category` | `web_firewall` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.ingress_modsecurity_disabled`
+
+Whether or not ModSecurity is disabled within Ingress
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ingress_modsecurity_disabled`** |
+| `product_section` | sec |
+| `product_stage` | protect |
+| `product_group` | `group::container security` |
+| `product_category` | `web_firewall` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.ingress_modsecurity_logging`
+
+Whether or not ModSecurity is set to logging mode
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ingress_modsecurity_logging`** |
+| `product_section` | sec |
+| `product_stage` | protect |
+| `product_group` | `group::container security` |
+| `product_category` | `web_firewall` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.ingress_modsecurity_not_installed`
+
+Whether or not ModSecurity has not been installed into the cluster
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ingress_modsecurity_not_installed`** |
+| `product_section` | sec |
+| `product_stage` | protect |
+| `product_group` | `group::container security` |
+| `product_category` | `web_firewall` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.ingress_modsecurity_packets_anomalous`
+
+Cumulative count of packets identified as anomalous by ModSecurity since Usage Ping was last reported
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ingress_modsecurity_packets_anomalous`** |
+| `product_section` | sec |
+| `product_stage` | protect |
+| `product_group` | `group::container security` |
+| `product_category` | `web_firewall` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.ingress_modsecurity_packets_processed`
+
+Cumulative count of packets processed by ModSecurity since Usage Ping was last reported
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ingress_modsecurity_packets_processed`** |
+| `product_section` | sec |
+| `product_stage` | protect |
+| `product_group` | `group::container security` |
+| `product_category` | `web_firewall` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.ingress_modsecurity_statistics_unavailable`
+
+Whether or not ModSecurity statistics are unavailable
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ingress_modsecurity_statistics_unavailable`** |
+| `product_section` | sec |
+| `product_stage` | protect |
+| `product_group` | `group::container security` |
+| `product_category` | `web_firewall` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `counts.instance_clusters_disabled`
+
+Total GitLab Managed disabled clusters previously attached to the instance
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instance_clusters_disabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instance_clusters_enabled`
+
+Total GitLab Managed clusters attached to the instance
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instance_clusters_enabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_asana_active`
+
+Count of active instance-level integrations for Asana
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_asana_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_assembla_active`
+
+Count of active instance-level integrations for Assembla
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_assembla_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_bamboo_active`
+
+Count of active instance-level integrations for Bamboo CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_bamboo_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_bugzilla_active`
+
+Count of active instance-level integrations for Bugzilla
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_bugzilla_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_buildkite_active`
+
+Count of active instance-level integrations for Buildkite
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_buildkite_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_campfire_active`
+
+Count of active instance-level integrations for Campfire
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_campfire_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_confluence_active`
+
+Count of active instance-level integrations for Confluence
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_confluence_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_custom_issue_tracker_active`
+
+Count of active instance-level integrations for a Custom Issue Tracker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_custom_issue_tracker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_datadog_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_datadog_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.instances_discord_active`
+
+Count of active instance-level integrations for Discord
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_discord_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_drone_ci_active`
+
+Count of active instance-level integrations for Drone CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_drone_ci_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_emails_on_push_active`
+
+Count of active instance-level integrations for Emails on Push
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_emails_on_push_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_ewm_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_ewm_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.instances_external_wiki_active`
+
+Count of active instance-level integrations for External Wiki
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_external_wiki_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_flowdock_active`
+
+Count of active instance-level integrations for Flowdock
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_flowdock_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_github_active`
+
+Count of active instance-level integrations for GitHub
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_github_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_hangouts_chat_active`
+
+Count of active instance-level integrations for Hangouts Chat
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_hangouts_chat_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_hipchat_active`
+
+Count of active instance-level integrations for HipChat
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_hipchat_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_irker_active`
+
+Count of active instance-level integrations for Irker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_irker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_jenkins_active`
+
+Count of active instance-level integrations for Jenkins
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_jenkins_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_jira_active`
+
+Count of active instance-level integrations for Jira
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_jira_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_mattermost_active`
+
+Count of active instance-level integrations for Mattermost
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_mattermost_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_mattermost_slash_commands_active`
+
+Count of active instance-level integrations for Mattermost (slash commands)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_mattermost_slash_commands_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_microsoft_teams_active`
+
+Count of active instance-level integrations for Microsoft Teams
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_microsoft_teams_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_mock_ci_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_mock_ci_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.instances_mock_monitoring_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_mock_monitoring_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.instances_packagist_active`
+
+Count of active instance-level integrations for Packagist
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_packagist_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_pipelines_email_active`
+
+Count of active instance-level integrations for Pipeline Emails
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_pipelines_email_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_pivotaltracker_active`
+
+Count of active instance-level integrations for Pivotal Tracker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_pivotaltracker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_prometheus_active`
+
+Count of active instance-level integrations for Prometheus
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_prometheus_active`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | `metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_pushover_active`
+
+Count of active instance-level integrations for Pushover
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_pushover_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_redmine_active`
+
+Count of active instance-level integrations for Redmine
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_redmine_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_slack_active`
+
+Count of active instance-level integrations for Slack
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_slack_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_slack_slash_commands_active`
+
+Count of active instance-level integrations for Slack (slash commands)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_slack_slash_commands_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_teamcity_active`
+
+Count of active instance-level integrations for Teamcity CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_teamcity_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_unify_circuit_active`
+
+Count of active instance-level integrations for Unifiy Circuit
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_unify_circuit_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_webex_teams_active`
+
+Count of active instance-level integrations for Webex Teams
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_webex_teams_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.instances_youtrack_active`
+
+Count of active instance-level integrations for YouTrack
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.instances_youtrack_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.issues`
+
+Count of Issues created
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.issues`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.issues_created_from_alerts`
+
+Count of issues created automatically on alerts from GitLab-Managed Prometheus
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.issues_created_from_alerts`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.issues_created_from_gitlab_error_tracking_ui`
+
+Count of issues manually created from the GitLab UI on Sentry errors
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.issues_created_from_gitlab_error_tracking_ui`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `error_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.issues_created_gitlab_alerts`
+
+Count of all issues created from GitLab alerts (bot and non-bot)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.issues_created_gitlab_alerts`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.issues_created_manually_from_alerts`
+
+Count of issues created manually by non-bot users from GitLab alerts
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.issues_created_manually_from_alerts`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.issues_using_zoom_quick_actions`
+
+Count of issues where a user have added AND removed a zoom meeting using slash commands
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.issues_using_zoom_quick_actions`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.issues_with_associated_zoom_link`
+
+Count of issues where a user has linked a Zoom meeting
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.issues_with_associated_zoom_link`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.issues_with_embedded_grafana_charts_approx`
+
+Count of issues where a user has embedded a Grafana chart
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.issues_with_embedded_grafana_charts_approx`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.issues_with_health_status`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.issues_with_health_status`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::portfolio management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.jira_imports_projects_count`
+
+Count of Projects that imported Issues from Jira
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.jira_imports_projects_count`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `jira_importer` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.jira_imports_total_imported_count`
+
+Count of Issues imported from Jira
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.jira_imports_total_imported_count`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `jira_importer` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.jira_imports_total_imported_issues_count`
+
+Count of Jira imports run
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.jira_imports_total_imported_issues_count`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `jira_importer` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.keys`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.keys`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | `authentication_and_authorization` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.kubernetes_agent_gitops_sync`
+
+Count of GitOps Sync events
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.kubernetes_agent_gitops_sync`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.kubernetes_agents`
+
+Count of Kubernetes agents
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.kubernetes_agents`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.kubernetes_agents_with_token`
+
+Count of Kubernetes agents with at least one token
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.kubernetes_agents_with_token`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.label_lists`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.label_lists`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.labels`
+
+Count of Labels
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.labels`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.ldap_group_links`
+
+Number of groups that are synced via LDAP group sync `https://docs.gitlab.com/ee/user/group/index.html#manage-group-memberships-via-ldap-starter-only`
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ldap_group_links`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::access` |
+| `product_category` | `authentication_and_authorization` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.ldap_keys`
+
+Number of keys synced as part of LDAP `https://docs.gitlab.com/ee/administration/auth/ldap/#ldap-sync-configuration-settings-starter-only`
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ldap_keys`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::access` |
+| `product_category` | `authentication_and_authorization` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.ldap_users`
+
+Number of users that are linked to LDAP
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.ldap_users`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::access` |
+| `product_category` | `authentication_and_authorization` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.lfs_objects`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.lfs_objects`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
## `counts.license_management_jobs`
Name on the GitLab license
@@ -115,15 +4522,5163 @@ Name on the GitLab license
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | number |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | Database |
-| `distribution` | |
+| `distribution` | ce |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.licenses_list_views`
+
+Count to License List page views
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.licenses_list_views`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::composition analysis` |
+| `product_category` | `license_compliance` |
+| `value_type` | string |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `counts.merge_request_comment`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.merge_request_comment`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.merge_request_create`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.merge_request_create`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.merge_requests`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.merge_requests`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.merged_merge_requests_using_approval_rules`
+
+Count of merge requests merged using approval rules
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.merged_merge_requests_using_approval_rules`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::compliance` |
+| `product_category` | `compliance_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.milestone_lists`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.milestone_lists`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.milestones`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.milestones`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.navbar_searches`
+
+Total Searches using the navbar for All Basic Search and Advanced Search in self-managed and SaaS
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.navbar_searches`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::global search` |
+| `product_category` | `global_search` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Redis |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+
+## `counts.network_policy_drops`
+
+Cumulative count of packets dropped by Cilium (Container Network Security) since Usage Ping was last reported
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.network_policy_drops`** |
+| `product_section` | sec |
+| `product_stage` | protect |
+| `product_group` | `group::container security` |
+| `product_category` | `container_network_security` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.network_policy_forwards`
+
+Cumulative count of packets forwarded by Cilium (Container Network Security) since Usage Ping was last reported
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.network_policy_forwards`** |
+| `product_section` | sec |
+| `product_stage` | protect |
+| `product_group` | `group::container security` |
+| `product_category` | `container_network_security` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.notes`
+
+Count of Notes across all objects that use them
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.notes`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.operations_dashboard_default_dashboard`
+
+Active users with enabled operations dashboard
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.operations_dashboard_default_dashboard`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.operations_dashboard_users_with_projects_added`
+
+Active users with projects on operations dashboard
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.operations_dashboard_users_with_projects_added`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_composer_delete_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_composer_delete_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_composer_pull_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_composer_pull_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_composer_push_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_composer_push_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_conan_delete_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_conan_delete_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_conan_pull_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_conan_pull_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_conan_push_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_conan_push_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_container_delete_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_container_delete_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_container_pull_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_container_pull_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_container_push_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_container_push_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_debian_delete_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_debian_delete_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_debian_pull_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_debian_pull_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_debian_push_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_debian_push_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_delete_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_delete_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_delete_package_by_deploy_token`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_delete_package_by_deploy_token`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_delete_package_by_guest`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_delete_package_by_guest`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_delete_package_by_user`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_delete_package_by_user`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_generic_delete_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_generic_delete_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_generic_pull_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_generic_pull_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_generic_push_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_generic_push_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_golang_delete_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_golang_delete_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_golang_pull_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_golang_pull_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_golang_push_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_golang_push_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_maven_delete_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_maven_delete_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_maven_pull_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_maven_pull_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_maven_push_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_maven_push_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_npm_delete_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_npm_delete_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_npm_pull_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_npm_pull_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_npm_push_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_npm_push_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_nuget_delete_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_nuget_delete_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_nuget_pull_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_nuget_pull_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_nuget_push_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_nuget_push_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_pull_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_pull_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_pull_package_by_deploy_token`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_pull_package_by_deploy_token`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_pull_package_by_guest`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_pull_package_by_guest`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_pull_package_by_user`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_pull_package_by_user`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_push_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_push_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_push_package_by_deploy_token`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_push_package_by_deploy_token`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_push_package_by_guest`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_push_package_by_guest`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_push_package_by_user`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_push_package_by_user`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_pypi_delete_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_pypi_delete_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_pypi_pull_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_pypi_pull_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_pypi_push_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_pypi_push_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_tag_delete_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_tag_delete_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_tag_pull_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_tag_pull_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.package_events_i_package_tag_push_package`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.package_events_i_package_tag_push_package`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.packages`
+
+Number of packages
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.packages`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.pages_domains`
+
+Total GitLab Pages domains
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.pages_domains`** |
+| `product_section` | ops |
+| `product_stage` | release |
+| `product_group` | `group::release management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.personal_snippets`
+
+Count of Personal Snippets
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.personal_snippets`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `snippets` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.pod_logs_usages_total`
+
+Count the total number of log views
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.pod_logs_usages_total`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::apm` |
+| `product_category` | `logging` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.pool_repositories`
+
+Count of unique object pool repositories for fork deduplication
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.pool_repositories`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::gitaly` |
+| `product_category` | `gitaly` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.productivity_analytics_views`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.productivity_analytics_views`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.project_clusters_disabled`
+
+Total GitLab Managed disabled clusters previously attached to projects
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.project_clusters_disabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.project_clusters_enabled`
+
+Total GitLab Managed clusters attached to projects
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.project_clusters_enabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.project_snippets`
+
+Count of Project Snippetss
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.project_snippets`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `snippets` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects`
+
+Count of Projects
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `projects` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_asana_active`
+
+Count of projects with active integrations for Asana
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_asana_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_assembla_active`
+
+Count of projects with active integrations for Assembla
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_assembla_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_bamboo_active`
+
+Count of projects with active integrations for Bamboo CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_bamboo_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_bugzilla_active`
+
+Count of projects with active integrations for Bugzilla
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_bugzilla_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_buildkite_active`
+
+Count of projects with active integrations for Buildkite
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_buildkite_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_campfire_active`
+
+Count of projects with active integrations for Campfire
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_campfire_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_confluence_active`
+
+Count of projects with active integrations for Confluence
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_confluence_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_creating_incidents`
+
+Counts of Projects that have created incidents
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_creating_incidents`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_custom_issue_tracker_active`
+
+Count of projects with active integrations for a Custom Issue Tracker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_custom_issue_tracker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_datadog_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_datadog_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_discord_active`
+
+Count of projects with active integrations for Discord
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_discord_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_drone_ci_active`
+
+Count of projects with active integrations for Drone CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_drone_ci_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_emails_on_push_active`
+
+Count of projects with active integrations for Emails on Push
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_emails_on_push_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_ewm_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_ewm_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_external_wiki_active`
+
+Count of projects with active integrations for External Wiki
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_external_wiki_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_flowdock_active`
+
+Count of projects with active integrations for Flowdock
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_flowdock_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_github_active`
+
+Count of projects with active integrations for GitHub
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_github_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_hangouts_chat_active`
+
+Count of projects with active integrations for Hangouts Chat
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_hangouts_chat_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_hipchat_active`
+
+Count of projects with active integrations for HipChat
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_hipchat_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_imported_from_github`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_imported_from_github`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_asana_active`
+
+Count of active projects inheriting integrations for Asana
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_asana_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_assembla_active`
+
+Count of active projects inheriting integrations for Assembla
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_assembla_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_bamboo_active`
+
+Count of active projects inheriting integrations for Bamboo CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_bamboo_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_bugzilla_active`
+
+Count of active projects inheriting integrations for Bugzilla
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_bugzilla_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_buildkite_active`
+
+Count of active projects inheriting integrations for Buildkite
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_buildkite_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_campfire_active`
+
+Count of active projects inheriting integrations for Campfire
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_campfire_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_confluence_active`
+
+Count of active projects inheriting integrations for Confluence
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_confluence_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_custom_issue_tracker_active`
+
+Count of active projects inheriting integrations for a Custom Issue Tracker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_custom_issue_tracker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_datadog_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_datadog_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_discord_active`
+
+Count of active projects inheriting integrations for Discord
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_discord_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_drone_ci_active`
+
+Count of active projects inheriting integrations for Drone CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_drone_ci_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_emails_on_push_active`
+
+Count of active projects inheriting integrations for Emails on Push
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_emails_on_push_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_ewm_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_ewm_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_external_wiki_active`
+
+Count of active projects inheriting integrations for External Wiki
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_external_wiki_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_flowdock_active`
+
+Count of active projects inheriting integrations for Flowdock
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_flowdock_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_github_active`
+
+Count of active projects inheriting integrations for GitHub
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_github_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_hangouts_chat_active`
+
+Count of active projects inheriting integrations for Hangouts Chat
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_hangouts_chat_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_hipchat_active`
+
+Count of active projects inheriting integrations for HipChat
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_hipchat_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_irker_active`
+
+Count of active projects inheriting integrations for Irker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_irker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_jenkins_active`
+
+Count of active projects inheriting integrations for Jenkins
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_jenkins_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_jira_active`
+
+Count of active projects inheriting integrations for Jira
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_jira_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_mattermost_active`
+
+Count of active projects inheriting integrations for Mattermost
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_mattermost_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_mattermost_slash_commands_active`
+
+Count of active projects inheriting integrations for Mattermost (slash commands)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_mattermost_slash_commands_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_microsoft_teams_active`
+
+Count of active projects inheriting integrations for Microsoft Teams
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_microsoft_teams_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_mock_ci_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_mock_ci_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_mock_monitoring_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_mock_monitoring_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_packagist_active`
+
+Count of active projects inheriting integrations for Packagist
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_packagist_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_pipelines_email_active`
+
+Count of active projects inheriting integrations for Pipeline Emails
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_pipelines_email_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_pivotaltracker_active`
+
+Count of active projects inheriting integrations for Pivotal Tracker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_pivotaltracker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_prometheus_active`
+
+Count of active projects inheriting integrations for Prometheus
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_prometheus_active`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | `metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_pushover_active`
+
+Count of active projects inheriting integrations for Pushover
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_pushover_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_redmine_active`
+
+Count of active projects inheriting integrations for Redmine
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_redmine_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_slack_active`
+
+Count of active projects inheriting integrations for Slack
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_slack_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_slack_slash_commands_active`
+
+Count of active projects inheriting integrations for Slack (slash commands)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_slack_slash_commands_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_teamcity_active`
+
+Count of active projects inheriting integrations for Teamcity CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_teamcity_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_unify_circuit_active`
+
+Count of active projects inheriting integrations for Unifiy Circuit
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_unify_circuit_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_webex_teams_active`
+
+Count of active projects inheriting integrations for Webex Teams
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_webex_teams_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_inheriting_youtrack_active`
+
+Count of active projects inheriting integrations for YouTrack
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_inheriting_youtrack_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_irker_active`
+
+Count of projects with active integrations for Irker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_irker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_jenkins_active`
+
+Count of projects with active integrations for Jenkins
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_jenkins_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_jira_active`
+
+Count of projects with active integrations for Jira
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_jira_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_jira_cloud_active`
+
+Count of active integrations with Jira Cloud (Saas)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_jira_cloud_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_jira_dvcs_cloud_active`
+
+Count of active integrations with Jira Cloud (DVCS Connector)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_jira_dvcs_cloud_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_jira_dvcs_server_active`
+
+Count of active integrations with Jira Software (DVCS connector)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_jira_dvcs_server_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_jira_issuelist_active`
+
+Total Jira Issue feature enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_jira_issuelist_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_jira_server_active`
+
+Count of active integrations with Jira Software (server)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_jira_server_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_mattermost_active`
+
+Count of projects with active integrations for Mattermost
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_mattermost_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_mattermost_slash_commands_active`
+
+Count of projects with active integrations for Mattermost (slash commands)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_mattermost_slash_commands_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_microsoft_teams_active`
+
+Count of projects with active integrations for Microsoft Teams
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_microsoft_teams_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_mirrored_with_pipelines_enabled`
+
+Projects with repository mirroring enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_mirrored_with_pipelines_enabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_mock_ci_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_mock_ci_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_mock_monitoring_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_mock_monitoring_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_packagist_active`
+
+Count of projects with active integrations for Packagist
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_packagist_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_pipelines_email_active`
+
+Count of projects with active integrations for Pipeline Emails
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_pipelines_email_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_pivotaltracker_active`
+
+Count of projects with active integrations for Pivotal Tracker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_pivotaltracker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_prometheus_active`
+
+Count of projects with active integrations for Prometheus
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_prometheus_active`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | `metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_pushover_active`
+
+Count of projects with active integrations for Pushover
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_pushover_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_redmine_active`
+
+Count of projects with active integrations for Redmine
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_redmine_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_reporting_ci_cd_back_to_github`
+
+Projects with a GitHub service pipeline enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_reporting_ci_cd_back_to_github`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::verify` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
| `tier` | premium, ultimate |
| `skip_validation` | true |
+## `counts.projects_slack_active`
+
+Count of projects with active integrations for Slack
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_slack_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_slack_slash_commands_active`
+
+Count of projects with active integrations for Slack (slash commands)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_slack_slash_commands_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_teamcity_active`
+
+Count of projects with active integrations for Teamcity CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_teamcity_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_unify_circuit_active`
+
+Count of projects with active integrations for Unifiy Circuit
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_unify_circuit_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_webex_teams_active`
+
+Count of projects with active integrations for Webex Teams
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_webex_teams_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_with_alerts_created`
+
+Count of projects with alerts created in given time period
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_alerts_created`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `alert_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_alerts_service_enabled`
+
+Count of projects that have enabled the Alerts service
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_alerts_service_enabled`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_with_enabled_alert_integrations`
+
+Count of projects with at least 1 enabled integration
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_enabled_alert_integrations`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_error_tracking_enabled`
+
+Count of projects that have enabled Error tracking via Sentry
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_error_tracking_enabled`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `error_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_disabled`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_disabled`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_14d`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_cadence_set_to_14d`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1d`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1d`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1month`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1month`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_3month`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_cadence_set_to_3month`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_7d`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_cadence_set_to_7d`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_1`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_1`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_10`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_10`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_100`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_100`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_25`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_25`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_5`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_5`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_50`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_50`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_keep_n_unset`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_keep_n_unset`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_older_than_set_to_14d`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_older_than_set_to_14d`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_older_than_set_to_30d`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_older_than_set_to_30d`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_older_than_set_to_7d`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_older_than_set_to_7d`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_older_than_set_to_90d`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_older_than_set_to_90d`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_expiration_policy_enabled_with_older_than_unset`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_expiration_policy_enabled_with_older_than_unset`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_packages`
+
+Projects with package registry configured
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_packages`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_prometheus_alerts`
+
+Projects with Prometheus alerting enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_prometheus_alerts`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::apm` |
+| `product_category` | `metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_repositories_enabled`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_repositories_enabled`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_terraform_reports`
+
+Count of projects with Terraform MR reports
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_terraform_reports`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `infrastructure_as_code` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_terraform_states`
+
+Count of projects with GitLab Managed Terraform State
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_terraform_states`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `infrastructure_as_code` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_with_tracing_enabled`
+
+Projects with tracing enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_with_tracing_enabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | `tracing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.projects_youtrack_active`
+
+Count of projects with active integrations for YouTrack
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.projects_youtrack_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.protected_branches`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.protected_branches`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.protected_branches_except_default`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.protected_branches_except_default`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.releases`
+
+Unique release tags
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.releases`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.remote_mirrors`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.remote_mirrors`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.requirement_test_reports_ci`
+
+Count of requirement test reports created from CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.requirement_test_reports_ci`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::certify` |
+| `product_category` | `requirements_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `counts.requirement_test_reports_manual`
+
+Count of requirement test reports created manually
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.requirement_test_reports_manual`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::certify` |
+| `product_category` | `requirements_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `counts.requirements_created`
+
+Count of requirements created
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.requirements_created`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::certify` |
+| `product_category` | `requirements_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.requirements_with_test_report`
+
+Count of requirements having a test report
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.requirements_with_test_report`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::certify` |
+| `product_category` | `requirements_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `counts.sast_jobs`
+
+Count of SAST CI jobs for the month. Job names ending in '-sast'
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.sast_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::static analysis` |
+| `product_category` | `static_application_security_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.secret_detection_jobs`
+
+Count of 'secret-detection' CI jobs fro the month.
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.secret_detection_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::static analysis` |
+| `product_category` | `secret_detection` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.service_desk_enabled_projects`
+
+Count of service desk enabled projects
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.service_desk_enabled_projects`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::certify` |
+| `product_category` | `service_desk` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.service_desk_issues`
+
+Count of service desk issues
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.service_desk_issues`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::certify` |
+| `product_category` | `service_desk` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.snippet_comment`
+
+Count of comments on Snippets
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.snippet_comment`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `snippets` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.snippet_create`
+
+Count of newly created Snippets
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.snippet_create`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `snippets` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.snippet_update`
+
+Count of updates to existing Snippets
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.snippet_update`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `snippets` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.snippets`
+
+Count of all Snippets
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.snippets`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `snippets` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.source_code_pushes`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.source_code_pushes`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.static_site_editor_commits`
+
+Count of commits created via Static Site Editor
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.static_site_editor_commits`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `static_site_editor` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.static_site_editor_merge_requests`
+
+Count of merge requests created via Static Site Editor
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.static_site_editor_merge_requests`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `static_site_editor` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.static_site_editor_views`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.static_site_editor_views`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `static_site_editor` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.status_page_incident_publishes`
+
+Cumulative count of usages of publish operation
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.status_page_incident_publishes`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.status_page_incident_unpublishes`
+
+Cumulative count of usages of unpublish operation
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.status_page_incident_unpublishes`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.status_page_issues`
+
+Issues published to a Status Page
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.status_page_issues`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.status_page_projects`
+
+Projects with status page enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.status_page_projects`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.successful_deployments`
+
+Total successful deployments
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.successful_deployments`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.suggestions`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.suggestions`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.template_repositories`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.template_repositories`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.templates_asana_active`
+
+Count of active service templates for Asana
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_asana_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_assembla_active`
+
+Count of active service templates for Assembla
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_assembla_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_bamboo_active`
+
+Count of active service templates for Bamboo CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_bamboo_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_bugzilla_active`
+
+Count of active service templates for Bugzilla
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_bugzilla_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_buildkite_active`
+
+Count of active service templates for Buildkite
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_buildkite_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_campfire_active`
+
+Count of active service templates for Campfire
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_campfire_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_confluence_active`
+
+Count of active service templates for Confluence
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_confluence_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_custom_issue_tracker_active`
+
+Count of active service templates for a Custom Issue Tracker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_custom_issue_tracker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_datadog_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_datadog_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.templates_discord_active`
+
+Count of active service templates for Discord
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_discord_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_drone_ci_active`
+
+Count of active service templates for Drone CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_drone_ci_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_emails_on_push_active`
+
+Count of active service templates for Emails on Push
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_emails_on_push_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_ewm_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_ewm_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.templates_external_wiki_active`
+
+Count of active service templates for External Wiki
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_external_wiki_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_flowdock_active`
+
+Count of active service templates for Flowdock
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_flowdock_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_github_active`
+
+Count of active service templates for GitHub
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_github_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_hangouts_chat_active`
+
+Count of active service templates for Hangouts Chat
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_hangouts_chat_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_hipchat_active`
+
+Count of active service templates for HipChat
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_hipchat_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_irker_active`
+
+Count of active service templates for Irker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_irker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_jenkins_active`
+
+Count of active service templates for Jenkins
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_jenkins_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_jira_active`
+
+Count of active service templates for Jira
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_jira_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_mattermost_active`
+
+Count of active service templates for Mattermost
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_mattermost_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_mattermost_slash_commands_active`
+
+Count of active service templates for Mattermost (slash commands)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_mattermost_slash_commands_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_microsoft_teams_active`
+
+Count of active service templates for Microsoft Teams
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_microsoft_teams_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_mock_ci_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_mock_ci_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.templates_mock_monitoring_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_mock_monitoring_active`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.templates_packagist_active`
+
+Count of active service templates for Packagist
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_packagist_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_pipelines_email_active`
+
+Count of active service templates for Pipeline Emails
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_pipelines_email_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_pivotaltracker_active`
+
+Count of active service templates for Pivotal Tracker
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_pivotaltracker_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_prometheus_active`
+
+Count of active service templates for Prometheus
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_prometheus_active`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | `metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_pushover_active`
+
+Count of active service templates for Pushover
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_pushover_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_redmine_active`
+
+Count of active service templates for Redmine
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_redmine_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_slack_active`
+
+Count of active service templates for Slack
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_slack_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_slack_slash_commands_active`
+
+Count of active service templates for Slack (slash commands)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_slack_slash_commands_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_teamcity_active`
+
+Count of active service templates for Teamcity CI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_teamcity_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_unify_circuit_active`
+
+Count of active service templates for Unifiy Circuit
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_unify_circuit_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_webex_teams_active`
+
+Count of active service templates for Webex Teams
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_webex_teams_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.templates_youtrack_active`
+
+Count of active service templates for YouTrack
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.templates_youtrack_active`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | `integrations` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.terraform_reports`
+
+Count of Terraform MR reports generated
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.terraform_reports`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `infrastructure_as_code` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.terraform_states`
+
+Count of GitLab Managed Terraform States used
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.terraform_states`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `infrastructure_as_code` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.todos`
+
+Count of ToDos
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.todos`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.uploads`
+
+Count of Uploads via Notes and Descriptions
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.uploads`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.user_preferences_group_overview_details`
+
+Count of users who set personal preference to see Details on Group overview page
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.user_preferences_group_overview_details`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::threat insights` |
+| `product_category` | `vulnerability_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `counts.user_preferences_group_overview_security_dashboard`
+
+Count of users who set personal preference to see Security Dashboard on Group overview page
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.user_preferences_group_overview_security_dashboard`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::threat insights` |
+| `product_category` | `vulnerability_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `counts.user_preferences_user_gitpod_enabled`
+
+Count all users with their GitPod setting enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.user_preferences_user_gitpod_enabled`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `editor_extension` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.web_hooks`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.web_hooks`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::ecosystem` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.web_ide_commits`
+
+Count of Commits made from Web IDE
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.web_ide_commits`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `web_ide` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.web_ide_merge_requests`
+
+Count of Merge Requests created from Web IDE
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.web_ide_merge_requests`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `web_ide` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.web_ide_pipelines`
+
+Count of Pipeline tab views in Web IDE
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.web_ide_pipelines`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `web_ide` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.web_ide_previews`
+
+Count of Live Preview tab views in Web IDE
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.web_ide_previews`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `web_ide` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.web_ide_terminals`
+
+Count of Web Terminal Tab views in Web IDE
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.web_ide_terminals`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `web_ide` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.web_ide_views`
+
+Count of Views of the Web IDE
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.web_ide_views`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `web_ide` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts.wiki_pages_create`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.wiki_pages_create`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::knowledge` |
+| `product_category` | `wiki` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.wiki_pages_delete`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.wiki_pages_delete`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::knowledge` |
+| `product_category` | `wiki` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.wiki_pages_update`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.wiki_pages_update`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::knowledge` |
+| `product_category` | `wiki` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts.wiki_pages_view`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts.wiki_pages_view`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts_monthly.aggregated_metrics.compliance_features_track_unique_visits_union`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_monthly.aggregated_metrics.compliance_features_track_unique_visits_union`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts_monthly.aggregated_metrics.i_testing_paid_monthly_active_user_total`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_monthly.aggregated_metrics.i_testing_paid_monthly_active_user_total`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts_monthly.aggregated_metrics.incident_management_alerts_total_unique_counts`
+
+Count of unique users per month to take an action on an alert
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_monthly.aggregated_metrics.incident_management_alerts_total_unique_counts`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts_monthly.aggregated_metrics.incident_management_incidents_total_unique_counts`
+
+Count of unique users per month to take an action on an incident
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_monthly.aggregated_metrics.incident_management_incidents_total_unique_counts`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts_monthly.aggregated_metrics.product_analytics_test_metrics_intersection`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_monthly.aggregated_metrics.product_analytics_test_metrics_intersection`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts_monthly.aggregated_metrics.product_analytics_test_metrics_union`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_monthly.aggregated_metrics.product_analytics_test_metrics_union`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
## `counts_monthly.deployments`
Total deployments count for recent 28 days
@@ -144,6 +9699,253 @@ Total deployments count for recent 28 days
| `distribution` | ee, ce |
| `tier` | free, premium, ultimate |
+## `counts_monthly.failed_deployments`
+
+Total failed deployments
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_monthly.failed_deployments`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts_monthly.packages`
+
+Monthly count of Packages
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_monthly.packages`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts_monthly.personal_snippets`
+
+Monthly count of Personal Snippets
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_monthly.personal_snippets`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `snippets` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts_monthly.project_snippets`
+
+Monthly count of Project Snippets
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_monthly.project_snippets`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `snippets` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts_monthly.projects_with_alerts_created`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_monthly.projects_with_alerts_created`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts_monthly.snippets`
+
+Monthly count of All Snippets
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_monthly.snippets`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `snippets` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Database |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `counts_monthly.successful_deployments`
+
+Total successful deployments
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_monthly.successful_deployments`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Database |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `counts_weekly.aggregated_metrics.compliance_features_track_unique_visits_union`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_weekly.aggregated_metrics.compliance_features_track_unique_visits_union`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `counts_weekly.aggregated_metrics.i_testing_paid_monthly_active_user_total`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_weekly.aggregated_metrics.i_testing_paid_monthly_active_user_total`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `counts_weekly.aggregated_metrics.incident_management_alerts_total_unique_counts`
+
+Count of unique users per week to take an action on an alert
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_weekly.aggregated_metrics.incident_management_alerts_total_unique_counts`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `counts_weekly.aggregated_metrics.incident_management_incidents_total_unique_counts`
+
+Count of unique users per week to take an action on an incident
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_weekly.aggregated_metrics.incident_management_incidents_total_unique_counts`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `counts_weekly.aggregated_metrics.product_analytics_test_metrics_intersection`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_weekly.aggregated_metrics.product_analytics_test_metrics_intersection`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `counts_weekly.aggregated_metrics.product_analytics_test_metrics_union`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`counts_weekly.aggregated_metrics.product_analytics_test_metrics_union`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Database |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
## `database.adapter`
This metric only returns a value of PostgreSQL in supported versions of GitLab. It could be removed from the usage ping. Historically MySQL was also supported.
@@ -154,7 +9956,7 @@ This metric only returns a value of PostgreSQL in supported versions of GitLab.
| `product_section` | enablement |
| `product_stage` | enablement |
| `product_group` | `group::enablement distribution` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
@@ -162,6 +9964,44 @@ This metric only returns a value of PostgreSQL in supported versions of GitLab.
| `distribution` | ee, ce |
| `tier` | free, premium, ultimate |
+## `database.pg_system_id`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`database.pg_system_id`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `database.version`
+
+The version of the PostgreSQL database.
+
+| field | value |
+| --- | --- |
+| `key_path` | **`database.version`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::distribution` |
+| `product_category` | `collection` |
+| `value_type` | string |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
## `dependency_proxy_enabled`
Whether dependency proxy is enabled
@@ -172,13 +10012,32 @@ Whether dependency proxy is enabled
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `edition`
+
+Edition of GitLab such as EE, CE, Bronze, Silver, Gold
+
+| field | value |
+| --- | --- |
+| `key_path` | **`edition`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::distribution` |
+| `product_category` | `collection` |
+| `value_type` | string |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
| `skip_validation` | true |
## `elasticsearch_enabled`
@@ -191,13 +10050,51 @@ Whether Elasticsearch is enabled
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `geo_enabled`
+
+Is Geo enabled?
+
+| field | value |
+| --- | --- |
+| `key_path` | **`geo_enabled`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::geo` |
+| `product_category` | `collection` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `git.version`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`git.version`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | string |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
| `skip_validation` | true |
## `gitaly.clusters`
@@ -210,13 +10107,32 @@ Total GitLab Managed clusters both enabled and disabled
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | number |
| `status` | data_available |
| `time_frame` | all |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `gitaly.filesystems`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`gitaly.filesystems`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
| `skip_validation` | true |
## `gitaly.servers`
@@ -229,13 +10145,13 @@ Total Gitalty Servers
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | number |
| `status` | data_available |
| `time_frame` | all |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
| `skip_validation` | true |
## `gitaly.version`
@@ -248,13 +10164,13 @@ Version of Gitaly
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
| `skip_validation` | true |
## `gitlab_pages.enabled`
@@ -267,13 +10183,13 @@ Whether GitLab Pages is enabled
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
| `skip_validation` | true |
## `gitlab_pages.version`
@@ -286,13 +10202,13 @@ The version number of GitLab Pages
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
| `skip_validation` | true |
## `gitlab_shared_runners_enabled`
@@ -305,13 +10221,32 @@ Whether shared runners is enabled
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `gitpod_enabled`
+
+Whether gitpod is enabled in the instance
+
+| field | value |
+| --- | --- |
+| `key_path` | **`gitpod_enabled`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `integrations` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
| `skip_validation` | true |
## `grafana_link_enabled`
@@ -324,13 +10259,13 @@ Whether Grafana is enabled
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
| `skip_validation` | true |
## `gravatar_enabled`
@@ -343,13 +10278,13 @@ Whether gravatar is enabled
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
| `skip_validation` | true |
## `historical_max_users`
@@ -362,7 +10297,7 @@ The maximum active user count. Active is defined in UsersStatistics model.
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
@@ -381,7 +10316,45 @@ Host name of GitLab instance
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
+| `value_type` | string |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `ingress_modsecurity_enabled`
+
+Whether or not ModSecurity is enabled within Ingress
+
+| field | value |
+| --- | --- |
+| `key_path` | **`ingress_modsecurity_enabled`** |
+| `product_section` | sec |
+| `product_stage` | protect |
+| `product_group` | `group::container security` |
+| `product_category` | `web_firewall` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `installation_type`
+
+The installation method used to install GitLab (Omnibus, Helm, etc)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`installation_type`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::distribution` |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
@@ -400,13 +10373,13 @@ Whether auto DevOps is enabled
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
| `skip_validation` | true |
## `ldap_enabled`
@@ -419,13 +10392,13 @@ Whether LDAP is enabled
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
| `skip_validation` | true |
## `license_expires_at`
@@ -438,7 +10411,7 @@ The date the license ends
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
@@ -457,7 +10430,7 @@ The ID of the license
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
@@ -476,7 +10449,7 @@ The license key of the GitLab instance
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
@@ -495,7 +10468,7 @@ The plan of the GitLab license
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
@@ -514,7 +10487,7 @@ The date the license starts
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
@@ -533,7 +10506,7 @@ Licese zuora_subscription_id
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
@@ -552,7 +10525,7 @@ Whether this is a trial license or not
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
@@ -571,13 +10544,13 @@ Date the license ends on
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
| `skip_validation` | true |
## `license_user_count`
@@ -590,7 +10563,7 @@ The number of users included in the license
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
@@ -609,7 +10582,7 @@ Company on the GitLab license
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
@@ -628,7 +10601,7 @@ Email on the GitLab license
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
@@ -647,7 +10620,7 @@ Name on the GitLab license
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
@@ -656,6 +10629,25 @@ Name on the GitLab license
| `tier` | premium, ultimate |
| `skip_validation` | true |
+## `mail.smtp_server`
+
+The value of the SMTP server that is used
+
+| field | value |
+| --- | --- |
+| `key_path` | **`mail.smtp_server`** |
+| `product_section` | growth |
+| `product_stage` | |
+| `product_group` | `group::acquisition` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
## `mattermost_enabled`
Whether Mattermost is enabled
@@ -666,13 +10658,488 @@ Whether Mattermost is enabled
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `object_store.artifacts.enabled`
+
+Whether Object Storage is enabled for Artifacts
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.artifacts.enabled`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.artifacts.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for Artifacts
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.artifacts.object_store.background_upload`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.artifacts.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for Artifacts
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.artifacts.object_store.direct_upload`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.artifacts.object_store.enabled`
+
+Whether Object Storage is enabled for Artifacts
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.artifacts.object_store.enabled`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.artifacts.object_store.provider`
+
+What Object Storage provider has been configured for Artifacts
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.artifacts.object_store.provider`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.external_diffs.enabled`
+
+Whether Object Storage is enabled for External Diffs
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.external_diffs.enabled`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.external_diffs.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for External Diffs
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.external_diffs.object_store.background_upload`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.external_diffs.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for External Diffs
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.external_diffs.object_store.direct_upload`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.external_diffs.object_store.enabled`
+
+Whether Object Storage is enabled for External Diffs
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.external_diffs.object_store.enabled`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.external_diffs.object_store.provider`
+
+What Object Storage provider has been configured for External Diffs
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.external_diffs.object_store.provider`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.lfs.enabled`
+
+Whether Object Storage is enabled for LFS
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.lfs.enabled`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.lfs.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for LFS
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.lfs.object_store.background_upload`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.lfs.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for LFS
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.lfs.object_store.direct_upload`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.lfs.object_store.enabled`
+
+Whether Object Storage is enabled for LFS
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.lfs.object_store.enabled`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.lfs.object_store.provider`
+
+What Object Storage provider has been configured for LFS
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.lfs.object_store.provider`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.packages.enabled`
+
+Whether Object Storage is enabled for Uploads
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.packages.enabled`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.packages.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for Packages
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.packages.object_store.background_upload`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.packages.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for Packages
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.packages.object_store.direct_upload`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.packages.object_store.enabled`
+
+Whether Object Storage is enabled for Packages
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.packages.object_store.enabled`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.packages.object_store.provider`
+
+What Object Storage provider has been configured for Packages
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.packages.object_store.provider`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.uploads.enabled`
+
+Whether Object Storage is enabled for Uploads
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.uploads.enabled`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.uploads.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for Uploads
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.uploads.object_store.background_upload`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.uploads.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for Uploads
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.uploads.object_store.direct_upload`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.uploads.object_store.enabled`
+
+Whether Object Storage is enabled for Uploads
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.uploads.object_store.enabled`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `object_store.uploads.object_store.provider`
+
+What Object Storage provider has been configured for Uploads
+
+| field | value |
+| --- | --- |
+| `key_path` | **`object_store.uploads.object_store.provider`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | `operational_metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
| `skip_validation` | true |
## `omniauth_enabled`
@@ -685,13 +11152,13 @@ Whether OmniAuth is enabled
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
| `skip_validation` | true |
## `prometheus_enabled`
@@ -704,13 +11171,13 @@ Whether the bundled Prometheus is enabled
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
| `skip_validation` | true |
## `prometheus_metrics_enabled`
@@ -723,13 +11190,13 @@ Whether Prometheus Metrics endpoint is enabled
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
| `skip_validation` | true |
## `recorded_at`
@@ -742,7 +11209,7 @@ When the Usage Ping computation was started
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `milestone` | 8.1 |
@@ -762,13 +11229,13 @@ When the core features were computed
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
| `distribution` | ce, ee |
-| `tier` | |
+| `tier` | free |
| `skip_validation` | true |
## `recording_ee_finished_at`
@@ -781,7 +11248,7 @@ When the EE-specific features were computed
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `time_frame` | none |
@@ -790,6 +11257,5383 @@ When the EE-specific features were computed
| `tier` | |
| `skip_validation` | true |
+## `redis_hll_counters.analytics.analytics_total_unique_counts_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.analytics_total_unique_counts_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.analytics_total_unique_counts_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.analytics_total_unique_counts_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.g_analytics_contribution_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.g_analytics_contribution_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.g_analytics_contribution_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.g_analytics_contribution_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.g_analytics_insights_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.g_analytics_insights_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.g_analytics_insights_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.g_analytics_insights_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.g_analytics_issues_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.g_analytics_issues_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.g_analytics_issues_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.g_analytics_issues_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.g_analytics_merge_request_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.g_analytics_merge_request_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.g_analytics_merge_request_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.g_analytics_merge_request_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.g_analytics_productivity_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.g_analytics_productivity_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.g_analytics_productivity_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.g_analytics_productivity_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.g_analytics_valuestream_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.g_analytics_valuestream_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.g_analytics_valuestream_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.g_analytics_valuestream_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.i_analytics_cohorts_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.i_analytics_cohorts_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.i_analytics_cohorts_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.i_analytics_cohorts_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.i_analytics_dev_ops_score_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.i_analytics_dev_ops_score_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.i_analytics_dev_ops_score_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.i_analytics_dev_ops_score_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.i_analytics_instance_statistics_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.i_analytics_instance_statistics_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.i_analytics_instance_statistics_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.i_analytics_instance_statistics_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.p_analytics_code_reviews_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.p_analytics_code_reviews_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.p_analytics_code_reviews_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.p_analytics_code_reviews_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.p_analytics_insights_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.p_analytics_insights_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.p_analytics_insights_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.p_analytics_insights_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.p_analytics_issues_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.p_analytics_issues_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.p_analytics_issues_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.p_analytics_issues_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.p_analytics_merge_request_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.p_analytics_merge_request_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.p_analytics_merge_request_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.p_analytics_merge_request_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.p_analytics_pipelines_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.p_analytics_pipelines_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.p_analytics_pipelines_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.p_analytics_pipelines_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.p_analytics_repo_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.p_analytics_repo_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.p_analytics_repo_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.p_analytics_repo_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.p_analytics_valuestream_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.p_analytics_valuestream_monthly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.analytics.p_analytics_valuestream_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.analytics.p_analytics_valuestream_weekly`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::analytics` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_secrets_management.i_ci_secrets_management_vault_build_created_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_secrets_management.i_ci_secrets_management_vault_build_created_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_secrets_management.i_ci_secrets_management_vault_build_created_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_secrets_management.i_ci_secrets_management_vault_build_created_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.ci_templates_total_unique_counts_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.ci_templates_total_unique_counts_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.ci_templates_total_unique_counts_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.ci_templates_total_unique_counts_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_5_min_production_app_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_5_min_production_app_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_5_min_production_app_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_5_min_production_app_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_build_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_auto_devops_build_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_build_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_auto_devops_build_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_latest_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_latest_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_latest_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_latest_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_auto_devops_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_auto_devops_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_aws_cf_deploy_ec2_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_aws_cf_deploy_ec2_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_aws_cf_deploy_ec2_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_aws_cf_deploy_ec2_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_aws_deploy_ecs_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_aws_deploy_ecs_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_aws_deploy_ecs_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_aws_deploy_ecs_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_build_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_build_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_build_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_build_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_deploy_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_deploy_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_deploy_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_deploy_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_implicit_security_secret_detection_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_implicit_security_secret_detection_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_implicit_security_secret_detection_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_implicit_security_secret_detection_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_security_sast_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_security_sast_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_security_sast_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_security_sast_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_security_secret_detection_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_security_secret_detection_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_security_secret_detection_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_security_secret_detection_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_terraform_base_latest_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_terraform_base_latest_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ci_templates.p_ci_templates_terraform_base_latest_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ci_templates.p_ci_templates_terraform_base_latest_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.code_review_total_unique_counts_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.code_review_total_unique_counts_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.code_review_total_unique_counts_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.code_review_total_unique_counts_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_edit_mr_desc_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_edit_mr_desc_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_edit_mr_desc_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_edit_mr_desc_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_edit_mr_title_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_edit_mr_title_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_edit_mr_title_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_edit_mr_title_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_mr_diffs_monthly`
+
+Count of unique merge requests per week|month with diffs viewed
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_mr_diffs_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_mr_diffs_weekly`
+
+Count of unique merge requests per week|month with diffs viewed
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_mr_diffs_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_mr_single_file_diffs_monthly`
+
+Count of unique merge requests per week|month with diffs viewed file by file
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_mr_single_file_diffs_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_mr_single_file_diffs_weekly`
+
+Count of unique merge requests per week|month with diffs viewed file by file
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_mr_single_file_diffs_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_add_suggestion_monthly`
+
+Count of unique users per month who added a suggestion
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_add_suggestion_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_add_suggestion_weekly`
+
+Count of unique users per week who added a suggestion
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_add_suggestion_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_apply_suggestion_monthly`
+
+Count of unique users per month who applied a suggestion
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_apply_suggestion_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_apply_suggestion_weekly`
+
+Count of unique users per week who applied a suggestion
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_apply_suggestion_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_approval_rule_added_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_approval_rule_added_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_approval_rule_added_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_approval_rule_added_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_approval_rule_deleted_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_approval_rule_deleted_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_approval_rule_deleted_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_approval_rule_deleted_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_approval_rule_edited_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_approval_rule_edited_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_approval_rule_edited_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_approval_rule_edited_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_approve_mr_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_approve_mr_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_approve_mr_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_approve_mr_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_assigned_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_assigned_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_assigned_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_assigned_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_close_mr_monthly`
+
+Count of unique users per week|month who closed a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_close_mr_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_close_mr_weekly`
+
+Count of unique users per week|month who closed a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_close_mr_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_create_mr_comment_monthly`
+
+Count of unique users per week|month who commented on a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_create_mr_comment_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_create_mr_comment_weekly`
+
+Count of unique users per week|month who commented on a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_create_mr_comment_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_create_mr_from_issue_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_create_mr_from_issue_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_create_mr_from_issue_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_create_mr_from_issue_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_create_mr_monthly`
+
+Count of unique users per week|month who created a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_create_mr_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_create_mr_weekly`
+
+Count of unique users per week|month who created a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_create_mr_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_create_multiline_mr_comment_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_create_multiline_mr_comment_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_create_multiline_mr_comment_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_create_multiline_mr_comment_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_create_review_note_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_create_review_note_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_create_review_note_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_create_review_note_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_edit_mr_comment_monthly`
+
+Count of unique users per week|month who edited a comment on a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_edit_mr_comment_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_edit_mr_comment_weekly`
+
+Count of unique users per week|month who edited a comment on a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_edit_mr_comment_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_edit_multiline_mr_comment_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_edit_multiline_mr_comment_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_edit_multiline_mr_comment_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_edit_multiline_mr_comment_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_marked_as_draft_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_marked_as_draft_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_marked_as_draft_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_marked_as_draft_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_merge_mr_monthly`
+
+Count of unique users per week|month who merged a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_merge_mr_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_merge_mr_weekly`
+
+Count of unique users per week|month who merged a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_merge_mr_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_publish_review_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_publish_review_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_publish_review_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_publish_review_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_remove_mr_comment_monthly`
+
+Count of unique users per week|month who removed a comment on a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_remove_mr_comment_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_remove_mr_comment_weekly`
+
+Count of unique users per week|month who removed a comment on a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_remove_mr_comment_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_remove_multiline_mr_comment_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_remove_multiline_mr_comment_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_remove_multiline_mr_comment_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_remove_multiline_mr_comment_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_reopen_mr_monthly`
+
+Count of unique users per week|month who reopened a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_reopen_mr_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_reopen_mr_weekly`
+
+Count of unique users per week|month who reopened a MR
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_reopen_mr_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_resolve_thread_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_resolve_thread_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_resolve_thread_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_resolve_thread_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_review_requested_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_review_requested_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_review_requested_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_review_requested_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_single_file_diffs_monthly`
+
+Count of unique users per week|month with diffs viewed file by file
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_single_file_diffs_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_single_file_diffs_weekly`
+
+Count of unique users per week|month with diffs viewed file by file
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_single_file_diffs_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_toggled_task_item_status_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_toggled_task_item_status_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_toggled_task_item_status_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_toggled_task_item_status_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_unapprove_mr_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_unapprove_mr_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_unapprove_mr_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_unapprove_mr_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_unmarked_as_draft_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_unmarked_as_draft_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_unmarked_as_draft_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_unmarked_as_draft_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_unresolve_thread_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_unresolve_thread_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_unresolve_thread_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_unresolve_thread_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_vs_code_api_request_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_vs_code_api_request_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.code_review.i_code_review_user_vs_code_api_request_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.code_review.i_code_review_user_vs_code_api_request_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.compliance.a_compliance_audit_events_api_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.compliance.a_compliance_audit_events_api_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.compliance.a_compliance_audit_events_api_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.compliance.a_compliance_audit_events_api_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.compliance.compliance_total_unique_counts_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.compliance.compliance_total_unique_counts_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.compliance.compliance_total_unique_counts_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.compliance.compliance_total_unique_counts_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.compliance.g_compliance_audit_events_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.compliance.g_compliance_audit_events_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.compliance.g_compliance_audit_events_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.compliance.g_compliance_audit_events_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.compliance.g_compliance_dashboard_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.compliance.g_compliance_dashboard_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.compliance.g_compliance_dashboard_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.compliance.g_compliance_dashboard_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.compliance.i_compliance_audit_events_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.compliance.i_compliance_audit_events_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.compliance.i_compliance_audit_events_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.compliance.i_compliance_audit_events_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.compliance.i_compliance_credential_inventory_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.compliance.i_compliance_credential_inventory_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.compliance.i_compliance_credential_inventory_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.compliance.i_compliance_credential_inventory_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.deploy_token_packages_total_unique_counts_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.deploy_token_packages_total_unique_counts_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.deploy_token_packages_total_unique_counts_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.deploy_token_packages_total_unique_counts_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_composer_deploy_token_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_composer_deploy_token_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_composer_deploy_token_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_composer_deploy_token_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_conan_deploy_token_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_conan_deploy_token_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_conan_deploy_token_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_conan_deploy_token_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_container_deploy_token_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_container_deploy_token_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_container_deploy_token_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_container_deploy_token_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_debian_deploy_token_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_debian_deploy_token_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_debian_deploy_token_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_debian_deploy_token_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_generic_deploy_token_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_generic_deploy_token_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_generic_deploy_token_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_generic_deploy_token_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_golang_deploy_token_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_golang_deploy_token_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_golang_deploy_token_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_golang_deploy_token_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_maven_deploy_token_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_maven_deploy_token_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_maven_deploy_token_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_maven_deploy_token_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_npm_deploy_token_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_npm_deploy_token_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_npm_deploy_token_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_npm_deploy_token_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_nuget_deploy_token_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_nuget_deploy_token_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_nuget_deploy_token_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_nuget_deploy_token_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_pypi_deploy_token_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_pypi_deploy_token_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_pypi_deploy_token_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_pypi_deploy_token_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_tag_deploy_token_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_tag_deploy_token_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.deploy_token_packages.i_package_tag_deploy_token_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.deploy_token_packages.i_package_tag_deploy_token_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ecosystem.ecosystem_total_unique_counts_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ecosystem.ecosystem_total_unique_counts_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ecosystem.ecosystem_total_unique_counts_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ecosystem.ecosystem_total_unique_counts_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ecosystem.i_ecosystem_jira_service_close_issue_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ecosystem.i_ecosystem_jira_service_close_issue_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ecosystem.i_ecosystem_jira_service_close_issue_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ecosystem.i_ecosystem_jira_service_close_issue_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ecosystem.i_ecosystem_jira_service_create_issue_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ecosystem.i_ecosystem_jira_service_create_issue_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ecosystem.i_ecosystem_jira_service_create_issue_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ecosystem.i_ecosystem_jira_service_create_issue_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ecosystem.i_ecosystem_jira_service_cross_reference_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ecosystem.i_ecosystem_jira_service_cross_reference_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ecosystem.i_ecosystem_jira_service_cross_reference_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ecosystem.i_ecosystem_jira_service_cross_reference_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ecosystem.i_ecosystem_jira_service_list_issues_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ecosystem.i_ecosystem_jira_service_list_issues_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ecosystem.i_ecosystem_jira_service_list_issues_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ecosystem.i_ecosystem_jira_service_list_issues_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ide_edit.g_edit_by_sfe_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ide_edit.g_edit_by_sfe_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ide_edit.g_edit_by_sfe_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ide_edit.g_edit_by_sfe_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ide_edit.g_edit_by_snippet_ide_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ide_edit.g_edit_by_snippet_ide_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ide_edit.g_edit_by_snippet_ide_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ide_edit.g_edit_by_snippet_ide_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ide_edit.g_edit_by_sse_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ide_edit.g_edit_by_sse_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ide_edit.g_edit_by_sse_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ide_edit.g_edit_by_sse_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ide_edit.g_edit_by_web_ide_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ide_edit.g_edit_by_web_ide_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ide_edit.g_edit_by_web_ide_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ide_edit.g_edit_by_web_ide_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ide_edit.ide_edit_total_unique_counts_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ide_edit.ide_edit_total_unique_counts_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.ide_edit.ide_edit_total_unique_counts_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.ide_edit.ide_edit_total_unique_counts_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_alert_assigned_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_alert_assigned_monthly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_alert_assigned_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_alert_assigned_weekly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_alert_status_changed_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_alert_status_changed_monthly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_alert_status_changed_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_alert_status_changed_weekly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_alert_todo_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_alert_todo_monthly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_alert_todo_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_alert_todo_weekly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_assigned_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_assigned_monthly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_assigned_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_assigned_weekly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_change_confidential_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_change_confidential_monthly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_change_confidential_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_change_confidential_weekly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_closed_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_closed_monthly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_closed_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_closed_weekly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_comment_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_comment_monthly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_comment_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_comment_weekly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_created_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_created_monthly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_created_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_created_weekly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_published_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_published_monthly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_published_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_published_weekly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_relate_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_relate_monthly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_relate_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_relate_weekly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_reopened_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_reopened_monthly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_reopened_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_reopened_weekly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_todo_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_todo_monthly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_todo_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_todo_weekly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_unrelate_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_unrelate_monthly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_unrelate_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_unrelate_weekly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_zoom_meeting_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_zoom_meeting_monthly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_incident_zoom_meeting_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_incident_zoom_meeting_weekly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_total_unique_counts_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_total_unique_counts_monthly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management.incident_management_total_unique_counts_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management.incident_management_total_unique_counts_weekly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management_alerts.incident_management_alert_create_incident_monthly`
+
+Count of unique users per month to create an incident corresponding to an alert
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management_alerts.incident_management_alert_create_incident_monthly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.incident_management_alerts.incident_management_alert_create_incident_weekly`
+
+Count of unique users per week to create an incident corresponding to an alert
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.incident_management_alerts.incident_management_alert_create_incident_weekly`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_added_to_epic_monthly`
+
+Count of MAU adding an issue to an epic
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_added_to_epic_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_added_to_epic_weekly`
+
+Count of WAU adding an issue to an epic
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_added_to_epic_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_assignee_changed_monthly`
+
+Count of MAU changing issue assignees
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_assignee_changed_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_assignee_changed_weekly`
+
+Count of WAU changing issue assignees
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_assignee_changed_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_changed_epic_monthly`
+
+Count of MAU changing the epic on an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_changed_epic_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_changed_epic_weekly`
+
+Count of WAU changing the epic on an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_changed_epic_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_cloned_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_cloned_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_cloned_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_cloned_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_closed_monthly`
+
+Count of MAU closing an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_closed_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_closed_weekly`
+
+Count of WAU closing an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_closed_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_comment_added_monthly`
+
+Count of MAU commenting on an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_comment_added_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_comment_added_weekly`
+
+Count of WAU commenting on an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_comment_added_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_comment_edited_monthly`
+
+Count of MAU editing a comment on an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_comment_edited_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_comment_edited_weekly`
+
+Count of WAU editing a comment on an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_comment_edited_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_comment_removed_monthly`
+
+Count of MAU deleting a comment from an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_comment_removed_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_comment_removed_weekly`
+
+Count of WAU deleting a comment from an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_comment_removed_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_created_monthly`
+
+Count of MAU creating new issues
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_created_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_created_weekly`
+
+Count of WAU creating issues
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_created_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_cross_referenced_monthly`
+
+Count of MAU referencing an issue from somewhere else
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_cross_referenced_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_cross_referenced_weekly`
+
+Count of WAU referncing an issue from somewhere else
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_cross_referenced_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_description_changed_monthly`
+
+Count of MAU editing an issue description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_description_changed_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_description_changed_weekly`
+
+Count of WAU editing an issue description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_description_changed_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_designs_added_monthly`
+
+Count of MAU adding a design to an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_designs_added_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_designs_added_weekly`
+
+Count of WAU adding a design to an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_designs_added_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_designs_modified_monthly`
+
+Count of MAU modifying a design on an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_designs_modified_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_designs_modified_weekly`
+
+Count of WAU modifying a design on an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_designs_modified_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_designs_removed_monthly`
+
+Count of MAU removing a design from an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_designs_removed_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_designs_removed_weekly`
+
+Count of WAU removing a design from an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_designs_removed_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_due_date_changed_monthly`
+
+Count of MAU changing an issue due date
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_due_date_changed_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_due_date_changed_weekly`
+
+Count of WAU changing an issue due date
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_due_date_changed_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_health_status_changed_monthly`
+
+Count of MAU changing the health status on an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_health_status_changed_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_health_status_changed_weekly`
+
+Count of WAU changing the health status on an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_health_status_changed_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_iteration_changed_monthly`
+
+Count of MAU changing an issue's iteration
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_iteration_changed_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_iteration_changed_weekly`
+
+Count of WAU changing an issue's iteration
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_iteration_changed_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_label_changed_monthly`
+
+Count of MAU changing an issue's label
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_label_changed_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_label_changed_weekly`
+
+Count of WAU changing an issue's label
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_label_changed_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_locked_monthly`
+
+Count of MAU locking an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_locked_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_locked_weekly`
+
+Count of WAU locking an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_locked_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_made_confidential_monthly`
+
+Count of MAU making an issue confidential
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_made_confidential_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_made_confidential_weekly`
+
+Count of WAU making an issue confidential
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_made_confidential_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_made_visible_monthly`
+
+Count of MAU making an issue not confidential
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_made_visible_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_made_visible_weekly`
+
+Count of WAU making an issue not confidential
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_made_visible_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_marked_as_duplicate_monthly`
+
+Count of MAU marking an issue as a duplicate
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_marked_as_duplicate_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_marked_as_duplicate_weekly`
+
+Count of WAU marking an issue as a duplicate
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_marked_as_duplicate_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_milestone_changed_monthly`
+
+Count of MAU changing an issue's milestone
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_milestone_changed_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_milestone_changed_weekly`
+
+Count of WAU changing an issue's milestone
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_milestone_changed_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_moved_monthly`
+
+Count of MAU moving an issue to another project
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_moved_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_moved_weekly`
+
+Count of WAU moving an issue to another project
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_moved_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_related_monthly`
+
+Count of MAU relating an issue to another issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_related_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_related_weekly`
+
+Count of WAU relating an issue to another issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_related_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_removed_from_epic_monthly`
+
+Count of MAU removing an issue from an epic
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_removed_from_epic_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_removed_from_epic_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_removed_from_epic_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_reopened_monthly`
+
+Count of MAU re-opening a closed issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_reopened_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_reopened_weekly`
+
+Count of WAU re-opening a closed issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_reopened_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_time_estimate_changed_monthly`
+
+Count of MAU changing an issue time estimate
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_time_estimate_changed_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_time_estimate_changed_weekly`
+
+Count of WAU changing an issue time estimate
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_time_estimate_changed_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_time_spent_changed_monthly`
+
+Count of MAU recording time spent on an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_time_spent_changed_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_time_spent_changed_weekly`
+
+Count of WAU recording time spent on an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_time_spent_changed_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_title_changed_monthly`
+
+Count of MAU editing an issue title
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_title_changed_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
## `redis_hll_counters.issues_edit.g_project_management_issue_title_changed_weekly`
Distinct users count that changed issue title in a group for last recent week
@@ -799,7 +16643,7 @@ Distinct users count that changed issue title in a group for last recent week
| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_title_changed_weekly`** |
| `product_stage` | plan |
| `product_group` | `group::project management` |
-| `product_category` | issue_tracking |
+| `product_category` | `issue_tracking` |
| `value_type` | number |
| `status` | data_available |
| `milestone` | 13.6 |
@@ -809,6 +16653,3952 @@ Distinct users count that changed issue title in a group for last recent week
| `distribution` | ee, ce |
| `tier` | free, premium, ultimate |
+## `redis_hll_counters.issues_edit.g_project_management_issue_unlocked_monthly`
+
+Count of MAU marking an issue as blocked or blocked by
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_unlocked_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_unlocked_weekly`
+
+Count of WAU marking an issue as blocked or blocked by
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_unlocked_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_unrelated_monthly`
+
+Count of MAU unrelating an issue to another issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_unrelated_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_unrelated_weekly`
+
+Count of WAU unrelating an issue to another issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_unrelated_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_weight_changed_monthly`
+
+Count of MAU changing an issue's weight
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_weight_changed_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.g_project_management_issue_weight_changed_weekly`
+
+Count of WAU changing an issue's weight
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.g_project_management_issue_weight_changed_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.issues_edit_total_unique_counts_monthly`
+
+Count of MAU taking an action related to an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.issues_edit_total_unique_counts_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.issues_edit.issues_edit_total_unique_counts_weekly`
+
+Count of WAU taking an action related to an issue
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.issues_edit.issues_edit_total_unique_counts_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | `issue_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_committing_ciconfigfile_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_committing_ciconfigfile_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_approve_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_approve_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_approve_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_approve_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_assign_multiple_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_assign_multiple_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_assign_multiple_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_assign_multiple_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_assign_reviewer_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_assign_reviewer_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_assign_reviewer_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_assign_reviewer_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_assign_self_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_assign_self_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_assign_self_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_assign_self_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_assign_single_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_assign_single_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_assign_single_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_assign_single_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_award_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_award_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_award_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_award_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_board_move_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_board_move_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_board_move_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_board_move_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_child_epic_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_child_epic_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_child_epic_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_child_epic_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_clear_weight_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_clear_weight_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_clear_weight_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_clear_weight_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_clone_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_clone_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_clone_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_clone_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_close_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_close_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_close_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_close_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_confidential_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_confidential_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_confidential_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_confidential_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_copy_metadata_issue_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_copy_metadata_issue_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_copy_metadata_issue_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_copy_metadata_issue_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_copy_metadata_merge_request_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_copy_metadata_merge_request_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_copy_metadata_merge_request_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_copy_metadata_merge_request_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_create_merge_request_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_create_merge_request_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_create_merge_request_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_create_merge_request_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_done_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_done_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_done_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_done_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_draft_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_draft_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_draft_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_draft_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_due_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_due_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_due_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_due_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_duplicate_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_duplicate_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_duplicate_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_duplicate_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_epic_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_epic_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_epic_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_epic_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_estimate_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_estimate_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_estimate_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_estimate_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_iteration_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_iteration_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_iteration_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_iteration_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_label_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_label_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_label_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_label_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_lock_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_lock_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_lock_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_lock_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_merge_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_merge_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_merge_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_merge_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_milestone_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_milestone_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_milestone_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_milestone_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_move_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_move_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_move_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_move_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_parent_epic_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_parent_epic_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_parent_epic_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_parent_epic_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_promote_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_promote_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_promote_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_promote_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_publish_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_publish_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_publish_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_publish_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_reassign_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_reassign_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_reassign_reviewer_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_reassign_reviewer_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_reassign_reviewer_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_reassign_reviewer_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_reassign_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_reassign_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_rebase_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_rebase_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_rebase_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_rebase_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_relabel_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_relabel_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_relabel_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_relabel_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_relate_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_relate_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_relate_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_relate_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_child_epic_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_child_epic_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_child_epic_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_child_epic_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_due_date_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_due_date_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_due_date_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_due_date_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_epic_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_epic_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_epic_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_epic_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_estimate_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_estimate_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_estimate_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_estimate_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_iteration_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_iteration_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_iteration_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_iteration_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_milestone_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_milestone_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_milestone_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_milestone_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_parent_epic_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_parent_epic_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_parent_epic_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_parent_epic_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_time_spent_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_time_spent_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_time_spent_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_time_spent_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_zoom_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_zoom_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_remove_zoom_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_remove_zoom_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_reopen_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_reopen_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_reopen_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_reopen_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_shrug_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_shrug_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_shrug_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_shrug_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_spend_add_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_spend_add_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_spend_add_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_spend_add_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_spend_subtract_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_spend_subtract_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_spend_subtract_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_spend_subtract_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_submit_review_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_submit_review_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_submit_review_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_submit_review_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_subscribe_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_subscribe_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_subscribe_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_subscribe_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_tableflip_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_tableflip_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_tableflip_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_tableflip_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_tag_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_tag_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_tag_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_tag_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_target_branch_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_target_branch_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_target_branch_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_target_branch_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_title_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_title_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_title_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_title_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_todo_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_todo_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_todo_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_todo_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_unassign_all_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_unassign_all_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_unassign_all_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_unassign_all_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_unassign_reviewer_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_unassign_reviewer_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_unassign_reviewer_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_unassign_reviewer_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_unassign_specific_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_unassign_specific_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_unassign_specific_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_unassign_specific_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_unlabel_all_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_unlabel_all_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_unlabel_all_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_unlabel_all_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_unlabel_specific_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_unlabel_specific_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_unlabel_specific_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_unlabel_specific_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_unlock_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_unlock_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_unlock_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_unlock_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_unsubscribe_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_unsubscribe_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_unsubscribe_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_unsubscribe_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_weight_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_weight_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_weight_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_weight_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_wip_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_wip_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_wip_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_wip_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_zoom_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_zoom_monthly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.i_quickactions_zoom_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.i_quickactions_zoom_weekly`** |
+| `product_section` | dev |
+| `product_stage` | plan |
+| `product_group` | `group::project management` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.quickactions_total_unique_counts_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.quickactions_total_unique_counts_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.quickactions.quickactions_total_unique_counts_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.quickactions.quickactions_total_unique_counts_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.search.i_search_advanced_monthly`
+
+Calculated unique users to perform Advanced searches by month
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.search.i_search_advanced_monthly`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::global search` |
+| `product_category` | `global_search` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+
+## `redis_hll_counters.search.i_search_advanced_weekly`
+
+Calculated unique users to perform Advanced searches by week
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.search.i_search_advanced_weekly`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::global search` |
+| `product_category` | `global_search` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+
+## `redis_hll_counters.search.i_search_paid_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.search.i_search_paid_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.search.i_search_paid_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.search.i_search_paid_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.search.i_search_total_monthly`
+
+Calculated unique users to perform Basic or Advanced searches by month
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.search.i_search_total_monthly`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::global search` |
+| `product_category` | `global_search` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+
+## `redis_hll_counters.search.i_search_total_weekly`
+
+Calculated unique users to perform Basic or Advanced searches by week
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.search.i_search_total_weekly`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::global search` |
+| `product_category` | `global_search` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee, ce |
+| `tier` | free, premium, ultimate |
+
+## `redis_hll_counters.search.search_total_unique_counts_monthly`
+
+Calculated unique users to perform Basic or Advanced searches by month
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.search.search_total_unique_counts_monthly`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::global search` |
+| `product_category` | `global_search` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+
+## `redis_hll_counters.search.search_total_unique_counts_weekly`
+
+Calculated unique users to perform Basic or Advanced searches by week
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.search.search_total_unique_counts_weekly`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::global search` |
+| `product_category` | `global_search` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee, ce |
+| `tier` | free, premium, ultimate |
+
+## `redis_hll_counters.snippets.i_snippets_show_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.snippets.i_snippets_show_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.snippets.i_snippets_show_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.snippets.i_snippets_show_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.source_code.design_action_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.source_code.design_action_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.source_code.design_action_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.source_code.design_action_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.source_code.git_write_action_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.source_code.git_write_action_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.source_code.git_write_action_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.source_code.git_write_action_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.source_code.i_source_code_code_intelligence_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.source_code.i_source_code_code_intelligence_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.source_code.i_source_code_code_intelligence_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.source_code.i_source_code_code_intelligence_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.source_code.merge_request_action_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.source_code.merge_request_action_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.source_code.merge_request_action_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.source_code.merge_request_action_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.source_code.project_action_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.source_code.project_action_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.source_code.project_action_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.source_code.project_action_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.source_code.wiki_action_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.source_code.wiki_action_monthly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.source_code.wiki_action_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.source_code.wiki_action_weekly`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.terraform.p_terraform_state_api_unique_users_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.terraform.p_terraform_state_api_unique_users_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.terraform.p_terraform_state_api_unique_users_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.terraform.p_terraform_state_api_unique_users_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.i_testing_full_code_quality_report_total_monthly`
+
+Count of unique users per week|month who visit the full code quality report
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.i_testing_full_code_quality_report_total_monthly`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::testing` |
+| `product_category` | `code_quality` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.i_testing_full_code_quality_report_total_weekly`
+
+Count of unique users per week|month who visit the full code quality report
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.i_testing_full_code_quality_report_total_weekly`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::testing` |
+| `product_category` | `code_quality` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.i_testing_group_code_coverage_project_click_total_monthly`
+
+Count of unique users per week|month who click on a project link in the group code coverage table
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.i_testing_group_code_coverage_project_click_total_monthly`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::testing` |
+| `product_category` | `code_analytics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.i_testing_group_code_coverage_project_click_total_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.i_testing_group_code_coverage_project_click_total_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.i_testing_group_code_coverage_visit_total_monthly`
+
+Count of unique users per week|month who visited the group code coverage page
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.i_testing_group_code_coverage_visit_total_monthly`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::testing` |
+| `product_category` | `code_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.i_testing_group_code_coverage_visit_total_weekly`
+
+Count of unique users per week|month who visited the group code coverage page
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.i_testing_group_code_coverage_visit_total_weekly`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::testing` |
+| `product_category` | `code_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.i_testing_load_performance_widget_total_monthly`
+
+Count of unique users per week|month who expanded the load performance report MR widget
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.i_testing_load_performance_widget_total_monthly`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::testing` |
+| `product_category` | `load_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.i_testing_load_performance_widget_total_weekly`
+
+Count of unique users per week|month who expanded the load performance report MR widget
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.i_testing_load_performance_widget_total_weekly`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::testing` |
+| `product_category` | `load_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.i_testing_metrics_report_artifact_uploaders_monthly`
+
+Internal Tracking to count number of unit tests parsed for planning of future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.i_testing_metrics_report_artifact_uploaders_monthly`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::testing` |
+| `product_category` | `code_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.i_testing_metrics_report_artifact_uploaders_weekly`
+
+Internal Tracking to count number of unit tests parsed for planning of future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.i_testing_metrics_report_artifact_uploaders_weekly`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::testing` |
+| `product_category` | `code_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee, ce |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.i_testing_metrics_report_widget_total_monthly`
+
+Count of unique users per week|month who expanded the metrics report MR widget
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.i_testing_metrics_report_widget_total_monthly`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::testing` |
+| `product_category` | `code_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.i_testing_metrics_report_widget_total_weekly`
+
+Count of unique users per week|month who expanded the metrics report MR widget
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.i_testing_metrics_report_widget_total_weekly`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::testing` |
+| `product_category` | `code_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.i_testing_test_case_parsed_monthly`
+
+Internal Tracking to count number of unit tests parsed for planning of future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.i_testing_test_case_parsed_monthly`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::testing` |
+| `product_category` | `code_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.i_testing_test_case_parsed_weekly`
+
+Internal Tracking to count number of unit tests parsed for planning of future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.i_testing_test_case_parsed_weekly`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::testing` |
+| `product_category` | `code_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee, ce |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.i_testing_web_performance_widget_total_monthly`
+
+Count of unique users per week|month who expanded the browser performance report MR widget
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.i_testing_web_performance_widget_total_monthly`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::testing` |
+| `product_category` | `web_performance` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.i_testing_web_performance_widget_total_weekly`
+
+Count of unique users per week|month who expanded the browser performance report MR widget
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.i_testing_web_performance_widget_total_weekly`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::testing` |
+| `product_category` | `web_performance` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.testing_total_unique_counts_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.testing_total_unique_counts_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.testing.testing_total_unique_counts_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.testing.testing_total_unique_counts_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_composer_user_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_composer_user_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_composer_user_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_composer_user_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_conan_user_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_conan_user_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_conan_user_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_conan_user_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_container_user_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_container_user_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_container_user_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_container_user_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_debian_user_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_debian_user_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_debian_user_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_debian_user_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_generic_user_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_generic_user_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_generic_user_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_generic_user_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_golang_user_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_golang_user_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_golang_user_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_golang_user_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_maven_user_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_maven_user_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_maven_user_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_maven_user_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_npm_user_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_npm_user_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_npm_user_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_npm_user_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_nuget_user_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_nuget_user_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_nuget_user_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_nuget_user_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_pypi_user_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_pypi_user_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_pypi_user_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_pypi_user_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_tag_user_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_tag_user_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.i_package_tag_user_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.i_package_tag_user_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.user_packages_total_unique_counts_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.user_packages_total_unique_counts_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | Redis_hll |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `redis_hll_counters.user_packages.user_packages_total_unique_counts_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`redis_hll_counters.user_packages.user_packages_total_unique_counts_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
## `reply_by_email_enabled`
Whether incoming email is setup
@@ -819,15 +20609,126 @@ Whether incoming email is setup
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `search_unique_visits.i_search_advanced`
+
+Calculated unique users to perform Advanced searches by week
+
+| field | value |
+| --- | --- |
+| `key_path` | **`search_unique_visits.i_search_advanced`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::global search` |
+| `product_category` | `global_search` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Redis_hll |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+
+## `search_unique_visits.i_search_paid`
+
+Calculated unique users to perform a search with a paid license enabled by week
+
+| field | value |
+| --- | --- |
+| `key_path` | **`search_unique_visits.i_search_paid`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::global search` |
+| `product_category` | `global_search` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Redis_hll |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+
+## `search_unique_visits.i_search_total`
+
+Calculated unique users to perform Basic or Advanced searches by week
+
+| field | value |
+| --- | --- |
+| `key_path` | **`search_unique_visits.i_search_total`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::global search` |
+| `product_category` | `global_search` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Redis_hll |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+
+## `search_unique_visits.search_unique_visits_for_any_target_monthly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`search_unique_visits.search_unique_visits_for_any_target_monthly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `search_unique_visits.search_unique_visits_for_any_target_weekly`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`search_unique_visits.search_unique_visits_for_any_target_weekly`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 7d |
+| `data_source` | |
+| `distribution` | ee |
| `tier` | |
| `skip_validation` | true |
+## `settings.ldap_encrypted_secrets_enabled`
+
+Is encrypted LDAP secrets configured?
+
+| field | value |
+| --- | --- |
+| `key_path` | **`settings.ldap_encrypted_secrets_enabled`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::distribution` |
+| `product_category` | `global_search` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
## `signup_enabled`
Whether public signup is enabled
@@ -838,15 +20739,6076 @@ Whether public signup is enabled
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `topology.duration_s`
+
+Time it took to collect topology data
+
+| field | value |
+| --- | --- |
+| `key_path` | **`topology.duration_s`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Prometheus |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `topology.failures`
+
+Contains information about failed queries
+
+| field | value |
+| --- | --- |
+| `key_path` | **`topology.failures`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::memory` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | Prometheus |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.clusters_applications_cert_managers`
+
+Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.clusters_applications_cert_managers`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.clusters_applications_helm`
+
+Total GitLab Managed clusters with GitLab Managed App:Helm enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.clusters_applications_helm`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.clusters_applications_ingress`
+
+Total GitLab Managed clusters with GitLab Managed App:Ingress installed
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.clusters_applications_ingress`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.clusters_applications_knative`
+
+Total GitLab Managed clusters with GitLab Managed App:Knative installed
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.clusters_applications_knative`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.clusters_disabled`
+
+Total GitLab Managed disabled clusters
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.clusters_disabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.clusters_enabled`
+
+Total GitLab Managed clusters currently enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.clusters_enabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.clusters_management_project`
+
+Total GitLab Managed clusters with defined cluster management project
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.clusters_management_project`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.clusters_platforms_eks`
+
+Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.clusters_platforms_eks`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.clusters_platforms_gke`
+
+Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.clusters_platforms_gke`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.clusters_platforms_user`
+
+Total GitLab Managed clusters that are user provisioned
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.clusters_platforms_user`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.group_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to groups
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.group_clusters_disabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.group_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to groups
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.group_clusters_enabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.instance_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to the instance
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.instance_clusters_disabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.instance_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to the instance
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.instance_clusters_enabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.project_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to projects
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.project_clusters_disabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.project_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to projects
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.project_clusters_enabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.projects_slack_notifications_active`
+
+Unique projects with Slack webhook enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.projects_slack_notifications_active`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `chatops` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.projects_slack_slash_active`
+
+Unique projects with Slack ‘/’ commands enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.projects_slack_slash_active`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `chatops` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.configure.projects_with_prometheus_alerts`
+
+Projects with Prometheus alerting enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.configure.projects_with_prometheus_alerts`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.approval_project_rules`
+
+Number of project approval rules
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.approval_project_rules`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.approval_project_rules_with_exact_required_approvers`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.approval_project_rules_with_exact_required_approvers`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.approval_project_rules_with_less_approvers_than_required`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.approval_project_rules_with_less_approvers_than_required`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.approval_project_rules_with_more_approvers_than_required`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.approval_project_rules_with_more_approvers_than_required`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.approval_project_rules_with_target_branch`
+
+Number of project approval rules with not default target branch
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.approval_project_rules_with_target_branch`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.deploy_keys`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.deploy_keys`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.keys`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.keys`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.merge_requests`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.merge_requests`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.merge_requests_with_added_rules`
+
+Merge Requests with added rules
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.merge_requests_with_added_rules`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.merge_requests_with_optional_codeowners`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.merge_requests_with_optional_codeowners`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.merge_requests_with_overridden_project_rules`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.merge_requests_with_overridden_project_rules`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.merge_requests_with_required_codeowners`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.merge_requests_with_required_codeowners`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.projects_enforcing_code_owner_approval`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.projects_enforcing_code_owner_approval`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.projects_imported_from_github`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.projects_imported_from_github`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.projects_with_disable_overriding_approvers_per_merge_request`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.projects_with_disable_overriding_approvers_per_merge_request`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.projects_with_repositories_enabled`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.projects_with_repositories_enabled`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.projects_with_sectional_code_owner_rules`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.projects_with_sectional_code_owner_rules`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.projects_without_disable_overriding_approvers_per_merge_request`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.projects_without_disable_overriding_approvers_per_merge_request`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.protected_branches`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.protected_branches`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.remote_mirrors`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.remote_mirrors`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.snippets`
+
+Snippets
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.snippets`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `snippets` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.suggestions`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.suggestions`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.total_number_of_locked_files`
+
+The total number of exclusive file locks (through the CLI)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.total_number_of_locked_files`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.total_number_of_path_locks`
+
+The total number of default branch locks done through the GitLab UI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.total_number_of_path_locks`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.users_using_lfs_locks`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.users_using_lfs_locks`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.create.users_using_path_locks`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.create.users_using_path_locks`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.bulk_imports.gitlab`
+
+Distinct count of users that triggered an import using the Group Migration tool
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.bulk_imports.gitlab`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.bulk_imports.gitlab_v1`
+
+Count of imports using GitLab Migration
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.bulk_imports.gitlab_v1`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.events`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.events`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.group_imports.gitlab_migration`
+
+Count of groups imported using GitLab Migration
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.group_imports.gitlab_migration`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.group_imports.group_import`
+
+Count of group imports using Group Import/Export
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.group_imports.group_import`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.group_saml_enabled`
+
+Has the instance enabled Group SAML SSO `https://docs.gitlab.com/ee/user/group/saml_sso/` on at least 1 group?
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.group_saml_enabled`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | premium |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.groups`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.groups`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.groups_imported`
+
+Distinct count of users that imported groups using Group Import
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.groups_imported`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.issue_imports.csv`
+
+Count of (attempted) imports from csv files
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.issue_imports.csv`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.issue_imports.fogbugz`
+
+Count of projects imported from fogbugz
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.issue_imports.fogbugz`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.issue_imports.jira`
+
+Count of projects imported from Jira
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.issue_imports.jira`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.issue_imports.phabricator`
+
+Count of projects imported from phabricator
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.issue_imports.phabricator`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.issues_imported.csv`
+
+Distinct count of users that imported issues into projects using CSV upload
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.issues_imported.csv`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.issues_imported.fogbugz`
+
+Distinct count of users that imported issues into projects using FogBugz
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.issues_imported.fogbugz`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.issues_imported.jira`
+
+Distinct count of users that imported issues into projects using Jira
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.issues_imported.jira`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.issues_imported.phabricator`
+
+Distinct count of users that imported issues into projects using Phabricator
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.issues_imported.phabricator`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.ldap_admin_sync_enabled`
+
+Has the instance configured LDAP Admin Sync `https://docs.gitlab.com/ee/administration/auth/ldap/#administrator-sync-starter-only`?
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.ldap_admin_sync_enabled`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.ldap_group_sync_enabled`
+
+Has the instance configured LDAP Group Sync `https://docs.gitlab.com/ee/administration/auth/ldap/#group-sync-starter-only`?
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.ldap_group_sync_enabled`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.ldap_keys`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.ldap_keys`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.ldap_servers`
+
+Number of LDAP servers configured for the instance `https://docs.gitlab.com/ee/administration/auth/ldap/#multiple-ldap-servers-starter-only`
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.ldap_servers`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.ldap_users`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.ldap_users`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.omniauth_providers`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.omniauth_providers`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.project_imports.bitbucket`
+
+Count of projects imported from Bitbucket
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.project_imports.bitbucket`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.project_imports.bitbucket_server`
+
+Count of projects imported from Bitbucket Server
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.project_imports.bitbucket_server`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.project_imports.git`
+
+Count of projects imported by URL
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.project_imports.git`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.project_imports.gitea`
+
+Count of projects imported from Gitea
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.project_imports.gitea`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.project_imports.github`
+
+Count of projects imported from GitHub
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.project_imports.github`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.project_imports.gitlab`
+
+Count of projects imported from GitLab.com
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.project_imports.gitlab`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.project_imports.gitlab_migration`
+
+Count of projects imported using GitLab Migration
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.project_imports.gitlab_migration`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.project_imports.gitlab_project`
+
+Count of projects imported using Project Import/Export
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.project_imports.gitlab_project`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.project_imports.manifest`
+
+Count of projects imported using manifst file
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.project_imports.manifest`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.projects_imported.bitbucket`
+
+Distinct count of users that imported projects from Bitbucket Cloud
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.projects_imported.bitbucket`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.projects_imported.bitbucket_server`
+
+Distinct count of users that imported projects from Bitbucket Server
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.projects_imported.bitbucket_server`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.projects_imported.git`
+
+Distinct count of users that imported projects using Import by URL
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.projects_imported.git`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.projects_imported.gitea`
+
+Distinct count of users that imported projects from Gitea
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.projects_imported.gitea`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.projects_imported.github`
+
+Distinct count of users that imported projects from GitHub
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.projects_imported.github`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.projects_imported.gitlab`
+
+Distinct count of users that imported projects from GitLab.com
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.projects_imported.gitlab`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.projects_imported.gitlab_project`
+
+Distinct count of users that imported projects using Project Import/Export
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.projects_imported.gitlab_project`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.projects_imported.manifest`
+
+Distinct count of users that imported projects using Manifest file
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.projects_imported.manifest`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.projects_imported.total`
+
+Total count of all projects imported with import_source NOT NULL
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.projects_imported.total`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.projects_with_compliance_framework`
+
+Number of projects labeled with a compliance framework label [see](https://gitlab.com/gitlab-org/gitlab/-/issues/118671)
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.projects_with_compliance_framework`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.unique_users_all_imports`
+
+Distinct count of users that triggered any kind of import
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.unique_users_all_imports`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.user_auth_by_provider.google_oauth2`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.user_auth_by_provider.google_oauth2`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.user_auth_by_provider.standard`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.user_auth_by_provider.standard`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.user_auth_by_provider.two-factor`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.user_auth_by_provider.two-factor`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.user_auth_by_provider.two-factor-via-u2f-device`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.user_auth_by_provider.two-factor-via-u2f-device`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.user_auth_by_provider.two-factor-via-webauthn-device`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.user_auth_by_provider.two-factor-via-webauthn-device`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.users_created`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.users_created`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.manage.value_stream_management_customized_group_stages`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.manage.value_stream_management_customized_group_stages`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.monitor.clusters`
+
+Total GitLab Managed clusters both enabled and disabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.monitor.clusters`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | `metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.monitor.clusters_applications_prometheus`
+
+Total GitLab Managed clusters with Prometheus enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.monitor.clusters_applications_prometheus`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | `metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.monitor.operations_dashboard_default_dashboard`
+
+Active users with enabled operations dashboard
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.monitor.operations_dashboard_default_dashboard`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.monitor.operations_dashboard_users_with_projects_added`
+
+Active users with projects on operations dashboard
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.monitor.operations_dashboard_users_with_projects_added`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.monitor.projects_incident_sla_enabled`
+
+Projects where Incident SLA is enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.monitor.projects_incident_sla_enabled`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `error_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.monitor.projects_with_alert_incidents`
+
+Count of unique projects with an incident from an alert
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.monitor.projects_with_alert_incidents`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.monitor.projects_with_error_tracking_enabled`
+
+Projects where error tracking is enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.monitor.projects_with_error_tracking_enabled`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `error_tracking` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.monitor.projects_with_incidents`
+
+Count of unique projects with an incident
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.monitor.projects_with_incidents`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.monitor.projects_with_tracing_enabled`
+
+Projects with tracing enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.monitor.projects_with_tracing_enabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | `tracing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.package.projects_with_packages`
+
+Projects with package registry configured
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.package.projects_with_packages`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.plan.assignee_lists`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.plan.assignee_lists`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.plan.epics`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.plan.epics`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.plan.issues`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.plan.issues`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.plan.label_lists`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.plan.label_lists`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.plan.milestone_lists`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.plan.milestone_lists`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.plan.notes`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.plan.notes`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.plan.projects`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.plan.projects`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.plan.projects_jira_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.plan.projects_jira_active`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.plan.projects_jira_dvcs_cloud_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.plan.projects_jira_dvcs_cloud_active`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.plan.projects_jira_dvcs_server_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.plan.projects_jira_dvcs_server_active`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.plan.service_desk_enabled_projects`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.plan.service_desk_enabled_projects`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.plan.service_desk_issues`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.plan.service_desk_issues`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.plan.todos`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.plan.todos`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.release.deployments`
+
+Unique users triggering deployments
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.release.deployments`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.release.failed_deployments`
+
+Total failed deployments
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.release.failed_deployments`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.release.projects_mirrored_with_pipelines_enabled`
+
+Projects with repository mirroring enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.release.projects_mirrored_with_pipelines_enabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.release.releases`
+
+Unique users creating release tags
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.release.releases`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.release.successful_deployments`
+
+Total successful deployments
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.release.successful_deployments`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.api_fuzzing_scans`
+
+Counts API fuzzing jobs
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.api_fuzzing_scans`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::fuzz testing` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.container_scanning_scans`
+
+Counts container scanning jobs
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.container_scanning_scans`** |
+| `product_section` | sec |
+| `product_stage` | protect |
+| `product_group` | `group::container security` |
+| `product_category` | `container_scanning` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.coverage_fuzzing_scans`
+
+Counts fuzzing jobs
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.coverage_fuzzing_scans`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::fuzz testing` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.dast_scans`
+
+Counts dast jobs
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.dast_scans`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::static analysis` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.dependency_scanning_scans`
+
+Counts dependency scanning jobs
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.dependency_scanning_scans`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::composition analysis` |
+| `product_category` | `dependency_scanning` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.sast_scans`
+
+Counts sast jobs
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.sast_scans`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::static analysis` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.secret_detection_scans`
+
+Counts secret detection jobs
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.secret_detection_scans`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::static analysis` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.user_api_fuzzing_dnd_jobs`
+
+Count of API Fuzzing `docker-in-docker` jobs by job name
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.user_api_fuzzing_dnd_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::fuzz testing` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.user_api_fuzzing_jobs`
+
+Count of API Fuzzing jobs by job name
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.user_api_fuzzing_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::fuzz testing` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.user_container_scanning_jobs`
+
+no idea, Count of Container Scanning jobs run, it implies user but AFAIK we don't track per user
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.user_container_scanning_jobs`** |
+| `product_section` | sec |
+| `product_stage` | protect |
+| `product_group` | `group::container security` |
+| `product_category` | `container_scanning` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.user_coverage_fuzzing_jobs`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.user_coverage_fuzzing_jobs`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.user_dast_jobs`
+
+Count of DAST jobs
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.user_dast_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::dynamic analysis` |
+| `product_category` | `dynamic_application_security_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.user_dependency_scanning_jobs`
+
+no idea, Count of Dependency Scanning jobs run, it implies user but AFAIK we don't track per user
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.user_dependency_scanning_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::composition analysis` |
+| `product_category` | `dependency_scanning` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.user_license_management_jobs`
+
+no idea, Count of License Scanning jobs run, it implies user but AFAIK we don't track per user
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.user_license_management_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::composition analysis` |
+| `product_category` | `license_compliance` |
+| `value_type` | string |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.user_preferences_group_overview_security_dashboard`
+
+Users who set personal preference to see Details on Group overview page
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.user_preferences_group_overview_security_dashboard`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::threat insights` |
+| `product_category` | `vulnerability_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.user_sast_jobs`
+
+Count of SAST jobs
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.user_sast_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::static analysis` |
+| `product_category` | `static_application_security_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.user_secret_detection_jobs`
+
+Count of Secret Detection Jobs
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.user_secret_detection_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::static analysis` |
+| `product_category` | `secret_detection` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.secure.user_unique_users_all_secure_scanners`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.secure.user_unique_users_all_secure_scanners`** |
+| `product_section` | sec |
+| `product_stage` | |
+| `product_group` | `group::secure` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.verify.ci_builds`
+
+Unique builds in project
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.verify.ci_builds`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.verify.ci_external_pipelines`
+
+Total pipelines in external repositories
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.verify.ci_external_pipelines`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.verify.ci_internal_pipelines`
+
+Total pipelines in GitLab repositories
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.verify.ci_internal_pipelines`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.verify.ci_pipeline_config_auto_devops`
+
+Total pipelines from an Auto DevOps template
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.verify.ci_pipeline_config_auto_devops`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.verify.ci_pipeline_config_repository`
+
+Total Pipelines from templates in repository
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.verify.ci_pipeline_config_repository`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.verify.ci_pipeline_schedules`
+
+Pipeline schedules in GitLab
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.verify.ci_pipeline_schedules`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.verify.ci_pipelines`
+
+Distinct Users triggering Total pipelines
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.verify.ci_pipelines`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.verify.ci_triggers`
+
+Total configured Triggers in project
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.verify.ci_triggers`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.verify.clusters_applications_runner`
+
+Total GitLab Managed clusters with Runner enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.verify.clusters_applications_runner`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::runner` |
+| `product_category` | `runner` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage.verify.projects_reporting_ci_cd_back_to_github`
+
+Projects with a GitHub service pipeline enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage.verify.projects_reporting_ci_cd_back_to_github`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | all |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.clusters_applications_cert_managers`
+
+Total GitLab Managed clusters with Cert Manager enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.clusters_applications_cert_managers`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.clusters_applications_helm`
+
+Total GitLab Managed clusters with Helm enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.clusters_applications_helm`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.clusters_applications_ingress`
+
+Total GitLab Managed clusters with Ingress enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.clusters_applications_ingress`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.clusters_applications_knative`
+
+Total GitLab Managed clusters with Knative enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.clusters_applications_knative`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.clusters_disabled`
+
+Total GitLab Managed disabled clusters
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.clusters_disabled`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.clusters_enabled`
+
+Total GitLab Managed clusters currently enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.clusters_enabled`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.clusters_management_project`
+
+Total GitLab Managed clusters with defined cluster management project
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.clusters_management_project`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.clusters_platforms_eks`
+
+Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.clusters_platforms_eks`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.clusters_platforms_gke`
+
+Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.clusters_platforms_gke`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.clusters_platforms_user`
+
+Total GitLab Managed clusters that are user provisioned
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.clusters_platforms_user`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.group_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to groups
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.group_clusters_disabled`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.group_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to groups
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.group_clusters_enabled`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.instance_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to the instance
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.instance_clusters_disabled`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.instance_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to the instance
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.instance_clusters_enabled`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.project_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to projects
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.project_clusters_disabled`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.project_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to projects
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.project_clusters_enabled`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `kubernetes_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.projects_slack_notifications_active`
+
+Unique projects with Slack webhook enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.projects_slack_notifications_active`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `chatops` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.projects_slack_slash_active`
+
+Unique projects with Slack ‘/’ commands enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.projects_slack_slash_active`** |
+| `product_section` | ops |
+| `product_stage` | configure |
+| `product_group` | `group::configure` |
+| `product_category` | `chatops` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.configure.projects_with_prometheus_alerts`
+
+Projects with Prometheus alerting enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.configure.projects_with_prometheus_alerts`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | `metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.action_monthly_active_users_design_management`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.action_monthly_active_users_design_management`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::knowledge` |
+| `product_category` | `design_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.action_monthly_active_users_git_write`
+
+Aggregated value for wiki, design and project repo actions
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.action_monthly_active_users_git_write`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.action_monthly_active_users_ide_edit`
+
+Count unique edit actions when users used an IDE, no matter which one
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.action_monthly_active_users_ide_edit`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `web_ide` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.action_monthly_active_users_project_repo`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.action_monthly_active_users_project_repo`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.action_monthly_active_users_sfe_edit`
+
+Count unique edit actions using the single file editor
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.action_monthly_active_users_sfe_edit`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `web_ide` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.action_monthly_active_users_snippet_editor_edit`
+
+Count unique edit actions using the snippet editor
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.action_monthly_active_users_snippet_editor_edit`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `web_ide` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.action_monthly_active_users_sse_edit`
+
+Count unique edit actions using the static site editor
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.action_monthly_active_users_sse_edit`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `web_ide` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.action_monthly_active_users_web_ide_edit`
+
+Count unique edit actions using the web IDE
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.action_monthly_active_users_web_ide_edit`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `web_ide` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.action_monthly_active_users_wiki_repo`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.action_monthly_active_users_wiki_repo`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::knowledge` |
+| `product_category` | `wiki` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.approval_project_rules`
+
+Number of project approval rules
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.approval_project_rules`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.approval_project_rules_with_exact_required_approvers`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.approval_project_rules_with_exact_required_approvers`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.approval_project_rules_with_less_approvers_than_required`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.approval_project_rules_with_less_approvers_than_required`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.approval_project_rules_with_more_approvers_than_required`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.approval_project_rules_with_more_approvers_than_required`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.approval_project_rules_with_target_branch`
+
+Number of project approval rules with not default target branch
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.approval_project_rules_with_target_branch`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.deploy_keys`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.deploy_keys`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.keys`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.keys`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.merge_requests`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.merge_requests`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.merge_requests_users`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.merge_requests_users`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.merge_requests_with_added_rules`
+
+Merge Requests with added rules
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.merge_requests_with_added_rules`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.merge_requests_with_optional_codeowners`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.merge_requests_with_optional_codeowners`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.merge_requests_with_overridden_project_rules`
+
+Number of merge requests that have local rules that have overwritten a project rule
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.merge_requests_with_overridden_project_rules`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.merge_requests_with_required_codeowners`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.merge_requests_with_required_codeowners`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.projects_enforcing_code_owner_approval`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.projects_enforcing_code_owner_approval`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.projects_imported_from_github`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.projects_imported_from_github`** |
+| `product_section` | dev |
+| `product_stage` | manage |
+| `product_group` | `group::import` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.projects_with_disable_overriding_approvers_per_merge_request`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.projects_with_disable_overriding_approvers_per_merge_request`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.projects_with_repositories_enabled`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.projects_with_repositories_enabled`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.projects_with_sectional_code_owner_rules`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.projects_with_sectional_code_owner_rules`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.projects_without_disable_overriding_approvers_per_merge_request`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.projects_without_disable_overriding_approvers_per_merge_request`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.protected_branches`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.protected_branches`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.remote_mirrors`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.remote_mirrors`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.snippets`
+
+Monthly Snippets
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.snippets`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::editor` |
+| `product_category` | `snippets` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.suggestions`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.suggestions`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::code review` |
+| `product_category` | `code_review` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.total_number_of_locked_files`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.total_number_of_locked_files`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.total_number_of_path_locks`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.total_number_of_path_locks`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.users_using_lfs_locks`
+
+Number of users that have used default branch locks through the UI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.users_using_lfs_locks`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.create.users_using_path_locks`
+
+Number of users that have used exclusive file locks through the CLI
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.create.users_using_path_locks`** |
+| `product_section` | dev |
+| `product_stage` | create |
+| `product_group` | `group::source code` |
+| `product_category` | `source_code_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.bulk_imports.gitlab`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.bulk_imports.gitlab`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.bulk_imports.gitlab_v1`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.bulk_imports.gitlab_v1`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.events`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.events`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.group_imports.gitlab_migration`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.group_imports.gitlab_migration`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.group_imports.group_import`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.group_imports.group_import`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.group_saml_enabled`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.group_saml_enabled`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.groups`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.groups`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.groups_imported`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.groups_imported`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.issue_imports.csv`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.issue_imports.csv`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.issue_imports.fogbugz`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.issue_imports.fogbugz`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.issue_imports.jira`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.issue_imports.jira`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.issue_imports.phabricator`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.issue_imports.phabricator`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.issues_imported.csv`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.issues_imported.csv`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.issues_imported.fogbugz`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.issues_imported.fogbugz`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.issues_imported.jira`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.issues_imported.jira`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.issues_imported.phabricator`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.issues_imported.phabricator`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.ldap_admin_sync_enabled`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.ldap_admin_sync_enabled`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.ldap_group_sync_enabled`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.ldap_group_sync_enabled`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | boolean |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.ldap_keys`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.ldap_keys`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.ldap_servers`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.ldap_servers`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.ldap_users`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.ldap_users`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.omniauth_providers`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.omniauth_providers`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.project_imports.bitbucket`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.project_imports.bitbucket`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.project_imports.bitbucket_server`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.project_imports.bitbucket_server`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.project_imports.git`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.project_imports.git`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.project_imports.gitea`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.project_imports.gitea`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.project_imports.github`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.project_imports.github`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.project_imports.gitlab`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.project_imports.gitlab`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.project_imports.gitlab_migration`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.project_imports.gitlab_migration`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.project_imports.gitlab_project`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.project_imports.gitlab_project`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.project_imports.manifest`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.project_imports.manifest`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.projects_imported.bitbucket`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.projects_imported.bitbucket`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.projects_imported.bitbucket_server`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.projects_imported.bitbucket_server`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.projects_imported.git`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.projects_imported.git`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.projects_imported.gitea`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.projects_imported.gitea`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.projects_imported.github`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.projects_imported.github`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.projects_imported.gitlab`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.projects_imported.gitlab`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.projects_imported.gitlab_project`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.projects_imported.gitlab_project`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.projects_imported.manifest`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.projects_imported.manifest`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.projects_imported.total`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.projects_imported.total`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.projects_with_compliance_framework`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.projects_with_compliance_framework`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.unique_users_all_imports`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.unique_users_all_imports`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.user_auth_by_provider.google_oauth2`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.user_auth_by_provider.google_oauth2`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.user_auth_by_provider.standard`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.user_auth_by_provider.standard`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor-via-u2f-device`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor-via-u2f-device`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor-via-webauthn-device`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor-via-webauthn-device`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.users_created`
+
+Number of users created in the month
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.users_created`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.manage.value_stream_management_customized_group_stages`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.manage.value_stream_management_customized_group_stages`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::manage` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
| `tier` | |
| `skip_validation` | true |
+## `usage_activity_by_stage_monthly.monitor.clusters`
+
+Total GitLab Managed clusters both enabled and disabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.monitor.clusters`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | `metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.monitor.clusters_applications_prometheus`
+
+Total GitLab Managed clusters with Prometheus enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.monitor.clusters_applications_prometheus`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | `metrics` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.monitor.operations_dashboard_default_dashboard`
+
+Active users with enabled operations dashboard
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.monitor.operations_dashboard_default_dashboard`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.monitor.operations_dashboard_users_with_projects_added`
+
+Active users with projects on operations dashboard
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.monitor.operations_dashboard_users_with_projects_added`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.monitor.projects_incident_sla_enabled`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.monitor.projects_incident_sla_enabled`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.monitor.projects_with_alert_incidents`
+
+Count of unique projects with an incident from an alert created in the last month
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.monitor.projects_with_alert_incidents`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.monitor.projects_with_error_tracking_enabled`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.monitor.projects_with_error_tracking_enabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.monitor.projects_with_incidents`
+
+Count of unique projects with an incident created in the last month
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.monitor.projects_with_incidents`** |
+| `product_section` | ops |
+| `product_stage` | monitor |
+| `product_group` | `group::health` |
+| `product_category` | `incident_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.monitor.projects_with_tracing_enabled`
+
+Projects with tracing enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.monitor.projects_with_tracing_enabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::monitor` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.package.projects_with_packages`
+
+Incident confidential status changed event
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.package.projects_with_packages`** |
+| `product_section` | ops |
+| `product_stage` | package |
+| `product_group` | `group::package` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.plan.assignee_lists`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.plan.assignee_lists`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.plan.epics`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.plan.epics`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.plan.issues`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.plan.issues`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.plan.label_lists`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.plan.label_lists`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.plan.milestone_lists`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.plan.milestone_lists`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.plan.notes`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.plan.notes`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.plan.projects`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.plan.projects`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.plan.projects_jira_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.plan.projects_jira_active`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.plan.projects_jira_dvcs_cloud_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.plan.projects_jira_dvcs_cloud_active`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.plan.projects_jira_dvcs_server_active`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.plan.projects_jira_dvcs_server_active`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.plan.service_desk_enabled_projects`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.plan.service_desk_enabled_projects`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.plan.service_desk_issues`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.plan.service_desk_issues`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.plan.todos`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.plan.todos`** |
+| `product_section` | dev |
+| `product_stage` | |
+| `product_group` | `group::plan` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.release.deployments`
+
+Unique users triggering deployments
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.release.deployments`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.release.failed_deployments`
+
+Total failed deployments
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.release.failed_deployments`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.release.projects_mirrored_with_pipelines_enabled`
+
+Projects with repository mirroring enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.release.projects_mirrored_with_pipelines_enabled`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.release.releases`
+
+Unique users creating release tags
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.release.releases`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.release.successful_deployments`
+
+Total successful deployments
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.release.successful_deployments`** |
+| `product_section` | ops |
+| `product_stage` | |
+| `product_group` | `group::release` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.api_fuzzing_pipeline`
+
+Counts of Pipelines that have at least 1 API Fuzzing Testing job
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.api_fuzzing_pipeline`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::fuzz testing` |
+| `product_category` | `fuzz-testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.api_fuzzing_scans`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.api_fuzzing_scans`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.container_scanning_pipeline`
+
+no idea, what is this when did it get added? guess pipelines containing a CS job
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.container_scanning_pipeline`** |
+| `product_section` | sec |
+| `product_stage` | protect |
+| `product_group` | `group::container security` |
+| `product_category` | `container_scanning` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.container_scanning_scans`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.container_scanning_scans`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.coverage_fuzzing_pipeline`
+
+Counts of Pipelines that have at least 1 coverage-guided Fuzz Testing job
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.coverage_fuzzing_pipeline`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::fuzz testing` |
+| `product_category` | `fuzz-testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.coverage_fuzzing_scans`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.coverage_fuzzing_scans`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.dast_pipeline`
+
+Count of pipelines that have at least 1 DAST job
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.dast_pipeline`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::dynamic analysis` |
+| `product_category` | `dynamic_application_security_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.dast_scans`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.dast_scans`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.dependency_scanning_pipeline`
+
+no idea, what is this when did it get added? guess pipelines containing a DS job
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.dependency_scanning_pipeline`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::composition analysis` |
+| `product_category` | `dependency_scanning` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.dependency_scanning_scans`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.dependency_scanning_scans`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.sast_pipeline`
+
+Counts of Pipelines that have at least 1 SAST job
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.sast_pipeline`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::static analysis` |
+| `product_category` | `static_application_security_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.sast_scans`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.sast_scans`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.secret_detection_pipeline`
+
+Counts of Pipelines that have at least 1 Secret Detection job
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.secret_detection_pipeline`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::static analysis` |
+| `product_category` | `secret_detection` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.secret_detection_scans`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.secret_detection_scans`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.user_api_fuzzing_dnd_jobs`
+
+Count of API Fuzzing `docker-in-docker` jobs by job names
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.user_api_fuzzing_dnd_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::fuzz testing` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.user_api_fuzzing_jobs`
+
+Count of API Fuzzing jobs by job name
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.user_api_fuzzing_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::fuzz testing` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.user_container_scanning_jobs`
+
+no idea, Count of Container Scanning jobs run, it implies user and monthly, but AFAIK we don't track per user
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.user_container_scanning_jobs`** |
+| `product_section` | sec |
+| `product_stage` | protect |
+| `product_group` | `group::container security` |
+| `product_category` | `container_scanning` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.user_coverage_fuzzing_jobs`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.user_coverage_fuzzing_jobs`** |
+| `product_section` | |
+| `product_stage` | |
+| `product_group` | |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.user_dast_jobs`
+
+Users who run a DAST job
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.user_dast_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::dynamic analysis` |
+| `product_category` | `dynamic_application_security_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.user_dependency_scanning_jobs`
+
+no idea, Count of Dependency Scanning jobs run, it implies user and monthly, but AFAIK we don't track per user
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.user_dependency_scanning_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::composition analysis` |
+| `product_category` | `dependency_scanning` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.user_license_management_jobs`
+
+no idea, Count of License Scanning jobs run, it implies user and monthly, but AFAIK we don't track per user
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.user_license_management_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::composition analysis` |
+| `product_category` | `license_compliance` |
+| `value_type` | string |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.user_preferences_group_overview_security_dashboard`
+
+Users who set personal preference to see Security Dashboard on Group overview page
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.user_preferences_group_overview_security_dashboard`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::threat insights` |
+| `product_category` | `vulnerability_management` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.user_sast_jobs`
+
+Users who run a SAST job
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.user_sast_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::static analysis` |
+| `product_category` | `static_application_security_testing` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.user_secret_detection_jobs`
+
+Users who run a Secret Detection job
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.user_secret_detection_jobs`** |
+| `product_section` | sec |
+| `product_stage` | secure |
+| `product_group` | `group::static analysis` |
+| `product_category` | `secret_detection` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.secure.user_unique_users_all_secure_scanners`
+
+Missing description
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.secure.user_unique_users_all_secure_scanners`** |
+| `product_section` | sec |
+| `product_stage` | |
+| `product_group` | `group::secure` |
+| `product_category` | |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.verify.ci_builds`
+
+Unique builds in project
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.verify.ci_builds`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.verify.ci_external_pipelines`
+
+Total pipelines in external repositories
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.verify.ci_external_pipelines`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.verify.ci_internal_pipelines`
+
+Total pipelines in GitLab repositories
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.verify.ci_internal_pipelines`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.verify.ci_pipeline_config_auto_devops`
+
+Total pipelines from an Auto DevOps template
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.verify.ci_pipeline_config_auto_devops`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.verify.ci_pipeline_config_repository`
+
+Total Pipelines from templates in repository
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.verify.ci_pipeline_config_repository`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.verify.ci_pipeline_schedules`
+
+Pipeline schedules in GitLab
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.verify.ci_pipeline_schedules`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.verify.ci_pipelines`
+
+ Distinct users triggering pipelines in a month
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.verify.ci_pipelines`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.verify.ci_triggers`
+
+Total configured Triggers in project
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.verify.ci_triggers`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.verify.clusters_applications_runner`
+
+Total GitLab Managed clusters with Runner enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.verify.clusters_applications_runner`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::runner` |
+| `product_category` | `runner` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
+## `usage_activity_by_stage_monthly.verify.projects_reporting_ci_cd_back_to_github`
+
+Projects with a GitHub service pipeline enabled
+
+| field | value |
+| --- | --- |
+| `key_path` | **`usage_activity_by_stage_monthly.verify.projects_reporting_ci_cd_back_to_github`** |
+| `product_section` | ops |
+| `product_stage` | verify |
+| `product_group` | `group::continuous integration` |
+| `product_category` | `continuous_integration` |
+| `value_type` | number |
+| `status` | data_available |
+| `time_frame` | 28d |
+| `data_source` | |
+| `distribution` | ee |
+| `tier` | premium, ultimate |
+| `skip_validation` | true |
+
## `uuid`
GitLab instance unique identifier
@@ -857,7 +26819,7 @@ GitLab instance unique identifier
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | string |
| `status` | data_available |
| `milestone` | 9.1 |
@@ -867,6 +26829,25 @@ GitLab instance unique identifier
| `distribution` | ee, ce |
| `tier` | free, premium, ultimate |
+## `version`
+
+Version of GitLab instance
+
+| field | value |
+| --- | --- |
+| `key_path` | **`version`** |
+| `product_section` | enablement |
+| `product_stage` | enablement |
+| `product_group` | `group::distribution` |
+| `product_category` | `collection` |
+| `value_type` | string |
+| `status` | data_available |
+| `time_frame` | none |
+| `data_source` | |
+| `distribution` | ce, ee |
+| `tier` | free, premium, ultimate |
+| `skip_validation` | true |
+
## `web_ide_clientside_preview_enabled`
Whether web ide clientside preview is enabled
@@ -877,11 +26858,11 @@ Whether web ide clientside preview is enabled
| `product_section` | growth |
| `product_stage` | growth |
| `product_group` | `group::product intelligence` |
-| `product_category` | collection |
+| `product_category` | `collection` |
| `value_type` | boolean |
| `status` | data_available |
| `time_frame` | none |
| `data_source` | |
-| `distribution` | |
-| `tier` | |
+| `distribution` | ce |
+| `tier` | free |
| `skip_validation` | true |
diff --git a/doc/development/usage_ping/metrics_dictionary.md b/doc/development/usage_ping/metrics_dictionary.md
index 406a223b204..db40ce0af27 100644
--- a/doc/development/usage_ping/metrics_dictionary.md
+++ b/doc/development/usage_ping/metrics_dictionary.md
@@ -50,18 +50,19 @@ instance unique identifier.
```yaml
key_path: uuid
description: GitLab instance unique identifier
-value_type: string
product_category: collection
+product_section: growth
product_stage: growth
+product_group: group::product intelligence
+value_type: string
status: data_available
milestone: 9.1
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/1521
-product_group: group::product intelligence
time_frame: none
data_source: database
distribution:
-- ee
- ce
+- ee
tier:
- free
- premium
diff --git a/doc/development/wikis.md b/doc/development/wikis.md
index 7995afb1e17..f47c87137ae 100644
--- a/doc/development/wikis.md
+++ b/doc/development/wikis.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
description: "GitLab's development guidelines for Wikis"
---
-# Wikis development guide
+# Wikis development guide **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227027) in GitLab 13.5.
diff --git a/doc/gitlab-basics/index.md b/doc/gitlab-basics/index.md
index 8052fd27bb3..001806c0a59 100644
--- a/doc/gitlab-basics/index.md
+++ b/doc/gitlab-basics/index.md
@@ -23,7 +23,7 @@ The following are guides to basic GitLab functionality:
- [Create and add your SSH public key](../ssh/README.md), for enabling Git over SSH.
- [Create a project](../user/project/working_with_projects.md#create-a-project), to start using GitLab.
-- [Create a group](../user/group/index.md#create-a-new-group), to combine and administer
+- [Create a group](../user/group/index.md#create-a-group), to combine and administer
projects together.
- [Create a branch](create-branch.md), to make changes to files stored in a project's repository.
- [Feature branch workflow](feature_branch_workflow.md).
diff --git a/doc/install/index.md b/doc/install/index.md
index 948365ce548..d7c562ac77b 100644
--- a/doc/install/index.md
+++ b/doc/install/index.md
@@ -52,11 +52,11 @@ GitLab as described in our [reference architecture documentation](../administrat
[**> Install GitLab using the Omnibus GitLab package.**](https://about.gitlab.com/install/)
-### GitLab Environment Toolkit (alpha)
+### GitLab Environment Toolkit (GET)
-The [GitLab Environment Toolkit](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit) provides a set of automation tools to easily deploy a [reference architecture](../administration/reference_architectures/index.md) on most major cloud providers.
+The [GitLab Environment Toolkit](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit) (GET) provides a set of automation tools to easily deploy a [reference architecture](../administration/reference_architectures/index.md) on most major cloud providers.
-It is currently in alpha, and is not recommended for production use.
+It is currently in beta, and is not yet recommended for production use.
[**> Install a GitLab reference architecture using the GitLab Environment Toolkit.**](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit#documentation)
diff --git a/doc/integration/README.md b/doc/integration/README.md
index 7d38dd6222a..9ae75019efb 100644
--- a/doc/integration/README.md
+++ b/doc/integration/README.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
comments: false
---
-# GitLab integrations
+# GitLab integrations **(FREE)**
GitLab can be integrated with external services for enhanced functionality.
diff --git a/doc/integration/akismet.md b/doc/integration/akismet.md
index a2720c82fe7..d2e20b225cc 100644
--- a/doc/integration/akismet.md
+++ b/doc/integration/akismet.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Akismet
+# Akismet **(FREE)**
GitLab leverages [Akismet](https://akismet.com/) to protect against spam.
GitLab uses Akismet to prevent the creation of spam issues on public projects. Issues
diff --git a/doc/integration/auth0.md b/doc/integration/auth0.md
index 7e531682faf..ecf54613ec6 100644
--- a/doc/integration/auth0.md
+++ b/doc/integration/auth0.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Auth0 OmniAuth Provider
+# Auth0 OmniAuth Provider **(FREE)**
To enable the Auth0 OmniAuth provider, you must create an Auth0 account, and an
application.
diff --git a/doc/integration/azure.md b/doc/integration/azure.md
index c83ef650f54..61a8290e664 100644
--- a/doc/integration/azure.md
+++ b/doc/integration/azure.md
@@ -4,11 +4,12 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Microsoft Azure OAuth2 OmniAuth Provider
+# Microsoft Azure OAuth2 OmniAuth Provider **(FREE)**
NOTE:
Per Microsoft, this provider uses the [older Azure Active Directory v1.0 endpoint](https://docs.microsoft.com/en-us/azure/active-directory/azuread-dev/v1-protocols-oauth-code).
Microsoft documentation suggests that you should use the [OpenID Connect protocol to use the v2 endpoints](../administration/auth/oidc.md#microsoft-azure) for new projects.
+To use v2 endpoints via OmniAuth, please follow [Microsoft Azure OAuth2 OmniAuth Provider v2 instructions](#microsoft-azure-oauth2-omniauth-provider-v2).
To enable the Microsoft Azure OAuth2 OmniAuth provider, you must register your application with Azure. Azure generates a client ID and secret key for you to use.
@@ -94,3 +95,106 @@ sign in and authorize the GitLab application. If successful, you are returned to
Read [Enable OmniAuth for an Existing User](omniauth.md#enable-omniauth-for-an-existing-user)
for information on how existing GitLab users can connect to their newly-available Azure AD accounts.
+
+## Microsoft Azure OAuth2 OmniAuth Provider v2
+
+In order to use v2 endpoints provided by Microsoft Azure Active Directory you must to configure it via Azure OAuth2 OmniAuth Provider v2.
+
+### Registering an Azure application
+
+To enable the Microsoft Azure OAuth2 OmniAuth provider, you must register your application with Azure. Azure generates a client ID and secret key for you to use.
+
+Sign in to the [Azure Portal](https://portal.azure.com), and follow the instructions in
+the [Microsoft Quickstart documentation](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app).
+
+As you go through the Microsoft procedure, keep the following in mind:
+
+- If you have multiple instances of Azure Active Directory, you can switch to the desired tenant.
+- You're setting up a Web application.
+- The redirect URI requires the URL of the Azure OAuth callback of your GitLab
+ installation. For example, `https://gitlab.example.com/users/auth/azure_activedirectory_v2/callback`.
+ The type dropdown should be set to **Web**.
+- The `client ID` and `client secret` are terms associated with OAuth 2. In some Microsoft documentation,
+ the terms may be listed as `Application ID` and `Application Secret`.
+- If you need to generate a new client secret, follow the Microsoft documentation
+ for [creating a new application secret](https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal#create-a-new-application-secret).
+- Save the client ID and client secret for your new app, as the client secret is only
+ displayed one time.
+
+### Adding API permissions (scopes)
+
+Once you have created an application, follow the [Microsoft Quickstart documentation to expose a web API](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-configure-app-expose-web-apis). Be sure to add the following delegated permissions under the Microsoft Graph API:
+
+- `email`
+- `openid`
+- `profile`
+
+### Configuring GitLab
+
+1. On your GitLab server, open the configuration file.
+
+ For Omnibus GitLab:
+
+ ```shell
+ sudo editor /etc/gitlab/gitlab.rb
+ ```
+
+ For installations from source:
+
+ ```shell
+ cd /home/git/gitlab
+
+ sudo -u git -H editor config/gitlab.yml
+ ```
+
+1. Refer to [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration)
+ for initial settings.
+
+1. Add the provider configuration:
+
+ For Omnibus GitLab:
+
+ ```ruby
+ gitlab_rails['omniauth_providers'] = [
+ {
+ "name" => "azure_activedirectory_v2",
+ "args" => {
+ "client_id" => "CLIENT ID",
+ "client_secret" => "CLIENT SECRET",
+ "tenant_id" => "TENANT ID",
+ }
+ }
+ ]
+ ```
+
+ For installations from source:
+
+ ```yaml
+ - { name: 'azure_activedirectory_v2',
+ args: { client_id: "CLIENT ID",
+ client_secret: "CLIENT SECRET",
+ tenant_id: "TENANT ID" } }
+ ```
+
+ The `base_azure_url` is optional and can be added for different locales;
+ such as `base_azure_url: "https://login.microsoftonline.de"`.
+
+ The `scope` parameter is optional and can be added to `args`. Default `scope` is: `openid profile email`.
+
+1. Replace `CLIENT ID`, `CLIENT SECRET`, and `TENANT ID` with the values you got above.
+
+1. Save the configuration file.
+
+1. Reconfigure or restart GitLab, depending on your installation method:
+
+ - *If you installed from Omnibus GitLab,*
+ [reconfigure](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure) GitLab.
+ - *If you installed from source,*
+ [restart GitLab](../administration/restart_gitlab.md#installations-from-source).
+
+On the sign-in page, you should now see a Microsoft icon below the regular sign-in form.
+Select the icon to begin the authentication process. Microsoft then asks you to
+sign in and authorize the GitLab application. If successful, you are returned to GitLab and signed in.
+
+Read [Enable OmniAuth for an Existing User](omniauth.md#enable-omniauth-for-an-existing-user)
+for information on how existing GitLab users can connect to their newly available Azure AD accounts.
diff --git a/doc/integration/bitbucket.md b/doc/integration/bitbucket.md
index 8999f4da9a2..54bcaee7cab 100644
--- a/doc/integration/bitbucket.md
+++ b/doc/integration/bitbucket.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Integrate your GitLab server with Bitbucket Cloud
+# Integrate your GitLab server with Bitbucket Cloud **(FREE)**
NOTE:
Starting from GitLab 11.4, OmniAuth is enabled by default. If you're using an
diff --git a/doc/integration/cas.md b/doc/integration/cas.md
index b444143b03e..59f41ab4368 100644
--- a/doc/integration/cas.md
+++ b/doc/integration/cas.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# CAS OmniAuth Provider
+# CAS OmniAuth Provider **(FREE)**
To enable the CAS OmniAuth provider you must register your application with your CAS instance. This requires the service URL GitLab supplies to CAS. It should be something like: `https://gitlab.example.com:443/users/auth/cas3/callback?url`. By default handling for SLO is enabled, you only need to configure CAS for back-channel logout.
diff --git a/doc/integration/elasticsearch.md b/doc/integration/elasticsearch.md
index 389c7aabdf5..9e2ecdeeb5e 100644
--- a/doc/integration/elasticsearch.md
+++ b/doc/integration/elasticsearch.md
@@ -218,7 +218,7 @@ The following Elasticsearch settings are available:
| `Elasticsearch indexing` | Enables or disables Elasticsearch indexing and creates an empty index if one does not already exist. You may want to enable indexing but disable search in order to give the index time to be fully completed, for example. Also, keep in mind that this option doesn't have any impact on existing data, this only enables/disables the background indexer which tracks data changes and ensures new data is indexed. |
| `Pause Elasticsearch indexing` | Enables or disables temporary indexing pause. This is useful for cluster migration/reindexing. All changes are still tracked, but they are not committed to the Elasticsearch index until resumed. |
| `Search with Elasticsearch enabled` | Enables or disables using Elasticsearch in search. |
-| `URL` | The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., `http://host1, https://host2:9200`). If your Elasticsearch instance is password protected, pass the `username:password` in the URL (e.g., `http://<username>:<password>@<elastic_host>:9200/`). |
+| `URL` | The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., `http://host1, https://host2:9200`). If your Elasticsearch instance is password protected, pass the `username:password` in the URL (e.g., `http://<username>:<password>@<elastic_host>:9200/`). Special characters in the username or password should use [percentage encoding](https://en.wikipedia.org/wiki/Percent-encoding). |
| `Number of Elasticsearch shards` | Elasticsearch indexes are split into multiple shards for performance reasons. In general, larger indexes need to have more shards. Changes to this value do not take effect until the index is recreated. You can read more about tradeoffs in the [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/scalability.html). |
| `Number of Elasticsearch replicas` | Each Elasticsearch shard can have a number of replicas. These are a complete copy of the shard, and can provide increased query performance or resilience against hardware failure. Increasing this value will greatly increase total disk space required by the index. |
| `Limit namespaces and projects that can be indexed` | Enabling this will allow you to select namespaces and projects to index. All other namespaces and projects will use database search instead. Please note that if you enable this option but do not select any namespaces or projects, none will be indexed. [Read more below](#limiting-namespaces-and-projects).
@@ -232,6 +232,12 @@ The following Elasticsearch settings are available:
| `Bulk request concurrency` | The Bulk request concurrency indicates how many of the GitLab Golang-based indexer processes (or threads) can run in parallel to collect data to subsequently submit to Elasticsearch’s Bulk API. This increases indexing performance, but fills the Elasticsearch bulk requests queue faster. This setting should be used together with the Maximum bulk request size setting (see above) and needs to accommodate the resource constraints of both the Elasticsearch host(s) and the host(s) running the GitLab Golang-based indexer either from the `gitlab-rake` command or the Sidekiq tasks. |
| `Client request timeout` | Elasticsearch HTTP client request timeout value in seconds. `0` means using the system default timeout value, which depends on the libraries that GitLab application is built upon. |
+WARNING:
+Increasing the values of `Maximum bulk request size (MiB)` and `Bulk request concurrency` can negatively impact
+Sidekiq performance. Return them to their default values if you see increased `scheduling_latency_s` durations
+in your Sidekiq logs. For more information, see
+[issue 322147](https://gitlab.com/gitlab-org/gitlab/-/issues/322147).
+
### Limiting namespaces and projects
If you select `Limit namespaces and projects that can be indexed`, more options will become available.
@@ -416,6 +422,7 @@ The following are some available Rake tasks:
| [`sudo gitlab-rake gitlab:elastic:projects_not_indexed`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Displays which projects are not indexed. |
| [`sudo gitlab-rake gitlab:elastic:reindex_cluster`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Schedules a zero-downtime cluster reindexing task. This feature should be used with an index that was created after GitLab 13.0. |
| [`sudo gitlab-rake gitlab:elastic:mark_reindex_failed`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake)`] | Mark the most recent re-index job as failed. |
+| [`sudo gitlab-rake gitlab:elastic:list_pending_migrations`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/tasks/gitlab/elastic.rake)`] | List pending migrations. Pending migrations include those that have not yet started, have started but not finished, and those that are halted. |
### Environment variables
diff --git a/doc/integration/external-issue-tracker.md b/doc/integration/external-issue-tracker.md
index b1eb9d0d2fe..4e00057c4b7 100644
--- a/doc/integration/external-issue-tracker.md
+++ b/doc/integration/external-issue-tracker.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# External issue tracker
+# External issue tracker **(FREE)**
GitLab has a great [issue tracker](../user/project/issues/index.md) but you can also use an external
one. External issue trackers are configurable per GitLab project.
diff --git a/doc/integration/facebook.md b/doc/integration/facebook.md
index b86958726a7..c901fdfdd10 100644
--- a/doc/integration/facebook.md
+++ b/doc/integration/facebook.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Facebook OAuth2 OmniAuth Provider
+# Facebook OAuth2 OmniAuth Provider **(FREE)**
To enable the Facebook OmniAuth provider you must register your application with Facebook. Facebook generates an app ID and secret key for you to use.
diff --git a/doc/integration/github.md b/doc/integration/github.md
index 0239ba0e818..4258b1c3c76 100644
--- a/doc/integration/github.md
+++ b/doc/integration/github.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Integrate your GitLab instance with GitHub
+# Integrate your GitLab instance with GitHub **(FREE)**
You can integrate your GitLab instance with GitHub.com and GitHub Enterprise. This integration
enables users to import projects from GitHub, or sign in to your GitLab instance
@@ -12,7 +12,7 @@ with their GitHub account.
## Enabling GitHub OAuth
-To enable the GitHub OmniAuth provider, you need an OAuth 2 Client ID and Client Secret from GitHub. To get these credentials, sign into GitHub and follow their procedure for [Creating an OAuth App](https://docs.github.com/apps/building-oauth-apps/creating-an-oauth-app/).
+To enable the GitHub OmniAuth provider, you need an OAuth 2 Client ID and Client Secret from GitHub. To get these credentials, sign into GitHub and follow their procedure for [Creating an OAuth App](https://docs.github.com/en/developers/apps/creating-an-oauth-app).
When you create an OAuth 2 app in GitHub, you need the following information:
diff --git a/doc/integration/gitlab.md b/doc/integration/gitlab.md
index 97c5332c438..7e21685fd54 100644
--- a/doc/integration/gitlab.md
+++ b/doc/integration/gitlab.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Integrate your server with GitLab.com
+# Integrate your server with GitLab.com **(FREE)**
Import projects from GitLab.com and login to your GitLab instance with your GitLab.com account.
diff --git a/doc/integration/gitpod.md b/doc/integration/gitpod.md
index 7dc710615fb..e62e3de29c2 100644
--- a/doc/integration/gitpod.md
+++ b/doc/integration/gitpod.md
@@ -5,7 +5,7 @@ group: Editor
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
---
-# Gitpod Integration
+# Gitpod Integration **(FREE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/228893) in GitLab 13.4.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/258206) in GitLab 13.8
@@ -34,9 +34,8 @@ To learn more about Gitpod, see their [features](https://www.gitpod.io/features/
With the Gitpod integration enabled for your GitLab instance, to enable it for yourself:
1. In the top-right corner, select your avatar.
-1. Select **Edit profile**.
-1. In the left sidebar, select **Account**.
-1. Under **Integrations**, locate the **Gitpod** section.
+1. Select **Preferences**.
+1. Under **Preferences**, locate the **Integrations** section.
1. Check the **Enable Gitpod integration** checkbox and select the **Save changes** button.
## Configure a self-managed instance **(FREE SELF)**
diff --git a/doc/integration/gmail_action_buttons_for_gitlab.md b/doc/integration/gmail_action_buttons_for_gitlab.md
index af9972e825e..fa0e79d4c0b 100644
--- a/doc/integration/gmail_action_buttons_for_gitlab.md
+++ b/doc/integration/gmail_action_buttons_for_gitlab.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Gmail actions buttons for GitLab
+# Gmail actions buttons for GitLab **(FREE)**
GitLab supports [Google actions in email](https://developers.google.com/gmail/markup/actions/actions-overview).
diff --git a/doc/integration/google.md b/doc/integration/google.md
index cd00c854fea..0e4c9b78b5f 100644
--- a/doc/integration/google.md
+++ b/doc/integration/google.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Google OAuth2 OmniAuth Provider
+# Google OAuth2 OmniAuth Provider **(FREE)**
To enable the Google OAuth2 OmniAuth provider you must register your application
with Google. Google generates a client ID and secret key for you to use.
diff --git a/doc/integration/jenkins_deprecated.md b/doc/integration/jenkins_deprecated.md
index 2ed87456ea1..61d1deace4f 100644
--- a/doc/integration/jenkins_deprecated.md
+++ b/doc/integration/jenkins_deprecated.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Jenkins CI (deprecated) service
+# Jenkins CI (deprecated) service **(FREE)**
NOTE:
In GitLab 8.3, Jenkins integration using the
@@ -42,7 +42,7 @@ In GitLab, perform the following steps.
Jenkins needs read access to the GitLab repository. We already specified a
private key to use in Jenkins, now we need to add a public one to the GitLab
project. For that case we need a Deploy key. Read the documentation on
-[how to set up a Deploy key](../ssh/README.md#deploy-keys).
+[how to set up a Deploy key](../user/project/deploy_keys/index.md).
### Jenkins service
diff --git a/doc/integration/oauth2_generic.md b/doc/integration/oauth2_generic.md
index 41656bd2216..84490757c16 100644
--- a/doc/integration/oauth2_generic.md
+++ b/doc/integration/oauth2_generic.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Sign into GitLab with (almost) any OAuth2 provider
+# Sign into GitLab with (almost) any OAuth2 provider **(FREE)**
The `omniauth-oauth2-generic` gem allows Single Sign-On between GitLab and your own OAuth2 provider
(or any OAuth2 provider compatible with this gem)
diff --git a/doc/integration/omniauth.md b/doc/integration/omniauth.md
index cf033018e17..9fd2e7a69e9 100644
--- a/doc/integration/omniauth.md
+++ b/doc/integration/omniauth.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# OmniAuth
+# OmniAuth **(FREE)**
GitLab leverages OmniAuth to allow users to sign in using Twitter, GitHub, and
other popular services. [OmniAuth](https://rubygems.org/gems/omniauth/) is
diff --git a/doc/integration/openid_connect_provider.md b/doc/integration/openid_connect_provider.md
index 4455ace3e1f..b37c5064063 100644
--- a/doc/integration/openid_connect_provider.md
+++ b/doc/integration/openid_connect_provider.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# GitLab as OpenID Connect identity provider
+# GitLab as OpenID Connect identity provider **(FREE)**
This document is about using GitLab as an OpenID Connect identity provider
to sign in to other services.
diff --git a/doc/integration/recaptcha.md b/doc/integration/recaptcha.md
index 8f090dfc588..9ffc89e2c13 100644
--- a/doc/integration/recaptcha.md
+++ b/doc/integration/recaptcha.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# reCAPTCHA
+# reCAPTCHA **(FREE)**
GitLab leverages [Google's reCAPTCHA](https://www.google.com/recaptcha/about/)
to protect against spam and abuse. GitLab displays the CAPTCHA form on the sign-up page
diff --git a/doc/integration/salesforce.md b/doc/integration/salesforce.md
index 156109518a6..102b89298a1 100644
--- a/doc/integration/salesforce.md
+++ b/doc/integration/salesforce.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Salesforce OmniAuth Provider
+# Salesforce OmniAuth Provider **(FREE)**
You can integrate your GitLab instance with [Salesforce](https://www.salesforce.com/) to enable users to log in to your GitLab instance with their Salesforce account.
diff --git a/doc/integration/saml.md b/doc/integration/saml.md
index 9b6ad3f2755..d68cf8e2f34 100644
--- a/doc/integration/saml.md
+++ b/doc/integration/saml.md
@@ -13,15 +13,15 @@ You should also reference the [OmniAuth documentation](omniauth.md) for general
## Common SAML Terms
-| Term | Description |
-|------|-------------|
-| Identity Provider (IdP) | The service which manages your user identities such as ADFS, Okta, Onelogin, or Ping Identity. |
-| Service Provider (SP) | SAML considers GitLab to be a service provider. |
-| Assertion | A piece of information about a user's identity, such as their name or role. Also known as claims or attributes. |
-| SSO | Single Sign-On. |
+| Term | Description |
+|--------------------------------|-------------|
+| Identity Provider (IdP) | The service which manages your user identities, such as ADFS, Okta, OneLogin, or Ping Identity. |
+| Service Provider (SP) | SAML considers GitLab to be a service provider. |
+| Assertion | A piece of information about a user's identity, such as their name or role. Also known as claims or attributes. |
+| SSO | Single Sign-On. |
| Assertion consumer service URL | The callback on GitLab where users will be redirected after successfully authenticating with the identity provider. |
-| Issuer | How GitLab identifies itself to the identity provider. Also known as a "Relying party trust identifier". |
-| Certificate fingerprint | Used to confirm that communications over SAML are secure by checking that the server is signing communications with the correct certificate. Also known as a certificate thumbprint. |
+| Issuer | How GitLab identifies itself to the identity provider. Also known as a "Relying party trust identifier". |
+| Certificate fingerprint | Used to confirm that communications over SAML are secure by checking that the server is signing communications with the correct certificate. Also known as a certificate thumbprint. |
## General Setup
@@ -265,7 +265,7 @@ considered admin users.
### Auditor groups **(PREMIUM SELF)**
-> Introduced in [GitLab Starter](https://about.gitlab.com/pricing/) 11.4.
+> Introduced in GitLab 11.4.
The requirements are the same as the previous settings, your IdP needs to pass Group information to GitLab, you need to tell
GitLab where to look for the groups in the SAML response, and which group(s) should be
@@ -454,8 +454,6 @@ args: {
### `uid_attribute`
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17734) in GitLab 10.7.
-
By default, the `uid` is set as the `name_id` in the SAML response. If you'd like to designate a unique attribute for the `uid`, you can set the `uid_attribute`. In the example below, the value of `uid` attribute in the SAML response is set as the `uid_attribute`.
```yaml
diff --git a/doc/integration/shibboleth.md b/doc/integration/shibboleth.md
index 3b92f2858ac..c4cf19747be 100644
--- a/doc/integration/shibboleth.md
+++ b/doc/integration/shibboleth.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Shibboleth OmniAuth Provider
+# Shibboleth OmniAuth Provider **(FREE)**
NOTE:
The preferred approach for integrating a Shibboleth authentication system
diff --git a/doc/integration/slash_commands.md b/doc/integration/slash_commands.md
index 0dcf86cc46d..2c133c1de76 100644
--- a/doc/integration/slash_commands.md
+++ b/doc/integration/slash_commands.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Slash Commands
+# Slash Commands **(FREE)**
> - [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24780) to GitLab Free in 11.9.
diff --git a/doc/integration/trello_power_up.md b/doc/integration/trello_power_up.md
index 1a1b6cd101f..e8956271508 100644
--- a/doc/integration/trello_power_up.md
+++ b/doc/integration/trello_power_up.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Trello Power-Up
+# Trello Power-Up **(FREE)**
The GitLab Trello Power-Up enables you to seamlessly attach
GitLab **merge requests** to Trello cards.
diff --git a/doc/integration/twitter.md b/doc/integration/twitter.md
index 8404352d0e9..58e111be73c 100644
--- a/doc/integration/twitter.md
+++ b/doc/integration/twitter.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Twitter OAuth2 OmniAuth Provider
+# Twitter OAuth2 OmniAuth Provider **(FREE)**
To enable the Twitter OmniAuth provider you must register your application with Twitter. Twitter generates a client ID and secret key for you to use.
diff --git a/doc/intro/index.md b/doc/intro/index.md
index 1ab7553d3a8..a40293955a9 100644
--- a/doc/intro/index.md
+++ b/doc/intro/index.md
@@ -12,7 +12,7 @@ comments: false
Create projects and groups.
- [Create a new project](../user/project/working_with_projects.md#create-a-project)
-- [Create a new group](../user/group/index.md#create-a-new-group)
+- [Create a new group](../user/group/index.md#create-a-group)
## Prioritize
diff --git a/doc/operations/feature_flags.md b/doc/operations/feature_flags.md
index f23880554a6..de6b2985786 100644
--- a/doc/operations/feature_flags.md
+++ b/doc/operations/feature_flags.md
@@ -79,8 +79,8 @@ is 200. For GitLab SaaS, the maximum number is determined by [tier](https://abou
You can apply a feature flag strategy across multiple environments, without defining
the strategy multiple times.
-GitLab Feature Flags use [Unleash](https://unleash.github.io) as the feature flag
-engine. In Unleash, there are [strategies](https://unleash.github.io/docs/activation_strategy)
+GitLab Feature Flags use [Unleash](https://docs.getunleash.ai/) as the feature flag
+engine. In Unleash, there are [strategies](https://docs.getunleash.ai/docs/activation_strategy)
for granular feature flag controls. GitLab Feature Flags can have multiple strategies,
and the supported strategies are:
@@ -95,7 +95,7 @@ and clicking **{pencil}** (edit).
### All users
-Enables the feature for all users. It uses the [`default`](https://unleash.github.io/docs/activation_strategy#default)
+Enables the feature for all users. It uses the [`default`](https://docs.getunleash.ai/docs/activation_strategy#default)
Unleash activation strategy.
### Percent Rollout
diff --git a/doc/operations/incident_management/incidents.md b/doc/operations/incident_management/incidents.md
index f0bb9a8e950..317797376fc 100644
--- a/doc/operations/incident_management/incidents.md
+++ b/doc/operations/incident_management/incidents.md
@@ -54,7 +54,7 @@ With Maintainer or higher [permissions](../../user/permissions.md), you can enab
1. Navigate to **Settings > Operations > Incidents** and expand **Incidents**.
1. Check the **Create an incident** checkbox.
1. To customize the incident, select an
- [issue template](../../user/project/description_templates.md#creating-issue-templates).
+ [issue template](../../user/project/description_templates.md#create-an-issue-template).
1. To send [an email notification](paging.md#email-notifications) to users
with [Developer permissions](../../user/permissions.md), select
**Send a separate email notification to Developers**. Email notifications are
diff --git a/doc/ssh/README.md b/doc/ssh/README.md
index 815d8c13c43..7814b1dbda1 100644
--- a/doc/ssh/README.md
+++ b/doc/ssh/README.md
@@ -7,19 +7,12 @@ type: howto, reference
# GitLab and SSH keys
-Git is a distributed version control system, which means you can work locally.
-In addition, you can also share or "push" your changes to other servers.
-GitLab supports secure communication between Git and its servers using SSH keys.
+Git is a distributed version control system, which means you can work locally,
+then share or "push" your changes to a server. In this case, the server is GitLab.
-The SSH protocol provides this security and allows you to authenticate to the
-GitLab remote server without supplying your username or password each time.
-
-This page can help you configure secure SSH keys which you can use to help secure
-connections to GitLab repositories.
-
-- If you need information on creating SSH keys, start with our [options for SSH keys](#supported-ssh-key-types).
-- If you have SSH keys dedicated for your GitLab account, you may be interested in [Working with non-default SSH key pair paths](#working-with-non-default-ssh-key-pair-paths).
-- If you already have an SSH key pair, you can go to how you can [add an SSH key to your GitLab account](#add-an-ssh-key-to-your-gitlab-account).
+GitLab uses the SSH protocol to securely communicate with Git.
+When you use SSH keys to authenticate to the GitLab remote server,
+you don't need to supply your username and password each time.
## Prerequisites
@@ -31,7 +24,7 @@ To use SSH to communicate with GitLab, you need:
To view the version of SSH installed on your system, run `ssh -V`.
GitLab does [not support installation on Microsoft Windows](../install/requirements.md#microsoft-windows),
-but you can set up SSH keys on the Windows [client](#options-for-microsoft-windows).
+but you can set up SSH keys on the Windows [client](#use-ssh-on-microsoft-windows).
## Supported SSH key types
@@ -84,7 +77,7 @@ If you do not have an existing SSH key pair, generate a new one.
1. Type `ssh-keygen -t` followed by the key type and an optional comment.
This comment is included in the `.pub` file that's created.
You may want to use an email address for the comment.
-
+
For example, for ED25519:
```shell
@@ -104,10 +97,10 @@ If you do not have an existing SSH key pair, generate a new one.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
```
-1. Accept the suggested filename and directory, unless you are generating a [deploy key](#deploy-keys)
+1. Accept the suggested filename and directory, unless you are generating a [deploy key](../user/project/deploy_keys/index.md)
or want to save in a specific directory where you store other keys.
- You can also dedicate the SSH key pair to a [specific host](#working-with-non-default-ssh-key-pair-paths).
+ You can also dedicate the SSH key pair to a [specific host](#configure-ssh-to-point-to-a-different-directory).
1. Specify a [passphrase](https://www.ssh.com/ssh/passphrase/):
@@ -118,15 +111,47 @@ If you do not have an existing SSH key pair, generate a new one.
1. A confirmation is displayed, including information about where your files are stored.
-A public and private key are generated.
+A public and private key are generated.
[Add the public SSH key to your GitLab account](#add-an-ssh-key-to-your-gitlab-account) and keep
the private key secure.
+### Configure SSH to point to a different directory
+
+If you did not save your SSH key pair in the default directory,
+configure your SSH client to point to the directory where the private key is stored.
+
+1. Open a terminal and run this command:
+
+ ```shell
+ eval $(ssh-agent -s)
+ ssh-add <directory to private SSH key>
+ ```
+
+1. Save these settings in the `~/.ssh/config` file. For example:
+
+ ```conf
+ # GitLab.com
+ Host gitlab.com
+ PreferredAuthentications publickey
+ IdentityFile ~/.ssh/gitlab_com_rsa
+
+ # Private GitLab instance
+ Host gitlab.company.com
+ PreferredAuthentications publickey
+ IdentityFile ~/.ssh/example_com_rsa
+ ```
+
+ For more information on these settings, see the [`man ssh_config`](https://man.openbsd.org/ssh_config) page in the SSH configuration manual.
+
+Public SSH keys must be unique to GitLab because they bind to your account.
+Your SSH key is the only identifier you have when you push code with SSH.
+It must uniquely map to a single user.
+
### Update your SSH key passphrase
You can update the passphrase for your SSH key.
-1. Open a terminal and type this command:
+1. Open a terminal and run this command:
```shell
ssh-keygen -p -f /path/to/ssh_key
@@ -140,7 +165,7 @@ If your version of OpenSSH is between 6.5 and 7.8,
you can save your private RSA SSH keys in a more secure
OpenSSH format.
-1. Open a terminal and type this command:
+1. Open a terminal and run this command:
```shell
ssh-keygen -o -f ~/.ssh/id_rsa
@@ -155,11 +180,10 @@ OpenSSH format.
## Add an SSH key to your GitLab account
-Now you can copy the SSH key you created to your GitLab account.
+To use SSH with GitLab, copy your public key to your GitLab account.
-1. Copy your **public** SSH key to a location that saves information in text format.
- The following options saves information for ED25519 keys to the clipboard
- for the noted operating system:
+1. Copy the contents of your public key file. You can do this manually or use a script.
+ For example, to copy an ED25519 key to the clipboard:
**macOS:**
@@ -167,7 +191,7 @@ Now you can copy the SSH key you created to your GitLab account.
pbcopy < ~/.ssh/id_ed25519.pub
```
- **Linux (requires the `xclip` package):**
+ **Linux** (requires the `xclip` package):
```shell
xclip -sel clip < ~/.ssh/id_ed25519.pub
@@ -179,128 +203,83 @@ Now you can copy the SSH key you created to your GitLab account.
cat ~/.ssh/id_ed25519.pub | clip
```
- If you're using an RSA key, substitute accordingly.
+ Replace `id_ed25519.pub` with your filename. For example, use `id_rsa.pub` for RSA.
-1. Navigate to `https://gitlab.com` or your local GitLab instance URL and sign in.
-1. In the top-right corner, select your avatar.
-1. Select **Edit profile**.
-1. In the left sidebar, select **SSH Keys**.
-1. Paste the public key that you copied into the **Key** text box.
-1. Make sure your key includes a descriptive name in the **Title** text box, such as _Work Laptop_ or
+1. Sign in to GitLab.
+1. In the top right corner, select your avatar.
+1. Select **Settings**.
+1. From the left sidebar, select **SSH Keys**.
+1. In the **Key** box, paste the contents of your public key.
+ If you manually copied the key, make sure you copy the entire key,
+ which starts with `ssh-ed25519` or `ssh-rsa`, and may end with a comment.
+1. In the **Title** text box, type a description, like _Work Laptop_ or
_Home Workstation_.
-1. Include an (optional) expiry date for the key under "Expires at" section. (Introduced in [GitLab 12.9](https://gitlab.com/gitlab-org/gitlab/-/issues/36243).)
-1. Click the **Add key** button.
-
-SSH keys that have "expired" using this procedure are valid in GitLab workflows.
-As the GitLab-configured expiration date is not included in the SSH key itself,
-you can still export public SSH keys as needed.
-
-NOTE:
-If you manually copied your public SSH key make sure you copied the entire
-key starting with `ssh-ed25519` (or `ssh-rsa`) and ending with your email address.
+1. Optional. In the **Expires at** box, select an expiration date. (Introduced in [GitLab 12.9](https://gitlab.com/gitlab-org/gitlab/-/issues/36243).)
+ The expiration date is informational only, and does not prevent you from using
+ the key. However, administrators can view expiration dates and
+ use them for guidance when [deleting keys](../user/admin_area/credentials_inventory.md#delete-a-users-ssh-key).
+1. Select **Add key**.
-## Two-factor Authentication (2FA)
+## Verify that you can connect
-You can set up two-factor authentication (2FA) for
-[Git over SSH](../security/two_factor_authentication.md#two-factor-authentication-2fa-for-git-over-ssh-operations).
+Verify that your SSH key was added correctly.
-## Testing that everything is set up correctly
+1. For GitLab.com, to ensure you're connecting to the correct server, confirm the
+ [SSH host keys fingerprints](../user/gitlab_com/index.md#ssh-host-keys-fingerprints).
+1. Open a terminal and run this command, replacing `gitlab.example.com` with your GitLab instance URL:
-To test whether your SSH key was added correctly, run the following
-command in your terminal (replace `gitlab.com` with the domain of
-your GitLab instance):
-
-```shell
-ssh -T git@gitlab.com
-```
-
-The first time you connect to GitLab via SSH, you should verify the
-authenticity of the GitLab host that you're connecting to.
-For example, when connecting to GitLab.com, answer `yes` to add GitLab.com to
-the list of trusted hosts:
-
-```plaintext
-The authenticity of host 'gitlab.com (35.231.145.151)' can't be established.
-ECDSA key fingerprint is SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw.
-Are you sure you want to continue connecting (yes/no)? yes
-Warning: Permanently added 'gitlab.com' (ECDSA) to the list of known hosts.
-```
-
-NOTE:
-For GitLab.com, consult the
-[SSH host keys fingerprints](../user/gitlab_com/index.md#ssh-host-keys-fingerprints),
-section to make sure you're connecting to the correct server. For example, you can see
-the ECDSA key fingerprint shown above in the linked section.
-
-Once added to the list of known hosts, you should validate the
-authenticity of the GitLab host, once again. Run the above command
-again, and you should receive a _Welcome to GitLab, `@username`!_ message.
+ ```shell
+ ssh -T git@gitlab.example.com
+ ```
-If the welcome message doesn't appear, you can troubleshoot the problem by running `ssh`
-in verbose mode with the following command:
+1. If this is the first time you connect, you should verify the
+ authenticity of the GitLab host. If you see a message like:
-```shell
-ssh -Tvvv git@gitlab.com
-```
+ ```plaintext
+ The authenticity of host 'gitlab.example.com (35.231.145.151)' can't be established.
+ ECDSA key fingerprint is SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw.
+ Are you sure you want to continue connecting (yes/no)? yes
+ Warning: Permanently added 'gitlab.example.com' (ECDSA) to the list of known hosts.
+ ```
-## Working with non-default SSH key pair paths
+ Type `yes` and press Enter.
-If you used a non-default file path for your GitLab SSH key pair,
-configure your SSH client to point to your GitLab private SSH key.
+1. Run the `ssh -T git@gitlab.example.com` command again. You should receive a _Welcome to GitLab, `@username`!_ message.
-To make these changes, run the following commands:
+If the welcome message doesn't appear, you can troubleshoot by running `ssh`
+in verbose mode:
```shell
-eval $(ssh-agent -s)
-ssh-add <path to private SSH key>
-```
-
-Now save these settings to the `~/.ssh/config` file. Two examples
-for SSH keys dedicated to GitLab are shown here:
-
-```conf
-# GitLab.com
-Host gitlab.com
- Preferredauthentications publickey
- IdentityFile ~/.ssh/gitlab_com_rsa
-
-# Private GitLab instance
-Host gitlab.company.com
- Preferredauthentications publickey
- IdentityFile ~/.ssh/example_com_rsa
+ssh -Tvvv git@gitlab.example.com
```
-Public SSH keys need to be unique to GitLab, as they bind to your account.
-Your SSH key is the only identifier you have when pushing code via SSH,
-that's why it needs to uniquely map to a single user.
+## Use different keys for different repositories
-## Per-repository SSH keys
+You can use a different key for each repository.
-If you want to use different keys depending on the repository you are working
-on, you can issue the following command while inside your repository:
+Open a terminal and run this command:
```shell
git config core.sshCommand "ssh -o IdentitiesOnly=yes -i ~/.ssh/private-key-filename-for-this-repository -F /dev/null"
```
-This does not use the SSH Agent and requires at least Git 2.10.
+This command does not use the SSH Agent and requires Git 2.10 or later. For more information
+on `ssh` command options, see the `man` pages for both `ssh` and `ssh_config`.
-## Multiple accounts on a single GitLab instance
+## Use different accounts on a single GitLab instance
-The [per-repository](#per-repository-ssh-keys) method also works for using
-multiple accounts within a single GitLab instance.
+You can use multiple accounts to connect to a single instance of GitLab.
+You can do this by using the command in the [previous topic](#use-different-keys-for-different-repositories).
+However, even if you set `IdentitiesOnly` to `yes`, you cannot sign in if an `IdentityFile` exists
+outside of a `Host` block.
-Alternatively, it is possible to directly assign aliases to hosts in
-`~.ssh/config`. SSH and, by extension, Git fails to log in if there is
-an `IdentityFile` set outside of a `Host` block in `.ssh/config`. This is
-due to how SSH assembles `IdentityFile` entries and is not changed by
-setting `IdentitiesOnly` to `yes`. `IdentityFile` entries should point to
-the private key of an SSH key pair.
+Instead, you can assign aliases to hosts in the `~.ssh/config` file.
-NOTE:
-Private and public keys should be readable by the user only. Accomplish this
-on Linux and macOS by running: `chmod 0400 ~/.ssh/<example_ssh_key>` and
-`chmod 0400 ~/.ssh/<example_sh_key.pub>`.
+- For the `Host`, use an alias like `user_1.gitlab.com` and
+ `user_2.gitlab.com`. Advanced configurations
+ are more difficult to maintain, and these strings are easier to
+ understand when you use tools like `git remote`.
+- For the `IdentityFile`, use the path the private key.
```conf
# User1 Account Identity
@@ -316,59 +295,60 @@ Host <user_2.gitlab.com>
IdentityFile ~/.ssh/<example_ssh_key2>
```
-NOTE:
-The example `Host` aliases are defined as `user_1.gitlab.com` and
-`user_2.gitlab.com` for efficiency and transparency. Advanced configurations
-are more difficult to maintain; using this type of alias makes it easier to
-understand when using other tools such as `git remote` sub-commands. SSH
-would understand any string as a `Host` alias thus `Tanuki1` and `Tanuki2`,
-despite giving very little context as to where they point, would also work.
-
-Cloning the `gitlab` repository normally looks like this:
-
-```shell
-git clone git@gitlab.com:gitlab-org/gitlab.git
-```
-
-To clone it for `user_1`, replace `gitlab.com` with the SSH alias `user_1.gitlab.com`:
+Now, to clone a repository for `user_1`, use `user_1.gitlab.com` in the `git clone` command:
```shell
git clone git@<user_1.gitlab.com>:gitlab-org/gitlab.git
```
-Fix a previously cloned repository using the `git remote` command.
-
-The example below assumes the remote repository is aliased as `origin`.
+To update a previously-cloned repository that is aliased as `origin`:
```shell
git remote set-url origin git@<user_1.gitlab.com>:gitlab-org/gitlab.git
```
-## Deploy keys
+NOTE:
+Private and public keys contain sensitive data. Ensure the permissions
+on the files make them readable to you but not accessible to others.
-Read the [documentation on deploy keys](../user/project/deploy_keys/index.md).
+## Configure two-factor authentication (2FA)
-## Applications
+You can set up two-factor authentication (2FA) for
+[Git over SSH](../security/two_factor_authentication.md#two-factor-authentication-2fa-for-git-over-ssh-operations).
-### Eclipse
+## Use EGit on Eclipse
If you are using [EGit](https://www.eclipse.org/egit/), you can [add your SSH key to Eclipse](https://wiki.eclipse.org/EGit/User_Guide#Eclipse_SSH_Configuration).
-## SSH on the GitLab server
+## Use SSH on Microsoft Windows
+
+If you're running Windows 10, you can use the [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install-win10)
+with [WSL 2](https://docs.microsoft.com/en-us/windows/wsl/install-win10#update-to-wsl-2).
+You can use WSL to install Linux distributions, which include the Git and SSH clients.
-GitLab integrates with the system-installed SSH daemon, designating a user
+For other versions of Windows, you can install the Git and SSH clients by using
+[Git for Windows](https://gitforwindows.org).
+
+Alternative tools include:
+
+- [Cygwin](https://www.cygwin.com)
+- [PuttyGen](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
+
+## Overriding SSH settings on the GitLab server
+
+GitLab integrates with the system-installed SSH daemon and designates a user
(typically named `git`) through which all access requests are handled. Users
-connecting to the GitLab server over SSH are identified by their SSH key instead
+who connect to the GitLab server over SSH are identified by their SSH key instead
of their username.
SSH *client* operations performed on the GitLab server are executed as this
-user. Although it is possible to modify the SSH configuration for this user to,
-e.g., provide a private SSH key to authenticate these requests by, this practice
+user. You can modify this SSH configuration. For example, you can specify
+a private SSH key for this user to use for authentication requests. However, this practice
is **not supported** and is strongly discouraged as it presents significant
security risks.
-The GitLab check process includes a check for this condition, and directs you
-to this section if your server is configured like this, for example:
+GitLab checks for this condition, and directs you
+to this section if your server is configured this way. For example:
```shell
$ gitlab-rake gitlab:check
@@ -383,30 +363,16 @@ Git user has default SSH configuration? ... no
Please fix the error above and rerun the checks.
```
-Remove the custom configuration as soon as you're able to. These customizations
-are *explicitly not supported* and may stop working at any time.
-
-### Options for Microsoft Windows
-
-If you're running Windows 10, the [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install-win10), and its latest [WSL 2](https://docs.microsoft.com/en-us/windows/wsl/install-win10#update-to-wsl-2) version,
-support the installation of different Linux distributions, which include the Git and SSH clients.
-
-For current versions of Windows, you can also install the Git and SSH clients with
-[Git for Windows](https://gitforwindows.org).
-
-Alternative tools include:
-
-- [Cygwin](https://www.cygwin.com)
-- [PuttyGen](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
+Remove the custom configuration as soon as you can. These customizations
+are **explicitly not supported** and may stop working at any time.
-## Troubleshooting
+## Troubleshooting SSH connections
-If on Git clone you are prompted for a password like `git@gitlab.com's password:`
-something is wrong with your SSH setup.
+When you run `git clone`, you may be prompted for a password, like `git@gitlab.example.com's password:`.
+This indicates that something is wrong with your SSH setup.
- Ensure that you generated your SSH key pair correctly and added the public SSH
- key to your GitLab profile
-- Try manually registering your private SSH key using `ssh-agent` as documented
- earlier in this document
-- Try to debug the connection by running `ssh -Tv git@example.com`
- (replacing `example.com` with your GitLab domain)
+ key to your GitLab profile.
+- Try to manually register your private SSH key by using `ssh-agent`.
+- Try to debug the connection by running `ssh -Tv git@example.com`.
+ Replace `example.com` with your GitLab URL.
diff --git a/doc/subscriptions/bronze_starter.md b/doc/subscriptions/bronze_starter.md
index 8b223953007..a43bb4498de 100644
--- a/doc/subscriptions/bronze_starter.md
+++ b/doc/subscriptions/bronze_starter.md
@@ -20,7 +20,7 @@ the tiers are no longer mentioned in GitLab documentation:
[per-group charts](../user/project/milestones/index.md#group-burndown-charts)
- [Code owners](../user/project/code_owners.md)
- Description templates:
- - [Setting a default template for merge requests and issues](../user/project/description_templates.md#setting-a-default-template-for-merge-requests-and-issues)
+ - [Setting a default template for merge requests and issues](../user/project/description_templates.md#set-a-default-template-for-merge-requests-and-issues)
- [Email from GitLab](../tools/email.md)
- Groups:
- [Creating group memberships via CN](../user/group/index.md#creating-group-links-via-cn)
diff --git a/doc/topics/autodevops/customize.md b/doc/topics/autodevops/customize.md
index b7f2a0768ef..56d84657534 100644
--- a/doc/topics/autodevops/customize.md
+++ b/doc/topics/autodevops/customize.md
@@ -17,7 +17,7 @@ staging and canary deployments,
## Custom buildpacks
If the automatic buildpack detection fails for your project, or if you want to
-use a custom buildpack, you can override the buildpack using a project variable
+use a custom buildpack, you can override the buildpack using a project CI/CD variable
or a `.buildpacks` file in your project:
- **Project variable** - Create a project variable `BUILDPACK_URL` with the URL
@@ -43,7 +43,7 @@ can't use the `.buildpacks` file. The buildpack
in the backend to parse the `.buildpacks` file, does not provide the necessary commands
`bin/test-compile` and `bin/test`.
-If your goal is to use only a single custom buildpack, you should provide the project variable
+If your goal is to use only a single custom buildpack, you should provide the project CI/CD variable
`BUILDPACK_URL` instead.
## Custom `Dockerfile`
@@ -55,13 +55,13 @@ builds a Docker image based on the Dockerfile, rather than using buildpacks.
This can be much faster and result in smaller images, especially if your
Dockerfile is based on [Alpine](https://hub.docker.com/_/alpine/).
-If you set the `DOCKERFILE_PATH` CI variable, Auto Build looks for a Dockerfile there
+If you set the `DOCKERFILE_PATH` CI/CD variable, Auto Build looks for a Dockerfile there
instead.
## Passing arguments to `docker build`
Arguments can be passed to the `docker build` command using the
-`AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` project variable. For example, to build a
+`AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` project CI/CD variable. For example, to build a
Docker image based on based on the `ruby:alpine` instead of the default `ruby:latest`:
1. Set `AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` to `--build-arg=RUBY_VERSION=alpine`.
@@ -93,12 +93,12 @@ You can extend and manage your Auto DevOps configuration with GitLab APIs:
- [Editing groups](../../api/groups.md#update-group).
- [Editing projects](../../api/projects.md#edit-project).
-## Forward CI variables to the build environment
+## Forward CI/CD variables to the build environment
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25514) in GitLab 12.3, but available in versions 11.9 and above.
-CI variables can be forwarded into the build environment using the
-`AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` CI variable.
+CI/CD variables can be forwarded into the build environment using the
+`AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` CI/CD variable.
The forwarded variables should be specified by name in a comma-separated
list. For example, to forward the variables `CI_COMMIT_SHA` and
`CI_ENVIRONMENT_NAME`, set `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES`
@@ -130,7 +130,7 @@ feature to use the `--secret` flag.
Auto DevOps uses [Helm](https://helm.sh/) to deploy your application to Kubernetes.
You can override the Helm chart used by bundling up a chart into your project
-repository or by specifying a project variable:
+repository or by specifying a project CI/CD variable:
- **Bundled chart** - If your project has a `./chart` directory with a `Chart.yaml`
file in it, Auto DevOps detects the chart and uses it instead of the
@@ -151,17 +151,17 @@ You can override the default values in the `values.yaml` file in the
- Adding a file named `.gitlab/auto-deploy-values.yaml` to your repository, which is
automatically used, if found.
- Adding a file with a different name or path to the repository, and setting the
- `HELM_UPGRADE_VALUES_FILE` [environment variable](#environment-variables) with
+ `HELM_UPGRADE_VALUES_FILE` [CI/CD variable](#cicd-variables) with
the path and name.
NOTE:
-For GitLab 12.5 and earlier, use the `HELM_UPGRADE_EXTRA_ARGS` environment variable
+For GitLab 12.5 and earlier, use the `HELM_UPGRADE_EXTRA_ARGS` variable
to override the default chart values by setting `HELM_UPGRADE_EXTRA_ARGS` to `--values <my-values.yaml>`.
## Customize the `helm upgrade` command
You can customize the `helm upgrade` command used in the [auto-deploy-image](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image)
-by passing options to the command with the `HELM_UPGRADE_EXTRA_ARGS` variable.
+by passing options to the command with the `HELM_UPGRADE_EXTRA_ARGS` CI/CD variable.
For example, set the value of `HELM_UPGRADE_EXTRA_ARGS` to `--no-hooks` to disable
pre-upgrade and post-upgrade hooks when the command is executed.
@@ -170,7 +170,7 @@ list of options.
## Custom Helm chart per environment
-You can specify the use of a custom Helm chart per environment by scoping the environment variable
+You can specify the use of a custom Helm chart per environment by scoping the CI/CD variable
to the desired environment. See [Limiting environment scopes of variables](../../ci/variables/README.md#limit-the-environment-scopes-of-cicd-variables).
## Customizing `.gitlab-ci.yml`
@@ -260,7 +260,7 @@ the [GitLab 12.10 based templates](https://gitlab.com/gitlab-org/auto-devops-v12
To support applications requiring a database,
[PostgreSQL](https://www.postgresql.org/) is provisioned by default. The credentials to access
the database are preconfigured, but can be customized by setting the associated
-[variables](#environment-variables). You can use these credentials to define a `DATABASE_URL`:
+[CI/CD variables](#cicd-variables). You can use these credentials to define a `DATABASE_URL`:
```yaml
postgres://user:password@postgres-host:postgres-port/postgres-database
@@ -269,7 +269,7 @@ postgres://user:password@postgres-host:postgres-port/postgres-database
### Upgrading PostgresSQL
WARNING:
-The variable `AUTO_DEVOPS_POSTGRES_CHANNEL` that controls default provisioned
+The CI/CD variable `AUTO_DEVOPS_POSTGRES_CHANNEL` that controls default provisioned
PostgreSQL was changed to `2` in [GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/210499).
To keep using the old PostgreSQL, set the `AUTO_DEVOPS_POSTGRES_CHANNEL` variable to
`1`.
@@ -290,17 +290,17 @@ production environments, for some use cases, it may not be sufficiently secure o
resilient, and you may want to use an external managed provider (such as
AWS Relational Database Service) for PostgreSQL.
-You must define environment-scoped variables for `POSTGRES_ENABLED` and
+You must define environment-scoped CI/CD variables for `POSTGRES_ENABLED` and
`DATABASE_URL` in your project's CI/CD settings:
1. Disable the built-in PostgreSQL installation for the required environments using
- scoped [environment variables](../../ci/environments/index.md#scoping-environments-with-specs).
+ environment-scoped [CI/CD variables](../../ci/environments/index.md#scoping-environments-with-specs).
For this use case, it's likely that only `production` must be added to this
list. The built-in PostgreSQL setup for Review Apps and staging is sufficient.
![Auto Metrics](img/disable_postgres.png)
-1. Define the `DATABASE_URL` CI variable as a scoped environment variable that is
+1. Define the `DATABASE_URL` variable as an environment-scoped variable that is
available to your application. This should be a URL in the following format:
```yaml
@@ -310,7 +310,7 @@ You must define environment-scoped variables for `POSTGRES_ENABLED` and
You must ensure that your Kubernetes cluster has network access to wherever
PostgreSQL is hosted.
-## Environment variables
+## CI/CD variables
The following variables can be used for setting up the Auto DevOps domain,
providing a custom Helm chart, or scaling your application. PostgreSQL can
@@ -318,10 +318,10 @@ also be customized, and you can use a [custom buildpack](#custom-buildpacks).
### Build and deployment
-The following table lists variables related to building and deploying
+The following table lists CI/CD variables related to building and deploying
applications.
-| **Variable** | **Description** |
+| **CI/CD Variable** | **Description** |
|-----------------------------------------|------------------------------------|
| `ADDITIONAL_HOSTS` | Fully qualified domain names specified as a comma-separated list that are added to the Ingress hosts. |
| `<ENVIRONMENT>_ADDITIONAL_HOSTS` | For a specific environment, the fully qualified domain names specified as a comma-separated list that are added to the Ingress hosts. This takes precedence over `ADDITIONAL_HOSTS`. |
@@ -329,7 +329,7 @@ applications.
| `AUTO_DEVOPS_BUILD_IMAGE_CNB_ENABLED` | When set to a non-empty value and no `Dockerfile` is present, Auto Build builds your application using Cloud Native Buildpacks instead of Herokuish. [More details](stages.md#auto-build-using-cloud-native-buildpacks-beta). |
| `AUTO_DEVOPS_BUILD_IMAGE_CNB_BUILDER` | The builder used when building with Cloud Native Buildpacks. The default builder is `heroku/buildpacks:18`. [More details](stages.md#auto-build-using-cloud-native-buildpacks-beta). |
| `AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` | Extra arguments to be passed to the `docker build` command. Note that using quotes doesn't prevent word splitting. [More details](#passing-arguments-to-docker-build). |
-| `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` | A [comma-separated list of CI variable names](#forward-ci-variables-to-the-build-environment) to be forwarded to the build environment (the buildpack builder or `docker build`). |
+| `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` | A [comma-separated list of CI/CD variable names](#forward-cicd-variables-to-the-build-environment) to be forwarded to the build environment (the buildpack builder or `docker build`). |
| `AUTO_DEVOPS_CHART` | Helm Chart used to deploy your apps. Defaults to the one [provided by GitLab](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app). |
| `AUTO_DEVOPS_CHART_REPOSITORY` | Helm Chart repository used to search for charts. Defaults to `https://charts.gitlab.io`. |
| `AUTO_DEVOPS_CHART_REPOSITORY_NAME` | From GitLab 11.11, used to set the name of the Helm repository. Defaults to `gitlab`. |
@@ -367,9 +367,9 @@ Auto DevOps can undo your changes.
### Database
-The following table lists variables related to the database.
+The following table lists CI/CD variables related to the database.
-| **Variable** | **Description** |
+| **CI/CD Variable** | **Description** |
|-----------------------------------------|------------------------------------|
| `DB_INITIALIZE` | From GitLab 11.4, used to specify the command to run to initialize the application's PostgreSQL database. Runs inside the application pod. |
| `DB_MIGRATE` | From GitLab 11.4, used to specify the command to run to migrate the application's PostgreSQL database. Runs inside the application pod. |
@@ -383,7 +383,7 @@ The following table lists variables related to the database.
The following table lists variables used to disable jobs.
-| **Job Name** | **Variable** | **GitLab version** | **Description** |
+| **Job Name** | **CI/CDVariable** | **GitLab version** | **Description** |
|----------------------------------------|---------------------------------|-----------------------|-----------------|
| `.fuzz_base` | `COVFUZZ_DISABLED` | [From GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34984) | [Read more](../../user/application_security/coverage_fuzzing/) about how `.fuzz_base` provide capability for your own jobs. If the variable is present, your jobs aren't created. |
| `apifuzzer_fuzz` | `API_FUZZING_DISABLED` | [From GitLab 13.3](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39135) | If the variable is present, the job isn't created. |
@@ -433,7 +433,7 @@ The following table lists variables used to disable jobs.
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/49056) in GitLab 11.7.
Some applications need to define secret variables that are accessible by the deployed
-application. Auto DevOps detects variables starting with `K8S_SECRET_`, and makes
+application. Auto DevOps detects CI/CD variables starting with `K8S_SECRET_`, and makes
these prefixed variables available to the deployed application as environment variables.
To configure your application variables:
@@ -545,7 +545,7 @@ The normal behavior of Auto DevOps is to use continuous deployment, pushing
automatically to the `production` environment every time a new pipeline is run
on the default branch. However, there are cases where you might want to use a
staging environment, and deploy to production manually. For this scenario, the
-`STAGING_ENABLED` environment variable was introduced.
+`STAGING_ENABLED` CI/CD variable was introduced.
If you define `STAGING_ENABLED` with a non-empty value, then GitLab automatically deploys the application
to a `staging` environment, and creates a `production_manual` job for
@@ -584,7 +584,7 @@ are created:
1. `rollout 50%`
1. `rollout 100%`
-The percentage is based on the `REPLICAS` variable, and defines the number of
+The percentage is based on the `REPLICAS` CI/CD variable, and defines the number of
pods you want to have for your deployment. If the value is `10`, and you run the
`10%` rollout job, there is `1` new pod and `9` old ones.
@@ -616,8 +616,8 @@ With `INCREMENTAL_ROLLOUT_MODE` set to `manual` and with `STAGING_ENABLED`
![Rollout and staging enabled](img/rollout_staging_enabled.png)
WARNING:
-Before GitLab 11.4, the presence of the `INCREMENTAL_ROLLOUT_ENABLED` environment
-variable enabled this feature. This configuration is deprecated, and is scheduled to be
+Before GitLab 11.4, the presence of the `INCREMENTAL_ROLLOUT_ENABLED` CI/CD variable
+enabled this feature. This configuration is deprecated, and is scheduled to be
removed in the future.
### Timed incremental rollout to production **(PREMIUM)**
@@ -632,7 +632,7 @@ This configuration is based on
Everything behaves the same way, except:
-- To enable it, set the `INCREMENTAL_ROLLOUT_MODE` variable to `timed`.
+- To enable it, set the `INCREMENTAL_ROLLOUT_MODE` CI/CD variable to `timed`.
- Instead of the standard `production` job, the following jobs are created with
a 5 minute delay between each:
diff --git a/doc/topics/autodevops/img/alexj_autodevops_min_v13_8.png b/doc/topics/autodevops/img/alexj_autodevops_min_v13_8.png
deleted file mode 100644
index 7dc37737835..00000000000
--- a/doc/topics/autodevops/img/alexj_autodevops_min_v13_8.png
+++ /dev/null
Binary files differ
diff --git a/doc/topics/autodevops/img/kai_autodevops_min_v13_8.png b/doc/topics/autodevops/img/kai_autodevops_min_v13_8.png
deleted file mode 100644
index fa3ab4c1820..00000000000
--- a/doc/topics/autodevops/img/kai_autodevops_min_v13_8.png
+++ /dev/null
Binary files differ
diff --git a/doc/topics/autodevops/index.md b/doc/topics/autodevops/index.md
index d95e5568e0b..44072147fde 100644
--- a/doc/topics/autodevops/index.md
+++ b/doc/topics/autodevops/index.md
@@ -6,50 +6,36 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Auto DevOps **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/37115) in GitLab 10.0.
> - Generally available on GitLab 11.0.
-Auto DevOps are default CI/CD templates that auto-discover the source code you have. They
-enable GitLab to automatically detect, build, test, deploy, and monitor your applications.
-Leveraging [CI/CD best practices](../../ci/pipelines/pipeline_efficiency.md) and tools,
-Auto DevOps aims to simplify the setup and execution of a mature and modern software
-development lifecycle.
+GitLab Auto DevOps helps to reduce the complexity of software delivery by
+setting up pipelines and integrations for you. Instead of requiring you to
+manually configure your entire GitLab environment, Auto DevOps configures
+many of these areas for you, including security auditing and vulnerability
+testing.
-## Overview
+Using Auto DevOps, you can:
-You can spend a lot of effort to set up the workflow and processes required to
-build, deploy, and monitor your project. It gets worse when your company has
-hundreds, if not thousands, of projects to maintain. With new projects
-constantly starting up, the entire software development process becomes
-impossibly complex to manage.
+- Detect the language of your code.
+- Automatically build, test, and measure code quality.
+- Scan for potential vulnerabilities, security flaws, and licensing issues.
+- Monitor in real-time.
+- Deploy your application.
-Auto DevOps provides you a seamless software development process by
-automatically detecting all dependencies and language technologies required to
-test, build, package, deploy, and monitor every project with minimal
-configuration. Automation enables consistency across your projects, seamless
-management of processes, and faster creation of new projects: push your code,
-and GitLab does the rest, improving your productivity and efficiency.
+The functionality of Auto DevOps is based on default CI/CD templates that
+auto-discover your source code. These templates enable GitLab to provide
+consistency across your projects, seamless management of processes, and faster
+creation of new projects. Leveraging [CI/CD best practices](../../ci/pipelines/pipeline_efficiency.md)
+and tools, Auto DevOps lets you push your code, with GitLab doing the rest,
+improving your productivity and efficiency.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an introduction to Auto DevOps, watch [AutoDevOps in GitLab 11.0](https://youtu.be/0Tc0YYBxqi4).
+For an introduction to Auto DevOps, watch [AutoDevOps in GitLab 11.0](https://youtu.be/0Tc0YYBxqi4) or see this [overview](https://about.gitlab.com/stages-devops-lifecycle/auto-devops/).
For requirements, read [Requirements for Auto DevOps](requirements.md) for more information.
For a developer's guide, read [Auto DevOps development guide](../../development/auto_devops.md).
-### Share your feedback
-
-As Auto DevOps continues to gain popularity, and lowers the barrier to entry for
-getting started with DevOps and CI/CD, see what our wider community is saying:
-
-From [AlexJonesax](https://twitter.com/AlexJonesax) and [KaiPMDH](https://twitter.com/KaiPMDH) on Twitter:
-
-![Alex on Twitter: Auto DevOps in GitLab doesn't just lower the bar to entry, it removes the bar and holds your hand.](img/alexj_autodevops_min_v13_8.png)
-
-![Kai on Twitter: When I saw this on the Auto DevOps stuff, my mind was blown...](img/kai_autodevops_min_v13_8.png)
-
-We welcome everyone to [share your experience by tagging GitLab on Twitter](https://twitter.com/gitlab).
-
## Enabled by default
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/41729) in GitLab 11.3.
@@ -162,7 +148,7 @@ any of the following places:
[groups](../../user/group/clusters/index.md#base-domain)
- or at the project level as a variable: `KUBE_INGRESS_BASE_DOMAIN`
- or at the group level as a variable: `KUBE_INGRESS_BASE_DOMAIN`
-- or as an instance-wide fallback in **Admin Area > Settings** under the
+- or as an instance-wide fallback in **Admin Area > Settings > CI/CD** under the
**Continuous Integration and Delivery** section
The base domain variable `KUBE_INGRESS_BASE_DOMAIN` follows the same order of precedence
@@ -238,7 +224,7 @@ To enable or disable Auto DevOps at the group level:
Even when disabled at the instance level, group owners and project maintainers can still enable
Auto DevOps at the group and project level, respectively.
-1. Go to **Admin Area > Settings > Continuous Integration and Deployment**.
+1. Go to **Admin Area > Settings > CI/CD > Continuous Integration and Deployment**.
1. Select **Default to Auto DevOps pipeline for all projects** to enable it.
1. (Optional) You can set up the Auto DevOps [base domain](#auto-devops-base-domain),
for Auto Deploy and Auto Review Apps to use.
@@ -348,246 +334,3 @@ spec:
- name: https_proxy
value: "PUT_YOUR_HTTPS_PROXY_HERE"
```
-
-## Troubleshooting
-
-### Unable to select a buildpack
-
-Auto Build and Auto Test may fail to detect your language or framework with the
-following error:
-
-```plaintext
-Step 5/11 : RUN /bin/herokuish buildpack build
- ---> Running in eb468cd46085
- -----> Unable to select a buildpack
-The command '/bin/sh -c /bin/herokuish buildpack build' returned a non-zero code: 1
-```
-
-The following are possible reasons:
-
-- Your application may be missing the key files the buildpack is looking for.
- Ruby applications require a `Gemfile` to be properly detected,
- even though it's possible to write a Ruby app without a `Gemfile`.
-- No buildpack may exist for your application. Try specifying a
- [custom buildpack](customize.md#custom-buildpacks).
-
-### Pipeline that extends Auto DevOps with only / except fails
-
-If your pipeline fails with the following message:
-
-```plaintext
-Found errors in your .gitlab-ci.yml:
-
- jobs:test config key may not be used with `rules`: only
-```
-
-This error appears when the included job’s rules configuration has been overridden with the `only` or `except` syntax.
-To fix this issue, you must either:
-
-- Transition your `only/except` syntax to rules.
-- (Temporarily) Pin your templates to the [GitLab 12.10 based templates](https://gitlab.com/gitlab-org/auto-devops-v12-10).
-
-### Failure to create a Kubernetes namespace
-
-Auto Deploy fails if GitLab can't create a Kubernetes namespace and
-service account for your project. For help debugging this issue, see
-[Troubleshooting failed deployment jobs](../../user/project/clusters/index.md#troubleshooting).
-
-### Detected an existing PostgreSQL database
-
-After upgrading to GitLab 13.0, you may encounter this message when deploying
-with Auto DevOps:
-
-```plaintext
-Detected an existing PostgreSQL database installed on the
-deprecated channel 1, but the current channel is set to 2. The default
-channel changed to 2 in of GitLab 13.0.
-[...]
-```
-
-Auto DevOps, by default, installs an in-cluster PostgreSQL database alongside
-your application. The default installation method changed in GitLab 13.0, and
-upgrading existing databases requires user involvement. The two installation
-methods are:
-
-- **channel 1 (deprecated):** Pulls in the database as a dependency of the associated
- Helm chart. Only supports Kubernetes versions up to version 1.15.
-- **channel 2 (current):** Installs the database as an independent Helm chart. Required
- for using the in-cluster database feature with Kubernetes versions 1.16 and greater.
-
-If you receive this error, you can do one of the following actions:
-
-- You can *safely* ignore the warning and continue using the channel 1 PostgreSQL
- database by setting `AUTO_DEVOPS_POSTGRES_CHANNEL` to `1` and redeploying.
-
-- You can delete the channel 1 PostgreSQL database and install a fresh channel 2
- database by setting `AUTO_DEVOPS_POSTGRES_DELETE_V1` to a non-empty value and
- redeploying.
-
- WARNING:
- Deleting the channel 1 PostgreSQL database permanently deletes the existing
- channel 1 database and all its data. See
- [Upgrading PostgreSQL](upgrading_postgresql.md)
- for more information on backing up and upgrading your database.
-
-- If you are not using the in-cluster database, you can set
- `POSTGRES_ENABLED` to `false` and re-deploy. This option is especially relevant to
- users of *custom charts without the in-chart PostgreSQL dependency*.
- Database auto-detection is based on the `postgresql.enabled` Helm value for
- your release. This value is set based on the `POSTGRES_ENABLED` CI variable
- and persisted by Helm, regardless of whether or not your chart uses the
- variable.
-
-WARNING:
-Setting `POSTGRES_ENABLED` to `false` permanently deletes any existing
-channel 1 database for your environment.
-
-### Error: unable to recognize "": no matches for kind "Deployment" in version "extensions/v1beta1"
-
-After upgrading your Kubernetes cluster to [v1.16+](stages.md#kubernetes-116),
-you may encounter this message when deploying with Auto DevOps:
-
-```plaintext
-UPGRADE FAILED
-Error: failed decoding reader into objects: unable to recognize "": no matches for kind "Deployment" in version "extensions/v1beta1"
-```
-
-This can occur if your current deployments on the environment namespace were deployed with a
-deprecated/removed API that doesn't exist in Kubernetes v1.16+. For example,
-if [your in-cluster PostgreSQL was installed in a legacy way](#detected-an-existing-postgresql-database),
-the resource was created via the `extensions/v1beta1` API. However, the deployment resource
-was moved to the `app/v1` API in v1.16.
-
-To recover such outdated resources, you must convert the current deployments by mapping legacy APIs
-to newer APIs. There is a helper tool called [`mapkubeapis`](https://github.com/hickeyma/helm-mapkubeapis)
-that works for this problem. Follow these steps to use the tool in Auto DevOps:
-
-1. Modify your `.gitlab-ci.yml` with:
-
- ```yaml
- include:
- - template: Auto-DevOps.gitlab-ci.yml
- - remote: https://gitlab.com/shinya.maeda/ci-templates/-/raw/master/map-deprecated-api.gitlab-ci.yml
-
- variables:
- HELM_VERSION_FOR_MAPKUBEAPIS: "v2" # If you're using auto-depoy-image v2 or above, please specify "v3".
- ```
-
-1. Run the job `<environment-name>:map-deprecated-api`. Ensure that this job succeeds before moving
- to the next step. You should see something like the following output:
-
- ```shell
- 2020/10/06 07:20:49 Found deprecated or removed Kubernetes API:
- "apiVersion: extensions/v1beta1
- kind: Deployment"
- Supported API equivalent:
- "apiVersion: apps/v1
- kind: Deployment"
- ```
-
-1. Revert your `.gitlab-ci.yml` to the previous version. You no longer need to include the
- supplemental template `map-deprecated-api`.
-
-1. Continue the deployments as usual.
-
-### Error: error initializing: Looks like "https://kubernetes-charts.storage.googleapis.com" is not a valid chart repository or cannot be reached
-
-As [announced in the official CNCF blog post](https://www.cncf.io/blog/2020/10/07/important-reminder-for-all-helm-users-stable-incubator-repos-are-deprecated-and-all-images-are-changing-location/),
-the stable Helm chart repository was deprecated and removed on November 13th, 2020.
-You may encounter this error after that date.
-
-Some GitLab features had dependencies on the stable chart. To mitigate the impact, we changed them
-to use new official repositories or the [Helm Stable Archive repository maintained by GitLab](https://gitlab.com/gitlab-org/cluster-integration/helm-stable-archive).
-Auto Deploy contains [an example fix](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/merge_requests/127).
-
-In Auto Deploy, `v1.0.6+` of `auto-deploy-image` no longer adds the deprecated stable repository to
-the `helm` command. If you use a custom chart and it relies on the deprecated stable repository,
-specify an older `auto-deploy-image` like this example:
-
-```yaml
-include:
- - template: Auto-DevOps.gitlab-ci.yml
-
-.auto-deploy:
- image: "registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:v1.0.5"
-```
-
-Keep in mind that this approach stops working when the stable repository is removed,
-so you must eventually fix your custom chart.
-
-To fix your custom chart:
-
-1. In your chart directory, update the `repository` value in your `requirements.yaml` file from :
-
- ```yaml
- repository: "https://kubernetes-charts.storage.googleapis.com/"
- ```
-
- to:
-
- ```yaml
- repository: "https://charts.helm.sh/stable"
- ```
-
-1. In your chart directory, run `helm dep update .` using the same Helm major version as Auto DevOps.
-1. Commit the changes for the `requirements.yaml` file.
-1. If you previously had a `requirements.lock` file, commit the changes to the file.
- If you did not previously have a `requirements.lock` file in your chart,
- you do not need to commit the new one. This file is optional, but when present,
- it's used to verify the integrity of the downloaded dependencies.
-
-You can find more information in
-[issue #263778, "Migrate PostgreSQL from stable Helm repository"](https://gitlab.com/gitlab-org/gitlab/-/issues/263778).
-
-### Error: release .... failed: timed out waiting for the condition
-
-When getting started with Auto DevOps, you may encounter this error when first
-deploying your application:
-
-```plaintext
-INSTALL FAILED
-PURGING CHART
-Error: release staging failed: timed out waiting for the condition
-```
-
-This is most likely caused by a failed liveness (or readiness) probe attempted
-during the deployment process. By default, these probes are run against the root
-page of the deployed application on port 5000. If your application isn't configured
-to serve anything at the root page, or is configured to run on a specific port
-*other* than 5000, this check fails.
-
-If it fails, you should see these failures in the events for the relevant
-Kubernetes namespace. These events look like the following example:
-
-```plaintext
-LAST SEEN TYPE REASON OBJECT MESSAGE
-3m20s Warning Unhealthy pod/staging-85db88dcb6-rxd6g Readiness probe failed: Get http://10.192.0.6:5000/: dial tcp 10.192.0.6:5000: connect: connection refused
-3m32s Warning Unhealthy pod/staging-85db88dcb6-rxd6g Liveness probe failed: Get http://10.192.0.6:5000/: dial tcp 10.192.0.6:5000: connect: connection refused
-```
-
-To change the port used for the liveness checks, pass
-[custom values to the Helm chart](customize.md#customize-values-for-helm-chart)
-used by Auto DevOps:
-
-1. Create a directory and file at the root of your repository named `.gitlab/auto-deploy-values.yaml`.
-
-1. Populate the file with the following content, replacing the port values with
- the actual port number your application is configured to use:
-
- ```yaml
- service:
- internalPort: <port_value>
- externalPort: <port_value>
- ```
-
-1. Commit your changes.
-
-After committing your changes, subsequent probes should use the newly-defined ports.
-The page that's probed can also be changed by overriding the `livenessProbe.path`
-and `readinessProbe.path` values (shown in the
-[default `values.yaml`](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/blob/master/assets/auto-deploy-app/values.yaml)
-file) in the same fashion.
-
-## Development guides
-
-[Development guide for Auto DevOps](../../development/auto_devops.md)
diff --git a/doc/topics/autodevops/quick_start_guide.md b/doc/topics/autodevops/quick_start_guide.md
index cd951e53bd1..541f4ab57ab 100644
--- a/doc/topics/autodevops/quick_start_guide.md
+++ b/doc/topics/autodevops/quick_start_guide.md
@@ -234,8 +234,8 @@ takes you to the pod's logs page.
NOTE:
The example shows only one pod hosting the application at the moment, but you can add
-more pods by defining the [`REPLICAS` variable](customize.md#environment-variables)
-in **Settings > CI/CD > Environment variables**.
+more pods by defining the [`REPLICAS` CI/CD variable](customize.md#cicd-variables)
+in **Settings > CI / CD > Variables**.
### Work with branches
@@ -307,7 +307,7 @@ and customized to fit your workflow. Here are some helpful resources for further
1. [Auto DevOps](index.md)
1. [Multiple Kubernetes clusters](index.md#using-multiple-kubernetes-clusters)
1. [Incremental rollout to production](customize.md#incremental-rollout-to-production) **(PREMIUM)**
-1. [Disable jobs you don't need with environment variables](customize.md#environment-variables)
+1. [Disable jobs you don't need with CI/CD variables](customize.md#cicd-variables)
1. [Use a static IP for your cluster](../../user/clusters/applications.md#using-a-static-ip)
1. [Use your own buildpacks to build your application](customize.md#custom-buildpacks)
1. [Prometheus monitoring](../../user/project/integrations/prometheus.md)
diff --git a/doc/topics/autodevops/requirements.md b/doc/topics/autodevops/requirements.md
index 930938b7571..e27686ec239 100644
--- a/doc/topics/autodevops/requirements.md
+++ b/doc/topics/autodevops/requirements.md
@@ -109,8 +109,8 @@ After all requirements are met, you can [enable Auto DevOps](index.md#enablingdi
You can choose to target [AWS ECS](../../ci/cloud_deployment/index.md) as a deployment platform instead of using Kubernetes.
-To get started on Auto DevOps to AWS ECS, you must add a specific Environment
-Variable. To do so, follow these steps:
+To get started on Auto DevOps to AWS ECS, you must add a specific CI/CD variable.
+To do so, follow these steps:
1. In your project, go to **Settings > CI / CD** and expand the **Variables**
section.
@@ -121,7 +121,7 @@ Variable. To do so, follow these steps:
- `ECS` if you're not enforcing any launch type check when deploying to ECS.
When you trigger a pipeline, if you have Auto DevOps enabled and if you have correctly
-[entered AWS credentials as environment variables](../../ci/cloud_deployment/index.md#deploy-your-application-to-the-aws-elastic-container-service-ecs),
+[entered AWS credentials as variables](../../ci/cloud_deployment/index.md#deploy-your-application-to-the-aws-elastic-container-service-ecs),
your application is deployed to AWS ECS.
[GitLab Managed Apps](../../user/clusters/applications.md) are not available when deploying to AWS ECS.
@@ -145,7 +145,7 @@ own pipeline, as the override stops working when the name changes.
You can target [AWS EC2](../../ci/cloud_deployment/index.md)
as a deployment platform instead of Kubernetes. To use Auto DevOps with AWS EC2, you must add a
-specific environment variable.
+specific CI/CD variable.
For more details, see [Custom build job for Auto DevOps](../../ci/cloud_deployment/index.md#custom-build-job-for-auto-devops)
for deployments to AWS EC2.
diff --git a/doc/topics/autodevops/stages.md b/doc/topics/autodevops/stages.md
index f1244a1ad1b..9051f6926bf 100644
--- a/doc/topics/autodevops/stages.md
+++ b/doc/topics/autodevops/stages.md
@@ -53,7 +53,7 @@ For the requirements of other languages and frameworks, read the
NOTE:
If Auto Build fails despite the project meeting the buildpack requirements, set
-a project variable `TRACE=true` to enable verbose logging, which may help you
+a project CI/CD variable `TRACE=true` to enable verbose logging, which may help you
troubleshoot.
### Auto Build using Cloud Native Buildpacks (beta)
@@ -62,9 +62,9 @@ troubleshoot.
Auto Build supports building your application using [Cloud Native Buildpacks](https://buildpacks.io)
through the [`pack` command](https://github.com/buildpacks/pack). To use Cloud Native Buildpacks,
-set the CI variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_ENABLED` to a non-empty
+set the CI/CD variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_ENABLED` to a non-empty
value. The default builder is `heroku/buildpacks:18` but a different builder
-can be selected using the CI variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_BUILDER`.
+can be selected using the CI/CD variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_BUILDER`.
Cloud Native Buildpacks (CNBs) are an evolution of Heroku buildpacks, and
GitLab expects them to eventually supersede Herokuish-based builds within Auto DevOps. For more
@@ -103,7 +103,9 @@ NOTE:
Not all buildpacks supported by [Auto Build](#auto-build) are supported by Auto Test.
Auto Test uses [Herokuish](https://gitlab.com/gitlab-org/gitlab/-/issues/212689), *not*
Cloud Native Buildpacks, and only buildpacks that implement the
+<!-- vale gitlab.Spelling = NO -->
[Testpack API](https://devcenter.heroku.com/articles/testpack-api) are supported.
+<!-- vale gitlab.Spelling = YES -->
### Currently supported languages
@@ -284,7 +286,7 @@ see the documentation.
### Overriding the DAST target
To use a custom target instead of the auto-deployed review apps,
-set a `DAST_WEBSITE` environment variable to the URL for DAST to scan.
+set a `DAST_WEBSITE` CI/CD variable to the URL for DAST to scan.
WARNING:
If [DAST Full Scan](../../user/application_security/dast/index.md#full-scan) is
@@ -297,10 +299,10 @@ data loss or corruption.
You can disable DAST:
-- On all branches by setting the `DAST_DISABLED` environment variable to `"true"`.
+- On all branches by setting the `DAST_DISABLED` CI/CD variable to `"true"`.
- Only on the default branch by setting the `DAST_DISABLED_FOR_DEFAULT_BRANCH`
- environment variable to `"true"`.
-- Only on feature branches by setting `REVIEW_DISABLED` environment variable to
+ variable to `"true"`.
+- Only on feature branches by setting `REVIEW_DISABLED` variable to
`"true"`. This also disables the Review App.
## Auto Browser Performance Testing **(PREMIUM)**
@@ -336,7 +338,7 @@ uploads the report as an artifact.
Some initial setup is required. A [k6](https://k6.io/) test needs to be
written that's tailored to your specific application. The test also needs to be
-configured so it can pick up the environment's dynamic URL via an environment variable.
+configured so it can pick up the environment's dynamic URL via a CI/CD variable.
Any load performance test result differences between the source and target branches are also
[shown in the merge request widget](../../user/project/merge_requests/load_performance_testing.md).
@@ -356,7 +358,7 @@ default, but the
[Auto DevOps template](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml)
contains job definitions for these tasks if you want to enable them.
-You can use [environment variables](customize.md#environment-variables) to automatically
+You can use [CI/CD variables](customize.md#cicd-variables) to automatically
scale your pod replicas, and to apply custom arguments to the Auto DevOps `helm upgrade`
commands. This is an easy way to
[customize the Auto Deploy Helm chart](customize.md#custom-helm-chart).
@@ -440,7 +442,7 @@ On GitLab 12.9 and 12.10, opting into
`AUTO_DEVOPS_POSTGRES_CHANNEL` version `2` deletes the version `1` PostgreSQL
database. Follow the [guide to upgrading PostgreSQL](upgrading_postgresql.md)
to back up and restore your database before opting into version `2` (On
-GitLab 13.0, an additional variable is required to trigger the database
+GitLab 13.0, an additional CI/CD variable is required to trigger the database
deletion).
### Migrations
@@ -448,7 +450,7 @@ deletion).
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/21955) in GitLab 11.4
You can configure database initialization and migrations for PostgreSQL to run
-within the application pod by setting the project variables `DB_INITIALIZE` and
+within the application pod by setting the project CI/CD variables `DB_INITIALIZE` and
`DB_MIGRATE` respectively.
If present, `DB_INITIALIZE` is run as a shell command within an application pod
@@ -500,7 +502,7 @@ access to a Redis instance. Auto DevOps doesn't deploy this instance for you, so
you must:
- Maintain your own Redis instance.
-- Set a CI variable `K8S_SECRET_REDIS_URL`, which is the URL of this instance,
+- Set a CI/CD variable `K8S_SECRET_REDIS_URL`, which is the URL of this instance,
to ensure it's passed into your deployments.
After configuring your worker to respond to health checks, run a Sidekiq
@@ -686,5 +688,5 @@ You can follow the [code intelligence epic](https://gitlab.com/groups/gitlab-org
for updates.
This stage is enabled by default. You can disable it by adding the
-`CODE_INTELLIGENCE_DISABLED` environment variable. Read more about
+`CODE_INTELLIGENCE_DISABLED` CI/CD variable. Read more about
[disabling Auto DevOps jobs](../../topics/autodevops/customize.md#disable-jobs).
diff --git a/doc/topics/autodevops/troubleshooting.md b/doc/topics/autodevops/troubleshooting.md
new file mode 100644
index 00000000000..e4d3a557995
--- /dev/null
+++ b/doc/topics/autodevops/troubleshooting.md
@@ -0,0 +1,247 @@
+---
+stage: Configure
+group: Configure
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Troubleshooting Auto DevOps **(FREE)**
+
+The information in this documentation page describes common errors when using
+Auto DevOps, and any available workarounds.
+
+## Unable to select a buildpack
+
+Auto Build and Auto Test may fail to detect your language or framework with the
+following error:
+
+```plaintext
+Step 5/11 : RUN /bin/herokuish buildpack build
+ ---> Running in eb468cd46085
+ -----> Unable to select a buildpack
+The command '/bin/sh -c /bin/herokuish buildpack build' returned a non-zero code: 1
+```
+
+The following are possible reasons:
+
+- Your application may be missing the key files the buildpack is looking for.
+ Ruby applications require a `Gemfile` to be properly detected,
+ even though it's possible to write a Ruby app without a `Gemfile`.
+- No buildpack may exist for your application. Try specifying a
+ [custom buildpack](customize.md#custom-buildpacks).
+
+## Pipeline that extends Auto DevOps with only / except fails
+
+If your pipeline fails with the following message:
+
+```plaintext
+Found errors in your .gitlab-ci.yml:
+
+ jobs:test config key may not be used with `rules`: only
+```
+
+This error appears when the included job’s rules configuration has been overridden with the `only` or `except` syntax.
+To fix this issue, you must either:
+
+- Transition your `only/except` syntax to rules.
+- (Temporarily) Pin your templates to the [GitLab 12.10 based templates](https://gitlab.com/gitlab-org/auto-devops-v12-10).
+
+## Failure to create a Kubernetes namespace
+
+Auto Deploy fails if GitLab can't create a Kubernetes namespace and
+service account for your project. For help debugging this issue, see
+[Troubleshooting failed deployment jobs](../../user/project/clusters/index.md#troubleshooting).
+
+## Detected an existing PostgreSQL database
+
+After upgrading to GitLab 13.0, you may encounter this message when deploying
+with Auto DevOps:
+
+```plaintext
+Detected an existing PostgreSQL database installed on the
+deprecated channel 1, but the current channel is set to 2. The default
+channel changed to 2 in of GitLab 13.0.
+[...]
+```
+
+Auto DevOps, by default, installs an in-cluster PostgreSQL database alongside
+your application. The default installation method changed in GitLab 13.0, and
+upgrading existing databases requires user involvement. The two installation
+methods are:
+
+- **channel 1 (deprecated):** Pulls in the database as a dependency of the associated
+ Helm chart. Only supports Kubernetes versions up to version 1.15.
+- **channel 2 (current):** Installs the database as an independent Helm chart. Required
+ for using the in-cluster database feature with Kubernetes versions 1.16 and greater.
+
+If you receive this error, you can do one of the following actions:
+
+- You can *safely* ignore the warning and continue using the channel 1 PostgreSQL
+ database by setting `AUTO_DEVOPS_POSTGRES_CHANNEL` to `1` and redeploying.
+
+- You can delete the channel 1 PostgreSQL database and install a fresh channel 2
+ database by setting `AUTO_DEVOPS_POSTGRES_DELETE_V1` to a non-empty value and
+ redeploying.
+
+ WARNING:
+ Deleting the channel 1 PostgreSQL database permanently deletes the existing
+ channel 1 database and all its data. See
+ [Upgrading PostgreSQL](upgrading_postgresql.md)
+ for more information on backing up and upgrading your database.
+
+- If you are not using the in-cluster database, you can set
+ `POSTGRES_ENABLED` to `false` and re-deploy. This option is especially relevant to
+ users of *custom charts without the in-chart PostgreSQL dependency*.
+ Database auto-detection is based on the `postgresql.enabled` Helm value for
+ your release. This value is set based on the `POSTGRES_ENABLED` CI variable
+ and persisted by Helm, regardless of whether or not your chart uses the
+ variable.
+
+WARNING:
+Setting `POSTGRES_ENABLED` to `false` permanently deletes any existing
+channel 1 database for your environment.
+
+## Error: unable to recognize "": no matches for kind "Deployment" in version "extensions/v1beta1"
+
+After upgrading your Kubernetes cluster to [v1.16+](stages.md#kubernetes-116),
+you may encounter this message when deploying with Auto DevOps:
+
+```plaintext
+UPGRADE FAILED
+Error: failed decoding reader into objects: unable to recognize "": no matches for kind "Deployment" in version "extensions/v1beta1"
+```
+
+This can occur if your current deployments on the environment namespace were deployed with a
+deprecated/removed API that doesn't exist in Kubernetes v1.16+. For example,
+if [your in-cluster PostgreSQL was installed in a legacy way](#detected-an-existing-postgresql-database),
+the resource was created via the `extensions/v1beta1` API. However, the deployment resource
+was moved to the `app/v1` API in v1.16.
+
+To recover such outdated resources, you must convert the current deployments by mapping legacy APIs
+to newer APIs. There is a helper tool called [`mapkubeapis`](https://github.com/hickeyma/helm-mapkubeapis)
+that works for this problem. Follow these steps to use the tool in Auto DevOps:
+
+1. Modify your `.gitlab-ci.yml` with:
+
+ ```yaml
+ include:
+ - template: Auto-DevOps.gitlab-ci.yml
+ - remote: https://gitlab.com/shinya.maeda/ci-templates/-/raw/master/map-deprecated-api.gitlab-ci.yml
+
+ variables:
+ HELM_VERSION_FOR_MAPKUBEAPIS: "v2" # If you're using auto-depoy-image v2 or above, please specify "v3".
+ ```
+
+1. Run the job `<environment-name>:map-deprecated-api`. Ensure that this job succeeds before moving
+ to the next step. You should see something like the following output:
+
+ ```shell
+ 2020/10/06 07:20:49 Found deprecated or removed Kubernetes API:
+ "apiVersion: extensions/v1beta1
+ kind: Deployment"
+ Supported API equivalent:
+ "apiVersion: apps/v1
+ kind: Deployment"
+ ```
+
+1. Revert your `.gitlab-ci.yml` to the previous version. You no longer need to include the
+ supplemental template `map-deprecated-api`.
+
+1. Continue the deployments as usual.
+
+## Error: error initializing: Looks like "https://kubernetes-charts.storage.googleapis.com" is not a valid chart repository or cannot be reached
+
+As [announced in the official CNCF blog post](https://www.cncf.io/blog/2020/10/07/important-reminder-for-all-helm-users-stable-incubator-repos-are-deprecated-and-all-images-are-changing-location/),
+the stable Helm chart repository was deprecated and removed on November 13th, 2020.
+You may encounter this error after that date.
+
+Some GitLab features had dependencies on the stable chart. To mitigate the impact, we changed them
+to use new official repositories or the [Helm Stable Archive repository maintained by GitLab](https://gitlab.com/gitlab-org/cluster-integration/helm-stable-archive).
+Auto Deploy contains [an example fix](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/merge_requests/127).
+
+In Auto Deploy, `v1.0.6+` of `auto-deploy-image` no longer adds the deprecated stable repository to
+the `helm` command. If you use a custom chart and it relies on the deprecated stable repository,
+specify an older `auto-deploy-image` like this example:
+
+```yaml
+include:
+ - template: Auto-DevOps.gitlab-ci.yml
+
+.auto-deploy:
+ image: "registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:v1.0.5"
+```
+
+Keep in mind that this approach stops working when the stable repository is removed,
+so you must eventually fix your custom chart.
+
+To fix your custom chart:
+
+1. In your chart directory, update the `repository` value in your `requirements.yaml` file from :
+
+ ```yaml
+ repository: "https://kubernetes-charts.storage.googleapis.com/"
+ ```
+
+ to:
+
+ ```yaml
+ repository: "https://charts.helm.sh/stable"
+ ```
+
+1. In your chart directory, run `helm dep update .` using the same Helm major version as Auto DevOps.
+1. Commit the changes for the `requirements.yaml` file.
+1. If you previously had a `requirements.lock` file, commit the changes to the file.
+ If you did not previously have a `requirements.lock` file in your chart,
+ you do not need to commit the new one. This file is optional, but when present,
+ it's used to verify the integrity of the downloaded dependencies.
+
+You can find more information in
+[issue #263778, "Migrate PostgreSQL from stable Helm repository"](https://gitlab.com/gitlab-org/gitlab/-/issues/263778).
+
+## Error: release .... failed: timed out waiting for the condition
+
+When getting started with Auto DevOps, you may encounter this error when first
+deploying your application:
+
+```plaintext
+INSTALL FAILED
+PURGING CHART
+Error: release staging failed: timed out waiting for the condition
+```
+
+This is most likely caused by a failed liveness (or readiness) probe attempted
+during the deployment process. By default, these probes are run against the root
+page of the deployed application on port 5000. If your application isn't configured
+to serve anything at the root page, or is configured to run on a specific port
+*other* than 5000, this check fails.
+
+If it fails, you should see these failures in the events for the relevant
+Kubernetes namespace. These events look like the following example:
+
+```plaintext
+LAST SEEN TYPE REASON OBJECT MESSAGE
+3m20s Warning Unhealthy pod/staging-85db88dcb6-rxd6g Readiness probe failed: Get http://10.192.0.6:5000/: dial tcp 10.192.0.6:5000: connect: connection refused
+3m32s Warning Unhealthy pod/staging-85db88dcb6-rxd6g Liveness probe failed: Get http://10.192.0.6:5000/: dial tcp 10.192.0.6:5000: connect: connection refused
+```
+
+To change the port used for the liveness checks, pass
+[custom values to the Helm chart](customize.md#customize-values-for-helm-chart)
+used by Auto DevOps:
+
+1. Create a directory and file at the root of your repository named `.gitlab/auto-deploy-values.yaml`.
+
+1. Populate the file with the following content, replacing the port values with
+ the actual port number your application is configured to use:
+
+ ```yaml
+ service:
+ internalPort: <port_value>
+ externalPort: <port_value>
+ ```
+
+1. Commit your changes.
+
+After committing your changes, subsequent probes should use the newly-defined ports.
+The page that's probed can also be changed by overriding the `livenessProbe.path`
+and `readinessProbe.path` values (shown in the
+[default `values.yaml`](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/blob/master/assets/auto-deploy-app/values.yaml)
+file) in the same fashion.
diff --git a/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md b/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
index 5f8dfcdfc05..1fff935880c 100644
--- a/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
+++ b/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
@@ -114,7 +114,7 @@ If your Auto DevOps project has an active environment that was deployed with the
job saves a backup for 1 week in a job artifact called `helm-2-release-backups`.
The backup is in a Kubernetes manifest file that can be restored using
`kubectl apply -f $backup`.
-1. Remove the `MIGRATE_HELM_2TO3` variable.
+1. Remove the `MIGRATE_HELM_2TO3` CI/CD variable.
#### In-Cluster PostgreSQL Channel 2
@@ -145,11 +145,11 @@ steps to upgrade to v2:
them to `production` first to delete the unstable tracks.
1. Verify your project is [using the v2 `auto-deploy-image`](#verify-dependency-versions).
If not, [specify the version](#use-a-specific-version-of-auto-deploy-dependencies).
-1. Add an `AUTO_DEVOPS_FORCE_DEPLOY_V2` environment variable with a value of `true`
+1. Add an `AUTO_DEVOPS_FORCE_DEPLOY_V2` CI/CD variable with a value of `true`
in the GitLab CI/CD settings.
1. Create a new pipeline and run the `production` job to renew the resource architecture
with the v2 `auto-deploy-app chart`.
-1. Remove the `AUTO_DEVOPS_FORCE_DEPLOY_V2` environment variable.
+1. Remove the `AUTO_DEVOPS_FORCE_DEPLOY_V2` variable.
### Use a specific version of Auto Deploy dependencies
@@ -167,7 +167,7 @@ include:
### Ignore warnings and continue deploying
If you are certain that the new chart version is safe to be deployed, you can add
-the `AUTO_DEVOPS_FORCE_DEPLOY_V<major-version-number>` [environment variable](customize.md#build-and-deployment)
+the `AUTO_DEVOPS_FORCE_DEPLOY_V<major-version-number>` [CI/CD variable](customize.md#build-and-deployment)
to force the deployment to continue.
For example, if you want to deploy the `v2.0.0` chart on a deployment that previously
diff --git a/doc/topics/autodevops/upgrading_postgresql.md b/doc/topics/autodevops/upgrading_postgresql.md
index a0c4a41f90d..9a15475703a 100644
--- a/doc/topics/autodevops/upgrading_postgresql.md
+++ b/doc/topics/autodevops/upgrading_postgresql.md
@@ -34,7 +34,7 @@ involves:
so that the in-cluster database does not get modified after the database dump is created.
1. Ensure you have not set `POSTGRES_ENABLED` to `false`, as this setting deletes
any existing channel 1 database. For more information, see
- [Detected an existing PostgreSQL database](index.md#detected-an-existing-postgresql-database).
+ [Detected an existing PostgreSQL database](troubleshooting.md#detected-an-existing-postgresql-database).
NOTE:
If you have configured Auto DevOps to have staging,
diff --git a/doc/topics/git/index.md b/doc/topics/git/index.md
index 52e8a42de76..d6e1dcf0998 100644
--- a/doc/topics/git/index.md
+++ b/doc/topics/git/index.md
@@ -14,7 +14,7 @@ large projects with speed and efficiency.
[GitLab](https://about.gitlab.com) is a Git-based fully integrated platform for
software development. Besides Git's functionalities, GitLab has a lot of
powerful [features](https://about.gitlab.com/features/) to enhance your
-[workflow](https://about.gitlab.com/blog/2016/10/25/gitlab-workflow-an-overview/).
+[workflow](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/).
We've gathered some resources to help you to get the best from Git with GitLab.
@@ -42,7 +42,7 @@ The following resources will help you get started with Git:
- [Git stash](../../university/training/topics/stash.md)
- [Git file blame](../../user/project/repository/git_blame.md)
- [Git file history](../../user/project/repository/git_history.md)
-- [Git tags](../../university/training/user_training.md#tags)
+- [Git tags](tags.md)
### Concepts
diff --git a/doc/topics/git/numerous_undo_possibilities_in_git/index.md b/doc/topics/git/numerous_undo_possibilities_in_git/index.md
index c263609125f..76fc9bc92b0 100644
--- a/doc/topics/git/numerous_undo_possibilities_in_git/index.md
+++ b/doc/topics/git/numerous_undo_possibilities_in_git/index.md
@@ -64,7 +64,7 @@ To avoid chaos with
development workflows have to be followed. It depends on your internal
workflow how certain changes or commits can be undone or changed.
-[GitLab Flow](https://about.gitlab.com/blog/2014/09/29/gitlab-flow/) provides a good
+[GitLab Flow](https://about.gitlab.com/topics/version-control/what-is-gitlab-flow/) provides a good
balance between developers clashing with each other while
developing the same feature and cooperating seamlessly. However, it does not enable
joined development of the same feature by multiple developers by default.
diff --git a/doc/topics/git/tags.md b/doc/topics/git/tags.md
new file mode 100644
index 00000000000..76e3cff3edc
--- /dev/null
+++ b/doc/topics/git/tags.md
@@ -0,0 +1,41 @@
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Tags
+
+Tags are useful for marking certain deployments and releases for later
+reference. Git supports two types of tags:
+
+- Annotated tags: An unchangeable part of Git history.
+- Lightweight (soft) tags: Tags that can be set and removed as needed.
+
+Many projects combine an annotated release tag with a stable branch. Consider
+setting deployment or release tags automatically.
+
+## Tags sample workflow
+
+1. Create a lightweight tag.
+1. Create an annotated tag.
+1. Push the tags to the remote repository.
+
+```shell
+git checkout master
+
+# Lightweight tag
+git tag my_lightweight_tag
+
+# Annotated tag
+git tag -a v1.0 -m ‘Version 1.0’
+
+# Show list of the existing tags
+git tag
+
+git push origin --tags
+```
+
+## Additional resources
+
+- [Tagging](https://git-scm.com/book/en/v2/Git-Basics-Tagging) Git reference page
diff --git a/doc/topics/git/troubleshooting_git.md b/doc/topics/git/troubleshooting_git.md
index 528a9a4ba00..be4903e2cb9 100644
--- a/doc/topics/git/troubleshooting_git.md
+++ b/doc/topics/git/troubleshooting_git.md
@@ -45,7 +45,7 @@ set to 50MB. The default is 1MB.
**If pushing over SSH**, first check your SSH configuration as 'Broken pipe'
errors can sometimes be caused by underlying issues with SSH (such as
authentication). Make sure that SSH is correctly configured by following the
-instructions in the [SSH troubleshooting](../../ssh/README.md#troubleshooting) documentation.
+instructions in the [SSH troubleshooting](../../ssh/README.md#troubleshooting-ssh-connections) documentation.
If you're a GitLab administrator and have access to the server, you can also prevent
session timeouts by configuring SSH `keep alive` either on the client or on the server.
diff --git a/doc/university/index.md b/doc/university/index.md
index 8b6c2d834f9..0d194c7708d 100644
--- a/doc/university/index.md
+++ b/doc/university/index.md
@@ -55,7 +55,7 @@ The GitLab University curriculum is composed of GitLab videos, screencasts, pres
1. [Creating a Project in GitLab - Video](https://www.youtube.com/watch?v=7p0hrpNaJ14)
1. [How to Create Files and Directories](https://about.gitlab.com/blog/2016/02/10/feature-highlight-create-files-and-directories-from-files-page/)
1. [GitLab To-Do List](https://about.gitlab.com/blog/2016/03/02/gitlab-todos-feature-highlight/)
-1. [GitLab Work in Progress (WIP) Flag](https://about.gitlab.com/blog/2016/01/08/feature-highlight-wip/)
+1. [GitLab Draft Flag](https://about.gitlab.com/blog/2016/01/08/feature-highlight-wip/)
### 1.5. Migrating from other Source Control
@@ -120,7 +120,7 @@ The GitLab University curriculum is composed of GitLab videos, screencasts, pres
1. [GitLab and Docker - Video](https://www.youtube.com/watch?v=ugOrCcbdHko&index=12&list=PLFGfElNsQthbQu_IWlNOxul0TbS_2JH-e)
1. [How we scale GitLab with built in Docker](https://about.gitlab.com/blog/2016/06/21/how-we-scale-gitlab-by-having-docker-built-in/)
1. [Continuous Integration, Delivery, and Deployment with GitLab](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/)
-1. [Deployments and Environments](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/)
+1. [Deployments and Environments](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/)
1. [Sequential, Parallel or Custom Pipelines](https://about.gitlab.com/blog/2016/07/29/the-basics-of-gitlab-ci/)
1. [Setting up GitLab Runner For Continuous Integration](https://about.gitlab.com/blog/2016/03/01/gitlab-runner-with-docker/)
1. [Setting up GitLab Runner on DigitalOcean](https://about.gitlab.com/blog/2016/04/19/how-to-set-up-gitlab-runner-on-digitalocean/)
@@ -134,7 +134,7 @@ The GitLab University curriculum is composed of GitLab videos, screencasts, pres
1. [GitLab Flow - Video](https://youtu.be/enMumwvLAug?list=PLFGfElNsQthZnwMUFi6rqkyUZkI00OxIV)
1. [GitLab Flow vs Forking in GitLab - Video](https://www.youtube.com/watch?v=UGotqAUACZA)
-1. [GitLab Flow Overview](https://about.gitlab.com/blog/2014/09/29/gitlab-flow/)
+1. [GitLab Flow Overview](https://about.gitlab.com/topics/version-control/what-is-gitlab-flow/)
1. [Always Start with an Issue](https://about.gitlab.com/blog/2016/03/03/start-with-an-issue/)
1. [GitLab Flow Documentation](../topics/gitlab_flow.md)
diff --git a/doc/university/training/index.md b/doc/university/training/index.md
index 13cf4184560..f69bd51b341 100644
--- a/doc/university/training/index.md
+++ b/doc/university/training/index.md
@@ -34,7 +34,6 @@ This section contains the following topics:
- [Merge conflicts](topics/merge_conflicts.md).
- [Rollback commits](topics/rollback_commits.md).
- [Subtree](topics/subtree.md).
-- [Tags](topics/tags.md).
- [Unstage](topics/unstage.md).
## Additional Resources
diff --git a/doc/university/training/topics/tags.md b/doc/university/training/topics/tags.md
index ca438e04a55..bb2e3e9b208 100644
--- a/doc/university/training/topics/tags.md
+++ b/doc/university/training/topics/tags.md
@@ -1,52 +1,8 @@
---
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-comments: false
-type: reference
+redirect_to: '../../../topics/git/tags.md'
---
-# Tags
+This document was moved to [another location](../../../topics/git/tags.md).
-- Useful for marking deployments and releases
-- Annotated tags are an unchangeable part of Git history
-- Soft/lightweight tags can be set and removed at will
-- Many projects combine an annotated release tag with a stable branch
-- Consider setting deployment/release tags automatically
-
-## Tags sample workflow
-
-- Create a lightweight tag
-- Create an annotated tag
-- Push the tags to the remote repository
-
-```shell
-git checkout master
-
-# Lightweight tag
-git tag my_lightweight_tag
-
-# Annotated tag
-git tag -a v1.0 -m ‘Version 1.0’
-
-# Show list of the existing tags
-git tag
-
-git push origin --tags
-```
-
-**Additional resources**
-
-<https://git-scm.com/book/en/Git-Basics-Tagging>
-
-<!-- ## Troubleshooting
-
-Include any troubleshooting steps that you can foresee. If you know beforehand what issues
-one might have when setting this up, or when something is changed, or on upgrading, it's
-important to describe those, too. Think of things that may go wrong and include them here.
-This is important to minimize requests for support, and to avoid doc comments with
-questions that you know someone might ask.
-
-Each scenario can be a third-level heading, e.g. `### Getting error message X`.
-If you have none to add when creating a doc, leave this section in place
-but commented out to help encourage others to add to it in the future. -->
+<!-- This redirect file can be deleted after <YYYY-MM-DD>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/update/index.md b/doc/update/index.md
index a07a6f4b0b7..9871d0aba2c 100644
--- a/doc/update/index.md
+++ b/doc/update/index.md
@@ -138,6 +138,33 @@ pending_job_classes = scheduled_queue.select { |job| job["class"] == "Background
pending_job_classes.each { |job_class| Gitlab::BackgroundMigration.steal(job_class) }
```
+## Checking for pending Elasticsearch migrations
+
+This section is only applicable if you have enabled the [Elasticsearch
+integration](../integration/elasticsearch.md).
+
+Certain major releases might require [Elasticsearch
+migrations](../integration/elasticsearch.md#background-migrations) to be
+finished. You can find pending migrations by running the following command:
+
+**For Omnibus installations**
+
+```shell
+sudo gitlab-rake gitlab:elastic:list_pending_migrations
+```
+
+**For installations from source**
+
+```shell
+cd /home/git/gitlab
+sudo -u git -H bundle exec rake gitlab:elastic:list_pending_migrations
+```
+
+### What do I do if my Elasticsearch migrations are stuck?
+
+See [how to retry a halted
+migration](../integration/elasticsearch.md#retry-a-halted-migration).
+
## Upgrade paths
Although you can generally upgrade through multiple GitLab versions in one go,
@@ -147,7 +174,7 @@ Find where your version sits in the upgrade path below, and upgrade GitLab
accordingly, while also consulting the
[version-specific upgrade instructions](#version-specific-upgrading-instructions):
-`8.11.x` -> `8.12.0` -> `8.17.7` -> `9.5.10` -> `10.8.7` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` -> `13.0.14` -> `13.1.11` - > `13.x (latest)`
+`8.11.Z` -> `8.12.0` -> `8.17.7` -> `9.5.10` -> `10.8.7` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` -> `13.0.14` -> `13.1.11` - > [latest `13.Y.Z`](https://about.gitlab.com/releases/categories/releases/)
The following table, while not exhaustive, shows some examples of the supported
upgrade paths.
@@ -174,7 +201,7 @@ Identify a [supported upgrade path](#upgrade-paths).
More significant migrations may occur during major release upgrades. To ensure these are successful:
-1. Increment to the first minor version (`x.0.x`) during the major version jump.
+1. Increment to the first minor version (`X.0.Z`) during the major version jump.
1. Proceed with upgrading to a newer release.
It's also important to ensure that any background migrations have been fully completed
@@ -235,7 +262,7 @@ which is the latest patch release of 9.4. When GitLab 9.5.0 is released this
installation can be safely upgraded to 9.5.0 without requiring downtime if the
requirements mentioned above are met. You can also skip 9.5.0 and upgrade to
9.5.1 after it's released, but you **can not** upgrade straight to 9.6.0; you
-_have_ to first upgrade to a 9.5.x release.
+_have_ to first upgrade to a 9.5.Z release.
**Example 2:** You are running a large GitLab installation using version 9.4.2,
which is the latest patch release of 9.4. GitLab 9.5 includes some background
@@ -243,7 +270,7 @@ migrations, and 10.0 will require these to be completed (processing any
remaining jobs for you). Skipping 9.5 is not possible without downtime, and due
to the background migrations would require potentially hours of downtime
depending on how long it takes for the background migrations to complete. To
-work around this you will have to upgrade to 9.5.x first, then wait at least a
+work around this you will have to upgrade to 9.5.Z first, then wait at least a
week before upgrading to 10.0.
**Example 3:** You use MySQL as the database for GitLab. Any upgrade to a new
@@ -361,9 +388,9 @@ with the older Rails version - which could cause non-GET requests to
fail for [multi-node GitLab installations](https://docs.gitlab.com/omnibus/update/#multi-node--ha-deployment).
So, if you are using multiple Rails servers and specifically upgrading from 13.0,
-all servers must first be upgraded to 13.1.X before upgrading to 13.2.0 or later:
+all servers must first be upgraded to 13.1.Z before upgrading to 13.2.0 or later:
-1. Ensure all GitLab web nodes are on GitLab 13.1.X.
+1. Ensure all GitLab web nodes are on GitLab 13.1.Z.
1. Optionally, enable the `global_csrf_token` feature flag to enable new
method of CSRF token generation:
@@ -383,33 +410,33 @@ any downgrades would result to all sessions being invalidated and users are logg
### 12.1.0
-If you are planning to upgrade from `12.0.x` to `12.10.x`, it is necessary to
-perform an intermediary upgrade to `12.1.x` before upgrading to `12.10.x` to
+If you are planning to upgrade from `12.0.Z` to `12.10.Z`, it is necessary to
+perform an intermediary upgrade to `12.1.Z` before upgrading to `12.10.Z` to
avoid issues like [#215141](https://gitlab.com/gitlab-org/gitlab/-/issues/215141).
### 12.0.0
In 12.0.0 we made various database related changes. These changes require that
-users first upgrade to the latest 11.11 patch release. After upgraded to 11.11.x,
-users can upgrade to 12.0.x. Failure to do so may result in database migrations
+users first upgrade to the latest 11.11 patch release. After upgraded to 11.11.Z,
+users can upgrade to 12.0.Z. Failure to do so may result in database migrations
not being applied, which could lead to application errors.
-It is also required that you upgrade to 12.0.x before moving to a later version
-of 12.x.
+It is also required that you upgrade to 12.0.Z before moving to a later version
+of 12.Y.
Example 1: you are currently using GitLab 11.11.8, which is the latest patch
-release for 11.11.x. You can upgrade as usual to 12.0.x.
+release for 11.11.Z. You can upgrade as usual to 12.0.Z.
-Example 2: you are currently using a version of GitLab 10.x. To upgrade, first
-upgrade to the last 10.x release (10.8.7) then the last 11.x release (11.11.8).
-After upgraded to 11.11.8 you can safely upgrade to 12.0.x.
+Example 2: you are currently using a version of GitLab 10.Y. To upgrade, first
+upgrade to the last 10.Y release (10.8.7) then the last 11.Y release (11.11.8).
+After upgraded to 11.11.8 you can safely upgrade to 12.0.Z.
See our [documentation on upgrade paths](../policy/maintenance.md#upgrade-recommendations)
for more information.
### Upgrades from versions earlier than 8.12
-- `8.11.x` and earlier: you might have to upgrade to `8.12.0` specifically before you can upgrade to `8.17.7`. This was [reported in an issue](https://gitlab.com/gitlab-org/gitlab/-/issues/207259).
+- `8.11.Z` and earlier: you might have to upgrade to `8.12.0` specifically before you can upgrade to `8.17.7`. This was [reported in an issue](https://gitlab.com/gitlab-org/gitlab/-/issues/207259).
- [CI changes prior to version 8.0](https://docs.gitlab.com/omnibus/update/README.html#updating-gitlab-ci-from-prior-540-to-version-714-via-omnibus-gitlab)
when it was merged into GitLab.
diff --git a/doc/user/admin_area/analytics/usage_trends.md b/doc/user/admin_area/analytics/usage_trends.md
index 0c0cae09c16..38cd2dee4e9 100644
--- a/doc/user/admin_area/analytics/usage_trends.md
+++ b/doc/user/admin_area/analytics/usage_trends.md
@@ -40,22 +40,3 @@ in the categories shown in [Total counts](#total-counts).
These charts help you visualize how rapidly these records are being created on your instance.
![Instance Activity Pipelines chart](img/instance_activity_pipelines_chart_v13_6.png)
-
-### Enable or disable Usage Trends
-
-In GitLab version 13.5 only, Usage Trends was under development and not ready for production use.
-It was deployed behind a feature flag that was **disabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
-can opt to enable it.
-
-To enable it:
-
-```ruby
-Feature.enable(:instance_statistics)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:instance_statistics)
-```
diff --git a/doc/user/admin_area/approving_users.md b/doc/user/admin_area/approving_users.md
index af4d4e86e69..9141d7f488d 100644
--- a/doc/user/admin_area/approving_users.md
+++ b/doc/user/admin_area/approving_users.md
@@ -7,30 +7,49 @@ type: howto
# Users pending approval
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4491) in GitLab 13.5.
+A user in _pending approval_ state requires action by an administrator. A user sign up can be in a
+pending approval state because an administrator has enabled either, or both, of the following
+options:
-When [Require admin approval for new sign-ups](settings/sign_up_restrictions.md#require-administrator-approval-for-new-sign-ups) is enabled, any user that signs up for an account using the registration form is placed under a **Pending approval** state.
+- [Require admin approval for new sign-ups](settings/sign_up_restrictions.md#require-administrator-approval-for-new-sign-ups) setting.
+- [User cap](settings/sign_up_restrictions.md#user-cap).
-A user pending approval is functionally identical to a [blocked](blocking_unblocking_users.md) user.
+When a user registers for an account while this setting is enabled:
+
+- The user is placed in a **Pending approval** state.
+- The user sees a message telling them their account is awaiting approval by an administrator.
A user pending approval:
-- Will not be able to sign in.
-- Cannot access Git repositories or the API.
-- Will not receive any notifications from GitLab.
+- Is functionally identical to a [blocked](blocking_unblocking_users.md) user.
+- Cannot sign in.
+- Cannot access Git repositories or the GitLab API.
+- Does not receive any notifications from GitLab.
- Does not consume a [seat](../../subscriptions/self_managed/index.md#billable-users).
-## Approving a user
+An administrator must [approve their sign up](#approve-or-reject-a-user-sign-up) to allow them to
+sign in.
+
+## View user sign ups pending approval
+
+To view user sign ups pending approval:
+
+1. Go to **Admin Area > Overview > Users**.
+1. Select the **Pending approval** tab.
+
+## Approve or reject a user sign up
+
+A user sign up pending approval can be approved or rejected from the Admin Area.
-A user that is pending approval can be approved from the Admin Area. To do this:
+To approve or reject a user sign up:
-1. Navigate to **Admin Area > Overview > Users**.
-1. Click on the **Pending approval** tab.
-1. Select a user.
-1. Under the **Account** tab, click **Approve user**.
+1. Go to **Admin Area > Overview > Users**.
+1. Select the **Pending approval** tab.
+1. In the user's row select settings (**{settings}**).
+1. Select **Approve** or **Reject**.
Approving a user:
-1. Activates their account.
-1. Changes the user's state to active and it consumes a
-[seat](../../subscriptions/self_managed/index.md#billable-users).
+- Activates their account.
+- Changes the user's state to active.
+- Consumes a subscription [seat](../../subscriptions/self_managed/index.md#billable-users).
diff --git a/doc/user/admin_area/credentials_inventory.md b/doc/user/admin_area/credentials_inventory.md
index 02659276b53..3d8a3a7c8c7 100644
--- a/doc/user/admin_area/credentials_inventory.md
+++ b/doc/user/admin_area/credentials_inventory.md
@@ -31,7 +31,7 @@ The following is an example of the Credentials inventory page:
If you see a **Revoke** button, you can revoke that user's PAT. Whether you see a **Revoke** button depends on the token state, and if an expiration date has been set. For more information, see the following table:
-| Token state | [Token expiry enforced?](settings/account_and_limit_settings.md#optional-enforcement-of-personal-access-token-expiry) | Show Revoke button? | Comments |
+| Token state | [Token expiration enforced?](settings/account_and_limit_settings.md#optional-non-enforcement-of-personal-access-token-expiration) | Show Revoke button? | Comments |
|-------------|------------------------|--------------------|----------------------------------------------------------------------------|
| Active | Yes | Yes | Allows administrators to revoke the PAT, such as for a compromised account |
| Active | No | Yes | Allows administrators to revoke the PAT, such as for a compromised account |
diff --git a/doc/user/admin_area/index.md b/doc/user/admin_area/index.md
index b5e51e8d4c0..14a193322a5 100644
--- a/doc/user/admin_area/index.md
+++ b/doc/user/admin_area/index.md
@@ -33,7 +33,7 @@ The Admin Area is made up of the following sections:
| **{cloud-gear}** Kubernetes | Create and manage instance-level [Kubernetes clusters](../instance/clusters/index.md). |
| **{push-rules}** Push rules **(STARTER ONLY)** | Configure pre-defined Git [push rules](../../push_rules/push_rules.md) for projects. Also, configure [merge requests approvers rules](merge_requests_approvals.md). **(PREMIUM SELF)** |
| **{location-dot}** Geo **(PREMIUM SELF)** | Configure and maintain [Geo nodes](geo_nodes.md). |
-| **{key}** Deploy keys | Create instance-wide [SSH deploy keys](../../ssh/README.md#deploy-keys). |
+| **{key}** Deploy keys | Create instance-wide [SSH deploy keys](../project/deploy_keys/index.md). |
| **{lock}** Credentials **(ULTIMATE SELF)** | View [credentials](credentials_inventory.md) that can be used to access your instance. |
| **{template}** Service Templates | Create [service templates](../project/integrations/services_templates.md) for projects. |
| **{labels}** Labels | Create and maintain [labels](labels.md) for your GitLab instance. |
@@ -157,6 +157,22 @@ All impersonation activities are [captured with audit events](../../administrati
![user impersonation button](img/impersonate_user_button_v13_8.png)
+#### User Permission Export **(PREMIUM SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1772) in GitLab 13.8.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292436) in GitLab 13.9.
+
+An administrator can export user permissions for all users in the GitLab instance from the Admin Area's Users page.
+The export lists direct membership the users have in groups and projects.
+
+The following data is included in the export:
+
+- Username
+- Email
+- Type
+- Path
+- Access level ([Project](../permissions.md#project-members-permissions) and [Group](../permissions.md#group-members-permissions))
+
#### Users statistics
The **Users statistics** page provides an overview of user accounts by role. These statistics are
@@ -187,7 +203,7 @@ sort order is by **Last created**.
To search for groups by name, enter your criteria in the search field. The group search is case
insensitive, and applies partial matching.
-To [Create a new group](../group/index.md#create-a-new-group) click **New group**.
+To [Create a new group](../group/index.md#create-a-group) click **New group**.
### Administering Jobs
diff --git a/doc/user/admin_area/settings/account_and_limit_settings.md b/doc/user/admin_area/settings/account_and_limit_settings.md
index 70416c224c7..25ab4ec173c 100644
--- a/doc/user/admin_area/settings/account_and_limit_settings.md
+++ b/doc/user/admin_area/settings/account_and_limit_settings.md
@@ -180,24 +180,26 @@ Once a lifetime for personal access tokens is set, GitLab:
allowed lifetime. Three hours is given to allow administrators to change the allowed lifetime,
or remove it, before revocation takes place.
-## Enforcement of SSH key expiration **(ULTIMATE SELF)**
+## Optional enforcement of SSH key expiration **(ULTIMATE SELF)**
-GitLab administrators can choose to enforce the expiration of SSH keys after their expiration dates.
-If you enable this feature, this disables all _expired_ SSH keys.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250480) in GitLab 13.9.
-To do this:
+By default, expired SSH keys **can still be used**.
+You can prevent the use of expired SSH keys with the following steps:
1. Navigate to **Admin Area > Settings > General**.
1. Expand the **Account and limit** section.
1. Select the **Enforce SSH key expiration** checkbox.
-## Optional enforcement of Personal Access Token expiry **(ULTIMATE SELF)**
+For more information, see the following issue on [SSH key expiration](https://gitlab.com/gitlab-org/gitlab/-/issues/320970).
+
+## Optional non-enforcement of Personal Access Token expiration **(ULTIMATE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214723) in GitLab Ultimate 13.1.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/296881) in GitLab 13.9.
-GitLab administrators can choose to prevent personal access tokens from expiring
-automatically. The tokens are usable after the expiry date, unless they are revoked explicitly.
+By default, expired personal access tokens (PATs) cannot be used.
+You can allow the use of expired PATs with the following steps:
To do this:
diff --git a/doc/user/admin_area/settings/index.md b/doc/user/admin_area/settings/index.md
index 3377b1674db..cbdc617d7d9 100644
--- a/doc/user/admin_area/settings/index.md
+++ b/doc/user/admin_area/settings/index.md
@@ -35,7 +35,7 @@ Access the default page for admin area settings by navigating to **Admin Area >
| ------ | ----------- |
| [Elasticsearch](../../../integration/elasticsearch.md#enabling-advanced-search) | Elasticsearch integration. Elasticsearch AWS IAM. |
| [Kroki](../../../administration/integration/kroki.md#enable-kroki-in-gitlab) | Allow rendering of diagrams in AsciiDoc and Markdown documents using [kroki.io](https://kroki.io). |
-| [PlantUML](../../../administration/integration/plantuml.md#gitlab) | Allow rendering of PlantUML diagrams in AsciiDoc and Markdown documents. |
+| [PlantUML](../../../administration/integration/plantuml.md) | Allow rendering of PlantUML diagrams in documents. |
| [Slack application](../../../user/project/integrations/gitlab_slack_application.md#configuration) **(FREE SAAS)** | Slack integration allows you to interact with GitLab via slash commands in a chat window. This option is only available on GitLab.com, though it may be [available for self-managed instances in the future](https://gitlab.com/gitlab-org/gitlab/-/issues/28164). |
| [Third party offers](third_party_offers.md) | Control the display of third party offers. |
| [Snowplow](../../../development/snowplow.md) | Configure the Snowplow integration. |
diff --git a/doc/user/admin_area/settings/project_integration_management.md b/doc/user/admin_area/settings/project_integration_management.md
index 18491f92650..0b9f039880a 100644
--- a/doc/user/admin_area/settings/project_integration_management.md
+++ b/doc/user/admin_area/settings/project_integration_management.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Project integration management
+# Project integration management **(FREE)**
Project integrations can be configured and enabled by project administrators. As a GitLab instance
administrator, you can set default configuration parameters for a given integration that all projects
diff --git a/doc/user/admin_area/settings/sign_up_restrictions.md b/doc/user/admin_area/settings/sign_up_restrictions.md
index 0945471b11b..aacea397aaa 100644
--- a/doc/user/admin_area/settings/sign_up_restrictions.md
+++ b/doc/user/admin_area/settings/sign_up_restrictions.md
@@ -30,7 +30,7 @@ To disable sign ups:
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4491) in GitLab 13.5.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/267568) in GitLab 13.6.
-When this setting is enabled, any user visiting your GitLab domain and signing up for a new account must be explicitly [approved](../approving_users.md#approving-a-user) by an administrator before they can start using their account. This setting is enabled by default for newly created instances. This setting is only applicable if sign ups are enabled.
+When this setting is enabled, any user visiting your GitLab domain and signing up for a new account must be explicitly [approved](../approving_users.md#approve-or-reject-a-user-sign-up) by an administrator before they can start using their account. In GitLab 13.6 and later, this setting is enabled by default for new GitLab instances. It is only applicable if sign ups are enabled.
To require administrator approval for new sign ups:
@@ -56,10 +56,48 @@ To enforce confirmation of the email address used for new sign ups:
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292600) in GitLab 13.9.
When the number of billable users reaches the user cap, any user who is added or requests access must be
-[approved](../approving_users.md#approving-a-user) by an administrator before they can start using
+[approved](../approving_users.md#approve-or-reject-a-user-sign-up) by an administrator before they can start using
their account.
-If an administrator increases or removes the user cap, the users in pending approval state are
+If an administrator [increases](#set-the-user-cap-number) or [removes](#remove-the-user-cap) the
+user cap, the users in pending approval state are automatically approved in a background job.
+
+### Enable or disable User cap **(FREE SELF)**
+
+User cap is under development but ready for production use.
+It is deployed behind a feature flag that is **enabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
+can opt to disable it.
+
+To disable it:
+
+```ruby
+Feature.disable(:admin_new_user_signups_cap)
+```
+
+To enable it:
+
+```ruby
+Feature.enable(:admin_new_user_signups_cap)
+```
+
+### Set the user cap number
+
+1. Go to **Admin Area > Settings > General**.
+1. Expand **Sign-up restrictions**.
+1. Enter a number in **User cap**.
+1. Select **Save changes**.
+
+New user sign ups are subject to the user cap restriction.
+
+## Remove the user cap
+
+1. Go to **Admin Area > Settings > General**.
+1. Expand **Sign-up restrictions**.
+1. Remove the number from **User cap**.
+1. Select **Save changes**.
+
+New users sign ups are not subject to the user cap restriction. Users in pending approval state are
automatically approved in a background job.
## Soft email confirmation
diff --git a/doc/user/analytics/img/mr_mean_time_to_merge_metric_v13_9.png b/doc/user/analytics/img/mr_mean_time_to_merge_metric_v13_9.png
new file mode 100644
index 00000000000..ad108dabf73
--- /dev/null
+++ b/doc/user/analytics/img/mr_mean_time_to_merge_metric_v13_9.png
Binary files differ
diff --git a/doc/user/analytics/merge_request_analytics.md b/doc/user/analytics/merge_request_analytics.md
index 3edbe3e8aa4..909eb7e585f 100644
--- a/doc/user/analytics/merge_request_analytics.md
+++ b/doc/user/analytics/merge_request_analytics.md
@@ -39,6 +39,15 @@ Merge Request Analytics could be used when:
The following visualizations and data are available, representing all merge requests that were merged in the given date range.
+### Mean time to merge
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229389) in GitLab 13.9.
+
+The mean time to merge (MTTM) metric shows the average time between when a merge request is created,
+and when it is merged. To view how the MTTM changes over time, compare MTTM across different date ranges.
+
+![Mean time to merge](img/mr_mean_time_to_merge_metric_v13_9.png "Merge Request Analytics - MTTM metric showing the average time it takes from initiating a MR to being merged")
+
### Throughput chart
The throughput chart shows the number of merge requests merged per month.
diff --git a/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_collection_edit_variable.png b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_collection_edit_variable.png
new file mode 100644
index 00000000000..3a2799ecdc1
--- /dev/null
+++ b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_collection_edit_variable.png
Binary files differ
diff --git a/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_environment_edit_variable.png b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_environment_edit_variable.png
new file mode 100644
index 00000000000..656ba7652cd
--- /dev/null
+++ b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_environment_edit_variable.png
Binary files differ
diff --git a/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_request_edit.png b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_request_edit.png
new file mode 100644
index 00000000000..3750af8f455
--- /dev/null
+++ b/doc/user/application_security/api_fuzzing/img/api_fuzzing_postman_request_edit.png
Binary files differ
diff --git a/doc/user/application_security/api_fuzzing/index.md b/doc/user/application_security/api_fuzzing/index.md
index 49311ccc7cd..fcb41b599ae 100644
--- a/doc/user/application_security/api_fuzzing/index.md
+++ b/doc/user/application_security/api_fuzzing/index.md
@@ -25,7 +25,7 @@ you can run fuzz tests as part your CI/CD workflow.
- GraphQL
- Form bodies, JSON, or XML
- One of the following assets to provide APIs to test:
- - OpenAPI v2 API definition
+ - OpenAPI v2 or v3 API definition
- HTTP Archive (HAR) of API requests to test
- Postman Collection v2.0 or v2.1
@@ -54,7 +54,7 @@ changes, other pipelines, or other scanners) during a scan could cause inaccurat
There are three ways to perform scans. See the configuration section for the one you wish to use:
-- [OpenAPI v2 specification](#openapi-specification)
+- [OpenAPI v2 or v3 specification](#openapi-specification)
- [HTTP Archive (HAR)](#http-archive-har)
- [Postman Collection v2.0 or v2.1](#postman-collection)
@@ -64,6 +64,12 @@ Examples of both configurations can be found here:
- [Example HTTP Archive (HAR) project](https://gitlab.com/gitlab-org/security-products/demos/api-fuzzing-example/-/tree/har)
- [Example Postman Collection project](https://gitlab.com/gitlab-org/security-products/demos/api-fuzzing/postman-api-fuzzing-example)
+WARNING:
+GitLab 14.0 will require that you place API fuzzing configuration files (for example,
+`gitlab-api-fuzzing-config.yml`) in your repository's `.gitlab` directory instead of your
+repository's root. You can continue using your existing configuration files as they are, but
+starting in GitLab 14.0, GitLab will not check your repository's root for configuration files.
+
### OpenAPI Specification
The [OpenAPI Specification](https://www.openapis.org/) (formerly the Swagger Specification) is an
@@ -71,6 +77,13 @@ API description format for REST APIs. This section shows you how to configure AP
an OpenAPI specification to provide information about the target API to test. OpenAPI specifications
are provided as a file system resource or URL.
+API fuzzing uses an OpenAPI document to generate the request body. When a request body is required,
+the body generation is limited to these body types:
+
+- `application/x-www-form-urlencoded`
+- `multipart/form-data`
+- `application/json`
+
Follow these steps to configure API fuzzing in GitLab with an OpenAPI specification:
1. To use API fuzzing, you must [include](../../../ci/yaml/README.md#includetemplate)
@@ -100,7 +113,7 @@ Follow these steps to configure API fuzzing in GitLab with an OpenAPI specificat
FUZZAPI_PROFILE: Quick-10
```
-1. Provide the location of the OpenAPI v2 specification. You can provide the specification as a file
+1. Provide the location of the OpenAPI specification. You can provide the specification as a file
or URL. Specify the location by adding the `FUZZAPI_OPENAPI` variable:
```yaml
@@ -327,6 +340,60 @@ WARNING:
the API can, it may also trigger bugs in the API. This includes actions like modifying and deleting
data. Only run fuzzing against a test server.
+#### Postman variables
+
+Postman allows the developer to define placeholders that can be used in different parts of the
+requests. These placeholders are called variables, as explained in [Using variables](https://learning.postman.com/docs/sending-requests/variables/).
+You can use variables to store and reuse values in your requests and scripts. For example, you can
+edit the collection to add variables to the document:
+
+![Edit collection variable tab View](img/api_fuzzing_postman_collection_edit_variable.png)
+
+You can then use the variables in sections such as URL, headers, and others:
+
+![Edit request using variables View](img/api_fuzzing_postman_request_edit.png)
+
+Variables can be defined at different [scopes](https://learning.postman.com/docs/sending-requests/variables/#variable-scopes)
+(for example, Global, Collection, Environment, Local, and Data). In this example, they're defined at
+the Environment scope:
+
+![Edit environment variables View](img/api_fuzzing_postman_environment_edit_variable.png)
+
+When you export a Postman collection, only Postman collection variables are exported into the
+Postman file. For example, Postman does not export environment-scoped variables into the Postman
+file.
+
+By default, the API fuzzer uses the Postman file to resolve Postman variable values. If a JSON file
+is set in a GitLab CI environment variable `FUZZAPI_POSTMAN_COLLECTION_VARIABLES`, then the JSON
+file takes precedence to get Postman variable values.
+
+Although Postman can export environment variables into a JSON file, the format is not compatible
+with the JSON expected by `FUZZAPI_POSTMAN_COLLECTION_VARIABLES`.
+
+Here is an example of using `FUZZAPI_POSTMAN_COLLECTION_VARIABLES`:
+
+```yaml
+include:
+ - template: API-Fuzzing.gitlab-ci.yml
+
+variables:
+ FUZZAPI_PROFILE: Quick-10
+ FUZZAPI_POSTMAN_COLLECTION: postman-collection_serviceA.json
+ FUZZAPI_TARGET_URL: http://test-deployment/
+ FUZZAPI_POSTMAN_COLLECTION_VARIABLES: variable-collection-dictionary.json
+```
+
+The file `variable-collection-dictionary.json` is a JSON document. This JSON is an object with
+key-value pairs for properties. The keys are the variables' names, and the values are the variables'
+values. For example:
+
+ ```json
+ {
+ "base_url": "http://127.0.0.1/",
+ "token": "Token 84816165151"
+ }
+ ```
+
### Authentication
Authentication is handled by providing the authentication token as a header or cookie. You can
@@ -502,6 +569,7 @@ repository's root as `.gitlab-api-fuzzing.yml`.
|[`FUZZAPI_OPENAPI`](#openapi-specification) | OpenAPI specification file or URL. |
|[`FUZZAPI_HAR`](#http-archive-har) | HTTP Archive (HAR) file. |
|[`FUZZAPI_POSTMAN_COLLECTION`](#postman-collection) | Postman Collection file. |
+|[`FUZZAPI_POSTMAN_COLLECTION_VARIABLES`](#postman-variables) | Path to a JSON file to extract postman variable values. |
|[`FUZZAPI_OVERRIDES_FILE`](#overrides) | Path to a JSON file containing overrides. |
|[`FUZZAPI_OVERRIDES_ENV`](#overrides) | JSON string containing headers to override. |
|[`FUZZAPI_OVERRIDES_CMD`](#overrides) | Overrides command. |
@@ -523,11 +591,19 @@ repository's root as `.gitlab-api-fuzzing.yml`.
### Overrides
-API Fuzzing provides a method to add or override headers and cookies for all outbound HTTP requests.
+API Fuzzing provides a method to add or override specific items in your request, for example:
+
+- Headers
+- Cookies
+- Query string
+- Form data
+- JSON nodes
+- XML nodes
+
You can use this to inject semantic version headers, authentication, and so on. The
[authentication section](#authentication) includes examples of using overrides for that purpose.
-Overrides use a JSON document to define the headers and cookies:
+Overrides use a JSON document, where each type of override is represented by a JSON object:
```json
{
@@ -538,6 +614,22 @@ Overrides use a JSON document to define the headers and cookies:
"cookies": {
"cookie1": "value",
"cookie2": "value"
+ },
+ "query": {
+ "query-string1": "value",
+ "query-string2": "value"
+ },
+ "body-form": {
+ "form-param1": "value",
+ "form-param1": "value",
+ },
+ "body-json": {
+ "json-path1": "value",
+ "json-path2": "value",
+ },
+ "body-xml" : {
+ "xpath1": "value",
+ "xpath2": "value",
}
}
```
@@ -565,7 +657,94 @@ Example of setting both a header and cookie:
}
```
-You can provide this JSON document as a file or CI/CD variable. You may also provide a command
+Example usage for setting a `body-form` override:
+
+```json
+{
+ "body-form": {
+ "username": "john.doe"
+ }
+}
+```
+
+The override engine uses `body-form` when the request body has only form-data content.
+
+Example usage for setting a `body-json` override:
+
+```json
+{
+ "body-json": {
+ "$.credentials.access-token": "iddqd!42.$"
+ }
+}
+```
+
+Note that each JSON property name in the object `body-json` is set to a [JSON Path](https://goessner.net/articles/JsonPath/)
+expression. The JSON Path expression `$.credentials.access-token` identifies the node to be
+overridden with the value `iddqd!42.$`. The override engine uses `body-json` when the request body
+has only [JSON](https://www.json.org/json-en.html) content.
+
+For example, if the body is set to the following JSON:
+
+```json
+{
+ "credentials" : {
+ "username" :"john.doe",
+ "access-token" : "non-valid-password"
+ }
+}
+```
+
+It is changed to:
+
+```json
+{
+ "credentials" : {
+ "username" :"john.doe",
+ "access-token" : "iddqd!42.$"
+ }
+}
+```
+
+Here's an example for setting a `body-xml` override. The first entry overrides an XML attribute and
+the second entry overrides an XML element:
+
+```json
+{
+ "body-xml" : {
+ "/credentials/@isEnabled": "true",
+ "/credentials/access-token/text()" : "iddqd!42.$"
+ }
+}
+```
+
+Note that each JSON property name in the object `body-xml` is set to an
+[XPath v2](https://www.w3.org/TR/xpath20/)
+expression. The XPath expression `/credentials/@isEnabled` identifies the attribute node to override
+with the value `true`. The XPath expression `/credentials/access-token/text()` identifies the
+element node to override with the value `iddqd!42.$`. The override engine uses `body-xml` when the
+request body has only [XML](https://www.w3.org/XML/)
+content.
+
+For example, if the body is set to the following XML:
+
+```xml
+<credentials isEnabled="false">
+ <username>john.doe</username>
+ <access-token>non-valid-password</access-token>
+</credentials>
+```
+
+It is changed to:
+
+```xml
+<credentials isEnabled="true">
+ <username>john.doe</username>
+ <access-token>iddqd!42.$</access-token>
+</credentials>
+```
+
+You can provide this JSON document as a file or environment variable. You may also provide a command
to generate the JSON document. The command can run at intervals to support values that expire.
#### Using a file
diff --git a/doc/user/application_security/configuration/index.md b/doc/user/application_security/configuration/index.md
index fe21fdc1f15..c6584054894 100644
--- a/doc/user/application_security/configuration/index.md
+++ b/doc/user/application_security/configuration/index.md
@@ -5,14 +5,22 @@ group: Static Analysis
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Security Configuration **(ULTIMATE)**
+# Security Configuration **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20711) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.6.
-> - SAST configuration was [enabled](https://gitlab.com/groups/gitlab-org/-/epics/3659) in 13.3 and [improved](https://gitlab.com/gitlab-org/gitlab/-/issues/232862) in 13.4.
-> - DAST Profiles feature was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40474) in 13.4.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20711) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.6. **(ULTIMATE)**
+> - SAST configuration was [enabled](https://gitlab.com/groups/gitlab-org/-/epics/3659) in 13.3 and [improved](https://gitlab.com/gitlab-org/gitlab/-/issues/232862) in 13.4. **(ULTIMATE)**
+> - DAST Profiles feature was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40474) in 13.4. **(ULTIMATE)**
+> - A simplified version was made [available in all tiers](https://gitlab.com/gitlab-org/gitlab/-/issues/294076) in GitLab 13.9. **(FREE)**
+> - It's [deployed behind a feature flag](../../feature_flags.md), disabled by default.
+> - It's enabled on GitLab.com.
+> - It's recommended for production use.
+> - For GitLab self-managed instances, GitLab administrators can opt to [enable it](#enable-or-disable-security-configuration). **(FREE SELF)**
+> - It can be enabled or disabled for a single project.
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
-The Security Configuration page displays the configuration state of each security control in the
-current project.
+The Security Configuration page displays what security scans are available, links to documentation and also simple enablement tools for the current project.
To view a project's security configuration, go to the project's home page,
then in the left sidebar go to **Security & Compliance > Configuration**.
@@ -20,10 +28,11 @@ then in the left sidebar go to **Security & Compliance > Configuration**.
For each security control the page displays:
- **Security Control:** Name, description, and a documentation link.
-- **Status:** The security control's status (enabled, not enabled, or available).
- **Manage:** A management option or a documentation link.
-## Status
+## Status **(ULTIMATE)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20711) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.6.
The status of each security control is determined by the project's latest default branch
[CI pipeline](../../../ci/pipelines/index.md).
@@ -35,7 +44,7 @@ all security features are configured by default.
For SAST, click **View history** to see the `.gitlab-ci.yml` file's history.
-## Manage
+## Manage **(ULTIMATE)**
You can configure the following security controls:
@@ -45,3 +54,25 @@ You can configure the following security controls:
- Click either **Enable** or **Configure** to use SAST for the current project. For more details, see [Configure SAST in the UI](../sast/index.md#configure-sast-in-the-ui).
- DAST Profiles
- Click **Manage** to manage the available DAST profiles used for on-demand scans. For more details, see [DAST on-demand scans](../dast/index.md#on-demand-scans).
+
+### Enable or disable Security Configuration **(FREE SELF)**
+
+Security Configuration is under development but ready for production use.
+It is deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
+can opt to enable it.
+
+NOTE:
+This does not apply to GitLab Ultimate.
+
+To enable it:
+
+```ruby
+Feature.enable(:secure_security_and_compliance_configuration_page_on_ce, Project.find(<project id>))
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:secure_security_and_compliance_configuration_page_on_ce, Project.find(<project id>))
+```
diff --git a/doc/user/application_security/container_scanning/index.md b/doc/user/application_security/container_scanning/index.md
index 6eec1418ef0..98aea2f6642 100644
--- a/doc/user/application_security/container_scanning/index.md
+++ b/doc/user/application_security/container_scanning/index.md
@@ -32,7 +32,7 @@ To integrate security scanners other than Clair and Klar into GitLab, see
You can enable container scanning by doing one of the following:
- [Include the CI job](#configuration) in your existing `.gitlab-ci.yml` file.
-- Implicitly use [Auto Container Scanning](../../../topics/autodevops/stages.md#auto-container-scanning)
+- Implicitly use [Auto Container Scanning](../../../topics/autodevops/stages.md#auto-container-scanning),
provided by [Auto DevOps](../../../topics/autodevops/index.md).
GitLab compares the found vulnerabilities between the source and target branches, and shows the
diff --git a/doc/user/application_security/dast/index.md b/doc/user/application_security/dast/index.md
index 3950c856b40..0cd7cb95f26 100644
--- a/doc/user/application_security/dast/index.md
+++ b/doc/user/application_security/dast/index.md
@@ -24,10 +24,13 @@ organization.
If you're using [GitLab CI/CD](../../../ci/README.md), you can analyze your running web applications
for known vulnerabilities using Dynamic Application Security Testing (DAST).
-You can take advantage of DAST by either [including the CI job](#configuration) in
-your existing `.gitlab-ci.yml` file or by implicitly using
-[Auto DAST](../../../topics/autodevops/stages.md#auto-dast),
-provided by [Auto DevOps](../../../topics/autodevops/index.md).
+You can take advantage of DAST by either:
+
+- [Including the CI job](#configuration) in
+ your existing `.gitlab-ci.yml` file.
+- Implicitly using
+ [Auto DAST](../../../topics/autodevops/stages.md#auto-dast),
+ provided by [Auto DevOps](../../../topics/autodevops/index.md).
GitLab checks the DAST report, compares the found vulnerabilities between the source and target
branches, and shows the information on the merge request.
diff --git a/doc/user/application_security/dependency_scanning/index.md b/doc/user/application_security/dependency_scanning/index.md
index 11d27140e42..eab490d3800 100644
--- a/doc/user/application_security/dependency_scanning/index.md
+++ b/doc/user/application_security/dependency_scanning/index.md
@@ -19,10 +19,13 @@ vulnerable. You can then take action to protect your application.
If you're using [GitLab CI/CD](../../../ci/README.md), you can use dependency scanning to analyze
your dependencies for known vulnerabilities. GitLab scans all dependencies, including transitive
dependencies (also known as nested dependencies). You can take advantage of dependency scanning by
-either [including the dependency scanning template](#configuration)
-in your existing `.gitlab-ci.yml` file, or by implicitly using
-the [auto dependency scanning](../../../topics/autodevops/stages.md#auto-dependency-scanning)
-provided by [Auto DevOps](../../../topics/autodevops/index.md).
+either:
+
+- [Including the dependency scanning template](#configuration)
+ in your existing `.gitlab-ci.yml` file.
+- Implicitly using
+ the [auto dependency scanning](../../../topics/autodevops/stages.md#auto-dependency-scanning)
+ provided by [Auto DevOps](../../../topics/autodevops/index.md).
GitLab checks the dependency scanning report, compares the found vulnerabilities
between the source and target branches, and shows the information on the
diff --git a/doc/user/application_security/sast/index.md b/doc/user/application_security/sast/index.md
index 880edebfeda..5e4ed4770de 100644
--- a/doc/user/application_security/sast/index.md
+++ b/doc/user/application_security/sast/index.md
@@ -83,8 +83,9 @@ You can also [view our language roadmap](https://about.gitlab.com/direction/secu
| Objective-C (iOS) | [MobSF (beta)](https://github.com/MobSF/Mobile-Security-Framework-MobSF) | 13.5 |
| PHP | [phpcs-security-audit](https://github.com/FloeDesignTechnologies/phpcs-security-audit) | 10.8 |
| Python ([pip](https://pip.pypa.io/en/stable/)) | [bandit](https://github.com/PyCQA/bandit) | 10.3 |
-| Python | [semgrep](https://semgrep.dev) | 13.9 |
+| Python | [Semgrep](https://semgrep.dev) | 13.9 |
| React | [ESLint react plugin](https://github.com/yannickcr/eslint-plugin-react) | 12.5 |
+| Ruby | [brakeman](https://brakemanscanner.org) | 13.9 |
| Ruby on Rails | [brakeman](https://brakemanscanner.org) | 10.3 |
| Scala ([Ant](https://ant.apache.org/), [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/), and [SBT](https://www.scala-sbt.org/)) | [SpotBugs](https://spotbugs.github.io/) with the [find-sec-bugs](https://find-sec-bugs.github.io/) plugin | 11.0 (SBT) & 11.9 (Ant, Gradle, Maven) |
| Swift (iOS) | [MobSF (beta)](https://github.com/MobSF/Mobile-Security-Framework-MobSF) | 13.5 |
@@ -149,7 +150,7 @@ The [Security Scanner Integration](../../../development/integrations/secure.md)
To configure SAST for a project you can:
-- Use [Auto SAST](../../../topics/autodevops/stages.md#auto-sast) provided by
+- Use [Auto SAST](../../../topics/autodevops/stages.md#auto-sast), provided by
[Auto DevOps](../../../topics/autodevops/index.md).
- [Configure SAST manually](#configure-sast-manually).
- [Configure SAST using the UI](#configure-sast-in-the-ui) (introduced in GitLab 13.3).
diff --git a/doc/user/application_security/secret_detection/index.md b/doc/user/application_security/secret_detection/index.md
index 98177e804f3..9390a5def18 100644
--- a/doc/user/application_security/secret_detection/index.md
+++ b/doc/user/application_security/secret_detection/index.md
@@ -112,7 +112,7 @@ For example, `https://username:$password@example.com/path/to/repo` isn't detecte
NOTE:
You don't have to configure Secret Detection manually as shown in this section if you're using
-[Auto Secret Detection](../../../topics/autodevops/stages.md#auto-secret-detection)
+[Auto Secret Detection](../../../topics/autodevops/stages.md#auto-secret-detection),
provided by [Auto DevOps](../../../topics/autodevops/index.md).
To enable Secret Detection for GitLab 13.1 and later, you must include the
diff --git a/doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v13_10.png b/doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v13_10.png
new file mode 100644
index 00000000000..8adb58b8143
--- /dev/null
+++ b/doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v13_10.png
Binary files differ
diff --git a/doc/user/application_security/security_dashboard/index.md b/doc/user/application_security/security_dashboard/index.md
index b08c19bee47..96d584737e2 100644
--- a/doc/user/application_security/security_dashboard/index.md
+++ b/doc/user/application_security/security_dashboard/index.md
@@ -52,7 +52,7 @@ To use the security dashboards and vulnerability reports:
At the pipeline level, the Security section displays the vulnerabilities present in the branch of
the project the pipeline ran against.
-![Pipeline Security Dashboard](img/pipeline_security_dashboard_v13_3.png)
+![Pipeline Security Dashboard](img/pipeline_security_dashboard_v13_10.png)
Visit the page for any pipeline that ran any of the [supported reports](#supported-reports). To view
the pipeline's security findings, select the **Security** tab when viewing the pipeline.
@@ -175,7 +175,7 @@ lock files. Python projects can have lock files, but GitLab Secure tools don't s
## Security scans using Auto DevOps
When using [Auto DevOps](../../../topics/autodevops/index.md), use
-[special environment variables](../../../topics/autodevops/customize.md#environment-variables)
+[special environment variables](../../../topics/autodevops/customize.md#cicd-variables)
to configure daily security scans.
<!-- ## Troubleshooting
diff --git a/doc/user/application_security/vulnerabilities/index.md b/doc/user/application_security/vulnerabilities/index.md
index 50f05b687f7..989af509c59 100644
--- a/doc/user/application_security/vulnerabilities/index.md
+++ b/doc/user/application_security/vulnerabilities/index.md
@@ -64,16 +64,18 @@ This feature might not be available to you. Check the **version history** note a
Prerequisites:
-- [Enable Jira integration for vulnerabilities](../../project/integrations/jira.md). Select
- **Enable Jira issues creation from vulnerabilities** when configuring the integration.
+- [Enable Jira integration for vulnerabilities](../../project/integrations/jira.md).
+ Select **Enable Jira issues creation from vulnerabilities** when configuring the integration.
+- A Jira user account with permission to create issues in the target project.
To create a Jira issue for a vulnerability:
1. Go to the vulnerability's page.
1. Select **Create Jira issue**.
+1. If you're not already logged in to Jira, log in.
-An issue is created in the linked Jira project, with the **Summary** and **Description** fields
-pre-populated. The Jira issue is then opened in a new browser tab.
+The Jira issue is created and opened in a new browser tab. The **Summary** and **Description**
+fields are pre-populated from the vulnerability's details.
### Enable or disable Jira integration for vulnerabilities **(ULTIMATE SELF)**
diff --git a/doc/user/application_security/vulnerability_report/index.md b/doc/user/application_security/vulnerability_report/index.md
index 28083e09f1c..ce29962d743 100644
--- a/doc/user/application_security/vulnerability_report/index.md
+++ b/doc/user/application_security/vulnerability_report/index.md
@@ -14,26 +14,6 @@ Critical, High, Medium, Low, Info, Unknown). Below this, a table shows each vuln
![Vulnerability Report](img/group_vulnerability_report_v13_9.png)
-You can filter which vulnerabilities display by:
-
-| Filter | Available Options |
-| --- | --- |
-| Status | Detected, Confirmed, Dismissed, Resolved |
-| Severity | Critical, High, Medium, Low, Info, Unknown |
-| Scanner | [Available Scanners](../index.md#security-scanning-tools) |
-| Project | Projects configured in the Security Center settings, or all projects in the group for the group level report. This filter is not displayed on the project level vulnerability report |
-| Activity | Vulnerabilities with issues and vulnerabilities that are no longer detected in the default branch |
-
-The Activity filter behaves differently from the other Vulnerability Report filters. The other filter options all OR together to show results from any vulnerability matching one of the filter criteria. With the Activity filter, the selected values form mutually exclusive sets to allow for precisely locating the desired vulnerability records. Additionally, not all options can be selected in combination. Selection behavior when using the Activity filter:
-
-| Activity Selection | Results Displayed |
-| --- | --- |
-| All | Vulnerabilities with any Activity status (same as ignoring this filter). Selecting this will deselect any other Activity filter options. |
-| No activity | Only vulnerabilities without either an associated Issue or that are no longer detected. Selecting this will deselect any other Activity filter options. |
-| With issues | Only vulnerabilities with one or more associated issues. Does not include vulnerabilities that also are no longer detected. |
-| No longer detected | Only vulnerabilities that are no longer detected in the latest pipeline scan of the `default` branch. Does not include vulnerabilities with one or more associated issues. |
-| With issues and No longer detected | Only vulnerabilities that have one or more associated issues and also are no longer detected in the latest pipeline scan of the `default` branch. |
-
Clicking any vulnerability in the table takes you to its
[vulnerability details](../vulnerabilities) page to see more information on that vulnerability.
@@ -42,6 +22,32 @@ Hover over an **Activity** entry and select a link go to that issue.
![Display attached issues](img/vulnerability_list_table_v13_9.png)
+## Filter options
+
+You can filter which vulnerabilities display by:
+
+| Filter | Available options |
+|:---------|:------------------|
+| Status | Detected, Confirmed, Dismissed, Resolved |
+| Severity | Critical, High, Medium, Low, Info, Unknown |
+| Scanner | [Available scanners](../index.md#security-scanning-tools). |
+| Project | Projects configured in the Security Center settings, or all projects in the group for the group level report. This filter is not displayed on the project level vulnerability report. |
+| Activity | Vulnerabilities with issues and vulnerabilities that are no longer detected in the default branch. |
+
+### Activity filter
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259255) in GitLab 13.9
+
+The Activity filter behaves differently from the other Vulnerability Report filters. The other filter options all OR together to show results from any vulnerability matching one of the filter criteria. With the Activity filter, the selected values form mutually exclusive sets to allow for precisely locating the desired vulnerability records. Additionally, not all options can be selected in combination. Selection behavior when using the Activity filter:
+
+| Activity Selection | Results Displayed |
+|:------------------------------------|:------------------|
+| All | Vulnerabilities with any Activity status (same as ignoring this filter). Selecting this will deselect any other Activity filter options. |
+| No activity | Only vulnerabilities without either an associated Issue or that are no longer detected. Selecting this will deselect any other Activity filter options. |
+| With issues | Only vulnerabilities with one or more associated issues. Does not include vulnerabilities that also are no longer detected. |
+| No longer detected | Only vulnerabilities that are no longer detected in the latest pipeline scan of the `default` branch. Does not include vulnerabilities with one or more associated issues. |
+| With issues and No longer detected | Only vulnerabilities that have one or more associated issues and also are no longer detected in the latest pipeline scan of the `default` branch. |
+
Contents of the unfiltered vulnerability report can be exported using our [export feature](#export-vulnerabilities).
You can also dismiss vulnerabilities in the table:
diff --git a/doc/user/clusters/agent/index.md b/doc/user/clusters/agent/index.md
index 6f3d1e197f5..0f30d09829a 100644
--- a/doc/user/clusters/agent/index.md
+++ b/doc/user/clusters/agent/index.md
@@ -21,6 +21,7 @@ tasks in a secure and cloud-native way. It enables:
- Pull-based GitOps deployments by leveraging the
[GitOps Engine](https://github.com/argoproj/gitops-engine).
- Real-time access to API endpoints in a cluster.
+- Alert generation based on [Container network policy](../../application_security/threat_monitoring/index.md#container-network-policy).
Many more features are planned. Please review [our roadmap](https://gitlab.com/groups/gitlab-org/-/epics/3329)
and [our development documentation](../../../development/agent/index.md).
@@ -36,7 +37,7 @@ sequenceDiagram
participant D as Developer
participant A as Application code repository
participant M as Manifest repository
- participant K as Kubernetes agent
+ participant K as Kubernetes Agent
participant C as Agent configuration repository
K->C: Grab the configuration
D->>+A: Pushing code changes
@@ -49,11 +50,10 @@ sequenceDiagram
There are several components that work in concert for the Agent to accomplish GitOps deployments:
-- A properly-configured Kubernetes cluster.
+- A properly-configured Kubernetes cluster where the Agent is running.
- A configuration repository that contains a `config.yaml` file, which tells the
- Agent which repositories to synchronize with.
-- A manifest repository that contains a `manifest.yaml`, which is tracked by the
- Agent and can be auto-generated. Any changes to `manifest.yaml` are applied to the cluster.
+ Agent which repositories to synchronize with the cluster.
+- A manifest repository that contains manifest files. Any changes to manifest files are applied to the cluster.
These repositories might be the same GitLab project or separate projects.
@@ -74,7 +74,7 @@ The setup process involves a few steps to enable GitOps deployments:
1. [Create an Agent record in GitLab](#create-an-agent-record-in-gitlab).
1. [Generate and copy a Secret token used to connect to the Agent](#create-the-kubernetes-secret).
1. [Install the Agent into the cluster](#install-the-agent-into-the-cluster).
-1. [Create a `manifest.yaml`](#create-a-manifestyaml).
+1. [Create manifest files](#create-manifest-files).
### Upgrades and version compatibility
@@ -388,11 +388,10 @@ subjects:
namespace: gitlab-agent
```
-### Create a `manifest.yaml`
+### Create manifest files
In a previous step, you configured a `config.yaml` to point to the GitLab projects
-the Agent should synchronize. In each of those projects, you must create a `manifest.yaml`
-file for the Agent to monitor. You can auto-generate this `manifest.yaml` with a
+the Agent should synchronize. Agent monitors each of those projects for changes to the manifest files it contains. You can auto-generate manifest files with a
templating engine or other means.
The agent is authorized to download manifests for the configuration
@@ -400,13 +399,13 @@ project, and public projects. Support for other private projects is
planned in the issue [Agent authorization for private manifest
projects](https://gitlab.com/gitlab-org/gitlab/-/issues/220912).
-Each time you commit and push a change to this file, the Agent logs the change:
+Each time you push a change to a monitored manifest repository, the Agent logs the change:
```plaintext
2020-09-15_14:09:04.87946 gitlab-k8s-agent : time="2020-09-15T10:09:04-04:00" level=info msg="Config: new commit" agent_id=1 commit_id=e6a3651f1faa2e928fe6120e254c122451be4eea
```
-#### Example `manifest.yaml` file
+#### Example manifest file
This file creates an NGINX deployment.
@@ -445,6 +444,51 @@ The following example projects can help you get started with the Kubernetes Agen
You can use the Kubernetes Agent to
[deploy GitLab Runner in a Kubernetes cluster](http://docs.gitlab.com/runner/install/kubernetes-agent.html).
+## Kubernetes Network Security Alerts
+
+The GitLab Agent also provides an integration with Cilium. This integration provides a simple way to
+generate network policy-related alerts and to surface those alerts in GitLab.
+
+There are several components that work in concert for the Agent to generate the alerts:
+
+- A working Kubernetes cluster.
+- Cilium integration through either of these options:
+ - Installation through [GitLab Managed Apps](../applications.md#install-cilium-using-gitlab-cicd).
+ - Enablement of [hubble-relay](https://docs.cilium.io/en/v1.8/concepts/overview/#hubble) on an
+ existing installation.
+- One or more network policies through any of these options:
+ - Use the [Container Network Policy editor](../../application_security/threat_monitoring/index.md#container-network-policy-editor) to create and manage policies.
+ - Use an [AutoDevOps](../../application_security/threat_monitoring/index.md#container-network-policy-management) configuration.
+ - Add the required labels and annotations to existing network policies.
+- Use a configuration repository to inform the Agent through a `config.yaml` file, which
+ repositories can synchronize with. This repository might be the same, or a separate GitLab
+ project.
+
+The setup process follows the same steps as [GitOps](#get-started-with-gitops-and-the-gitlab-agent),
+with the following differences:
+
+- When you define a configuration repository, you must do so with [Cilium settings](#define-a-configuration-repository-with-cilium-settings).
+- You do not need to create a `manifest.yaml`.
+
+### Define a configuration repository with Cilium settings
+
+You need a GitLab repository to contain your Agent configuration. The minimal repository layout
+looks like this:
+
+```plaintext
+.gitlab/agents/<agent-name>/config.yaml
+```
+
+Your `config.yaml` file must specify the `host` and `port` of your Hubble Relay service. If your
+Cilium integration was performed through [GitLab Managed Apps](../applications.md#install-cilium-using-gitlab-cicd),
+you can use `hubble-relay.gitlab-managed-apps.svc.cluster.local:80`:
+
+```yaml
+cilium:
+ hubble_relay_address: "<hubble-relay-host>:<hubble-relay-port>"
+ ...
+```
+
## Management interfaces
Users with at least the [Developer](../../permissions.md) can access the user interface
@@ -503,9 +547,9 @@ specified the `kas-address` correctly.
{"level":"info","time":"2020-10-30T08:56:54.329Z","msg":"Synced","project_id":"root/kas-manifest001","resource_key":"apps/Deployment/kas-test001/nginx-deployment","sync_result":"error validating data: [ValidationError(Deployment.metadata): unknown field \"replicas\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta, ValidationError(Deployment.metadata): unknown field \"selector\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta, ValidationError(Deployment.metadata): unknown field \"template\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta]"}
```
-This error is shown if your `manifest.yaml` file is malformed, and Kubernetes can't
-create specified objects. Make sure that your `manifest.yaml` file is valid. You
-may try using it to create objects in Kubernetes directly for more troubleshooting.
+This error is shown if a manifest file is malformed, and Kubernetes can't
+create specified objects. Make sure that your manifest files are valid. You
+may try using them to create objects in Kubernetes directly for more troubleshooting.
### Agent logs - Error while dialing failed to WebSocket dial: failed to send handshake request
diff --git a/doc/user/clusters/applications.md b/doc/user/clusters/applications.md
index ad92cf9b4ed..1d72426a1d4 100644
--- a/doc/user/clusters/applications.md
+++ b/doc/user/clusters/applications.md
@@ -372,7 +372,7 @@ For GitLab Runner to function, you _must_ specify the following:
- `runnerRegistrationToken`: The registration token for adding new runners to GitLab.
This must be [retrieved from your GitLab instance](../../ci/runners/README.md).
-These values can be specified using [CI variables](../../ci/variables/README.md):
+These values can be specified using [CI/CD variables](../../ci/variables/README.md):
- `GITLAB_RUNNER_GITLAB_URL` is used for `gitlabUrl`.
- `GITLAB_RUNNER_REGISTRATION_TOKEN` is used for `runnerRegistrationToken`
@@ -730,7 +730,7 @@ Set:
- "Redirect URI" to `http://<JupyterHub Host>/hub/oauth_callback`.
- "Scope" to `api read_repository write_repository`.
-In addition, the following variables must be specified using [CI variables](../../ci/variables/README.md):
+In addition, the following variables must be specified using [CI/CD variables](../../ci/variables/README.md):
- `JUPYTERHUB_PROXY_SECRET_TOKEN` - Secure string used for signing communications
from the hub. Read [`proxy.secretToken`](https://zero-to-jupyterhub.readthedocs.io/en/stable/reference/reference.html#proxy-secrettoken).
@@ -1655,3 +1655,17 @@ Error: Could not get apiVersions from Kubernetes: unable to retrieve the complet
This is a bug that was introduced in Helm `2.15` and fixed in `3.0.2`. As a workaround,
ensure [`cert-manager`](#cert-manager) is installed successfully prior to installing Prometheus.
+
+### Unable to create a Persistent Volume Claim with DigitalOcean
+
+Trying to create additional block storage volumes might lead to the following error when using DigitalOcean:
+
+```plaintext
+Server requested
+[Warning] pod has unbound immediate PersistentVolumeClaims (repeated 2 times)
+[Normal] pod didn't trigger scale-up (it wouldn't fit if a new node is added):
+Spawn failed: Timeout
+```
+
+This is due to DigitalOcean imposing a few limits with regards to creating additional block storage volumes.
+[Learn more about DigitalOcean Block Storage Volumes limits.](https://www.digitalocean.com/docs/volumes/#limits)
diff --git a/doc/user/compliance/license_compliance/index.md b/doc/user/compliance/license_compliance/index.md
index 74c608fcc38..31d3f7e1db0 100644
--- a/doc/user/compliance/license_compliance/index.md
+++ b/doc/user/compliance/license_compliance/index.md
@@ -14,10 +14,13 @@ project's dependencies for their licenses. You can then decide whether to allow
each license. For example, if your application uses an external (open source) library whose license
is incompatible with yours, then you can deny the use of that license.
-You can take advantage of License Compliance by either [including the job](#configuration)
-in your existing `.gitlab-ci.yml` file or by implicitly using
-[Auto License Compliance](../../../topics/autodevops/stages.md#auto-license-compliance)
-that is provided by [Auto DevOps](../../../topics/autodevops/index.md).
+You can take advantage of License Compliance by either:
+
+- [Including the job](#configuration)
+ in your existing `.gitlab-ci.yml` file.
+- Implicitly using
+ [Auto License Compliance](../../../topics/autodevops/stages.md#auto-license-compliance),
+ provided by [Auto DevOps](../../../topics/autodevops/index.md).
The [License Finder](https://github.com/pivotal/LicenseFinder) scan tool runs as part of the CI/CD
pipeline, and detects the licenses in use. GitLab checks the License Compliance report, compares the
diff --git a/doc/user/discussions/index.md b/doc/user/discussions/index.md
index 9320dbba1b8..0fd4ccfd869 100644
--- a/doc/user/discussions/index.md
+++ b/doc/user/discussions/index.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
type: reference, howto
---
diff --git a/doc/user/group/img/groups.png b/doc/user/group/img/groups.png
deleted file mode 100644
index 2e27d46b370..00000000000
--- a/doc/user/group/img/groups.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/import/index.md b/doc/user/group/import/index.md
index f4d15dce1cd..7f02c7b169f 100644
--- a/doc/user/group/import/index.md
+++ b/doc/user/group/import/index.md
@@ -20,11 +20,23 @@ Using GitLab Group Migration, you can migrate existing top-level groups from Git
The following resources are migrated to the target instance:
-- Groups
+- Groups ([Introduced in 13.7](https://gitlab.com/groups/gitlab-org/-/epics/4374))
- description
- attributes
- subgroups
-- Epics
+- Group Labels ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/292429))
+ - title
+ - description
+ - color
+ - created_at ([Introduced in 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/300007))
+ - updated_at ([Introduced in 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/300007))
+- Members ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/299415))
+ Group members are associated with the imported group if:
+ - The user already exists in the target GitLab instance and
+ - The user has a public email in the source GitLab instance that matches a
+ confirmed email in the target GitLab instance
+ confirmed email in the target GitLab instance
+- Epics ([Introduced in 13.7](https://gitlab.com/gitlab-org/gitlab/-/issues/250281))
- title
- description
- state (open / closed)
@@ -32,6 +44,10 @@ The following resources are migrated to the target instance:
- due date
- epic order on boards
- confidentiality
+ - labels ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/297460))
+ - author ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/298745))
+ - parent epic ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/297459))
+ - emoji award ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/297466))
Any other items are **not** migrated.
diff --git a/doc/user/group/index.md b/doc/user/group/index.md
index 4c63bae7e44..cdadb73aee5 100644
--- a/doc/user/group/index.md
+++ b/doc/user/group/index.md
@@ -7,54 +7,34 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Groups
-With GitLab Groups, you can:
+In GitLab, you can put related projects together in a group.
-- Assemble related projects together.
-- Grant members access to several projects at once.
+For example, you might create a group for your company members and a subgroup for each individual team.
+You can name the group `company-team`, and the subgroups `backend-team`, `frontend-team`, and `production-team`.
-For a video introduction to GitLab Groups, see [GitLab University: Repositories, Projects and Groups](https://www.youtube.com/watch?v=4TWfh1aKHHw).
+Then you can:
-Groups can also be nested in [subgroups](subgroups/index.md).
+- Grant members access to multiple projects at once.
+- Add to-do items for all of the group members at once.
+- View the [issues](../project/issues/index.md#issues-list) and
+ [merge requests](../project/merge_requests/reviewing_and_managing_merge_requests.md#view-merge-requests-for-all-projects-in-a-group)
+ for all projects in the group, together in a single list view.
+- [Bulk edit](../group/bulk_editing/index.md) issues, epics, and merge requests.
-Find your groups by clicking **Groups > Your Groups** in the top navigation.
+You can also create [subgroups](subgroups/index.md).
-![GitLab Groups](img/groups.png)
+## View groups
-> The **Groups** dropdown in the top navigation was [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/36234) in [GitLab 11.1](https://about.gitlab.com/releases/2018/07/22/gitlab-11-1-released/#groups-dropdown-in-navigation).
+To view groups:
-The **Groups** page displays:
+1. In the top menu, select **Groups > Your Groups**. All groups you are a member of are displayed.
+1. To view a list of public groups, select **Explore public groups**.
-- All groups you are a member of, when **Your groups** is selected.
-- A list of public groups, when **Explore public groups** is selected.
+You can also view groups by namespace.
-Each group on the **Groups** page is listed with:
+### Namespaces
-- How many subgroups it has.
-- How many projects it contains.
-- How many members the group has, not including members inherited from parent group(s).
-- The group's visibility.
-- A link to the group's settings, if you have sufficient permissions.
-- A link to leave the group, if you are a member.
-
-## Use cases
-
-You can create groups for numerous reasons. To name a couple:
-
-- Grant access to multiple projects and multiple team members in fewer steps by organizing related projects under the same [namespace](#namespaces) and adding members to the top-level group.
-- Make it easier to `@mention` all of your team at once in issues and merge requests by creating a group and including the appropriate members.
-
-For example, you could create a group for your company members, and create a [subgroup](subgroups/index.md) for each individual team. Let's say you create a group called `company-team`, and you create subgroups in this group for the individual teams `backend-team`, `frontend-team`, and `production-team`.
-
-- When you start a new implementation from an issue, you add a comment:
- _"`@company-team`, let's do it! `@company-team/backend-team` you're good to go!"_
-- When your backend team needs help from frontend, they add a comment:
- _"`@company-team/frontend-team` could you help us here please?"_
-- When the frontend team completes their implementation, they comment:
- _"`@company-team/backend-team`, it's done! Let's ship it `@company-team/production-team`!"_
-
-## Namespaces
-
-In GitLab, a namespace is a unique name to be used as a user name, a group name, or a subgroup name.
+In GitLab, a namespace is a unique name and URL for a user, a group, or subgroup.
- `http://gitlab.example.com/username`
- `http://gitlab.example.com/groupname`
@@ -62,35 +42,19 @@ In GitLab, a namespace is a unique name to be used as a user name, a group name,
For example, consider a user named Alex:
-1. Alex creates an account on GitLab.com with the username `alex`;
- their profile will be accessed under `https://gitlab.example.com/alex`
-1. Alex creates a group for their team with the group name `alex-team`;
- the group and its projects will be accessed under `https://gitlab.example.com/alex-team`
-1. Alex creates a subgroup of `alex-team` with the subgroup name `marketing`;
- this subgroup and its projects will be accessed under `https://gitlab.example.com/alex-team/marketing`
-
-By doing so:
-
-- Any team member mentions Alex with `@alex`
-- Alex mentions everyone from their team with `@alex-team`
-- Alex mentions only the marketing team with `@alex-team/marketing`
+1. Alex creates an account with the username `alex`: `https://gitlab.example.com/alex`
+1. Alex creates a group for their team with the group name `alex-team`.
+ The group and its projects are available at: `https://gitlab.example.com/alex-team`
+1. Alex creates a subgroup of `alex-team` with the subgroup name `marketing`.
+ The subgroup and its projects are available at: `https://gitlab.example.com/alex-team/marketing`
-## Issues and merge requests within a group
+## Create a group
-Issues and merge requests are part of projects. For a given group, you can view all of the
-[issues](../project/issues/index.md#issues-list) and [merge requests](../project/merge_requests/reviewing_and_managing_merge_requests.md#view-merge-requests-for-all-projects-in-a-group) across all projects in that group,
-together in a single list view.
-
-### Bulk editing issues and merge requests
-
-For details, see [bulk editing issues and merge requests](../group/bulk_editing/index.md).
-
-## Create a new group
-
-> For a list of words that are not allowed to be used as group names see the
-> [reserved names](../reserved_names.md).
+NOTE:
+For a list of words that can not be used as group names, see
+[reserved names](../reserved_names.md).
-To create a new Group, either:
+To create a new group, either:
- In the top menu, click **Groups** and then **Your Groups**, and click the green button **New group**.
@@ -166,7 +130,7 @@ If you change your mind before your request is approved, just click the
![Withdraw access request button](img/withdraw_access_request_button.png)
-## Changing the owner of a group
+## Change the owner of a group
Ownership of a group means at least one of its members has
[Owner permission](../permissions.md#group-members-permissions). Groups must have at
@@ -266,6 +230,18 @@ You can sort members by **Account**, **Access granted**, **Max role**, or **Last
![Group members sort](img/group_members_sort_13_7.png)
+## Mention a group in an issue or merge request
+
+When you mention a group in a comment, every member of the group gets a to-do item
+added to their To-do list.
+
+1. Open the MR or issue.
+1. In a comment, type `@` followed by the user, group, or subgroup namespace.
+ For example, `@alex`, `@alex-team`, or `@alex-team/marketing`.
+1. Select **Comment**.
+
+A to-do item is created for all the group and subgroup members.
+
## Changing the default branch protection of a group
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7583) in GitLab 12.9.
@@ -520,7 +496,7 @@ the group's dashboard, and clicking **Settings**.
### General settings
In addition to editing any settings you previously
-set when [creating the group](#create-a-new-group), you can also
+set when [creating the group](#create-a-group), you can also
access further configurations for your group.
#### Changing a group's path
@@ -641,8 +617,8 @@ request to add a new user to a project through API will not be possible.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/215410) to [GitLab Premium](https://about.gitlab.com/pricing/) in 13.1.
NOTE:
-IP Access Restrictions are currently not functioning as expected on GitLab.com. Some users
-may experience blocked Git operations or have difficulties accessing projects. Please
+IP Access Restrictions are currently not functioning as expected on GitLab.com. If enabled,
+users cannot perform Git operations through SSH, or access projects via the UI. Please
review the [following bug report](https://gitlab.com/gitlab-org/gitlab/-/issues/271673) for
more information.
diff --git a/doc/user/group/repositories_analytics/index.md b/doc/user/group/repositories_analytics/index.md
index 1cb7c05bb5f..42522723047 100644
--- a/doc/user/group/repositories_analytics/index.md
+++ b/doc/user/group/repositories_analytics/index.md
@@ -40,6 +40,9 @@ To see the latest code coverage for each project in your group:
1. Go to **Analytics > Repositories** in the group (not from a project).
1. In the **Latest test coverage results** section, use the **Select projects** dropdown to choose the projects you want to check.
+You can download code coverage data for specific projects using
+[code coverage history](../../../ci/pipelines/settings.md#code-coverage-history).
+
## Download historic test coverage data
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/215104) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.4.
diff --git a/doc/user/group/roadmap/index.md b/doc/user/group/roadmap/index.md
index e2c01987e36..9b3ae75b39c 100644
--- a/doc/user/group/roadmap/index.md
+++ b/doc/user/group/roadmap/index.md
@@ -41,7 +41,7 @@ toggle the list of the milestone bars.
> - Filtering roadmaps by milestone is enabled on GitLab.com.
> - Filtering roadmaps by milestone is recommended for production use.
> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-filtering-roadmaps-by-milestone). **(PREMIUM SELF)**
-> - Filtering by epic confidentiality [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218624) in GitLab 13.8.
+> - Filtering by epic confidentiality [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218624) in GitLab 13.9.
WARNING:
Filtering roadmaps by milestone might not be available to you. Check the **version history** note above for details.
diff --git a/doc/user/group/saml_sso/index.md b/doc/user/group/saml_sso/index.md
index d1c490b0769..24216188c80 100644
--- a/doc/user/group/saml_sso/index.md
+++ b/doc/user/group/saml_sso/index.md
@@ -87,7 +87,7 @@ Please note that the certificate [fingerprint algorithm](#additional-providers-a
With this option enabled, users must go through your group's GitLab single sign-on URL. They may also be added via SCIM, if configured. Users can't be added manually, and may only access project/group resources via the UI by signing in through the SSO URL.
However, users are not prompted to sign in through SSO on each visit. GitLab checks whether a user
-has authenticated through SSO. If it's been more than 7 days since the last sign-in, GitLab
+has authenticated through SSO. If it's been more than 1 day since the last sign-in, GitLab
prompts the user to sign in again through SSO.
You can see more information about how long a session is valid in our [user profile documentation](../../profile/#why-do-i-keep-getting-signed-out).
diff --git a/doc/user/group/saml_sso/scim_setup.md b/doc/user/group/saml_sso/scim_setup.md
index 3a34a4b0599..41373161a9a 100644
--- a/doc/user/group/saml_sso/scim_setup.md
+++ b/doc/user/group/saml_sso/scim_setup.md
@@ -204,6 +204,10 @@ graph TD
B -->|Yes| D[GitLab removes user from GitLab group]
```
+During the synchronization process, all of your users get GitLab accounts, welcoming them
+to their respective groups, with an invitation email. When implementing SCIM provisioning,
+you may want to warn your security-conscious employees about this email.
+
## Troubleshooting
This section contains possible solutions for problems you might encounter.
diff --git a/doc/user/index.md b/doc/user/index.md
index a678038507f..47a9699543a 100644
--- a/doc/user/index.md
+++ b/doc/user/index.md
@@ -31,10 +31,10 @@ For more information, see [All GitLab Features](https://about.gitlab.com/feature
To get familiar with the concepts needed to develop code on GitLab, read the following articles:
- [Demo: Mastering Code Review With GitLab](https://about.gitlab.com/blog/2017/03/17/demo-mastering-code-review-with-gitlab/).
-- [GitLab Workflow: An Overview](https://about.gitlab.com/blog/2016/10/25/gitlab-workflow-an-overview/#gitlab-workflow-use-case-scenario).
+- [GitLab Workflow: An Overview](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/#gitlab-workflow-a-use-case-scenario).
- [Tutorial: It's all connected in GitLab](https://about.gitlab.com/blog/2016/03/08/gitlab-tutorial-its-all-connected/): an overview on code collaboration with GitLab.
- [Trends in Version Control Land: Microservices](https://about.gitlab.com/blog/2016/08/16/trends-in-version-control-land-microservices/).
-- [Trends in Version Control Land: Innersourcing](https://about.gitlab.com/blog/2016/07/07/trends-version-control-innersourcing/).
+- [Trends in Version Control Land: Innersourcing](https://about.gitlab.com/topics/version-control/what-is-innersource/).
## Use cases
diff --git a/doc/user/infrastructure/index.md b/doc/user/infrastructure/index.md
index 6ba5e49d553..b202359847c 100644
--- a/doc/user/infrastructure/index.md
+++ b/doc/user/infrastructure/index.md
@@ -52,9 +52,9 @@ This video from January 2021 walks you through all the GitLab Terraform integrat
## GitLab Managed Terraform state
-[Terraform remote backends](https://www.terraform.io/docs/backends/index.html)
+[Terraform remote backends](https://www.terraform.io/docs/language/settings/backends/index.html)
enable you to store the state file in a remote, shared store. GitLab uses the
-[Terraform HTTP backend](https://www.terraform.io/docs/backends/types/http.html)
+[Terraform HTTP backend](https://www.terraform.io/docs/language/settings/backends/http.html)
to securely store the state files in local storage (the default) or
[the remote store of your choice](../../administration/terraform_state.md).
diff --git a/doc/user/infrastructure/terraform_state.md b/doc/user/infrastructure/terraform_state.md
index ae35ebce0dc..786665ec47c 100644
--- a/doc/user/infrastructure/terraform_state.md
+++ b/doc/user/infrastructure/terraform_state.md
@@ -8,9 +8,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2673) in GitLab 13.0.
-[Terraform remote backends](https://www.terraform.io/docs/backends/index.html)
+[Terraform remote backends](https://www.terraform.io/docs/language/settings/backends/index.html)
enable you to store the state file in a remote, shared store. GitLab uses the
-[Terraform HTTP backend](https://www.terraform.io/docs/backends/types/http.html)
+[Terraform HTTP backend](https://www.terraform.io/docs/language/settings/backends/http.html)
to securely store the state files in local storage (the default) or
[the remote store of your choice](../../administration/terraform_state.md).
@@ -96,7 +96,7 @@ Next, [configure the backend](#configure-the-backend).
After executing the `terraform init` command, you must configure the Terraform backend
and the CI YAML file:
-1. In your Terraform project, define the [HTTP backend](https://www.terraform.io/docs/backends/types/http.html)
+1. In your Terraform project, define the [HTTP backend](https://www.terraform.io/docs/language/settings/backends/http.html)
by adding the following code block in a `.tf` file (such as `backend.tf`) to
define the remote backend:
@@ -203,9 +203,9 @@ See [this reference project](https://gitlab.com/gitlab-org/configure/examples/gi
## Using a GitLab managed Terraform state backend as a remote data source
You can use a GitLab-managed Terraform state as a
-[Terraform data source](https://www.terraform.io/docs/providers/terraform/d/remote_state.html).
+[Terraform data source](https://www.terraform.io/docs/language/state/remote-state-data.html).
To use your existing Terraform state backend as a data source, provide the following details
-as [Terraform input variables](https://www.terraform.io/docs/configuration/variables.html):
+as [Terraform input variables](https://www.terraform.io/docs/language/values/variables.html):
- **address**: The URL of the remote state backend you want to use as a data source.
For example, `https://gitlab.com/api/v4/projects/<TARGET-PROJECT-ID>/terraform/state/<TARGET-STATE-NAME>`.
diff --git a/doc/user/markdown.md b/doc/user/markdown.md
index 5f974d75522..cba7354cd82 100644
--- a/doc/user/markdown.md
+++ b/doc/user/markdown.md
@@ -22,7 +22,7 @@ We encourage you to view this document as [rendered by GitLab itself](https://gi
GitLab uses "GitLab Flavored Markdown" (GFM). It extends the [CommonMark specification](https://spec.commonmark.org/current/)
(which is based on standard Markdown) in several ways to add more features.
-It was inspired by [GitHub Flavored Markdown](https://docs.github.com/en/free-pro-team@latest/github/writing-on-github/basic-writing-and-formatting-syntax).
+It was inspired by [GitHub Flavored Markdown](https://docs.github.com/en/github/writing-on-github/basic-writing-and-formatting-syntax).
You can use GFM in the following areas:
diff --git a/doc/user/packages/go_proxy/index.md b/doc/user/packages/go_proxy/index.md
index c9397f8d9f6..1fdc34e820e 100644
--- a/doc/user/packages/go_proxy/index.md
+++ b/doc/user/packages/go_proxy/index.md
@@ -96,7 +96,7 @@ following steps work only if GitLab is configured for HTTPS:
Create a [personal access token](../../profile/personal_access_tokens.md) with
the scope set to `api` or `read_api`.
-Open your [`~/.netrc`](https://ec.haxx.se/usingcurl/usingcurl-netrc) file
+Open your [`~/.netrc`](https://everything.curl.dev/usingcurl/netrc) file
and add the following text. Replace the variables in `< >` with your values.
```plaintext
diff --git a/doc/user/packages/index.md b/doc/user/packages/index.md
index d2bd9ef5646..03738eb0b9e 100644
--- a/doc/user/packages/index.md
+++ b/doc/user/packages/index.md
@@ -43,14 +43,14 @@ guides you through the process.
| CocoaPods | [#36890](https://gitlab.com/gitlab-org/gitlab/-/issues/36890) |
| Conda | [#36891](https://gitlab.com/gitlab-org/gitlab/-/issues/36891) |
| CRAN | [#36892](https://gitlab.com/gitlab-org/gitlab/-/issues/36892) |
-| Debian | [WIP: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44746) |
+| Debian | [Draft: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50438) |
| Opkg | [#36894](https://gitlab.com/gitlab-org/gitlab/-/issues/36894) |
| P2 | [#36895](https://gitlab.com/gitlab-org/gitlab/-/issues/36895) |
| Puppet | [#36897](https://gitlab.com/gitlab-org/gitlab/-/issues/36897) |
| RPM | [#5932](https://gitlab.com/gitlab-org/gitlab/-/issues/5932) |
| RubyGems | [#803](https://gitlab.com/gitlab-org/gitlab/-/issues/803) |
| SBT | [#36898](https://gitlab.com/gitlab-org/gitlab/-/issues/36898) |
-| Terraform | [WIP: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18834) |
+| Terraform | [Draft: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18834) |
| Vagrant | [#36899](https://gitlab.com/gitlab-org/gitlab/-/issues/36899) |
<!-- vale gitlab.Spelling = YES -->
diff --git a/doc/user/packages/npm_registry/index.md b/doc/user/packages/npm_registry/index.md
index b1075e19b7b..68b421ec73b 100644
--- a/doc/user/packages/npm_registry/index.md
+++ b/doc/user/packages/npm_registry/index.md
@@ -86,7 +86,9 @@ A `package.json` file is created.
To use the GitLab endpoint for npm packages, choose an option:
- **Project-level**: Use when you have few npm packages and they are not in
- the same GitLab group.
+ the same GitLab group. The [package naming convention](#package-naming-convention) is not enforced at this level.
+ Instead, you should use a [scope](https://docs.npmjs.com/cli/v6/using-npm/scope) for your package.
+ When you use a scope, the registry URL is [updated](#authenticate-to-the-package-registry) only for that scope.
- **Instance-level**: Use when you have many npm packages in different
GitLab groups or in their own namespace. Be sure to comply with the [package naming convention](#package-naming-convention).
@@ -204,7 +206,7 @@ Then, you can run `npm publish` either locally or by using GitLab CI/CD.
## Package naming convention
-Your npm package name must be in the format of `@scope/package-name`.
+When you use the [instance-level endpoint](#use-the-gitlab-endpoint-for-npm-packages), only the packages with names in the format of `@scope/package-name` are available.
- The `@scope` is the root namespace of the GitLab project. It must match exactly, including the case.
- The `package-name` can be whatever you want.
@@ -302,8 +304,9 @@ the same version more than once, even if it has been deleted.
## Install a package
npm packages are commonly-installed by using the `npm` or `yarn` commands
-in a JavaScript project. You can install a package from the scope of a project, group,
-or instance.
+in a JavaScript project. You can install a package from the scope of a project or instance.
+
+If multiple packages have the same name and version, when you install a package, the most recently-published package is retrieved.
1. Set the URL for scoped packages by running:
diff --git a/doc/user/packages/workflows/monorepo.md b/doc/user/packages/workflows/monorepo.md
deleted file mode 100644
index abba9df6ec2..00000000000
--- a/doc/user/packages/workflows/monorepo.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../npm_registry/index.md'
-disqus_identifier: 'https://docs.gitlab.com/ee/user/packages/workflows/monorepo.html'
----
-
-This document was moved to [another location](../npm_registry/index.md).
-
-<!-- This redirect file can be deleted after <2021-02-14>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/profile/img/busy_indicator_note_header_v13_9.png b/doc/user/profile/img/busy_indicator_note_header_v13_9.png
new file mode 100644
index 00000000000..e1dade8fabc
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_note_header_v13_9.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_notes_v13_9.png b/doc/user/profile/img/busy_indicator_notes_v13_9.png
new file mode 100644
index 00000000000..ac3e57815cc
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_notes_v13_9.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_profile_page_v13_6.png b/doc/user/profile/img/busy_indicator_profile_page_v13_6.png
new file mode 100644
index 00000000000..4698a0bd45c
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_profile_page_v13_6.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_settings_menu_v13_6.png b/doc/user/profile/img/busy_indicator_settings_menu_v13_6.png
new file mode 100644
index 00000000000..9dc10603a19
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_settings_menu_v13_6.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_sidebar_collapsed_v13_9.png b/doc/user/profile/img/busy_indicator_sidebar_collapsed_v13_9.png
new file mode 100644
index 00000000000..2cecd74542a
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_sidebar_collapsed_v13_9.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_sidebar_v13_9.png b/doc/user/profile/img/busy_indicator_sidebar_v13_9.png
new file mode 100644
index 00000000000..8bbc2e9551b
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_sidebar_v13_9.png
Binary files differ
diff --git a/doc/user/profile/img/busy_indicator_user_popovers_v13_6.png b/doc/user/profile/img/busy_indicator_user_popovers_v13_6.png
new file mode 100644
index 00000000000..7941f098a08
--- /dev/null
+++ b/doc/user/profile/img/busy_indicator_user_popovers_v13_6.png
Binary files differ
diff --git a/doc/user/profile/index.md b/doc/user/profile/index.md
index d2cbf9e4acd..17516adf799 100644
--- a/doc/user/profile/index.md
+++ b/doc/user/profile/index.md
@@ -233,6 +233,26 @@ To set the busy status indicator, either:
1. Select **Edit profile**.
1. Select the **Busy** checkbox.
+ Once selected, you can see the busy status in various locations in the user interface.
+
+ Username:
+
+ | Profile page | Settings menu | User popovers |
+ | --- | --- | --- |
+ | ![Busy status - profile page](img/busy_indicator_profile_page_v13_6.png) | ![Busy status - settings menu](img/busy_indicator_settings_menu_v13_6.png) | ![Busy status - user popovers](img/busy_indicator_user_popovers_v13_6.png) |
+
+ Issue and merge request sidebar:
+
+ | Sidebar| Collapsed sidebar |
+ | --- | --- |
+ | ![Busy status - sidebar](img/busy_indicator_sidebar_v13_9.png) | ![Busy status - sidebar collapsed](img/busy_indicator_sidebar_collapsed_v13_9.png) |
+
+ Notes:
+
+ | Notes | Note headers |
+ | --- | --- |
+ | ![Busy status - notes](img/busy_indicator_notes_v13_9.png) | ![Busy status - note header](img/busy_indicator_note_header_v13_9.png) |
+
### Disable busy status feature
The busy status feature is deployed behind a feature flag and is **enabled by default**.
diff --git a/doc/user/profile/notifications.md b/doc/user/profile/notifications.md
index 703154945db..5e36bb70935 100644
--- a/doc/user/profile/notifications.md
+++ b/doc/user/profile/notifications.md
@@ -206,7 +206,7 @@ epics:
| Failed pipeline | The author of the pipeline |
| Fixed pipeline ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24309) in GitLab 13.1.) | The author of the pipeline. Enabled by default. |
| Merge merge request | |
-| Merge when pipeline succeeds ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211961) in GitLab 13.4) | |
+| Merge when pipeline succeeds ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211961) in GitLab 13.4) | Author, Participants, Watchers, Subscribers, and Custom notification level with this event selected. `Note:` Custom notification level is ignored for Author, Watchers and Subscribers |
| New comment | Participants, Watchers, Subscribers, and Custom notification level with this event selected, plus anyone mentioned by `@username` in the comment, with notification level "Mention" or higher |
| New epic | |
| New issue | |
diff --git a/doc/user/profile/personal_access_tokens.md b/doc/user/profile/personal_access_tokens.md
index 99db0c4b898..d32971a7618 100644
--- a/doc/user/profile/personal_access_tokens.md
+++ b/doc/user/profile/personal_access_tokens.md
@@ -21,7 +21,7 @@ Personal access tokens expire on the date you define, at midnight UTC.
- GitLab runs a check at 01:00 AM UTC every day to identify personal access tokens that expire in under seven days. The owners of these tokens are notified by email.
- GitLab runs a check at 02:00 AM UTC every day to identify personal access tokens that expired on the current date. The owners of these tokens are notified by email.
- In GitLab Ultimate, administrators may [limit the lifetime of personal access tokens](../admin_area/settings/account_and_limit_settings.md#limiting-lifetime-of-personal-access-tokens).
-- In GitLab Ultimate, administrators may [toggle enforcement of personal access token expiry](../admin_area/settings/account_and_limit_settings.md#optional-enforcement-of-personal-access-token-expiry).
+- In GitLab Ultimate, administrators may [toggle enforcement of personal access token expiration](../admin_area/settings/account_and_limit_settings.md#optional-non-enforcement-of-personal-access-token-expiration).
For examples of how you can use a personal access token to authenticate with the API, see the following section from our [API Docs](../../api/README.md#personalproject-access-tokens).
diff --git a/doc/user/profile/preferences.md b/doc/user/profile/preferences.md
index 464edf13a7e..c9b17eaaefe 100644
--- a/doc/user/profile/preferences.md
+++ b/doc/user/profile/preferences.md
@@ -58,12 +58,10 @@ Dark mode is available as a navigation theme, for MVC and compatibility reasons.
the future, we plan to make it configurable in its own section along with support for
[different navigation themes](https://gitlab.com/gitlab-org/gitlab/-/issues/219512).
-NOTE:
Dark theme only works with the **Dark** syntax highlighting theme.
## Syntax highlighting theme
-NOTE:
GitLab uses the [rouge Ruby library](http://rouge.jneen.net/ "Rouge website")
for syntax highlighting outside of any Editor context. The WebIDE (like Snippets)
uses [Monaco Editor](https://microsoft.github.io/monaco-editor/) and it's provided
@@ -88,11 +86,7 @@ The default syntax theme is White, and you can choose among 5 different themes:
![Profile preferences syntax highlighting themes](img/profile-preferences-syntax-themes.png)
-[Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2389) in 13.0, the theme
-you choose also applies to the [Web IDE](../project/web_ide/index.md)'s code editor and [Snippets](../snippets.md).
-The themes are available only in the Web IDE file editor, except for the [dark theme](https://gitlab.com/gitlab-org/gitlab/-/issues/209808) and
-the [Solarized dark theme](https://gitlab.com/gitlab-org/gitlab/-/issues/219228),
-which apply to the entire Web IDE screen.
+Introduced in GitLab 13.6, the themes [Solarized](https://gitlab.com/gitlab-org/gitlab/-/issues/221034) and [Monokai](https://gitlab.com/gitlab-org/gitlab/-/issues/221034) also apply to the [Web IDE](../project/web_ide/index.md) and [Snippets](../snippets.md).
## Behavior
diff --git a/doc/user/project/clusters/add_eks_clusters.md b/doc/user/project/clusters/add_eks_clusters.md
index eb6b8302667..141e8267d75 100644
--- a/doc/user/project/clusters/add_eks_clusters.md
+++ b/doc/user/project/clusters/add_eks_clusters.md
@@ -326,7 +326,7 @@ If a default Storage Class doesn't already exist and is desired, follow Amazon's
to create one.
Alternatively, disable PostgreSQL by setting the project variable
-[`POSTGRES_ENABLED`](../../../topics/autodevops/customize.md#environment-variables) to `false`.
+[`POSTGRES_ENABLED`](../../../topics/autodevops/customize.md#cicd-variables) to `false`.
### Deploy the app to EKS
diff --git a/doc/user/project/clusters/index.md b/doc/user/project/clusters/index.md
index d3d434762ab..fd3426f01e2 100644
--- a/doc/user/project/clusters/index.md
+++ b/doc/user/project/clusters/index.md
@@ -58,7 +58,6 @@ Kubernetes version to any supported version at any time:
- 1.17 (support ends on September 22, 2021)
- 1.16 (support ends on July 22, 2021)
- 1.15 (support ends on May 22, 2021)
-- 1.14 (deprecated, support ends on December 22, 2020)
Some GitLab features may support versions outside the range provided here.
diff --git a/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md b/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md
index 0c4ec72ed5b..0383675e38c 100644
--- a/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md
+++ b/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md
@@ -15,7 +15,7 @@ applications through GMAv2 exclusively when using Container Network Security.
The following steps are recommended to install and use Container Host Security through GitLab:
1. [Install at least one runner and connect it to GitLab](https://docs.gitlab.com/runner/).
-1. [Create a group](../../../../group/#create-a-new-group).
+1. [Create a group](../../../../group/#create-a-group).
1. [Connect a Kubernetes cluster to the group](../../add_remove_clusters.md).
1. [Create a cluster management project and associate it with the Kubernetes cluster](../../../../clusters/management_project.md).
diff --git a/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md b/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md
index e530f0dfcda..30f0791a054 100644
--- a/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md
+++ b/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md
@@ -15,7 +15,7 @@ applications through GMAv2 exclusively when using Container Network Security.
The following steps are recommended to install and use Container Network Security through GitLab:
1. [Install at least one runner and connect it to GitLab](https://docs.gitlab.com/runner/).
-1. [Create a group](../../../../group/#create-a-new-group).
+1. [Create a group](../../../../group/#create-a-group).
1. [Connect a Kubernetes cluster to the group](../../add_remove_clusters.md).
1. [Create a cluster management project and associate it with the Kubernetes cluster](../../../../clusters/management_project.md).
diff --git a/doc/user/project/code_intelligence.md b/doc/user/project/code_intelligence.md
index 0e8c1bf8f4d..b290359cc6c 100644
--- a/doc/user/project/code_intelligence.md
+++ b/doc/user/project/code_intelligence.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
type: reference
---
@@ -19,6 +19,9 @@ Code Intelligence is built into GitLab and powered by [LSIF](https://lsif.dev/)
(Language Server Index Format), a file format for precomputed code
intelligence data.
+NOTE:
+You can automate this feature in your applications by using [Auto DevOps](../../topics/autodevops/index.md).
+
## Configuration
Enable code intelligence for a project by adding a GitLab CI/CD job to the project's
diff --git a/doc/user/project/deploy_boards.md b/doc/user/project/deploy_boards.md
index 72695580d9d..83e3d0c2c80 100644
--- a/doc/user/project/deploy_boards.md
+++ b/doc/user/project/deploy_boards.md
@@ -16,6 +16,10 @@ of the pods in the deployment. Developers and other teammates can view the
progress and status of a rollout, pod by pod, in the workflow they already use
without any need to access Kubernetes.
+NOTE:
+If you have a Kubernetes cluster, you can Auto Deploy applications to production
+environments by using [Auto DevOps](../../topics/autodevops/index.md).
+
## Overview
With Deploy Boards you can gain more insight into deploys with benefits such as:
diff --git a/doc/user/project/deploy_tokens/index.md b/doc/user/project/deploy_tokens/index.md
index 6f05c40eefc..2eb9bdf0c2a 100644
--- a/doc/user/project/deploy_tokens/index.md
+++ b/doc/user/project/deploy_tokens/index.md
@@ -20,7 +20,7 @@ Deploy tokens can be managed by [maintainers only](../../permissions.md).
Deploy tokens cannot be used with the GitLab API.
-If you have a key pair, you might want to use [deploy keys](../../../ssh/README.md#deploy-keys)
+If you have a key pair, you might want to use [deploy keys](../../project/deploy_keys/index.md)
instead.
## Creating a Deploy Token
@@ -180,7 +180,6 @@ docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
```
NOTE:
-The special handling for the `gitlab-deploy-token` deploy token is not currently
-implemented for group deploy tokens. For the deploy token to be available for
-CI/CD jobs, it must be created at the project level. For details, see
-[this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/214014).
+The special handling for the `gitlab-deploy-token` deploy token is not
+implemented for group deploy tokens. To make the group-level deploy token available for
+CI/CD jobs, use the workaround in [issue 214014](https://gitlab.com/gitlab-org/gitlab/-/issues/214014).
diff --git a/doc/user/project/description_templates.md b/doc/user/project/description_templates.md
index c56470ee07a..307313ffb49 100644
--- a/doc/user/project/description_templates.md
+++ b/doc/user/project/description_templates.md
@@ -37,10 +37,10 @@ To learn how to create templates for various file types in groups, visit
images guidelines, link to the related issue, reviewer name, and so on.
- You can also create issues and merge request templates for different
stages of your workflow, for example, feature proposal, feature improvement, or a bug report.
-- You can use an [issue description template](#creating-issue-templates) as a
+- You can use an [issue description template](#create-an-issue-template) as a
[Service Desk email template](service_desk.md#new-service-desk-issues).
-## Creating issue templates
+## Create an issue template
Create a new Markdown (`.md`) file inside the `.gitlab/issue_templates/`
directory in your repository. Commit and push to your default branch.
@@ -65,13 +65,13 @@ To create the `.gitlab/issue_templates` directory:
To check if this has worked correctly, [create a new issue](issues/managing_issues.md#create-a-new-issue)
and see if you can choose a description template.
-## Creating merge request templates
+## Create a merge request template
Similarly to issue templates, create a new Markdown (`.md`) file inside the
`.gitlab/merge_request_templates/` directory in your repository. Commit and
push to your default branch.
-## Using the templates
+## Use the templates
Let's take for example that you've created the file `.gitlab/issue_templates/Bug.md`.
This enables the `Bug` dropdown option when creating or editing issues. When
@@ -85,9 +85,45 @@ For example: `https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_templat
![Description templates](img/description_templates.png)
-## Setting a default template for merge requests and issues **(PREMIUM)**
+### Set an issue and merge request description template at group level **(PREMIUM)**
-> - Moved to GitLab Premium in 13.9.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52360) in GitLab 13.9.
+> - It's [deployed behind a feature flag](../feature_flags.md), disabled by default.
+> - It's disabled by default on GitLab.com.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to
+ [enable it](#enable-or-disable-issue-and-merge-request-description-templates-at-group-and-instance-level).
+
+Templates can be useful because you can create a template once and use it multiple times.
+To re-use templates [you've created](../project/description_templates.md#create-an-issue-template):
+
+1. Go to the group's **Settings > General > Templates**.
+1. From the dropdown, select your template project as the template repository at group level.
+
+![Group template settings](../group/img/group_file_template_settings.png)
+
+### Set an issue and merge request description template at instance level **(PREMIUM ONLY)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52360) in GitLab 13.9.
+> - It's [deployed behind a feature flag](../feature_flags.md), disabled by default.
+> - It's disabled by default on GitLab.com.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to
+ [enable it](#enable-or-disable-issue-and-merge-request-description-templates-at-group-and-instance-level).
+
+Similar to group templates, issue and merge request templates can also be set up at the instance level.
+This results in those templates being available in all projects within the instance.
+Only instance administrators can set instance-level templates.
+
+To set the instance-level description template repository:
+
+1. Select the **Admin Area** icon (**{admin}**).
+1. Go to **Settings > Templates**.
+1. From the dropdown, select your template project as the template repository at instance level.
+
+Learn more about [instance template repository](../admin_area/settings/instance_template_repository.md).
+
+![Setting templates in the Admin Area](../admin_area/settings/img/file_template_admin_area.png)
+
+### Set a default template for merge requests and issues **(PREMIUM)**
The visibility of issues or merge requests should be set to either "Everyone
with access" or "Only Project Members" in your project's **Settings / Visibility, project features, permissions** section, otherwise the
@@ -159,3 +195,28 @@ it's very hard to read otherwise.)
/cc @project-manager
/assign @qa-tester
```
+
+## Enable or disable issue and merge request description templates at group and instance level
+
+Setting issue and merge request description templates at group and instance levels
+is under development and not ready for production use. It is deployed behind a
+feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:inherited_issuable_templates)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:inherited_issuable_templates)
+```
+
+The feature flag affects these features:
+
+- Setting a templates project as issue and merge request description templates source at group level.
+- Setting a templates project as issue and merge request description templates source at instance level.
diff --git a/doc/user/project/import/github.md b/doc/user/project/import/github.md
index c135b1be54a..11b7f2445e7 100644
--- a/doc/user/project/import/github.md
+++ b/doc/user/project/import/github.md
@@ -62,7 +62,7 @@ must meet one of the following conditions prior to the import:
- Have previously logged in to a GitLab account using the GitHub icon.
- Have a GitHub account with a publicly visible
- [primary email address](https://docs.github.com/en/free-pro-team@latest/rest/reference/users#get-a-user)
+ [primary email address](https://docs.github.com/en/rest/reference/users#get-a-user)
on their profile that matches their GitLab account's primary or secondary email address.
If a user referenced in the project is not found in the GitLab database, the project creator (typically the user
@@ -91,7 +91,7 @@ Before you begin, ensure that any GitHub users who you want to map to GitLab use
- A GitLab account that has logged in using the GitHub icon
\- or -
-- A GitLab account with an email address that matches the [publicly visible email address](https://docs.github.com/en/free-pro-team@latest/rest/reference/users#get-a-user) in the profile of the GitHub user
+- A GitLab account with an email address that matches the [publicly visible email address](https://docs.github.com/en/rest/reference/users#get-a-user) in the profile of the GitHub user
User-matching attempts occur in that order, and if a user is not identified either way, the activity is associated with
the user account that is performing the import.
diff --git a/doc/user/project/integrations/bamboo.md b/doc/user/project/integrations/bamboo.md
index fb9314f7504..3b012ab4430 100644
--- a/doc/user/project/integrations/bamboo.md
+++ b/doc/user/project/integrations/bamboo.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Atlassian Bamboo CI Service
+# Atlassian Bamboo CI Service **(FREE)**
GitLab provides integration with Atlassian Bamboo for continuous integration.
When configured, pushes to a project trigger a build in Bamboo automatically.
diff --git a/doc/user/project/integrations/bugzilla.md b/doc/user/project/integrations/bugzilla.md
index 4e2ee9b3662..7e14515d98e 100644
--- a/doc/user/project/integrations/bugzilla.md
+++ b/doc/user/project/integrations/bugzilla.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Bugzilla Service
+# Bugzilla Service **(FREE)**
Navigate to the [Integrations page](overview.md#accessing-integrations),
select the **Bugzilla** service and fill in the required details as described
diff --git a/doc/user/project/integrations/custom_issue_tracker.md b/doc/user/project/integrations/custom_issue_tracker.md
index 143f0e2a25d..9cc4e980212 100644
--- a/doc/user/project/integrations/custom_issue_tracker.md
+++ b/doc/user/project/integrations/custom_issue_tracker.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Custom Issue Tracker service
+# Custom Issue Tracker service **(FREE)**
To enable the Custom Issue Tracker integration in a project:
diff --git a/doc/user/project/integrations/discord_notifications.md b/doc/user/project/integrations/discord_notifications.md
index 8e0a167a968..624c0252f23 100644
--- a/doc/user/project/integrations/discord_notifications.md
+++ b/doc/user/project/integrations/discord_notifications.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Discord Notifications service
+# Discord Notifications service **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22684) in GitLab 11.6.
diff --git a/doc/user/project/integrations/emails_on_push.md b/doc/user/project/integrations/emails_on_push.md
index 2274913d349..4970e20974b 100644
--- a/doc/user/project/integrations/emails_on_push.md
+++ b/doc/user/project/integrations/emails_on_push.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Enabling emails on push
+# Enabling emails on push **(FREE)**
By enabling this service, you receive email notifications for every change
that is pushed to your project.
diff --git a/doc/user/project/integrations/github.md b/doc/user/project/integrations/github.md
index 5ef36ff4074..1c0309cab87 100644
--- a/doc/user/project/integrations/github.md
+++ b/doc/user/project/integrations/github.md
@@ -20,7 +20,7 @@ and is automatically configured on [GitHub import](../../../integration/github.m
### Complete these steps on GitHub
-This integration requires a [GitHub API token](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token)
+This integration requires a [GitHub API token](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token)
with `repo:status` access granted:
1. Go to your "Personal access tokens" page at <https://github.com/settings/tokens>
diff --git a/doc/user/project/integrations/hangouts_chat.md b/doc/user/project/integrations/hangouts_chat.md
index 06dcca6eb44..d0efebd4da7 100644
--- a/doc/user/project/integrations/hangouts_chat.md
+++ b/doc/user/project/integrations/hangouts_chat.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Hangouts Chat service
+# Hangouts Chat service **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/43756) in GitLab 11.2.
diff --git a/doc/user/project/integrations/hipchat.md b/doc/user/project/integrations/hipchat.md
index 7b90d8d7cfd..f66fc0a0f6a 100644
--- a/doc/user/project/integrations/hipchat.md
+++ b/doc/user/project/integrations/hipchat.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Atlassian HipChat
+# Atlassian HipChat **(FREE)**
GitLab provides a way to send HipChat notifications upon a number of events,
such as when a user pushes code, creates a branch or tag, adds a comment, and
diff --git a/doc/user/project/integrations/index.md b/doc/user/project/integrations/index.md
index 0e5163e992a..5628a9bc5e5 100644
--- a/doc/user/project/integrations/index.md
+++ b/doc/user/project/integrations/index.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Project integrations
+# Project integrations **(FREE)**
You can find the available integrations under your project's
**Settings > Integrations** page. You need to have at least
diff --git a/doc/user/project/integrations/irker.md b/doc/user/project/integrations/irker.md
index 58f7ea3279f..e75561b3ddb 100644
--- a/doc/user/project/integrations/irker.md
+++ b/doc/user/project/integrations/irker.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Irker IRC Gateway
+# Irker IRC Gateway **(FREE)**
GitLab provides a way to push update messages to an Irker server. When
configured, pushes to a project trigger the service to send data directly
diff --git a/doc/user/project/integrations/jira.md b/doc/user/project/integrations/jira.md
index 5857c3da803..050f4faa5aa 100644
--- a/doc/user/project/integrations/jira.md
+++ b/doc/user/project/integrations/jira.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# GitLab Jira integration
+# GitLab Jira integration **(FREE)**
You can use Jira to track work implemented in GitLab. The Jira integration with GitLab makes the
process of working across these systems more efficient.
@@ -106,8 +106,6 @@ To enable the Jira integration in a project:
1. To include a comment on the Jira issue when the above reference is made in GitLab, select
**Enable comments**.
- 1. Select the **Comment detail**: **Standard** or **All details**.
-
1. Enter the further details on the page as described in the following table.
| Field | Description |
@@ -116,7 +114,6 @@ To enable the Jira integration in a project:
| `Jira API URL` | The base URL to the Jira instance API. Web URL value is used if not set. For example, `https://jira-api.example.com`. Leave this field blank (or use the same value of `Web URL`) if using **Jira on Atlassian cloud**. |
| `Username or Email` | Created in [configure Jira](#configure-jira) step. Use `username` for **Jira Server** or `email` for **Jira on Atlassian cloud**. |
| `Password/API token` | Created in [configure Jira](#configure-jira) step. Use `password` for **Jira Server** or `API token` for **Jira on Atlassian cloud**. |
- | `Jira workflow transition IDs` | Required for closing Jira issues via commits or merge requests. These are the IDs of transitions in Jira that move issues to a particular state. (See [Obtaining a transition ID](#obtaining-a-transition-id).) If you insert multiple transition IDs separated by `,` or `;`, the issue is moved to each state, one after another, using the given order. In GitLab 13.6 and earlier, field was called `Transition ID`. |
1. To enable users to view Jira issues inside the GitLab project, select **Enable Jira issues** and
enter a Jira project key. **(PREMIUM)**
@@ -138,10 +135,19 @@ To enable the Jira integration in a project:
Your GitLab project can now interact with all Jira projects in your instance and the project now
displays a Jira link that opens the Jira project.
-#### Obtaining a transition ID
+#### Automatic issue transitions
+
+When you [close a Jira issues with a trigger word](../issues/managing_issues.md#closing-issues-automatically),
+GitLab by default transitions the issue to the next available status with a category of "Done".
+
+#### Custom issue transitions
+
+For advanced workflows you can specify custom Jira transition IDs. If you insert multiple transition IDs separated by `,` or `;`, the issue is moved to each state, one after another, using the given order.
+
+To see the transition IDs on Jira Cloud, edit a workflow in the **Text** view.
+The transition IDs display in the **Transitions** column.
-In the most recent Jira user interface, you can no longer see transition IDs in the workflow
-administration UI. You can get the ID you need in either of the following ways:
+On Jira Server you can get the transition IDs in either of the following ways:
1. By using the API, with a request like `https://yourcompany.atlassian.net/rest/api/2/issue/ISSUE-123/transitions`
using an issue that is in the appropriate "open" state
diff --git a/doc/user/project/integrations/jira_cloud_configuration.md b/doc/user/project/integrations/jira_cloud_configuration.md
index e9f30f32308..8e25af3f884 100644
--- a/doc/user/project/integrations/jira_cloud_configuration.md
+++ b/doc/user/project/integrations/jira_cloud_configuration.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Create an API token in Jira on Atlassian cloud
+# Create an API token in Jira on Atlassian cloud **(FREE)**
For [integrations with Jira](jira.md), an API token is needed when integrating with Jira
on Atlassian cloud. To create an API token:
diff --git a/doc/user/project/integrations/jira_integrations.md b/doc/user/project/integrations/jira_integrations.md
index 6a1529f001a..6b938238320 100644
--- a/doc/user/project/integrations/jira_integrations.md
+++ b/doc/user/project/integrations/jira_integrations.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Jira integrations
+# Jira integrations **(FREE)**
GitLab can be integrated with [Jira](https://www.atlassian.com/software/jira).
diff --git a/doc/user/project/integrations/jira_server_configuration.md b/doc/user/project/integrations/jira_server_configuration.md
index 5bb17388a1e..b1ab2076dc0 100644
--- a/doc/user/project/integrations/jira_server_configuration.md
+++ b/doc/user/project/integrations/jira_server_configuration.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Create Jira Server username and password
+# Create Jira Server username and password **(FREE)**
For [integrations with Jira](jira.md), you must create a user account in Jira to have access to
all projects that need to integrate with GitLab.
diff --git a/doc/user/project/integrations/mattermost.md b/doc/user/project/integrations/mattermost.md
index db190f47b01..6a93fc0fb06 100644
--- a/doc/user/project/integrations/mattermost.md
+++ b/doc/user/project/integrations/mattermost.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Mattermost Notifications Service
+# Mattermost Notifications Service **(FREE)**
The Mattermost Notifications Service allows your GitLab project to send events (e.g., `issue created`) to your existing Mattermost team as notifications. This requires configurations in both Mattermost and GitLab.
diff --git a/doc/user/project/integrations/mattermost_slash_commands.md b/doc/user/project/integrations/mattermost_slash_commands.md
index 6c8a0ded2ae..d2ef6a24ddf 100644
--- a/doc/user/project/integrations/mattermost_slash_commands.md
+++ b/doc/user/project/integrations/mattermost_slash_commands.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Mattermost slash commands
+# Mattermost slash commands **(FREE)**
> Introduced in GitLab 8.14
diff --git a/doc/user/project/integrations/microsoft_teams.md b/doc/user/project/integrations/microsoft_teams.md
index 136da05d0e8..41e0938fc3b 100644
--- a/doc/user/project/integrations/microsoft_teams.md
+++ b/doc/user/project/integrations/microsoft_teams.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Microsoft Teams service
+# Microsoft Teams service **(FREE)**
## On Microsoft Teams
diff --git a/doc/user/project/integrations/mock_ci.md b/doc/user/project/integrations/mock_ci.md
index 18f0ad6b275..934510fd155 100644
--- a/doc/user/project/integrations/mock_ci.md
+++ b/doc/user/project/integrations/mock_ci.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Mock CI Service
+# Mock CI Service **(FREE)**
**NB: This service is only listed if you are in a development environment!**
diff --git a/doc/user/project/integrations/overview.md b/doc/user/project/integrations/overview.md
index b22a7c0295e..f6590b6ba2f 100644
--- a/doc/user/project/integrations/overview.md
+++ b/doc/user/project/integrations/overview.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Integrations
+# Integrations **(FREE)**
Integrations allow you to integrate GitLab with other applications. They
are a bit like plugins in that they allow a lot of freedom in adding
diff --git a/doc/user/project/integrations/redmine.md b/doc/user/project/integrations/redmine.md
index 38d6194b390..256ffe84ee2 100644
--- a/doc/user/project/integrations/redmine.md
+++ b/doc/user/project/integrations/redmine.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Redmine Service
+# Redmine Service **(FREE)**
1. To enable the Redmine integration in a project, navigate to the
[Integrations page](overview.md#accessing-integrations), click
diff --git a/doc/user/project/integrations/servicenow.md b/doc/user/project/integrations/servicenow.md
index 1de69f60a34..bdc05552c31 100644
--- a/doc/user/project/integrations/servicenow.md
+++ b/doc/user/project/integrations/servicenow.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# ServiceNow integration
+# ServiceNow integration **(FREE)**
ServiceNow offers several integrations to help centralize and automate your
management of GitLab workflows.
diff --git a/doc/user/project/integrations/services_templates.md b/doc/user/project/integrations/services_templates.md
index 7507792bb02..66810d8a01b 100644
--- a/doc/user/project/integrations/services_templates.md
+++ b/doc/user/project/integrations/services_templates.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Service templates
+# Service templates **(FREE)**
WARNING:
Service templates are [deprecated and scheduled to be removed](https://gitlab.com/gitlab-org/gitlab/-/issues/268032)
diff --git a/doc/user/project/integrations/slack.md b/doc/user/project/integrations/slack.md
index ab798675278..17d1c3adcb5 100644
--- a/doc/user/project/integrations/slack.md
+++ b/doc/user/project/integrations/slack.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Slack Notifications Service
+# Slack Notifications Service **(FREE)**
The Slack Notifications Service allows your GitLab project to send events
(such as issue creation) to your existing Slack team as notifications. Setting up
diff --git a/doc/user/project/integrations/unify_circuit.md b/doc/user/project/integrations/unify_circuit.md
index e8dcb577aba..3e5e368722e 100644
--- a/doc/user/project/integrations/unify_circuit.md
+++ b/doc/user/project/integrations/unify_circuit.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Unify Circuit service
+# Unify Circuit service **(FREE)**
The Unify Circuit service sends notifications from GitLab to the conversation for which the webhook was created.
diff --git a/doc/user/project/integrations/webex_teams.md b/doc/user/project/integrations/webex_teams.md
index 8a3383fd0e7..6820412808f 100644
--- a/doc/user/project/integrations/webex_teams.md
+++ b/doc/user/project/integrations/webex_teams.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Webex Teams service
+# Webex Teams service **(FREE)**
You can configure GitLab to send notifications to a Webex Teams space.
diff --git a/doc/user/project/integrations/webhooks.md b/doc/user/project/integrations/webhooks.md
index 0cf01adef13..63f15b7b914 100644
--- a/doc/user/project/integrations/webhooks.md
+++ b/doc/user/project/integrations/webhooks.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Webhooks
+# Webhooks **(FREE)**
Project webhooks allow you to trigger a percent-encoded URL if, for example, new code is pushed or
a new issue is created. You can configure webhooks to listen for specific events
diff --git a/doc/user/project/integrations/youtrack.md b/doc/user/project/integrations/youtrack.md
index f9b3c083a54..f9f61de9d6b 100644
--- a/doc/user/project/integrations/youtrack.md
+++ b/doc/user/project/integrations/youtrack.md
@@ -4,7 +4,7 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# YouTrack Service
+# YouTrack Service **(FREE)**
JetBrains [YouTrack](https://www.jetbrains.com/help/youtrack/standalone/YouTrack-Documentation.html) is a web-based issue tracking and project management platform.
diff --git a/doc/user/project/issue_board.md b/doc/user/project/issue_board.md
index e4f42b97b84..9c12591fa61 100644
--- a/doc/user/project/issue_board.md
+++ b/doc/user/project/issue_board.md
@@ -154,7 +154,7 @@ for them.
NOTE:
For a broader use case, please see the blog post
-[GitLab Workflow, an Overview](https://about.gitlab.com/blog/2016/10/25/gitlab-workflow-an-overview/#gitlab-workflow-use-case-scenario).
+[GitLab Workflow, an Overview](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/#gitlab-workflow-a-use-case-scenario).
For a real use case example, you can read why
[Codepen decided to adopt issue boards](https://about.gitlab.com/blog/2017/01/27/codepen-welcome-to-gitlab/#project-management-everything-in-one-place)
to improve their workflow with multiple boards.
@@ -277,6 +277,32 @@ group and its descendant subgroups. Similarly, you can only filter by group labe
boards. When updating milestones and labels for an issue through the sidebar update mechanism, again only
group-level objects are available.
+#### GraphQL-based sidebar for group issue boards **(PREMIUM)**
+
+<!-- When the feature flag is removed, integrate this section into the above ("Group issue boards"). -->
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/285074) in GitLab 13.9.
+> - It's [deployed behind a feature flag](../feature_flags.md), disabled by default.
+> - It's disabled on GitLab.com.
+> - It's not recommended for production use.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-graphql-based-sidebar-for-group-issue-boards). **(PREMIUM SELF)**
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
+
+The work-in-progress GraphQL-based sidebar for group issue boards brings better performance and the
+ability to edit issue titles in the issue sidebar.
+
+To **edit an issue's title** in the issue sidebar:
+
+1. In a group issue board, select the issue card. The issue sidebar opens on the right.
+1. Next to the issue's title, select **Edit**.
+
+This is work in progress as of GitLab 13.9. Learn more about the known issues in
+[MR 51480](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51480).
+
+<!-- Add this at the end of the file -->
+
### Assignee lists **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5784) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.0.
@@ -317,6 +343,7 @@ As in other list types, click the trash icon to remove a list.
> - Grouping by epic [introduced](https://gitlab.com/groups/gitlab-org/-/epics/3352) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.6.
> - Editing issue titles in the issue sidebar [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/232745) in GitLab 13.8.
+> - Editing iteration in the issue sidebar [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/290232) in GitLab 13.9.
With swimlanes you can visualize issues grouped by epic.
Your issue board keeps all the other features, but with a different visual organization of issues.
@@ -456,24 +483,6 @@ the list by filtering by the following:
- Release
- Weight
-#### Enable or disable adding issues to the list **(FREE SELF)**
-
-Adding issues to the list is deployed behind a feature flag that is **disabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
-can enable it.
-
-To enable it:
-
-```ruby
-Feature.enable(:add_issues_button)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:add_issues_button)
-```
-
### Remove an issue from a list
Removing an issue from a list can be done by clicking the issue card and then
@@ -593,3 +602,40 @@ A few things to remember:
- For performance and visibility reasons, each list shows the first 20 issues
by default. If you have more than 20 issues, start scrolling down and the next
20 appear.
+
+## Enable or disable GraphQL-based sidebar for group issue boards **(PREMIUM SELF)**
+
+GraphQL-based sidebar for group issue boards is under development and not ready for production use.
+It is deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:graphql_board_lists)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:graphql_board_lists)
+```
+
+## Enable or disable adding issues to the list **(FREE SELF)**
+
+Adding issues to the list is deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:add_issues_button)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:add_issues_button)
+```
diff --git a/doc/user/project/issues/index.md b/doc/user/project/issues/index.md
index e398c6f86d0..7a7c3578d42 100644
--- a/doc/user/project/issues/index.md
+++ b/doc/user/project/issues/index.md
@@ -184,7 +184,7 @@ You can then see issue statuses in the [issue list](#issues-list) and the
## Other Issue actions
-- [Create an issue from a template](../../project/description_templates.md#using-the-templates)
+- [Create an issue from a template](../../project/description_templates.md#use-the-templates)
- [Set a due date](due_dates.md)
- [Bulk edit issues](../bulk_editing.md) - From the Issues List, select multiple issues
in order to change their status, assignee, milestone, or labels in bulk.
diff --git a/doc/user/project/merge_requests/allow_collaboration.md b/doc/user/project/merge_requests/allow_collaboration.md
index 7aa7673366d..64757dff749 100644
--- a/doc/user/project/merge_requests/allow_collaboration.md
+++ b/doc/user/project/merge_requests/allow_collaboration.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, howto
---
diff --git a/doc/user/project/merge_requests/authorization_for_merge_requests.md b/doc/user/project/merge_requests/authorization_for_merge_requests.md
index 36481ac0133..aa43d34cdd9 100644
--- a/doc/user/project/merge_requests/authorization_for_merge_requests.md
+++ b/doc/user/project/merge_requests/authorization_for_merge_requests.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: concepts
---
diff --git a/doc/user/project/merge_requests/browser_performance_testing.md b/doc/user/project/merge_requests/browser_performance_testing.md
index 6fa2340c7a4..f6575ba4173 100644
--- a/doc/user/project/merge_requests/browser_performance_testing.md
+++ b/doc/user/project/merge_requests/browser_performance_testing.md
@@ -13,6 +13,9 @@ If your application offers a web interface and you're using
[GitLab CI/CD](../../../ci/README.md), you can quickly determine the rendering performance
impact of pending code changes in the browser.
+NOTE:
+You can automate this feature in your applications by using [Auto DevOps](../../../topics/autodevops/index.md).
+
## Overview
GitLab uses [Sitespeed.io](https://www.sitespeed.io), a free and open source
diff --git a/doc/user/project/merge_requests/code_quality.md b/doc/user/project/merge_requests/code_quality.md
index 55dc0bcc41a..451561cc22f 100644
--- a/doc/user/project/merge_requests/code_quality.md
+++ b/doc/user/project/merge_requests/code_quality.md
@@ -22,8 +22,7 @@ Code Quality:
[GitLab Code
Quality](https://gitlab.com/gitlab-org/ci-cd/codequality) project using [default Code Climate configurations](https://gitlab.com/gitlab-org/ci-cd/codequality/-/tree/master/codeclimate_defaults).
- Can make use of a [template](#example-configuration).
-- Is available with [Auto
- DevOps](../../../topics/autodevops/stages.md#auto-code-quality).
+- Is available by using [Auto Code Quality](../../../topics/autodevops/stages.md#auto-code-quality), provided by [Auto DevOps](../../../topics/autodevops/index.md).
- Can be extended through [Analysis Plugins](https://docs.codeclimate.com/docs/list-of-engines) or a [custom tool](#implementing-a-custom-tool).
## Code Quality Widget
diff --git a/doc/user/project/merge_requests/creating_merge_requests.md b/doc/user/project/merge_requests/creating_merge_requests.md
index 5cfedc6c9f1..dfd160fc91b 100644
--- a/doc/user/project/merge_requests/creating_merge_requests.md
+++ b/doc/user/project/merge_requests/creating_merge_requests.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: howto
description: "How to create Merge Requests in GitLab."
diff --git a/doc/user/project/merge_requests/getting_started.md b/doc/user/project/merge_requests/getting_started.md
index b1a57d9c3e6..dc6c5cdbfe6 100644
--- a/doc/user/project/merge_requests/getting_started.md
+++ b/doc/user/project/merge_requests/getting_started.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: index, reference
description: "Getting started with Merge Requests."
@@ -122,17 +122,19 @@ Requesting a code review is an important part of contributing code. However, dec
your code and asking for a review are no easy tasks. Using the "assignee" field for both authors and
reviewers makes it hard for others to determine who's doing what on a merge request.
-GitLab Merge Request Reviewers easily allow authors to request a review as well as see the status of the
-review. By selecting one or more users from the **Reviewers** field in the merge request's right-hand
-sidebar, the assigned reviewers will receive a notification of the request to review the merge request.
+The Merge Request Reviewers feature enables you to request a review of your work, and
+see the status of the review. Reviewers help distinguish the roles of the users
+involved in the merge request. In comparison to an **Assignee**, who is directly
+responsible for creating or merging a merge request, a **Reviewer** is a team member
+who may only be involved in one aspect of the merge request, such as a peer review.
-This makes it easy to determine the relevant roles for the users involved in the merge request, as well as formally requesting a review from a peer.
-
-To request it, open the **Reviewers** drop-down box to search for the user you wish to get a review from.
+To request a review of a merge request, expand the **Reviewers** select box in
+the right-hand sidebar. Search for the users you want to request a review from.
+When selected, GitLab creates a [to-do list item](../../todos.md) for each reviewer.
#### Approval Rule information for Reviewers **(PREMIUM)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/233736) in GitLab 13.8. For this version only, GitLab administrators can opt to [enable it](#enable-or-disable-approval-rule-information).
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/233736) in GitLab 13.8.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/293742) in GitLab 13.9.
When editing the **Reviewers** field in a new or existing merge request, GitLab
@@ -231,33 +233,6 @@ forks are not retargeted.
reviews are faster and your changes are less prone to errors.
- Do not use capital letters nor special chars in branch names.
-## Enable or disable Approval Rule information **(PREMIUM SELF)**
-
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/293742) in GitLab 13.9.
-
-Merge Request Reviewers is under development and ready for production use.
-It is deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
-can opt to disable it.
-
-To enable it:
-
-```ruby
-# For the instance
-Feature.enable(:reviewer_approval_rules)
-# For a single project
-Feature.enable(:reviewer_approval_rules, Project.find(<project id>))
-```
-
-To disable it:
-
-```ruby
-# For the instance
-Feature.disable(:reviewer_approval_rules)
-# For a single project
-Feature.disable(:reviewer_approval_rules, Project.find(<project id>))
-```
-
### Enable or disable branch retargeting on merge **(FREE SELF)**
Automatically retargeting merge requests is under development but ready for production use.
diff --git a/doc/user/project/merge_requests/index.md b/doc/user/project/merge_requests/index.md
index 8ccf50e48b8..7e25e5bacdf 100644
--- a/doc/user/project/merge_requests/index.md
+++ b/doc/user/project/merge_requests/index.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: index, reference
---
@@ -36,7 +36,7 @@ B. Consider you're a web developer writing a webpage for your company's website:
1. Your changes are previewed with [Review Apps](../../../ci/review_apps/index.md)
1. You request your web designers for their implementation
1. You request the [approval](merge_request_approvals.md) from your manager **(STARTER)**
-1. Once approved, your merge request is [squashed and merged](squash_and_merge.md), and [deployed to staging with GitLab Pages](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/)
+1. Once approved, your merge request is [squashed and merged](squash_and_merge.md), and [deployed to staging with GitLab Pages](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/)
1. Your production team [cherry picks](cherry_pick_changes.md) the merge commit into production
## Overview
diff --git a/doc/user/project/merge_requests/merge_request_approvals.md b/doc/user/project/merge_requests/merge_request_approvals.md
index 1fcc09a9d8a..a72ad8784e7 100644
--- a/doc/user/project/merge_requests/merge_request_approvals.md
+++ b/doc/user/project/merge_requests/merge_request_approvals.md
@@ -138,14 +138,14 @@ to push or merge code to any branches.
To enable this access:
-1. [Create a new group](../../group/index.md#create-a-new-group), and then
+1. [Create a new group](../../group/index.md#create-a-group), and then
[add the user to the group](../../group/index.md#add-users-to-a-group),
ensuring you select the Reporter role for the user.
1. [Share the project with your group](../members/share_project_with_groups.md#sharing-a-project-with-a-group-of-users),
based on the Reporter role.
1. Navigate to your project's **Settings > General**, and in the
**Merge request approvals** section, click **Expand**.
-1. [Add the group](../../group/index.md#create-a-new-group) to the permission list
+1. [Add the group](../../group/index.md#create-a-group) to the permission list
for the protected branch.
![Update approval rule](img/update_approval_rule_v13_4.png)
diff --git a/doc/user/project/merge_requests/merge_request_dependencies.md b/doc/user/project/merge_requests/merge_request_dependencies.md
index 646d77391a3..1949677177e 100644
--- a/doc/user/project/merge_requests/merge_request_dependencies.md
+++ b/doc/user/project/merge_requests/merge_request_dependencies.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, concepts
---
diff --git a/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md b/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md
index d33a8e40aac..7b8054b6d4b 100644
--- a/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md
+++ b/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, concepts
---
diff --git a/doc/user/project/merge_requests/resolve_conflicts.md b/doc/user/project/merge_requests/resolve_conflicts.md
index a53b5032e1d..4d5d89d6508 100644
--- a/doc/user/project/merge_requests/resolve_conflicts.md
+++ b/doc/user/project/merge_requests/resolve_conflicts.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, concepts
---
diff --git a/doc/user/project/merge_requests/revert_changes.md b/doc/user/project/merge_requests/revert_changes.md
index d5d0578c07c..077faed3740 100644
--- a/doc/user/project/merge_requests/revert_changes.md
+++ b/doc/user/project/merge_requests/revert_changes.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, concepts
---
diff --git a/doc/user/project/merge_requests/reviewing_and_managing_merge_requests.md b/doc/user/project/merge_requests/reviewing_and_managing_merge_requests.md
index 94f48fa544f..d7f7c3da000 100644
--- a/doc/user/project/merge_requests/reviewing_and_managing_merge_requests.md
+++ b/doc/user/project/merge_requests/reviewing_and_managing_merge_requests.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: index, reference
---
diff --git a/doc/user/project/merge_requests/work_in_progress_merge_requests.md b/doc/user/project/merge_requests/work_in_progress_merge_requests.md
index 43ab03114fa..6eef6505b5d 100644
--- a/doc/user/project/merge_requests/work_in_progress_merge_requests.md
+++ b/doc/user/project/merge_requests/work_in_progress_merge_requests.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Source Code
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, concepts
---
diff --git a/doc/user/project/milestones/burndown_charts.md b/doc/user/project/milestones/burndown_charts.md
deleted file mode 100644
index 2985e5da2ab..00000000000
--- a/doc/user/project/milestones/burndown_charts.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-redirect_to: 'burndown_and_burnup_charts.md'
----
-
-This document was moved to [another location](burndown_and_burnup_charts.md).
-
-<!-- This redirect file can be deleted after February 1, 2021. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/project/pages/getting_started/pages_from_scratch.md b/doc/user/project/pages/getting_started/pages_from_scratch.md
index 3f2df634e3a..86bbffa0fa8 100644
--- a/doc/user/project/pages/getting_started/pages_from_scratch.md
+++ b/doc/user/project/pages/getting_started/pages_from_scratch.md
@@ -396,7 +396,7 @@ but also pushes with **continuous tests** to feature-branches,
For more information, see the following blog posts.
- [Use GitLab CI/CD `environments` to deploy your
- web app to staging and production](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/).
+ web app to staging and production](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/).
- Learn [how to run jobs sequentially,
in parallel, or build a custom pipeline](https://about.gitlab.com/blog/2016/07/29/the-basics-of-gitlab-ci/).
- Learn [how to pull specific directories from different projects](https://about.gitlab.com/blog/2016/12/07/building-a-new-gitlab-docs-site-with-nanoc-gitlab-ci-and-gitlab-pages/)
diff --git a/doc/user/project/pages/index.md b/doc/user/project/pages/index.md
index 6eb06972945..1b04561c3c2 100644
--- a/doc/user/project/pages/index.md
+++ b/doc/user/project/pages/index.md
@@ -116,7 +116,7 @@ to use and adapt to your own needs:
- [Posting to your GitLab Pages blog from iOS](https://about.gitlab.com/blog/2016/08/19/posting-to-your-gitlab-pages-blog-from-ios/).
- [GitLab CI: Run jobs sequentially, in parallel, or build a custom pipeline](https://about.gitlab.com/blog/2016/07/29/the-basics-of-gitlab-ci/).
-- [GitLab CI: Deployment & environments](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/).
+- [GitLab CI: Deployment & environments](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/).
- [Building a new GitLab docs site with Nanoc, GitLab CI, and GitLab Pages](https://about.gitlab.com/blog/2016/12/07/building-a-new-gitlab-docs-site-with-nanoc-gitlab-ci-and-gitlab-pages/).
- [Publish code coverage reports with GitLab Pages](https://about.gitlab.com/blog/2016/11/03/publish-code-coverage-report-with-gitlab-pages/).
diff --git a/doc/user/project/repository/file_finder.md b/doc/user/project/repository/file_finder.md
index df3e24fbf30..3af7a5045c4 100644
--- a/doc/user/project/repository/file_finder.md
+++ b/doc/user/project/repository/file_finder.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
disqus_identifier: 'https://docs.gitlab.com/ee/workflow/file_finder.html'
---
-# File finder
+# File finder **(FREE)**
> [Introduced](https://github.com/gitlabhq/gitlabhq/pull/9889) in GitLab 8.4.
diff --git a/doc/user/project/repository/repository_mirroring.md b/doc/user/project/repository/repository_mirroring.md
index 4d5e4a5ef02..d9d9fd8bcd3 100644
--- a/doc/user/project/repository/repository_mirroring.md
+++ b/doc/user/project/repository/repository_mirroring.md
@@ -110,7 +110,7 @@ After the mirror is created, this option can currently only be modified via the
To set up a mirror from GitLab to GitHub, you need to follow these steps:
-1. Create a [GitHub personal access token](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token) with the `public_repo` box checked.
+1. Create a [GitHub personal access token](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token) with the `public_repo` box checked.
1. Fill in the **Git repository URL** field using this format: `https://<your_github_username>@github.com/<your_github_group>/<your_github_project>.git`.
1. Fill in **Password** field with your GitHub personal access token.
1. Click the **Mirror repository** button.
@@ -219,16 +219,20 @@ to be able to browse its content and its activity using the familiar GitLab inte
To configure mirror pulling for an existing project:
-1. Navigate to your project's **Settings > Repository** and expand the **Mirroring repositories**
- section.
-1. Enter a repository URL.
-1. Select **Pull** from the **Mirror direction** dropdown.
-1. Select an authentication method from the **Authentication method** dropdown, if necessary.
-1. If necessary, check the following boxes:
- - **Overwrite diverged branches**.
- - **Trigger pipelines for mirror updates**.
- - **Only mirror protected branches**.
-1. Click the **Mirror repository** button to save the configuration.
+1. If you [configured two-factor authentication (2FA)](https://docs.github.com/en/github/authenticating-to-github/securing-your-account-with-two-factor-authentication-2fa)
+ for GitHub, create a [personal access token for GitHub](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token)
+ with the `read_repository` scope. If 2FA is enabled, this personal access
+ token serves as your GitHub password.
+1. In your project, go to **Settings > Repository**, and then expand the
+ **Mirroring repositories** section.
+1. In the **Git repository URL** field, enter a repository URL.
+1. In the **Mirror direction** dropdown, select **Pull**.
+1. In the **Authentication method** dropdown, select your authentication method.
+1. Select from the following checkboxes, if needed:
+ - **Overwrite diverged branches**
+ - **Trigger pipelines for mirror updates**
+ - **Only mirror protected branches**
+1. Select **Mirror repository** to save the configuration.
![Repository mirroring pull settings screen - upper part](img/repository_mirroring_pull_settings_upper.png)
@@ -340,7 +344,7 @@ If you're mirroring over SSH (that is, using an `ssh://` URL), you can authentic
- Password-based authentication, just as over HTTPS.
- Public key authentication. This is often more secure than password authentication,
- especially when the other repository supports [deploy keys](../../../ssh/README.md#deploy-keys).
+ especially when the other repository supports [deploy keys](../deploy_keys/index.md).
To get started:
@@ -366,7 +370,7 @@ fingerprints in the open for you to check:
- [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/regions.html#regions-fingerprints)
- [Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/configure-ssh-and-two-step-verification/)
-- [GitHub](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/githubs-ssh-key-fingerprints)
+- [GitHub](https://docs.github.com/en/github/authenticating-to-github/githubs-ssh-key-fingerprints)
- [GitLab.com](../../gitlab_com/index.md#ssh-host-keys-fingerprints)
- [Launchpad](https://help.launchpad.net/SSHFingerprints)
- [Savannah](http://savannah.gnu.org/maintenance/SshAccess/)
@@ -401,7 +405,7 @@ GitLab generates a 4096-bit RSA key that can be copied by clicking the **Copy SS
You then need to add the public SSH key to the other repository's configuration:
- If the other repository is hosted on GitLab, you should add the public SSH key
- as a [deploy key](../../../ssh/README.md#deploy-keys).
+ as a [deploy key](../../project/deploy_keys/index.md).
- If the other repository is hosted elsewhere, you may need to add the key to
your user's `authorized_keys` file. Paste the entire public SSH key into the
file on its own line and save it.
diff --git a/doc/user/project/repository/web_editor.md b/doc/user/project/repository/web_editor.md
index a9e249bb8c3..4cc3c611a0a 100644
--- a/doc/user/project/repository/web_editor.md
+++ b/doc/user/project/repository/web_editor.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# GitLab Web Editor
+# GitLab Web Editor **(FREE)**
Sometimes it's easier to make quick changes directly from the GitLab interface
than to clone the project and use the Git command-line tool. In this feature
diff --git a/doc/user/project/service_desk.md b/doc/user/project/service_desk.md
index debe5c51d51..f589f3e8bac 100644
--- a/doc/user/project/service_desk.md
+++ b/doc/user/project/service_desk.md
@@ -137,13 +137,13 @@ You can use these placeholders to be automatically replaced in each email:
#### New Service Desk issues
-You can select one [issue description template](description_templates.md#creating-issue-templates)
+You can select one [issue description template](description_templates.md#create-an-issue-template)
**per project** to be appended to every new Service Desk issue's description.
Issue description templates should reside in your repository's `.gitlab/issue_templates/` directory.
To use a custom issue template with Service Desk, in your project:
-1. [Create a description template](description_templates.md#creating-issue-templates)
+1. [Create a description template](description_templates.md#create-an-issue-template)
1. Go to **Settings > General > Service Desk**.
1. From the dropdown **Template to append to all Service Desk issues**, select your template.
diff --git a/doc/user/project/settings/import_export.md b/doc/user/project/settings/import_export.md
index 6f230f1798a..8e6ace5da78 100644
--- a/doc/user/project/settings/import_export.md
+++ b/doc/user/project/settings/import_export.md
@@ -118,6 +118,7 @@ The following items will be exported:
- Issue boards
- Pipelines history
- Push Rules
+- Awards
The following items will **not** be exported:
@@ -127,7 +128,6 @@ The following items will **not** be exported:
- Webhooks
- Any encrypted tokens
- Merge Request Approvers
-- Awards
NOTE:
For more details on the specific data persisted in a project export, see the
diff --git a/doc/user/project/static_site_editor/index.md b/doc/user/project/static_site_editor/index.md
index 002eb398406..431250a817d 100644
--- a/doc/user/project/static_site_editor/index.md
+++ b/doc/user/project/static_site_editor/index.md
@@ -102,7 +102,7 @@ To edit a file:
in the bottom-right corner.
1. When you're done, click **Submit changes...**.
1. (Optional) Adjust the default title and description of the merge request, to submit
- with your changes. Alternatively, select a [merge request template](../../../user/project/description_templates.md#creating-merge-request-templates)
+ with your changes. Alternatively, select a [merge request template](../../../user/project/description_templates.md#create-a-merge-request-template)
from the dropdown menu and edit it accordingly.
1. Click **Submit changes**.
1. A new merge request is automatically created and you can assign a colleague for review.
diff --git a/doc/user/project/web_ide/img/solarized_dark_theme_v13_1.png b/doc/user/project/web_ide/img/solarized_dark_theme_v13_1.png
index ccb9cf6f126..8eca352a4d0 100644
--- a/doc/user/project/web_ide/img/solarized_dark_theme_v13_1.png
+++ b/doc/user/project/web_ide/img/solarized_dark_theme_v13_1.png
Binary files differ
diff --git a/doc/user/project/web_ide/img/solarized_light_theme_v13_0.png b/doc/user/project/web_ide/img/solarized_light_theme_v13_0.png
deleted file mode 100644
index 6257d78d29e..00000000000
--- a/doc/user/project/web_ide/img/solarized_light_theme_v13_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/web_ide/index.md b/doc/user/project/web_ide/index.md
index 07f46cb94f7..5345a031c48 100644
--- a/doc/user/project/web_ide/index.md
+++ b/doc/user/project/web_ide/index.md
@@ -71,19 +71,16 @@ Single file editing is based on the [Ace Editor](https://ace.c9.io).
### Themes
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2389) in GitLab in 13.0.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2389) in GitLab 13.0.
> - Full Solarized Dark Theme [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/219228) in GitLab 13.1.
+> - Full [Solarized Light](https://gitlab.com/gitlab-org/gitlab/-/issues/221035) and [Monokai](https://gitlab.com/gitlab-org/gitlab/-/issues/221034) Themes introduced in GitLab 13.6.
-All the themes GitLab supports for syntax highlighting are added to the Web IDE's code editor.
+All the themes GitLab supports for syntax highlighting are applied to the Web IDE's entire screen.
You can pick a theme from your [profile preferences](../../profile/preferences.md).
-The themes are available only in the Web IDE file editor, except for the [dark theme](https://gitlab.com/gitlab-org/gitlab/-/issues/209808) and
-the [Solarized dark theme](https://gitlab.com/gitlab-org/gitlab/-/issues/219228),
-which apply to the entire Web IDE screen.
-
-| Solarized Light Theme | Solarized Dark Theme | Dark Theme |
-|---------------------------------------------------------------|-------------------------------------------------------------|-----------------------------------------|
-| ![Solarized Light Theme](img/solarized_light_theme_v13_0.png) | ![Solarized Dark Theme](img/solarized_dark_theme_v13_1.png) | ![Dark Theme](img/dark_theme_v13_0.png) |
+| Solarized Dark Theme | Dark Theme |
+|-------------------------------------------------------------|-----------------------------------------|
+| ![Solarized Dark Theme](img/solarized_dark_theme_v13_1.png) | ![Dark Theme](img/dark_theme_v13_0.png) |
## Schema based validation
diff --git a/doc/user/project/working_with_projects.md b/doc/user/project/working_with_projects.md
index 3fe6193c414..04d2cf07068 100644
--- a/doc/user/project/working_with_projects.md
+++ b/doc/user/project/working_with_projects.md
@@ -278,7 +278,7 @@ databases if the module name or a prefix of it appears in `GONOPRIVATE` or
### Authenticate Go requests
To authenticate requests to private projects made by Go, use a [`.netrc`
-file](https://ec.haxx.se/usingcurl-netrc.html) and a [personal access
+file](https://everything.curl.dev/usingcurl/netrc) and a [personal access
token](../profile/personal_access_tokens.md) in the password field. **This only
works if your GitLab instance can be accessed with HTTPS.** The `go` command
does not transmit credentials over insecure connections. This authenticates
diff --git a/doc/user/search/index.md b/doc/user/search/index.md
index ffd331248be..79a7827c03b 100644
--- a/doc/user/search/index.md
+++ b/doc/user/search/index.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: index, reference, howto
---
-# Search through GitLab
+# Search through GitLab **(FREE)**
## Issues and merge requests
@@ -306,26 +306,27 @@ Use advanced queries for more targeted search results.
[Learn how to use the Advanced Search Syntax.](advanced_search_syntax.md)
-## Search project settings
+## Search settings
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292941) in GitLab 13.8.
+> - [Added to Group, Admin, and User settings](https://gitlab.com/groups/gitlab-org/-/epics/4842) in GitLab 13.9
> - It's [deployed behind a feature flag](../feature_flags.md), disabled by default.
> - It's disabled on GitLab.com.
> - It's not recommended for production use.
-> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-search-project-settings). **(FREE SELF)**
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-search-settings). **(FREE SELF)**
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
-You can search inside the project’s settings sections by entering a search
-term in the search box located at the top of the page. The search results
+You can search inside a Project, Group, Admin, or User’s settings by entering
+a search term in the search box located at the top of the page. The search results
appear highlighted in the sections that match the search term.
![Search project settings](img/project_search_general_settings_v13_8.png)
-### Enable or disable Search project settings **(FREE SELF)**
+### Enable or disable Search settings **(FREE SELF)**
-Search project settings is under development and not ready for production use. It is
+Search settings is under development and not ready for production use. It is
deployed behind a feature flag that is **disabled by default**.
[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
can enable it.
diff --git a/doc/user/snippets.md b/doc/user/snippets.md
index e919e73f404..4750adeb1a3 100644
--- a/doc/user/snippets.md
+++ b/doc/user/snippets.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference
---
-# Snippets
+# Snippets **(FREE)**
With GitLab Snippets you can store and share bits of code and text with other users.
diff --git a/lefthook.yml b/lefthook.yml
index 3469cd9bddf..f6e3fb68b0e 100644
--- a/lefthook.yml
+++ b/lefthook.yml
@@ -7,7 +7,7 @@ pre-push:
tags: frontend style
files: git diff --name-only $(git merge-base origin/master HEAD)..HEAD
glob: "*.{js,vue}"
- run: yarn eslint --cache --max-warnings 0 --report-unused-disable-directives {files}
+ run: yarn run internal:eslint {files}
haml-lint:
tags: view haml style
files: git diff --name-only $(git merge-base origin/master HEAD)..HEAD
@@ -18,12 +18,16 @@ pre-push:
files: git diff --name-only $(git merge-base origin/master HEAD)..HEAD
glob: "doc/*.md"
run: yarn markdownlint {files}
- scss-lint:
+ stylelint:
tags: stylesheet css style
files: git diff --name-only $(git merge-base origin/master HEAD)..HEAD
glob: "*.scss{,.css}"
- exclude: "app/assets/stylesheets/pages/emojis.scss"
- run: bundle exec scss-lint --config .scss-lint.yml {files}
+ run: yarn stylelint -q {files}
+ prettier:
+ tags: frontend style
+ files: git diff --name-only $(git merge-base origin/master HEAD)..HEAD
+ glob: "*.{js,vue,graphql}"
+ run: yarn run prettier --check {files}
rubocop:
tags: backend style
files: git diff --name-only $(git merge-base origin/master HEAD)..HEAD
diff --git a/lib/api/api.rb b/lib/api/api.rb
index 0598f03c7ab..bf4b031cb9f 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -147,7 +147,7 @@ module API
# Only overwrite `text/plain+deprecated`
if content_types[api_format] == 'text/plain+deprecated'
- if Feature.enabled?(:api_always_use_application_json)
+ if Feature.enabled?(:api_always_use_application_json, default_enabled: :yaml)
content_type 'application/json'
else
content_type 'text/plain'
diff --git a/lib/api/concerns/packages/npm_endpoints.rb b/lib/api/concerns/packages/npm_endpoints.rb
index 833288c6013..d6e006df976 100644
--- a/lib/api/concerns/packages/npm_endpoints.rb
+++ b/lib/api/concerns/packages/npm_endpoints.rb
@@ -41,8 +41,8 @@ module API
authorize_read_package!(project)
- packages = ::Packages::Npm::PackageFinder.new(project, package_name)
- .execute
+ packages = ::Packages::Npm::PackageFinder.new(package_name, project: project)
+ .execute
not_found! if packages.empty?
@@ -68,9 +68,8 @@ module API
authorize_create_package!(project)
- package = ::Packages::Npm::PackageFinder
- .new(project, package_name)
- .find_by_version(version)
+ package = ::Packages::Npm::PackageFinder.new(package_name, project: project)
+ .find_by_version(version)
not_found!('Package') unless package
::Packages::Npm::CreateTagService.new(package, tag).execute
@@ -112,9 +111,8 @@ module API
route_setting :authentication, job_token_allowed: true, deploy_token_allowed: true
get '*package_name', format: false, requirements: ::API::Helpers::Packages::Npm::NPM_ENDPOINT_REQUIREMENTS do
package_name = params[:package_name]
-
- packages = ::Packages::Npm::PackageFinder.new(project_or_nil, package_name)
- .execute
+ packages = ::Packages::Npm::PackageFinder.new(package_name, project: project_or_nil)
+ .execute
redirect_request = project_or_nil.blank? || packages.empty?
diff --git a/lib/api/helpers/packages/npm.rb b/lib/api/helpers/packages/npm.rb
index c1f6a001201..2d556f889bf 100644
--- a/lib/api/helpers/packages/npm.rb
+++ b/lib/api/helpers/packages/npm.rb
@@ -49,13 +49,28 @@ module API
when :project
params[:id]
when :instance
- ::Packages::Package.npm
- .with_name(params[:package_name])
- .first
- &.project_id
+ namespace_path = namespace_path_from_package_name
+ next unless namespace_path
+
+ namespace = Namespace.top_most
+ .by_path(namespace_path)
+ next unless namespace
+
+ finder = ::Packages::Npm::PackageFinder.new(params[:package_name], namespace: namespace)
+
+ finder.last&.project_id
end
end
end
+
+ # from "@scope/package-name" return "scope" or nil
+ def namespace_path_from_package_name
+ package_name = params[:package_name]
+ return unless package_name.starts_with?('@')
+ return unless package_name.include?('/')
+
+ package_name.match(Gitlab::Regex.npm_package_name_regex)&.captures&.first
+ end
end
end
end
diff --git a/lib/api/lint.rb b/lib/api/lint.rb
index 2d30754a36d..e0806674c6a 100644
--- a/lib/api/lint.rb
+++ b/lib/api/lint.rb
@@ -11,7 +11,7 @@ module API
optional :include_merged_yaml, type: Boolean, desc: 'Whether or not to include merged CI config yaml in the response'
end
post '/lint' do
- unauthorized! unless Gitlab::CurrentSettings.signup_enabled? && current_user
+ unauthorized! if Gitlab::CurrentSettings.signup_disabled? && current_user.nil?
result = Gitlab::Ci::YamlProcessor.new(params[:content], user: current_user).execute
diff --git a/lib/api/nuget_project_packages.rb b/lib/api/nuget_project_packages.rb
index e071b6bd68f..73ecc140959 100644
--- a/lib/api/nuget_project_packages.rb
+++ b/lib/api/nuget_project_packages.rb
@@ -62,8 +62,9 @@ module API
file_name: PACKAGE_FILENAME
)
- package = ::Packages::Nuget::CreatePackageService.new(project_or_group, current_user, declared_params.merge(build: current_authenticated_job))
- .execute
+ package = ::Packages::CreateTemporaryPackageService.new(
+ project_or_group, current_user, declared_params.merge(build: current_authenticated_job)
+ ).execute(:nuget, name: ::Packages::Nuget::TEMPORARY_PACKAGE_NAME)
package_file = ::Packages::CreatePackageFileService.new(package, file_params.merge(build: current_authenticated_job))
.execute
diff --git a/lib/api/rubygem_packages.rb b/lib/api/rubygem_packages.rb
index 7819aab879c..5bacf9b122d 100644
--- a/lib/api/rubygem_packages.rb
+++ b/lib/api/rubygem_packages.rb
@@ -12,7 +12,7 @@ module API
# The Marshal version can be found by "#{Marshal::MAJOR_VERSION}.#{Marshal::MINOR_VERSION}"
# Updating the version should require a GitLab API version change.
MARSHAL_VERSION = '4.8'
-
+ PACKAGE_FILENAME = 'package.gem'
FILE_NAME_REQUIREMENTS = {
file_name: API::NO_SLASH_URL_PART_REGEX
}.freeze
@@ -73,16 +73,45 @@ module API
detail 'This feature was introduced in GitLab 13.9'
end
post 'gems/authorize' do
- # To be implemented in https://gitlab.com/gitlab-org/gitlab/-/issues/299263
- not_found!
+ authorize_workhorse!(
+ subject: user_project,
+ has_length: false,
+ maximum_size: user_project.actual_limits.rubygems_max_file_size
+ )
end
desc 'Upload a gem' do
detail 'This feature was introduced in GitLab 13.9'
end
+ params do
+ requires :file, type: ::API::Validations::Types::WorkhorseFile, desc: 'The package file to be published (generated by Multipart middleware)'
+ end
post 'gems' do
- # To be implemented in https://gitlab.com/gitlab-org/gitlab/-/issues/299263
- not_found!
+ authorize_upload!(user_project)
+ bad_request!('File is too large') if user_project.actual_limits.exceeded?(:rubygems_max_file_size, params[:file].size)
+
+ track_package_event('push_package', :rubygems)
+
+ ActiveRecord::Base.transaction do
+ package = ::Packages::CreateTemporaryPackageService.new(
+ user_project, current_user, declared_params.merge(build: current_authenticated_job)
+ ).execute(:rubygems, name: ::Packages::Rubygems::TEMPORARY_PACKAGE_NAME)
+
+ file_params = {
+ file: params[:file],
+ file_name: PACKAGE_FILENAME
+ }
+
+ ::Packages::CreatePackageFileService.new(
+ package, file_params.merge(build: current_authenticated_job)
+ ).execute
+ end
+
+ created!
+ rescue ObjectStorage::RemoteStoreError => e
+ Gitlab::ErrorTracking.track_exception(e, extra: { file_name: params[:file_name], project_id: user_project.id })
+
+ forbidden!
end
desc 'Fetch a list of dependencies' do
diff --git a/lib/backup/repositories.rb b/lib/backup/repositories.rb
index d15114a72a3..79b7b2c61f2 100644
--- a/lib/backup/repositories.rb
+++ b/lib/backup/repositories.rb
@@ -201,7 +201,12 @@ module Backup
PoolRepository.includes(:source_project).find_each do |pool|
progress.puts " - Object pool #{pool.disk_path}..."
- pool.source_project ||= pool.member_projects.first.root_of_fork_network
+ pool.source_project ||= pool.member_projects.first&.root_of_fork_network
+ unless pool.source_project
+ progress.puts " - Object pool #{pool.disk_path}... " + "[SKIPPED]".color(:cyan)
+ next
+ end
+
pool.state = 'none'
pool.save
diff --git a/lib/banzai/filter/video_link_filter.rb b/lib/banzai/filter/video_link_filter.rb
index 98987ee2019..3789a215dd8 100644
--- a/lib/banzai/filter/video_link_filter.rb
+++ b/lib/banzai/filter/video_link_filter.rb
@@ -15,7 +15,7 @@ module Banzai
end
def extra_element_attrs
- { width: "400" }
+ { width: "400", preload: "metadata" }
end
end
end
diff --git a/lib/bulk_imports/common/loaders/entity_loader.rb b/lib/bulk_imports/common/loaders/entity_loader.rb
deleted file mode 100644
index 8644f3c9dcb..00000000000
--- a/lib/bulk_imports/common/loaders/entity_loader.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-module BulkImports
- module Common
- module Loaders
- class EntityLoader
- def initialize(*args); end
-
- def load(context, entity)
- context.bulk_import.entities.create!(entity)
- end
- end
- end
- end
-end
diff --git a/lib/bulk_imports/common/transformers/award_emoji_transformer.rb b/lib/bulk_imports/common/transformers/award_emoji_transformer.rb
index 260b47ab917..676c71f1316 100644
--- a/lib/bulk_imports/common/transformers/award_emoji_transformer.rb
+++ b/lib/bulk_imports/common/transformers/award_emoji_transformer.rb
@@ -4,8 +4,6 @@ module BulkImports
module Common
module Transformers
class AwardEmojiTransformer
- def initialize(*args); end
-
def transform(context, data)
user = find_user(context, data&.dig('user', 'public_email')) || context.current_user
diff --git a/lib/bulk_imports/common/transformers/prohibited_attributes_transformer.rb b/lib/bulk_imports/common/transformers/prohibited_attributes_transformer.rb
index 858c4c8976b..37b64923d56 100644
--- a/lib/bulk_imports/common/transformers/prohibited_attributes_transformer.rb
+++ b/lib/bulk_imports/common/transformers/prohibited_attributes_transformer.rb
@@ -14,10 +14,6 @@ module BulkImports
/\Aremote_\w+_(url|urls|request_header)\Z/ # carrierwave automatically creates these attribute methods for uploads
).freeze
- def initialize(options = {})
- @options = options
- end
-
def transform(context, data)
data.each_with_object({}) do |(key, value), result|
prohibited = prohibited_key?(key)
diff --git a/lib/bulk_imports/groups/extractors/subgroups_extractor.rb b/lib/bulk_imports/groups/extractors/subgroups_extractor.rb
index b01fb6f68ac..e5e2b9fdbd4 100644
--- a/lib/bulk_imports/groups/extractors/subgroups_extractor.rb
+++ b/lib/bulk_imports/groups/extractors/subgroups_extractor.rb
@@ -4,8 +4,6 @@ module BulkImports
module Groups
module Extractors
class SubgroupsExtractor
- def initialize(*args); end
-
def extract(context)
encoded_parent_path = ERB::Util.url_encode(context.entity.source_full_path)
diff --git a/lib/bulk_imports/groups/graphql/get_labels_query.rb b/lib/bulk_imports/groups/graphql/get_labels_query.rb
index d1fe791c2ce..23efbc33581 100644
--- a/lib/bulk_imports/groups/graphql/get_labels_query.rb
+++ b/lib/bulk_imports/groups/graphql/get_labels_query.rb
@@ -10,7 +10,7 @@ module BulkImports
<<-'GRAPHQL'
query ($full_path: ID!, $cursor: String) {
group(fullPath: $full_path) {
- labels(first: 100, after: $cursor) {
+ labels(first: 100, after: $cursor, onlyGroupLabels: true) {
page_info: pageInfo {
end_cursor: endCursor
has_next_page: hasNextPage
@@ -19,6 +19,8 @@ module BulkImports
title
description
color
+ created_at: createdAt
+ updated_at: updatedAt
}
}
}
diff --git a/lib/bulk_imports/groups/loaders/group_loader.rb b/lib/bulk_imports/groups/loaders/group_loader.rb
index 386fc695182..a631685c2ad 100644
--- a/lib/bulk_imports/groups/loaders/group_loader.rb
+++ b/lib/bulk_imports/groups/loaders/group_loader.rb
@@ -4,10 +4,6 @@ module BulkImports
module Groups
module Loaders
class GroupLoader
- def initialize(options = {})
- @options = options
- end
-
def load(context, data)
return unless user_can_create_group?(context.current_user, data)
diff --git a/lib/bulk_imports/groups/loaders/labels_loader.rb b/lib/bulk_imports/groups/loaders/labels_loader.rb
deleted file mode 100644
index b8c9ba9609c..00000000000
--- a/lib/bulk_imports/groups/loaders/labels_loader.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-module BulkImports
- module Groups
- module Loaders
- class LabelsLoader
- def initialize(*); end
-
- def load(context, data)
- Labels::CreateService.new(data).execute(group: context.group)
- end
- end
- end
- end
-end
diff --git a/lib/bulk_imports/groups/loaders/members_loader.rb b/lib/bulk_imports/groups/loaders/members_loader.rb
deleted file mode 100644
index ccf44b31aee..00000000000
--- a/lib/bulk_imports/groups/loaders/members_loader.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-module BulkImports
- module Groups
- module Loaders
- class MembersLoader
- def initialize(*); end
-
- def load(context, data)
- return unless data
-
- context.group.members.create!(data)
- end
- end
- end
- end
-end
diff --git a/lib/bulk_imports/groups/pipelines/labels_pipeline.rb b/lib/bulk_imports/groups/pipelines/labels_pipeline.rb
index 40dab9b444c..9f8b8682751 100644
--- a/lib/bulk_imports/groups/pipelines/labels_pipeline.rb
+++ b/lib/bulk_imports/groups/pipelines/labels_pipeline.rb
@@ -11,7 +11,9 @@ module BulkImports
transformer Common::Transformers::ProhibitedAttributesTransformer
- loader BulkImports::Groups::Loaders::LabelsLoader
+ def load(context, data)
+ Labels::CreateService.new(data).execute(group: context.group)
+ end
def after_run(extracted_data)
context.entity.update_tracker_for(
diff --git a/lib/bulk_imports/groups/pipelines/members_pipeline.rb b/lib/bulk_imports/groups/pipelines/members_pipeline.rb
index b00c4c1a659..32fc931e8c3 100644
--- a/lib/bulk_imports/groups/pipelines/members_pipeline.rb
+++ b/lib/bulk_imports/groups/pipelines/members_pipeline.rb
@@ -12,7 +12,11 @@ module BulkImports
transformer Common::Transformers::ProhibitedAttributesTransformer
transformer BulkImports::Groups::Transformers::MemberAttributesTransformer
- loader BulkImports::Groups::Loaders::MembersLoader
+ def load(context, data)
+ return unless data
+
+ context.group.members.create!(data)
+ end
def after_run(extracted_data)
context.entity.update_tracker_for(
diff --git a/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline.rb b/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline.rb
index d7e1a118d0b..c47a8bd1daa 100644
--- a/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline.rb
+++ b/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline.rb
@@ -9,7 +9,10 @@ module BulkImports
extractor BulkImports::Groups::Extractors::SubgroupsExtractor
transformer Common::Transformers::ProhibitedAttributesTransformer
transformer BulkImports::Groups::Transformers::SubgroupToEntityTransformer
- loader BulkImports::Common::Loaders::EntityLoader
+
+ def load(context, data)
+ context.bulk_import.entities.create!(data)
+ end
end
end
end
diff --git a/lib/bulk_imports/groups/transformers/group_attributes_transformer.rb b/lib/bulk_imports/groups/transformers/group_attributes_transformer.rb
index 7de9a430421..23e898a7bb2 100644
--- a/lib/bulk_imports/groups/transformers/group_attributes_transformer.rb
+++ b/lib/bulk_imports/groups/transformers/group_attributes_transformer.rb
@@ -4,10 +4,6 @@ module BulkImports
module Groups
module Transformers
class GroupAttributesTransformer
- def initialize(options = {})
- @options = options
- end
-
def transform(context, data)
import_entity = context.entity
@@ -39,12 +35,11 @@ module BulkImports
end
def transform_parent(context, import_entity, data)
- current_user = context.current_user
- namespace = Namespace.find_by_full_path(import_entity.destination_namespace)
-
- return data if namespace == current_user.namespace
+ unless import_entity.destination_namespace.blank?
+ namespace = Namespace.find_by_full_path(import_entity.destination_namespace)
+ data['parent_id'] = namespace.id
+ end
- data['parent_id'] = namespace.id
data
end
diff --git a/lib/bulk_imports/groups/transformers/member_attributes_transformer.rb b/lib/bulk_imports/groups/transformers/member_attributes_transformer.rb
index 622f5b60ffe..e92c898171a 100644
--- a/lib/bulk_imports/groups/transformers/member_attributes_transformer.rb
+++ b/lib/bulk_imports/groups/transformers/member_attributes_transformer.rb
@@ -4,8 +4,6 @@ module BulkImports
module Groups
module Transformers
class MemberAttributesTransformer
- def initialize(*); end
-
def transform(context, data)
data
.then { |data| add_user(data) }
diff --git a/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb b/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb
index 6c3c299c2d2..676a6ca8d2a 100644
--- a/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb
+++ b/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb
@@ -4,8 +4,6 @@ module BulkImports
module Groups
module Transformers
class SubgroupToEntityTransformer
- def initialize(*args); end
-
def transform(context, entry)
{
source_type: :group_entity,
diff --git a/lib/bulk_imports/pipeline.rb b/lib/bulk_imports/pipeline.rb
index 1d55ad95887..254ae0e792e 100644
--- a/lib/bulk_imports/pipeline.rb
+++ b/lib/bulk_imports/pipeline.rb
@@ -15,16 +15,78 @@ module BulkImports
attr_reader :context
+ # Fetch pipeline extractor.
+ # An extractor is defined either by instance `#extract(context)` method
+ # or by using `extractor` DSL.
+ #
+ # @example
+ # class MyPipeline
+ # extractor MyExtractor, foo: :bar
+ # end
+ #
+ # class MyPipeline
+ # def extract(context)
+ # puts 'Fetch some data'
+ # end
+ # end
+ #
+ # If pipeline implements instance method `extract` - use it
+ # and ignore class `extractor` method implementation.
def extractor
- @extractor ||= instantiate(self.class.get_extractor)
+ @extractor ||= self.respond_to?(:extract) ? self : instantiate(self.class.get_extractor)
end
+ # Fetch pipeline transformers.
+ #
+ # A transformer can be defined using:
+ # - `transformer` class method
+ # - `transform` instance method
+ #
+ # Multiple transformers can be defined within a single
+ # pipeline and run sequentially for each record in the
+ # following order:
+ # - Transformers defined using `transformer` class method
+ # - Instance method `transform`
+ #
+ # Instance method `transform` is always the last to run.
+ #
+ # @example
+ # class MyPipeline
+ # transformer MyTransformerOne, foo: :bar
+ # transformer MyTransformerTwo, foo: :bar
+ #
+ # def transform(context, data)
+ # # perform transformation here
+ # end
+ # end
+ #
+ # In the example above `MyTransformerOne` is the first to run and
+ # the instance `#transform` method is the last.
def transformers
@transformers ||= self.class.transformers.map(&method(:instantiate))
+ @transformers << self if respond_to?(:transform) && @transformers.exclude?(self)
+ @transformers
end
+ # Fetch pipeline loader.
+ # A loader is defined either by instance method `#load(context, data)`
+ # or by using `loader` DSL.
+ #
+ # @example
+ # class MyPipeline
+ # loader MyLoader, foo: :bar
+ # end
+ #
+ # class MyPipeline
+ # def load(context, data)
+ # puts 'Load some data'
+ # end
+ # end
+ #
+ # If pipeline implements instance method `load` - use it
+ # and ignore class `loader` method implementation.
def loader
- @loaders ||= instantiate(self.class.get_loader)
+ @loader ||= self.respond_to?(:load) ? self : instantiate(self.class.get_loader)
end
def pipeline
@@ -32,7 +94,13 @@ module BulkImports
end
def instantiate(class_config)
- class_config[:klass].new(class_config[:options])
+ options = class_config[:options]
+
+ if options
+ class_config[:klass].new(class_config[:options])
+ else
+ class_config[:klass].new
+ end
end
def abort_on_failure?
diff --git a/lib/csv_builder.rb b/lib/csv_builder.rb
index a9ef5a83ae8..6116009f171 100644
--- a/lib/csv_builder.rb
+++ b/lib/csv_builder.rb
@@ -16,6 +16,7 @@
class CsvBuilder
DEFAULT_ORDER_BY = 'id'.freeze
DEFAULT_BATCH_SIZE = 1000
+ PREFIX_REGEX = /^[=\+\-@;]/.freeze
attr_reader :rows_written
@@ -114,8 +115,8 @@ class CsvBuilder
def excel_sanitize(line)
return if line.nil?
+ return line unless line.is_a?(String) && line.match?(PREFIX_REGEX)
- line = ["'", line].join if line =~ /^[=\+\-@;]/
- line
+ ["'", line].join
end
end
diff --git a/lib/gitlab/analytics/cycle_analytics/average.rb b/lib/gitlab/analytics/cycle_analytics/average.rb
new file mode 100644
index 00000000000..a449b71b165
--- /dev/null
+++ b/lib/gitlab/analytics/cycle_analytics/average.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Analytics
+ module CycleAnalytics
+ class Average
+ include Gitlab::Utils::StrongMemoize
+ include StageQueryHelpers
+
+ def initialize(stage:, query:)
+ @stage = stage
+ @query = query
+ end
+
+ def seconds
+ select_average ? select_average['average'] : nil
+ end
+
+ def days
+ seconds ? seconds.fdiv(1.day) : nil
+ end
+
+ private
+
+ attr_reader :stage
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def select_average
+ strong_memoize(:select_average) do
+ execute_query(@query.select(average_in_seconds.as('average')).reorder(nil)).first
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def average
+ Arel::Nodes::NamedFunction.new(
+ 'AVG',
+ [duration]
+ )
+ end
+
+ def average_in_seconds
+ Arel::Nodes::Extract.new(average, :epoch)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/analytics/cycle_analytics/data_collector.rb b/lib/gitlab/analytics/cycle_analytics/data_collector.rb
index 5eca364a697..10a008a76d5 100644
--- a/lib/gitlab/analytics/cycle_analytics/data_collector.rb
+++ b/lib/gitlab/analytics/cycle_analytics/data_collector.rb
@@ -31,6 +31,12 @@ module Gitlab
end
end
+ def average
+ strong_memoize(:average) do
+ Average.new(stage: stage, query: query)
+ end
+ end
+
private
attr_reader :stage, :params
diff --git a/lib/gitlab/analytics/instance_statistics/workers_argument_builder.rb b/lib/gitlab/analytics/usage_trends/workers_argument_builder.rb
index 54b3bbb3ce6..a502f46287d 100644
--- a/lib/gitlab/analytics/instance_statistics/workers_argument_builder.rb
+++ b/lib/gitlab/analytics/usage_trends/workers_argument_builder.rb
@@ -2,7 +2,7 @@
module Gitlab
module Analytics
- module InstanceStatistics
+ module UsageTrends
class WorkersArgumentBuilder
def initialize(measurement_identifiers: [], recorded_at: Time.zone.now)
@measurement_identifiers = measurement_identifiers
@@ -35,11 +35,11 @@ module Gitlab
end
def custom_min_max_queries
- ::Analytics::InstanceStatistics::Measurement.identifier_min_max_queries
+ ::Analytics::UsageTrends::Measurement.identifier_min_max_queries
end
def query_mappings
- ::Analytics::InstanceStatistics::Measurement.identifier_query_mapping
+ ::Analytics::UsageTrends::Measurement.identifier_query_mapping
end
end
end
diff --git a/lib/gitlab/application_rate_limiter.rb b/lib/gitlab/application_rate_limiter.rb
index 0a69a9c503d..f74edf2b767 100644
--- a/lib/gitlab/application_rate_limiter.rb
+++ b/lib/gitlab/application_rate_limiter.rb
@@ -47,7 +47,7 @@ module Gitlab
# @option scope [Array<ActiveRecord>] Array of ActiveRecord models to scope throttling to a specific request (e.g. per user per project)
# @option threshold [Integer] Optional threshold value to override default one registered in `.rate_limits`
# @option interval [Integer] Optional interval value to override default one registered in `.rate_limits`
- # @option users_allowlist [Array<String>] Optional list of usernames to excepted from the limit. This param will only be functional if Scope includes a current user.
+ # @option users_allowlist [Array<String>] Optional list of usernames to exclude from the limit. This param will only be functional if Scope includes a current user.
#
# @return [Boolean] Whether or not a request should be throttled
def throttled?(key, **options)
diff --git a/lib/gitlab/auth/o_auth/provider.rb b/lib/gitlab/auth/o_auth/provider.rb
index 57ff3fcd1f0..ab6ac815601 100644
--- a/lib/gitlab/auth/o_auth/provider.rb
+++ b/lib/gitlab/auth/o_auth/provider.rb
@@ -5,11 +5,12 @@ module Gitlab
module OAuth
class Provider
LABELS = {
- "github" => "GitHub",
- "gitlab" => "GitLab.com",
- "google_oauth2" => "Google",
- "azure_oauth2" => "Azure AD",
- 'atlassian_oauth2' => 'Atlassian'
+ "github" => "GitHub",
+ "gitlab" => "GitLab.com",
+ "google_oauth2" => "Google",
+ "azure_oauth2" => "Azure AD",
+ "azure_activedirectory_v2" => "Azure AD v2",
+ 'atlassian_oauth2' => 'Atlassian'
}.freeze
def self.authentication(user, provider)
diff --git a/lib/gitlab/background_migration/set_default_iteration_cadences.rb b/lib/gitlab/background_migration/set_default_iteration_cadences.rb
new file mode 100644
index 00000000000..530608144aa
--- /dev/null
+++ b/lib/gitlab/background_migration/set_default_iteration_cadences.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # rubocop:disable Style/Documentation
+ class SetDefaultIterationCadences
+ class Iteration < ApplicationRecord
+ self.table_name = 'sprints'
+ end
+
+ class IterationCadence < ApplicationRecord
+ self.table_name = 'iterations_cadences'
+
+ include BulkInsertSafe
+ end
+
+ class Group < ApplicationRecord
+ self.table_name = 'namespaces'
+ end
+
+ def perform(*group_ids)
+ create_iterations_cadences(group_ids)
+ assign_iterations_cadences(group_ids)
+ end
+
+ private
+
+ def create_iterations_cadences(group_ids)
+ groups_with_cadence = IterationCadence.select(:group_id)
+ new_cadences = Group.where(id: group_ids).where.not(id: groups_with_cadence).map do |group|
+ last_iteration = Iteration.where(group_id: group.id).order(:start_date)&.last
+
+ next unless last_iteration
+
+ time = Time.now
+ IterationCadence.new(
+ group_id: group.id,
+ title: "#{group.name} Iterations",
+ start_date: last_iteration.start_date,
+ last_run_date: last_iteration.start_date,
+ automatic: false,
+ created_at: time,
+ updated_at: time
+ )
+ end
+
+ IterationCadence.bulk_insert!(new_cadences.compact)
+ end
+
+ def assign_iterations_cadences(group_ids)
+ IterationCadence.where(group_id: group_ids).each do |cadence|
+ Iteration.where(iterations_cadence_id: nil).where(group_id: cadence.group_id).update_all(iterations_cadence_id: cadence.id)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/jwt.rb b/lib/gitlab/ci/jwt.rb
index 0870c74053a..af06e124736 100644
--- a/lib/gitlab/ci/jwt.rb
+++ b/lib/gitlab/ci/jwt.rb
@@ -60,7 +60,7 @@ module Gitlab
ref_protected: build.protected.to_s
}
- if include_environment_claims?
+ if environment.present?
fields.merge!(
environment: environment.name,
environment_protected: environment_protected?.to_s
@@ -119,10 +119,6 @@ module Gitlab
def environment_protected?
false # Overridden in EE
end
-
- def include_environment_claims?
- Feature.enabled?(:ci_jwt_include_environment) && environment.present?
- end
end
end
end
diff --git a/lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml b/lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml
index a4aed36889e..e4ed7fadfaa 100644
--- a/lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml
@@ -1,11 +1,20 @@
-# use docker image with latex preinstalled
-# since there is no official latex image, use https://github.com/blang/latex-docker
-# possible alternative: https://github.com/natlownes/docker-latex
-image: blang/latex
+---
+variables:
+ # Feel free to choose the image that suits you best.
+ # blang/latex:latest ... Former image used in this template. No longer maintained by author.
+ # listx/texlive:2020 ... The default, referring to TexLive 2020. Current at least to 2021-02-02.
+
+ # Additional alternatives with high Docker pull counts:
+ # thomasweise/docker-texlive-full
+ # thomasweise/texlive
+ # adnrv/texlive
+ LATEX_IMAGE: listx/texlive:2020
build:
+ image: $LATEX_IMAGE
script:
- latexmk -pdf
+
artifacts:
paths:
- "*.pdf"
diff --git a/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml
index 135f0df99fe..460cb84460a 100644
--- a/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml
@@ -172,6 +172,7 @@ apifuzzer_fuzz_dnd:
-e FUZZAPI_HAR \
-e FUZZAPI_OPENAPI \
-e FUZZAPI_POSTMAN_COLLECTION \
+ -e FUZZAPI_POSTMAN_COLLECTION_VARIABLES \
-e FUZZAPI_TARGET_URL \
-e FUZZAPI_OVERRIDES_FILE \
-e FUZZAPI_OVERRIDES_ENV \
@@ -214,6 +215,7 @@ apifuzzer_fuzz_dnd:
-e FUZZAPI_HAR \
-e FUZZAPI_OPENAPI \
-e FUZZAPI_POSTMAN_COLLECTION \
+ -e FUZZAPI_POSTMAN_COLLECTION_VARIABLES \
-e FUZZAPI_TARGET_URL \
-e FUZZAPI_OVERRIDES_FILE \
-e FUZZAPI_OVERRIDES_ENV \
diff --git a/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml
index 828352743b4..3b166505e0a 100644
--- a/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml
@@ -140,7 +140,9 @@ gosec-sast:
mobsf-android-sast:
extends: .sast-analyzer
services:
- - name: opensecurity/mobile-security-framework-mobsf:latest
+ # this version must match with analyzer version mentioned in: https://gitlab.com/gitlab-org/security-products/analyzers/mobsf/-/blob/master/Dockerfile
+ # Unfortunately, we need to keep track of mobsf version in 2 different places for now.
+ - name: opensecurity/mobile-security-framework-mobsf:v3.2.9
alias: mobsf
image:
name: "$SAST_ANALYZER_IMAGE"
@@ -161,7 +163,9 @@ mobsf-android-sast:
mobsf-ios-sast:
extends: .sast-analyzer
services:
- - name: opensecurity/mobile-security-framework-mobsf:latest
+ # this version must match with analyzer version mentioned in: https://gitlab.com/gitlab-org/security-products/analyzers/mobsf/-/blob/master/Dockerfile
+ # Unfortunately, we need to keep track of mobsf version in 2 different places for now.
+ - name: opensecurity/mobile-security-framework-mobsf:v3.2.9
alias: mobsf
image:
name: "$SAST_ANALYZER_IMAGE"
diff --git a/lib/gitlab/current_settings.rb b/lib/gitlab/current_settings.rb
index 0bf41f9dc0d..55f381fcb64 100644
--- a/lib/gitlab/current_settings.rb
+++ b/lib/gitlab/current_settings.rb
@@ -3,6 +3,10 @@
module Gitlab
module CurrentSettings
class << self
+ def signup_disabled?
+ !signup_enabled?
+ end
+
def current_application_settings
Gitlab::SafeRequestStore.fetch(:current_application_settings) { ensure_application_settings! }
end
diff --git a/lib/gitlab/database/migrations/observation.rb b/lib/gitlab/database/migrations/observation.rb
index 518c2c560d2..046843824a4 100644
--- a/lib/gitlab/database/migrations/observation.rb
+++ b/lib/gitlab/database/migrations/observation.rb
@@ -7,7 +7,8 @@ module Gitlab
:migration,
:walltime,
:success,
- :total_database_size_change
+ :total_database_size_change,
+ :query_statistics
)
end
end
diff --git a/lib/gitlab/database/migrations/observers.rb b/lib/gitlab/database/migrations/observers.rb
index 4b931d3c19c..592993aeac5 100644
--- a/lib/gitlab/database/migrations/observers.rb
+++ b/lib/gitlab/database/migrations/observers.rb
@@ -6,7 +6,8 @@ module Gitlab
module Observers
def self.all_observers
[
- TotalDatabaseSizeChange.new
+ TotalDatabaseSizeChange.new,
+ QueryStatistics.new
]
end
end
diff --git a/lib/gitlab/database/migrations/observers/query_statistics.rb b/lib/gitlab/database/migrations/observers/query_statistics.rb
new file mode 100644
index 00000000000..466f4724256
--- /dev/null
+++ b/lib/gitlab/database/migrations/observers/query_statistics.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module Migrations
+ module Observers
+ # This observer gathers statistics from the pg_stat_statements extension.
+ # Notice that this extension is not installed by default. In case it cannot
+ # be found, the observer does nothing and doesn't throw an error.
+ class QueryStatistics < MigrationObserver
+ include Gitlab::Database::SchemaHelpers
+
+ def before
+ return unless enabled?
+
+ connection.execute('select pg_stat_statements_reset()')
+ end
+
+ def record(observation)
+ return unless enabled?
+
+ observation.query_statistics = connection.execute(<<~SQL)
+ SELECT query, calls, total_time, max_time, mean_time, rows
+ FROM pg_stat_statements
+ ORDER BY total_time DESC
+ SQL
+ end
+
+ private
+
+ def enabled?
+ function_exists?(:pg_stat_statements_reset) && connection.view_exists?(:pg_stat_statements)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/email/handler/service_desk_handler.rb b/lib/gitlab/email/handler/service_desk_handler.rb
index d1dd616385d..80e8b726099 100644
--- a/lib/gitlab/email/handler/service_desk_handler.rb
+++ b/lib/gitlab/email/handler/service_desk_handler.rb
@@ -79,7 +79,7 @@ module Gitlab
@issue = Issues::CreateService.new(
project,
User.support_bot,
- title: issue_title,
+ title: mail.subject,
description: message_including_template,
confidential: true,
external_author: from_address
@@ -137,12 +137,6 @@ module Gitlab
(mail.reply_to || []).first || mail.from.first || mail.sender
end
- def issue_title
- from = "(from #{from_address})" if from_address
-
- "Service Desk #{from}: #{mail.subject}"
- end
-
def can_handle_legacy_format?
project_path && project_path.include?('/') && !mail_key.include?('+')
end
diff --git a/lib/gitlab/experimentation.rb b/lib/gitlab/experimentation.rb
index 423f238a0a2..337c28f3179 100644
--- a/lib/gitlab/experimentation.rb
+++ b/lib/gitlab/experimentation.rb
@@ -58,10 +58,6 @@ module Gitlab
tracking_category: 'Growth::Conversion::Experiment::ContactSalesInApp',
use_backwards_compatible_subject_index: true
},
- customize_homepage: {
- tracking_category: 'Growth::Expansion::Experiment::CustomizeHomepage',
- use_backwards_compatible_subject_index: true
- },
group_only_trials: {
tracking_category: 'Growth::Conversion::Experiment::GroupOnlyTrials',
use_backwards_compatible_subject_index: true
@@ -81,7 +77,7 @@ module Gitlab
trial_during_signup: {
tracking_category: 'Growth::Conversion::Experiment::TrialDuringSignup'
},
- ci_syntax_templates: {
+ ci_syntax_templates_b: {
tracking_category: 'Growth::Activation::Experiment::CiSyntaxTemplates',
rollout_strategy: :user
},
diff --git a/lib/gitlab/gitaly_client.rb b/lib/gitlab/gitaly_client.rb
index 3c7fa88977e..e3788814dd5 100644
--- a/lib/gitlab/gitaly_client.rb
+++ b/lib/gitlab/gitaly_client.rb
@@ -246,9 +246,7 @@ module Gitlab
def self.route_to_primary
return {} unless Gitlab::SafeRequestStore.active?
- return {} unless Gitlab::SafeRequestStore[:gitlab_git_env]
-
- return {} if Gitlab::SafeRequestStore[:gitlab_git_env].empty?
+ return {} if Gitlab::SafeRequestStore[:gitlab_git_env].blank?
{ 'gitaly-route-repository-accessor-policy' => 'primary-only' }
end
diff --git a/lib/gitlab/gitaly_client/storage_settings.rb b/lib/gitlab/gitaly_client/storage_settings.rb
index 5e50ac72965..7edd42f9ef7 100644
--- a/lib/gitlab/gitaly_client/storage_settings.rb
+++ b/lib/gitlab/gitaly_client/storage_settings.rb
@@ -60,7 +60,8 @@ module Gitlab
end
def legacy_disk_path
- if self.class.disk_access_denied?
+ # Do not use self.class due to Spring reloading issues
+ if Gitlab::GitalyClient::StorageSettings.disk_access_denied?
raise DirectPathAccessError, "git disk access denied"
end
diff --git a/lib/gitlab/graphql/docs/helper.rb b/lib/gitlab/graphql/docs/helper.rb
index ad9e08e189c..155602740c4 100644
--- a/lib/gitlab/graphql/docs/helper.rb
+++ b/lib/gitlab/graphql/docs/helper.rb
@@ -28,16 +28,20 @@ module Gitlab
end
def render_name_and_description(object)
- content = "### #{object[:name]}\n"
+ content = "### #{object[:name].camelcase}\n"
if object[:description].present?
- content += "\n#{object[:description]}.\n"
+ content += "\n#{object[:description]}"
+ content += '.' unless object[:description].ends_with?('.')
+ content += "\n"
end
content
end
def sorted_by_name(objects)
+ return [] unless objects.present?
+
objects.sort_by { |o| o[:name] }
end
@@ -49,6 +53,14 @@ module Gitlab
]
end
+ def render_argument(argument)
+ '| %s | %s | %s |' % [
+ render_name(argument),
+ render_description(argument),
+ render_field_type(argument[:type][:info])
+ ]
+ end
+
def render_enum_value(value)
'| %s | %s |' % [
render_name(value),
@@ -98,6 +110,10 @@ module Gitlab
end
end
+ def queries
+ graphql_operation_types.find { |type| type[:name] == 'Query' }.to_h[:fields]
+ end
+
# We ignore the built-in enum types.
def enums
graphql_enum_types.select do |enum_type|
diff --git a/lib/gitlab/graphql/docs/templates/default.md.haml b/lib/gitlab/graphql/docs/templates/default.md.haml
index 9dfb9b090a8..1df1c3a3e58 100644
--- a/lib/gitlab/graphql/docs/templates/default.md.haml
+++ b/lib/gitlab/graphql/docs/templates/default.md.haml
@@ -21,6 +21,24 @@
\
:plain
+ ## Queries
+
+ Queries are used to get the resources, filter or query them.
+
+ For more information, visit [Queries and Mutations](https://graphql.org/learn/queries/).
+\
+
+- sorted_by_name(queries).each do |query|
+
+ = render_name_and_description(query)
+ - unless query[:arguments].empty?
+ ~ "| Name | Description | Type |"
+ ~ "| ----- | ---- | ----------- |"
+ - sorted_by_name(query[:arguments]).each do |argument|
+ = render_argument(argument)
+ \
+
+:plain
## Object types
Object types represent the resources that the GitLab GraphQL API can return.
diff --git a/lib/gitlab/import_export/repo_restorer.rb b/lib/gitlab/import_export/repo_restorer.rb
index 8af7b68d78e..998da3e4afb 100644
--- a/lib/gitlab/import_export/repo_restorer.rb
+++ b/lib/gitlab/import_export/repo_restorer.rb
@@ -42,7 +42,7 @@ module Gitlab
def ensure_repository_does_not_exist!
if repository.exists?
shared.logger.info(
- message: %Q{Deleting existing "#{repository.path}" to re-import it.}
+ message: %Q{Deleting existing "#{repository.disk_path}" to re-import it.}
)
Repositories::DestroyService.new(repository).execute
diff --git a/lib/gitlab/marginalia.rb b/lib/gitlab/marginalia.rb
index 325a8c5c325..c99cf113638 100644
--- a/lib/gitlab/marginalia.rb
+++ b/lib/gitlab/marginalia.rb
@@ -2,8 +2,6 @@
module Gitlab
module Marginalia
- cattr_accessor :enabled, default: false
-
def self.set_application_name
::Marginalia.application_name = Gitlab.process_name
end
@@ -13,12 +11,5 @@ module Gitlab
::Marginalia::SidekiqInstrumentation.enable!
end
end
-
- def self.set_enabled_from_feature_flag
- # During db:create and db:bootstrap skip feature query as DB is not available yet.
- return false unless Gitlab::Database.cached_table_exists?('features')
-
- self.enabled = Feature.enabled?(:marginalia, type: :ops)
- end
end
end
diff --git a/lib/gitlab/marginalia/active_record_instrumentation.rb b/lib/gitlab/marginalia/active_record_instrumentation.rb
deleted file mode 100644
index 452f472bf6a..00000000000
--- a/lib/gitlab/marginalia/active_record_instrumentation.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-# Patch to annotate sql only when the feature is enabled.
-module Gitlab
- module Marginalia
- module ActiveRecordInstrumentation
- def annotate_sql(sql)
- Gitlab::Marginalia.enabled ? super(sql) : sql
- end
- end
- end
-end
diff --git a/lib/gitlab/metrics/samplers/ruby_sampler.rb b/lib/gitlab/metrics/samplers/ruby_sampler.rb
index 76175b465e4..3d29d38fa1f 100644
--- a/lib/gitlab/metrics/samplers/ruby_sampler.rb
+++ b/lib/gitlab/metrics/samplers/ruby_sampler.rb
@@ -7,7 +7,7 @@ module Gitlab
module Samplers
class RubySampler < BaseSampler
DEFAULT_SAMPLING_INTERVAL_SECONDS = 60
- GC_REPORT_BUCKETS = [0.005, 0.01, 0.02, 0.04, 0.07, 0.1, 0.5].freeze
+ GC_REPORT_BUCKETS = [0.01, 0.05, 0.1, 0.2, 0.3, 0.5, 1].freeze
def initialize(*)
GC::Profiler.clear
diff --git a/lib/gitlab/metrics/subscribers/active_record.rb b/lib/gitlab/metrics/subscribers/active_record.rb
index d725d8d7b29..111aa2cab48 100644
--- a/lib/gitlab/metrics/subscribers/active_record.rb
+++ b/lib/gitlab/metrics/subscribers/active_record.rb
@@ -9,6 +9,7 @@ module Gitlab
IGNORABLE_SQL = %w{BEGIN COMMIT}.freeze
DB_COUNTERS = %i{db_count db_write_count db_cached_count}.freeze
+ SQL_COMMANDS_WITH_COMMENTS_REGEX = /\A(\/\*.*\*\/\s)?((?!(.*[^\w'"](DELETE|UPDATE|INSERT INTO)[^\w'"])))(WITH.*)?(SELECT)((?!(FOR UPDATE|FOR SHARE)).)*$/i.freeze
def sql(event)
# Mark this thread as requiring a database connection. This is used
@@ -37,7 +38,7 @@ module Gitlab
private
def select_sql_command?(payload)
- payload[:sql].match(/\A((?!(.*[^\w'"](DELETE|UPDATE|INSERT INTO)[^\w'"])))(WITH.*)?(SELECT)((?!(FOR UPDATE|FOR SHARE)).)*$/i)
+ payload[:sql].match(SQL_COMMANDS_WITH_COMMENTS_REGEX)
end
def increment_db_counters(payload)
diff --git a/lib/gitlab/performance_bar/redis_adapter_when_peek_enabled.rb b/lib/gitlab/performance_bar/redis_adapter_when_peek_enabled.rb
index 133d777fc32..ac5c907465e 100644
--- a/lib/gitlab/performance_bar/redis_adapter_when_peek_enabled.rb
+++ b/lib/gitlab/performance_bar/redis_adapter_when_peek_enabled.rb
@@ -17,7 +17,7 @@ module Gitlab
# to a structured log
# rubocop:disable Gitlab/ModuleWithInstanceVariables
def enqueue_stats_job(request_id)
- return unless gather_stats?
+ return unless Feature.enabled?(:performance_bar_stats)
@client.sadd(GitlabPerformanceBarStatsWorker::STATS_KEY, request_id)
@@ -43,12 +43,6 @@ module Gitlab
)
end
# rubocop:enable Gitlab/ModuleWithInstanceVariables
-
- def gather_stats?
- return unless Feature.enabled?(:performance_bar_stats)
-
- Gitlab.com? || Gitlab.staging? || !Rails.env.production?
- end
end
end
end
diff --git a/lib/gitlab/regex.rb b/lib/gitlab/regex.rb
index 96f2b7570b3..00739c05386 100644
--- a/lib/gitlab/regex.rb
+++ b/lib/gitlab/regex.rb
@@ -61,6 +61,10 @@ module Gitlab
maven_app_name_regex
end
+ def npm_package_name_regex
+ @npm_package_name_regex ||= %r{\A(?:@(#{Gitlab::PathRegex::NAMESPACE_FORMAT_REGEX})/)?[-+\.\_a-zA-Z0-9]+\z}
+ end
+
def nuget_package_name_regex
@nuget_package_name_regex ||= %r{\A[-+\.\_a-zA-Z0-9]+\z}.freeze
end
diff --git a/lib/gitlab/template/base_template.rb b/lib/gitlab/template/base_template.rb
index 0f933a61598..dc006877129 100644
--- a/lib/gitlab/template/base_template.rb
+++ b/lib/gitlab/template/base_template.rb
@@ -87,11 +87,11 @@ module Gitlab
raise NotImplementedError
end
- def by_category(category, project = nil)
+ def by_category(category, project = nil, empty_category_title: nil)
directory = category_directory(category)
files = finder(project).list_files_for(directory)
- files.map { |f| new(f, project, category: category) }.sort
+ files.map { |f| new(f, project, category: category.presence || empty_category_title) }.sort
end
def category_directory(category)
@@ -108,7 +108,7 @@ module Gitlab
# Gitaly the actual template names within a given project's repository for all file templates
# other than `issue` and `merge request` description templates, which would instead
# overwrite the `template_names` method to return a redis cached version, by reading cached values
- # from `repository.issue_template_names_by_category` and `repository.merge_request_template_names_by_category`
+ # from `repository.issue_template_names_hash` and `repository.merge_request_template_names_hash`
# methods.
def repository_template_names(project)
template_names_by_category(self.all(project))
diff --git a/lib/gitlab/template/issue_template.rb b/lib/gitlab/template/issue_template.rb
index 3049f43b322..6e579018e45 100644
--- a/lib/gitlab/template/issue_template.rb
+++ b/lib/gitlab/template/issue_template.rb
@@ -23,7 +23,11 @@ module Gitlab
# own caching mechanism to avoid the back and forth call jumps between finder and model.
#
# follow-up issue: https://gitlab.com/gitlab-org/gitlab/-/issues/300279
- project.repository.issue_template_names_by_category
+ project.repository.issue_template_names_hash
+ end
+
+ def by_category(category, project = nil, empty_category_title: nil)
+ super(category, project, empty_category_title: _('Project Templates'))
end
end
end
diff --git a/lib/gitlab/template/merge_request_template.rb b/lib/gitlab/template/merge_request_template.rb
index 9442f3b13fb..241a823d870 100644
--- a/lib/gitlab/template/merge_request_template.rb
+++ b/lib/gitlab/template/merge_request_template.rb
@@ -23,7 +23,11 @@ module Gitlab
# own caching mechanism to avoid the back and forth call jumps between finder and model.
#
# follow-up issue: https://gitlab.com/gitlab-org/gitlab/-/issues/300279
- project.repository.merge_request_template_names_by_category
+ project.repository.merge_request_template_names_hash
+ end
+
+ def by_category(category, project = nil, empty_category_title: nil)
+ super(category, project, empty_category_title: _('Project Templates'))
end
end
end
diff --git a/lib/gitlab/tracking/standard_context.rb b/lib/gitlab/tracking/standard_context.rb
index 92fdd008249..8ce16c11267 100644
--- a/lib/gitlab/tracking/standard_context.rb
+++ b/lib/gitlab/tracking/standard_context.rb
@@ -15,10 +15,14 @@ module Gitlab
end
def environment
- return 'production' if Gitlab.com_and_canary?
-
return 'staging' if Gitlab.staging?
+ return 'production' if Gitlab.com?
+
+ return 'org' if Gitlab.org?
+
+ return 'self-managed' if Rails.env.production?
+
'development'
end
diff --git a/lib/gitlab/usage/docs/helper.rb b/lib/gitlab/usage/docs/helper.rb
index 8483334800b..e090eb65b4b 100644
--- a/lib/gitlab/usage/docs/helper.rb
+++ b/lib/gitlab/usage/docs/helper.rb
@@ -31,7 +31,9 @@ module Gitlab
end
def render_description(object)
- object.description
+ return 'Missing description' unless object.attributes[:description].present?
+
+ object.attributes[:description]
end
def render_attribute_row(key, value)
diff --git a/lib/gitlab/usage/docs/value_formatter.rb b/lib/gitlab/usage/docs/value_formatter.rb
index a2dc9b081f8..22c5c13fc0f 100644
--- a/lib/gitlab/usage/docs/value_formatter.rb
+++ b/lib/gitlab/usage/docs/value_formatter.rb
@@ -5,12 +5,14 @@ module Gitlab
module Docs
class ValueFormatter
def self.format(key, value)
+ return '' unless value.present?
+
case key
when :key_path
"**`#{value}`**"
when :data_source
value.to_s.capitalize
- when :product_group
+ when :product_group, :product_category
"`#{value}`"
when :introduced_by_url
"[Introduced by](#{value})"
diff --git a/lib/gitlab/usage_data_counters/aggregated_metrics/code_review.yml b/lib/gitlab/usage_data_counters/aggregated_metrics/code_review.yml
new file mode 100644
index 00000000000..4f86d500164
--- /dev/null
+++ b/lib/gitlab/usage_data_counters/aggregated_metrics/code_review.yml
@@ -0,0 +1,89 @@
+# code_review_extension_category_monthly_active_users
+# This is only metrics related to the VS Code Extension for now.
+#
+# code_review_category_monthly_active_users
+# This is the user based metrics. These should only be user based metrics and only be related to the Code Review things inside of GitLab.
+#
+# code_review_group_monthly_active_users
+# This is an aggregation of both of the above aggregations. It's intended to represent all users who interact with our group across all of our categories.
+---
+- name: code_review_group_monthly_active_users
+ operator: OR
+ feature_flag: usage_data_code_review_aggregation
+ source: redis
+ events: [
+ 'i_code_review_user_single_file_diffs',
+ 'i_code_review_user_create_mr',
+ 'i_code_review_user_close_mr',
+ 'i_code_review_user_reopen_mr',
+ 'i_code_review_user_resolve_thread',
+ 'i_code_review_user_unresolve_thread',
+ 'i_code_review_edit_mr_title',
+ 'i_code_review_edit_mr_desc',
+ 'i_code_review_user_merge_mr',
+ 'i_code_review_user_create_mr_comment',
+ 'i_code_review_user_edit_mr_comment',
+ 'i_code_review_user_remove_mr_comment',
+ 'i_code_review_user_create_review_note',
+ 'i_code_review_user_publish_review',
+ 'i_code_review_user_create_multiline_mr_comment',
+ 'i_code_review_user_edit_multiline_mr_comment',
+ 'i_code_review_user_remove_multiline_mr_comment',
+ 'i_code_review_user_add_suggestion',
+ 'i_code_review_user_apply_suggestion',
+ 'i_code_review_user_assigned',
+ 'i_code_review_user_review_requested',
+ 'i_code_review_user_approve_mr',
+ 'i_code_review_user_unapprove_mr',
+ 'i_code_review_user_marked_as_draft',
+ 'i_code_review_user_unmarked_as_draft',
+ 'i_code_review_user_approval_rule_added',
+ 'i_code_review_user_approval_rule_deleted',
+ 'i_code_review_user_approval_rule_edited',
+ 'i_code_review_user_vs_code_api_request',
+ 'i_code_review_user_toggled_task_item_status',
+ 'i_code_review_user_create_mr_from_issue'
+ ]
+- name: code_review_category_monthly_active_users
+ operator: OR
+ feature_flag: usage_data_code_review_aggregation
+ source: redis
+ events: [
+ 'i_code_review_user_single_file_diffs',
+ 'i_code_review_user_create_mr',
+ 'i_code_review_user_close_mr',
+ 'i_code_review_user_reopen_mr',
+ 'i_code_review_user_resolve_thread',
+ 'i_code_review_user_unresolve_thread',
+ 'i_code_review_edit_mr_title',
+ 'i_code_review_edit_mr_desc',
+ 'i_code_review_user_merge_mr',
+ 'i_code_review_user_create_mr_comment',
+ 'i_code_review_user_edit_mr_comment',
+ 'i_code_review_user_remove_mr_comment',
+ 'i_code_review_user_create_review_note',
+ 'i_code_review_user_publish_review',
+ 'i_code_review_user_create_multiline_mr_comment',
+ 'i_code_review_user_edit_multiline_mr_comment',
+ 'i_code_review_user_remove_multiline_mr_comment',
+ 'i_code_review_user_add_suggestion',
+ 'i_code_review_user_apply_suggestion',
+ 'i_code_review_user_assigned',
+ 'i_code_review_user_review_requested',
+ 'i_code_review_user_approve_mr',
+ 'i_code_review_user_unapprove_mr',
+ 'i_code_review_user_marked_as_draft',
+ 'i_code_review_user_unmarked_as_draft',
+ 'i_code_review_user_approval_rule_added',
+ 'i_code_review_user_approval_rule_deleted',
+ 'i_code_review_user_approval_rule_edited',
+ 'i_code_review_user_toggled_task_item_status',
+ 'i_code_review_user_create_mr_from_issue'
+ ]
+- name: code_review_extension_category_monthly_active_users
+ operator: OR
+ feature_flag: usage_data_code_review_aggregation
+ source: redis
+ events: [
+ 'i_code_review_user_vs_code_api_request'
+ ]
diff --git a/lib/gitlab/usage_data_counters/counter_events/package_events.yml b/lib/gitlab/usage_data_counters/counter_events/package_events.yml
index f6bddabdd44..e1648245f3f 100644
--- a/lib/gitlab/usage_data_counters/counter_events/package_events.yml
+++ b/lib/gitlab/usage_data_counters/counter_events/package_events.yml
@@ -41,6 +41,9 @@
- i_package_pypi_delete_package
- i_package_pypi_pull_package
- i_package_pypi_push_package
+- i_package_rubygems_delete_package
+- i_package_rubygems_pull_package
+- i_package_rubygems_push_package
- i_package_tag_delete_package
- i_package_tag_pull_package
- i_package_tag_push_package
diff --git a/lib/gitlab/usage_data_counters/known_events/package_events.yml b/lib/gitlab/usage_data_counters/known_events/package_events.yml
index 78a2a587b34..6cf31ba4db7 100644
--- a/lib/gitlab/usage_data_counters/known_events/package_events.yml
+++ b/lib/gitlab/usage_data_counters/known_events/package_events.yml
@@ -99,6 +99,16 @@
aggregation: weekly
redis_slot: package
feature_flag: collect_package_events_redis
+- name: i_package_rubygems_deploy_token
+ category: deploy_token_packages
+ aggregation: weekly
+ redis_slot: package
+ feature_flag: collect_package_events_redis
+- name: i_package_rubygems_user
+ category: user_packages
+ aggregation: weekly
+ redis_slot: package
+ feature_flag: collect_package_events_redis
- name: i_package_tag_deploy_token
category: deploy_token_packages
aggregation: weekly
diff --git a/lib/tasks/eslint.rake b/lib/tasks/eslint.rake
index ad63de66c81..35c3e834258 100644
--- a/lib/tasks/eslint.rake
+++ b/lib/tasks/eslint.rake
@@ -3,7 +3,7 @@
unless Rails.env.production?
desc "GitLab | Run ESLint"
task eslint: ['yarn:check'] do
- unless system('yarn run eslint')
+ unless system('yarn run lint:eslint')
abort('rake eslint failed')
end
end
diff --git a/lib/tasks/gitlab/graphql.rake b/lib/tasks/gitlab/graphql.rake
index e4eb4604138..caf5879a154 100644
--- a/lib/tasks/gitlab/graphql.rake
+++ b/lib/tasks/gitlab/graphql.rake
@@ -6,6 +6,7 @@ require 'graphql/rake_task'
namespace :gitlab do
OUTPUT_DIR = Rails.root.join("doc/api/graphql/reference")
+ TEMP_SCHEMA_DIR = Rails.root.join('tmp/tests/graphql')
TEMPLATES_DIR = 'lib/gitlab/graphql/docs/templates/'
# Make all feature flags enabled so that all feature flag
@@ -27,7 +28,7 @@ namespace :gitlab do
GraphQL::RakeTask.new(
schema_name: 'GitlabSchema',
dependencies: [:environment, :enable_feature_flags],
- directory: OUTPUT_DIR,
+ directory: TEMP_SCHEMA_DIR,
idl_outfile: "gitlab_schema.graphql",
json_outfile: "gitlab_schema.json"
)
@@ -129,19 +130,6 @@ namespace :gitlab do
abort
end
end
-
- desc 'GitLab | GraphQL | Check if GraphQL schemas are up to date'
- task check_schema: [:environment, :enable_feature_flags] do
- idl_doc = File.read(Rails.root.join(OUTPUT_DIR, 'gitlab_schema.graphql'))
- json_doc = File.read(Rails.root.join(OUTPUT_DIR, 'gitlab_schema.json'))
-
- if idl_doc == GitlabSchema.to_definition && json_doc == GitlabSchema.to_json
- puts "GraphQL schema is up to date"
- else
- format_output('GraphQL schema is outdated! Please update it by running `bundle exec rake gitlab:graphql:schema:dump`.')
- abort
- end
- end
end
end
diff --git a/lib/tasks/lint.rake b/lib/tasks/lint.rake
index 5d60bc41f21..976ec089011 100644
--- a/lib/tasks/lint.rake
+++ b/lib/tasks/lint.rake
@@ -33,7 +33,6 @@ unless Rails.env.production?
tasks = %w[
config_lint
lint:haml
- scss_lint
gettext:lint
lint:static_verification
gitlab:sidekiq:all_queues_yml:check
diff --git a/lib/tasks/scss-lint.rake b/lib/tasks/scss-lint.rake
deleted file mode 100644
index 8a4809f80fd..00000000000
--- a/lib/tasks/scss-lint.rake
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-unless Rails.env.production?
- require 'scss_lint/rake_task'
-
- SCSSLint::RakeTask.new do |t|
- t.config = '.scss-lint.yml'
- # See https://github.com/brigade/scss-lint/issues/726
- # Hack, otherwise linter won't respect scss_files option in config file.
- t.files = []
- end
-end
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 1bcd85ca9e2..610e983a6b9 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -2297,6 +2297,9 @@ msgstr ""
msgid "AdminUsers|Active"
msgstr ""
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
msgid "AdminUsers|Admin"
msgstr ""
@@ -2390,6 +2393,15 @@ msgstr ""
msgid "AdminUsers|For more information, please refer to the %{link_start}user account deletion documentation.%{link_end}"
msgstr ""
+msgid "AdminUsers|Here are some helpful links to help you manage your instance:"
+msgstr ""
+
+msgid "AdminUsers|If you have any questions about this process please consult our %{doc_link} or %{support_link}."
+msgstr ""
+
+msgid "AdminUsers|Important information about usage on your GitLab instance"
+msgstr ""
+
msgid "AdminUsers|Is using seat"
msgstr ""
@@ -2399,6 +2411,9 @@ msgstr ""
msgid "AdminUsers|Log in"
msgstr ""
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
msgid "AdminUsers|New user"
msgstr ""
@@ -2498,6 +2513,18 @@ msgstr ""
msgid "AdminUsers|Users"
msgstr ""
+msgid "AdminUsers|Users can still be invited to your instance and/or add themselves if permitted based on your settings. They will not have access to your instance, nor count towards your subscribed seat count until you %{approve_link}."
+msgstr ""
+
+msgid "AdminUsers|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2531,6 +2558,21 @@ msgstr ""
msgid "AdminUsers|You must transfer ownership or delete the groups owned by this user before you can delete their account"
msgstr ""
+msgid "AdminUsers|Your GitLab instance has reached the maximum allowed %{user_doc_link} set by an instance admin."
+msgstr ""
+
+msgid "AdminUsers|approve them"
+msgstr ""
+
+msgid "AdminUsers|contact our support team"
+msgstr ""
+
+msgid "AdminUsers|docs"
+msgstr ""
+
+msgid "AdminUsers|user cap"
+msgstr ""
+
msgid "Administration"
msgstr ""
@@ -3004,9 +3046,6 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
-msgstr ""
-
msgid "All threads resolved"
msgstr ""
@@ -3109,6 +3148,9 @@ msgstr ""
msgid "Almost there"
msgstr ""
+msgid "Almost there..."
+msgstr ""
+
msgid "Already blocked"
msgstr ""
@@ -3175,15 +3217,6 @@ msgstr ""
msgid "An error has occurred"
msgstr ""
-msgid "An error occured while loading the notification settings. Please try again."
-msgstr ""
-
-msgid "An error occured while saving changes: %{error}"
-msgstr ""
-
-msgid "An error occured while updating the notification settings. Please try again."
-msgstr ""
-
msgid "An error occurred adding a draft to the thread."
msgstr ""
@@ -3262,6 +3295,9 @@ msgstr ""
msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again."
msgstr ""
+msgid "An error occurred while drawing job relationship links."
+msgstr ""
+
msgid "An error occurred while enabling Service Desk."
msgstr ""
@@ -3418,12 +3454,18 @@ msgstr ""
msgid "An error occurred while loading the merge request."
msgstr ""
+msgid "An error occurred while loading the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while loading the pipeline."
msgstr ""
msgid "An error occurred while loading the pipelines jobs."
msgstr ""
+msgid "An error occurred while loading your content. Please try again."
+msgstr ""
+
msgid "An error occurred while making the request."
msgstr ""
@@ -3466,6 +3508,9 @@ msgstr ""
msgid "An error occurred while retrieving projects."
msgstr ""
+msgid "An error occurred while saving changes: %{error}"
+msgstr ""
+
msgid "An error occurred while searching users."
msgstr ""
@@ -3505,6 +3550,9 @@ msgstr ""
msgid "An error occurred while updating the milestone."
msgstr ""
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3517,9 +3565,6 @@ msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
-msgid "An error ocurred while loading your content. Please try again."
-msgstr ""
-
msgid "An example project for managing Kubernetes clusters integrated with GitLab"
msgstr ""
@@ -3882,9 +3927,6 @@ msgstr ""
msgid "Are you sure you want to close this blocked issue?"
msgstr ""
-msgid "Are you sure you want to delete \"%{name}\" Value Stream?"
-msgstr ""
-
msgid "Are you sure you want to delete %{name}?"
msgstr ""
@@ -4766,6 +4808,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board epics. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while fetching the board issues. Please reload the page."
msgstr ""
@@ -5024,6 +5069,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr ""
+
msgid "BulkImport|From source group"
msgstr ""
@@ -5033,7 +5081,7 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
-msgid "BulkImport|No groups available for import"
+msgid "BulkImport|No parent"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
@@ -5048,6 +5096,9 @@ msgstr ""
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
msgid "BulkImport|destination group cannot be part of the source group tree"
msgstr ""
@@ -5608,6 +5659,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your source instance permissions."
+msgstr ""
+
msgid "Checking %{text} availability…"
msgstr ""
@@ -7291,6 +7345,9 @@ msgstr ""
msgid "Collapse approvers"
msgstr ""
+msgid "Collapse issues"
+msgstr ""
+
msgid "Collapse milestones"
msgstr ""
@@ -7545,12 +7602,24 @@ msgstr ""
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
msgstr ""
msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
msgstr ""
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+msgstr ""
+
+msgid "ComplianceFrameworks|Error deleting the compliance framework. Please try again"
+msgstr ""
+
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page"
msgstr ""
@@ -7572,6 +7641,9 @@ msgstr ""
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
msgstr ""
+msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
+msgstr ""
+
msgid "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
msgstr ""
@@ -8346,10 +8418,10 @@ msgstr ""
msgid "Could not find iteration"
msgstr ""
-msgid "Could not load instance counts. Please refresh the page to try again."
+msgid "Could not load the user chart. Please refresh the page to try again."
msgstr ""
-msgid "Could not load the user chart. Please refresh the page to try again."
+msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove the trigger."
@@ -8591,6 +8663,9 @@ msgstr ""
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
msgstr ""
+msgid "CreateValueStreamForm|'%{name}' Value Stream edited"
+msgstr ""
+
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
@@ -8603,15 +8678,27 @@ msgstr ""
msgid "CreateValueStreamForm|Code stage start"
msgstr ""
+msgid "CreateValueStreamForm|Create Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
+msgid "CreateValueStreamForm|Create new Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Default stages"
msgstr ""
+msgid "CreateValueStreamForm|Default stages can only be hidden or re-ordered"
+msgstr ""
+
+msgid "CreateValueStreamForm|Edit Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Editing stage"
msgstr ""
@@ -8660,6 +8747,9 @@ msgstr ""
msgid "CreateValueStreamForm|Restore stage"
msgstr ""
+msgid "CreateValueStreamForm|Save Value Stream"
+msgstr ""
+
msgid "CreateValueStreamForm|Select end event"
msgstr ""
@@ -9663,6 +9753,15 @@ msgstr ""
msgid "DeleteProject|Failed to restore wiki repository. Please contact the administrator."
msgstr ""
+msgid "DeleteValueStream|'%{name}' Value Stream deleted"
+msgstr ""
+
+msgid "DeleteValueStream|Are you sure you want to delete \"%{name}\" Value Stream?"
+msgstr ""
+
+msgid "DeleteValueStream|Delete %{name}"
+msgstr ""
+
msgid "Deleted"
msgstr ""
@@ -10290,10 +10389,10 @@ msgstr ""
msgid "DevopsAdoption|Adopted"
msgstr ""
-msgid "DevopsAdoption|An error occured while removing the group. Please try again."
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occured while saving the group. Please try again."
+msgid "DevopsAdoption|An error occurred while saving the group. Please try again."
msgstr ""
msgid "DevopsAdoption|Approvals"
@@ -10703,6 +10802,9 @@ msgstr ""
msgid "Drop or %{linkStart}upload%{linkEnd} designs to attach"
msgstr ""
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
msgstr ""
@@ -12068,6 +12170,9 @@ msgstr ""
msgid "Expand file"
msgstr ""
+msgid "Expand issues"
+msgstr ""
+
msgid "Expand milestones"
msgstr ""
@@ -12497,6 +12602,9 @@ msgstr ""
msgid "Feature flag is not enabled on the environment's project."
msgstr ""
+msgid "Feature flag status"
+msgstr ""
+
msgid "Feature flag was not removed."
msgstr ""
@@ -13183,6 +13291,9 @@ msgstr ""
msgid "Geo nodes are paused using a command run on the node"
msgstr ""
+msgid "Geo sites"
+msgstr ""
+
msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
msgstr ""
@@ -13561,6 +13672,9 @@ msgstr ""
msgid "Getting started with releases"
msgstr ""
+msgid "Git"
+msgstr ""
+
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr ""
@@ -13672,6 +13786,9 @@ msgstr ""
msgid "GitLab metadata URL"
msgstr ""
+msgid "GitLab namespace"
+msgstr ""
+
msgid "GitLab project export"
msgstr ""
@@ -14395,6 +14512,15 @@ msgstr ""
msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
msgstr ""
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
msgid "GroupSettings|Apply integration settings to all Projects"
msgstr ""
@@ -15940,96 +16066,6 @@ msgstr ""
msgid "Instance overview"
msgstr ""
-msgid "InstanceStatistics|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
-
-msgid "InstanceStatistics|Groups"
-msgstr ""
-
-msgid "InstanceStatistics|Issues"
-msgstr ""
-
-msgid "InstanceStatistics|Issues & Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Items"
-msgstr ""
-
-msgid "InstanceStatistics|Merge Requests"
-msgstr ""
-
-msgid "InstanceStatistics|Month"
-msgstr ""
-
-msgid "InstanceStatistics|No data available."
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines canceled"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines failed"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines skipped"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines succeeded"
-msgstr ""
-
-msgid "InstanceStatistics|Pipelines total"
-msgstr ""
-
-msgid "InstanceStatistics|Projects"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the cancelled pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the failed pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the issues"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the merge requests"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the skipped pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the successful pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error fetching the total pipelines"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the groups"
-msgstr ""
-
-msgid "InstanceStatistics|There was an error while loading the projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total groups"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects"
-msgstr ""
-
-msgid "InstanceStatistics|Total projects & groups"
-msgstr ""
-
-msgid "InstanceStatistics|Users"
-msgstr ""
-
msgid "Integration"
msgstr ""
@@ -16048,12 +16084,18 @@ msgstr ""
msgid "Integrations|Add namespace"
msgstr ""
+msgid "Integrations|Adding a namespace currently works only in browsers that allow cross‑site cookies. Please make sure to use %{firefox_link_start}Firefox%{firefox_link_end} or enable cross‑site cookies in your browser when adding a namespace."
+msgstr ""
+
msgid "Integrations|All details"
msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
+msgid "Integrations|Browser limitations"
+msgstr ""
+
msgid "Integrations|Comment detail:"
msgstr ""
@@ -16093,6 +16135,9 @@ msgstr ""
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
+msgid "Integrations|Link namespace to Jira"
+msgstr ""
+
msgid "Integrations|Link namespaces"
msgstr ""
@@ -16105,6 +16150,12 @@ msgstr ""
msgid "Integrations|No available namespaces."
msgstr ""
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
+msgstr ""
+
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -16309,6 +16360,9 @@ msgstr ""
msgid "Invite Members"
msgstr ""
+msgid "Invite a group"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -16405,19 +16459,40 @@ msgstr ""
msgid "InviteMembersModal|Invite"
msgstr ""
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
msgid "InviteMembersModal|Invite team members"
msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Search for members to invite"
msgstr ""
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
msgid "InviteMembersModal|Some of the members could not be added"
msgstr ""
-msgid "InviteMembersModal|You're inviting members to the %{name} %{type}"
+msgid "InviteMembersModal|You're inviting a group to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{name} project"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} group"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{name} project"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
@@ -16669,6 +16744,9 @@ msgstr ""
msgid "Issues with comments, merge requests with diffs and comments, labels, milestones, snippets, and other project entities"
msgstr ""
+msgid "Issues with label %{label}"
+msgstr ""
+
msgid "Issues with no epic assigned"
msgstr ""
@@ -16795,6 +16873,9 @@ msgstr ""
msgid "Jira service not configured."
msgstr ""
+msgid "Jira user"
+msgstr ""
+
msgid "Jira users have been imported from the configured Jira instance. They can be mapped by selecting a GitLab user from the dropdown in the \"GitLab username\" column. When the form appears, the dropdown defaults to the user conducting the import."
msgstr ""
@@ -16810,7 +16891,10 @@ msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
-msgid "JiraService|An error occured while fetching issue list"
+msgid "JiraService|An error occurred while fetching issue list"
+msgstr ""
+
+msgid "JiraService|Automatically transitions Jira issues to the \"Done\" category. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
@@ -16867,7 +16951,7 @@ msgstr ""
msgid "JiraService|Jira project key"
msgstr ""
-msgid "JiraService|Jira workflow transition IDs"
+msgid "JiraService|Move to Done"
msgstr ""
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
@@ -16888,7 +16972,7 @@ msgstr ""
msgid "JiraService|Select issue type"
msgstr ""
-msgid "JiraService|Set transition IDs for Jira workflow transitions. %{link_start}Learn more%{link_end}"
+msgid "JiraService|Set a custom final state by using transition IDs. %{linkStart}Learn about transition IDs%{linkEnd}"
msgstr ""
msgid "JiraService|Sign in to GitLab.com to get started."
@@ -16900,12 +16984,18 @@ msgstr ""
msgid "JiraService|This issue is synchronized with Jira"
msgstr ""
+msgid "JiraService|Transition Jira issues to their final state:"
+msgstr ""
+
msgid "JiraService|Use a password for server version and an API token for cloud version"
msgstr ""
msgid "JiraService|Use a username for server version and an email for cloud version"
msgstr ""
+msgid "JiraService|Use custom transitions"
+msgstr ""
+
msgid "JiraService|Username or Email"
msgstr ""
@@ -17248,6 +17338,9 @@ msgstr ""
msgid "Labels can be applied to issues and merge requests."
msgstr ""
+msgid "Labels with no issues in this iteration:"
+msgstr ""
+
msgid "Labels|%{spanStart}Promote label%{spanEnd} %{labelTitle} %{spanStart}to Group Label?%{spanEnd}"
msgstr ""
@@ -17831,7 +17924,7 @@ msgstr ""
msgid "Loading issues"
msgstr ""
-msgid "Loading more issues"
+msgid "Loading more"
msgstr ""
msgid "Loading snippet"
@@ -18206,9 +18299,6 @@ msgstr ""
msgid "Maximum Maven package file size in bytes"
msgstr ""
-msgid "Maximum NPM package file size in bytes"
-msgstr ""
-
msgid "Maximum NuGet package file size in bytes"
msgstr ""
@@ -18266,6 +18356,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
@@ -18620,9 +18713,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|Add a reply"
-msgstr ""
-
msgid "MergeRequests|An error occurred while checking whether another squash is in progress."
msgstr ""
@@ -18632,9 +18722,6 @@ msgstr ""
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
-msgid "MergeRequests|Reply..."
-msgstr ""
-
msgid "MergeRequests|Resolve this thread in a new issue"
msgstr ""
@@ -19911,6 +19998,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New discussion"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -20058,6 +20148,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No assignee"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -20085,6 +20178,9 @@ msgstr ""
msgid "No compliance frameworks are in use. Create one using the GraphQL API."
msgstr ""
+msgid "No confirmation email received? Please check your spam folder or"
+msgstr ""
+
msgid "No connection could be made to a Gitaly Server, please check your logs!"
msgstr ""
@@ -20145,6 +20241,9 @@ msgstr ""
msgid "No issues found"
msgstr ""
+msgid "No issues found for the selected labels"
+msgstr ""
+
msgid "No iteration"
msgstr ""
@@ -20454,6 +20553,9 @@ msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
msgid "NotificationEvent|Moved project"
msgstr ""
@@ -20643,6 +20745,9 @@ msgstr ""
msgid "OnCallSchedules|Create on-call schedules in GitLab"
msgstr ""
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
msgid "OnCallSchedules|Delete rotation"
msgstr ""
@@ -21248,9 +21353,6 @@ msgstr ""
msgid "PackageRegistry|Maven XML"
msgstr ""
-msgid "PackageRegistry|NPM"
-msgstr ""
-
msgid "PackageRegistry|NuGet"
msgstr ""
@@ -21335,6 +21437,9 @@ msgstr ""
msgid "PackageRegistry|You may also need to setup authentication using an auth token. %{linkStart}See the documentation%{linkEnd} to find out more."
msgstr ""
+msgid "PackageRegistry|npm"
+msgstr ""
+
msgid "PackageRegistry|npm command"
msgstr ""
@@ -21356,15 +21461,15 @@ msgstr ""
msgid "PackageType|Maven"
msgstr ""
-msgid "PackageType|NPM"
-msgstr ""
-
msgid "PackageType|NuGet"
msgstr ""
msgid "PackageType|PyPI"
msgstr ""
+msgid "PackageType|npm"
+msgstr ""
+
msgid "Packages"
msgstr ""
@@ -21602,6 +21707,9 @@ msgstr ""
msgid "PerformanceBar|SQL queries"
msgstr ""
+msgid "PerformanceBar|Stats"
+msgstr ""
+
msgid "PerformanceBar|trace"
msgstr ""
@@ -21677,10 +21785,10 @@ msgstr ""
msgid "Pipeline: %{status}"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the analytics data"
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
msgstr ""
-msgid "PipelineCharts|An error has ocurred when retrieving the pipelines data"
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
msgstr ""
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
@@ -21920,6 +22028,9 @@ msgstr ""
msgid "Pipeline|Canceled"
msgstr ""
+msgid "Pipeline|Checking pipeline status"
+msgstr ""
+
msgid "Pipeline|Checking pipeline status."
msgstr ""
@@ -21971,6 +22082,9 @@ msgstr ""
msgid "Pipeline|Pipeline"
msgstr ""
+msgid "Pipeline|Pipeline %{idStart}#%{idEnd} %{statusStart}%{statusEnd} for %{commitStart}%{commitEnd}"
+msgstr ""
+
msgid "Pipeline|Pipelines"
msgstr ""
@@ -22028,6 +22142,9 @@ msgstr ""
msgid "Pipeline|Variables"
msgstr ""
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
msgstr ""
@@ -22097,6 +22214,9 @@ msgstr ""
msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
+msgid "Please check your email to confirm your account"
+msgstr ""
+
msgid "Please choose a file"
msgstr ""
@@ -22937,6 +23057,9 @@ msgstr ""
msgid "Project ID"
msgstr ""
+msgid "Project Templates"
+msgstr ""
+
msgid "Project URL"
msgstr ""
@@ -24840,7 +24963,7 @@ msgstr ""
msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
-msgid "Reply..."
+msgid "Reply…"
msgstr ""
msgid "Repo by URL"
@@ -24895,10 +25018,10 @@ msgstr ""
msgid "Reports|Activity"
msgstr ""
-msgid "Reports|An error occured while loading report"
+msgid "Reports|An error occurred while loading %{name} results"
msgstr ""
-msgid "Reports|An error occurred while loading %{name} results"
+msgid "Reports|An error occurred while loading report"
msgstr ""
msgid "Reports|Class"
@@ -25109,6 +25232,9 @@ msgstr ""
msgid "Request details"
msgstr ""
+msgid "Request new confirmation email"
+msgstr ""
+
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -26407,6 +26533,9 @@ msgstr ""
msgid "SecurityReports|[No reason]"
msgstr ""
+msgid "Security|Policies"
+msgstr ""
+
msgid "See GitLab's %{password_policy_guidelines}"
msgstr ""
@@ -27001,6 +27130,9 @@ msgstr ""
msgid "Setup"
msgstr ""
+msgid "Several security scans are enabled because %{linkStart}Auto DevOps%{linkEnd} is enabled on this project"
+msgstr ""
+
msgid "Severity"
msgstr ""
@@ -27947,7 +28079,7 @@ msgstr ""
msgid "Start a Free Ultimate Trial"
msgstr ""
-msgid "Start a new discussion..."
+msgid "Start a new discussion…"
msgstr ""
msgid "Start a new merge request"
@@ -29706,6 +29838,9 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
+msgid "There was an error fetching the Geo Nodes"
+msgstr ""
+
msgid "There was an error fetching the Geo Settings"
msgstr ""
@@ -30012,9 +30147,6 @@ msgstr ""
msgid "This epic does not exist or you don't have sufficient permission."
msgstr ""
-msgid "This feature is disabled at the instance level."
-msgstr ""
-
msgid "This feature requires local storage to be enabled"
msgstr ""
@@ -30880,6 +31012,9 @@ msgstr ""
msgid "To widen your search, change or remove filters above"
msgstr ""
+msgid "To widen your search, change or remove filters above."
+msgstr ""
+
msgid "To widen your search, change or remove filters."
msgstr ""
@@ -31923,6 +32058,96 @@ msgstr ""
msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
msgstr ""
+msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
+msgstr ""
+
+msgid "UsageTrends|Could not load the pipelines chart. Please refresh the page to try again."
+msgstr ""
+
+msgid "UsageTrends|Could not load the projects and groups chart. Please refresh the page to try again."
+msgstr ""
+
+msgid "UsageTrends|Groups"
+msgstr ""
+
+msgid "UsageTrends|Issues"
+msgstr ""
+
+msgid "UsageTrends|Issues & Merge Requests"
+msgstr ""
+
+msgid "UsageTrends|Items"
+msgstr ""
+
+msgid "UsageTrends|Merge Requests"
+msgstr ""
+
+msgid "UsageTrends|Month"
+msgstr ""
+
+msgid "UsageTrends|No data available."
+msgstr ""
+
+msgid "UsageTrends|Pipelines"
+msgstr ""
+
+msgid "UsageTrends|Pipelines canceled"
+msgstr ""
+
+msgid "UsageTrends|Pipelines failed"
+msgstr ""
+
+msgid "UsageTrends|Pipelines skipped"
+msgstr ""
+
+msgid "UsageTrends|Pipelines succeeded"
+msgstr ""
+
+msgid "UsageTrends|Pipelines total"
+msgstr ""
+
+msgid "UsageTrends|Projects"
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the cancelled pipelines"
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the failed pipelines"
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the issues"
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the merge requests"
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the skipped pipelines"
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the successful pipelines"
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the total pipelines"
+msgstr ""
+
+msgid "UsageTrends|There was an error while loading the groups"
+msgstr ""
+
+msgid "UsageTrends|There was an error while loading the projects"
+msgstr ""
+
+msgid "UsageTrends|Total groups"
+msgstr ""
+
+msgid "UsageTrends|Total projects"
+msgstr ""
+
+msgid "UsageTrends|Total projects & groups"
+msgstr ""
+
+msgid "UsageTrends|Users"
+msgstr ""
+
msgid "Use %{code_start}::%{code_end} to create a %{link_start}scoped label set%{link_end} (eg. %{code_start}priority::1%{code_end})"
msgstr ""
@@ -33130,7 +33355,7 @@ msgstr ""
msgid "When enabled, any user visiting %{host} will be able to create an account."
msgstr ""
-msgid "When enabled, if an NPM package isn't found in the GitLab Registry, we will attempt to pull from the global NPM registry."
+msgid "When enabled, if an npm package isn't found in the GitLab Registry, we will attempt to pull from the global npm registry."
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
@@ -34933,6 +35158,9 @@ msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
msgid "is read only"
msgstr ""
diff --git a/locale/unfound_translations.rb b/locale/unfound_translations.rb
index 76ad81cacc1..3923c62466a 100644
--- a/locale/unfound_translations.rb
+++ b/locale/unfound_translations.rb
@@ -21,3 +21,4 @@ N_('NotificationEvent|Merge merge request')
N_('NotificationEvent|Failed pipeline')
N_('NotificationEvent|Fixed pipeline')
N_('NotificationEvent|Moved project')
+N_('NotificationEvent|Merge when pipeline succeeds')
diff --git a/package.json b/package.json
index eb39884a1d9..e5f3e284a09 100644
--- a/package.json
+++ b/package.json
@@ -5,13 +5,13 @@
"block-dependencies": "node scripts/frontend/block_dependencies.js",
"clean": "rm -rf public/assets tmp/cache/*-loader",
"dev-server": "NODE_OPTIONS=\"--max-old-space-size=3584\" node scripts/frontend/webpack_dev_server.js",
- "eslint": "eslint --cache --max-warnings 0 --report-unused-disable-directives --ext .js,.vue .",
- "eslint-fix": "eslint --cache --max-warnings 0 --report-unused-disable-directives --ext .js,.vue --fix .",
- "eslint-staged": "git diff --diff-filter=d --cached --name-only | grep -E \"(.*)\\.(js|vue)$\" | xargs eslint --cache --max-warnings 0 --report-unused-disable-directives",
- "eslint-staged-fix": "git diff --diff-filter=d --cached --name-only | grep -E \"(.*)\\.(js|vue)$\" | xargs eslint --cache --max-warnings 0 --report-unused-disable-directives --fix",
- "eslint-report": "eslint --max-warnings 0 --ext .js,.vue --format html --output-file ./eslint-report.html --no-inline-config .",
+ "eslint-fix": "echo 'Please use lint:eslint:fix instead' && exit 1",
+ "eslint-staged": "echo 'Please use lint:eslint:staged instead' && exit 1",
+ "eslint-staged-fix": "echo 'Please use lint:eslint:staged:fix instead' && exit 1",
+ "eslint-report": "echo 'Please use lint:eslint:report instead' && exit 1",
"file-coverage": "scripts/frontend/file_test_coverage.js",
"lint-docs": "scripts/lint-doc.sh",
+ "internal:eslint": "eslint --cache --max-warnings 0 --report-unused-disable-directives --ext .js,.vue",
"prejest": "yarn check-dependencies",
"jest": "jest --config jest.config.js",
"jest-debug": "node --inspect-brk node_modules/.bin/jest --runInBand",
@@ -21,12 +21,21 @@
"karma": "BABEL_ENV=${BABEL_ENV:=karma} karma start --single-run true config/karma.config.js",
"karma-coverage": "BABEL_ENV=coverage karma start --single-run true config/karma.config.js",
"karma-start": "BABEL_ENV=karma karma start config/karma.config.js",
+ "lint:eslint": "yarn run internal:eslint .",
+ "lint:eslint:fix": "yarn run lint:eslint --fix",
+ "lint:eslint:report": "yarn run internal:eslint --format html --output-file ./eslint-report.html --no-inline-config .",
+ "lint:eslint:staged": "scripts/frontend/execute-on-staged-files.sh internal:eslint '(js|vue)'",
+ "lint:eslint:staged:fix": "yarn run lint:eslint:staged --fix",
+ "lint:prettier": "yarn run prettier --check '**/*.{graphql,js,vue}'",
+ "lint:prettier:fix": "yarn run prettier --write '**/*.{graphql,js,vue}'",
+ "lint:prettier:staged": "scripts/frontend/execute-on-staged-files.sh prettier '(graphql|js|vue)' --check",
+ "lint:prettier:staged:fix": "scripts/frontend/execute-on-staged-files.sh prettier '(graphql|js|vue)' --write",
"markdownlint": "markdownlint --config .markdownlint.json",
"postinstall": "node ./scripts/frontend/postinstall.js",
- "prettier-staged": "node ./scripts/frontend/prettier.js check",
- "prettier-staged-save": "node ./scripts/frontend/prettier.js save",
- "prettier-all": "node ./scripts/frontend/prettier.js check-all",
- "prettier-all-save": "node ./scripts/frontend/prettier.js save-all",
+ "prettier-all": "echo 'Please use lint:prettier instead' && exit 1",
+ "prettier-all-save": "echo 'Please use lint:prettier:fix instead' && exit 1",
+ "prettier-staged": "echo 'Please use lint:prettier:staged instead' && exit 1",
+ "prettier-staged-save": "echo 'Please use lint:prettier:staged:fixed instead' && exit 1",
"stylelint": "yarn stylelint-file 'app/assets/stylesheets/**/*.*' 'ee/app/assets/stylesheets/**/*.*' '!app/assets/stylesheets/startup/startup-*.scss' '!**/vendors/**'",
"stylelint-file": "BROWSERSLIST_IGNORE_OLD_DATA=true node node_modules/stylelint/bin/stylelint.js",
"stylelint-create-utility-map": "node scripts/frontend/stylelint/stylelint-utility-map.js",
@@ -45,10 +54,11 @@
"@gitlab/favicon-overlay": "2.0.0",
"@gitlab/svgs": "1.182.0",
"@gitlab/tributejs": "1.0.0",
- "@gitlab/ui": "27.4.6",
+ "@gitlab/ui": "27.7.1",
"@gitlab/visual-review-tools": "1.6.1",
"@rails/actioncable": "^6.0.3-4",
"@rails/ujs": "^6.0.3-4",
+ "@sentry/browser": "^5.22.3",
"@sourcegraph/code-host-integration": "0.0.52",
"@toast-ui/editor": "^2.5.1",
"@toast-ui/vue-editor": "^2.5.1",
@@ -155,7 +165,8 @@
},
"devDependencies": {
"@babel/plugin-transform-modules-commonjs": "^7.10.1",
- "@gitlab/eslint-plugin": "8.0.0",
+ "@gitlab/eslint-plugin": "8.1.0",
+ "@gitlab/stylelint-config": "^2.2.0",
"@testing-library/dom": "^7.16.2",
"@vue/test-utils": "1.1.2",
"acorn": "^6.3.0",
@@ -167,17 +178,17 @@
"commander": "^2.18.0",
"custom-jquery-matchers": "^2.1.0",
"docdash": "^1.0.2",
- "eslint": "7.19.0",
+ "eslint": "7.20.0",
"eslint-import-resolver-jest": "3.0.0",
"eslint-import-resolver-webpack": "0.13.0",
"eslint-plugin-jasmine": "4.1.2",
"eslint-plugin-no-jquery": "2.5.0",
"gettext-extractor": "^3.5.3",
"gettext-extractor-vue": "^5.0.0",
+ "glob": "^7.1.6",
"istanbul-lib-coverage": "^3.0.0",
"istanbul-lib-report": "^3.0.0",
"istanbul-reports": "^3.0.0",
- "glob": "^7.1.6",
"jasmine-core": "^2.9.0",
"jasmine-diff": "^0.1.3",
"jasmine-jquery": "^2.1.1",
@@ -207,9 +218,6 @@
"postcss": "^7.0.14",
"prettier": "2.2.1",
"readdir-enhanced": "^2.2.4",
- "stylelint": "^10.1.0",
- "stylelint-config-recommended": "^2.2.0",
- "stylelint-scss": "^3.9.2",
"timezone-mock": "^1.0.8",
"vue-jest": "4.0.0-rc.0",
"webpack-dev-server": "^3.11.2",
diff --git a/qa/qa.rb b/qa/qa.rb
index 1cf6d7b79f7..a1ea71c81cc 100644
--- a/qa/qa.rb
+++ b/qa/qa.rb
@@ -489,6 +489,7 @@ module QA
autoload :ProjectSelector, 'qa/page/component/project_selector'
autoload :Snippet, 'qa/page/component/snippet'
autoload :NewSnippet, 'qa/page/component/new_snippet'
+ autoload :InviteMembersModal, 'qa/page/component/invite_members_modal'
module Issuable
autoload :Common, 'qa/page/component/issuable/common'
diff --git a/qa/qa/flow/project.rb b/qa/qa/flow/project.rb
index 8a9e2c86332..db42a3a3594 100644
--- a/qa/qa/flow/project.rb
+++ b/qa/qa/flow/project.rb
@@ -5,6 +5,16 @@ module QA
module Project
module_function
+ def add_member(project:, username:)
+ project.visit!
+
+ Page::Project::Menu.perform(&:click_members)
+
+ Page::Project::Members.perform do |member_settings|
+ member_settings.add_member(username)
+ end
+ end
+
def go_to_create_project_from_template
if Page::Project::NewExperiment.perform(&:shown?)
Page::Project::NewExperiment.perform(&:click_create_from_template_link)
diff --git a/qa/qa/page/component/invite_members_modal.rb b/qa/qa/page/component/invite_members_modal.rb
new file mode 100644
index 00000000000..fbddb37f15e
--- /dev/null
+++ b/qa/qa/page/component/invite_members_modal.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+module QA
+ module Page
+ module Component
+ module InviteMembersModal
+ extend QA::Page::PageConcern
+
+ def self.included(base)
+ super
+
+ base.view 'app/assets/javascripts/invite_members/components/invite_members_modal.vue' do
+ element :invite_button
+ element :access_level_dropdown
+ element :invite_members_modal_content
+ end
+
+ base.view 'app/assets/javascripts/invite_members/components/group_select.vue' do
+ element :group_select_dropdown_search_field
+ end
+
+ base.view 'app/assets/javascripts/invite_members/components/invite_group_trigger.vue' do
+ element :invite_a_group_button
+ end
+
+ base.view 'app/assets/javascripts/invite_members/components/invite_members_trigger.vue' do
+ element :invite_members_button
+ end
+ end
+
+ def open_invite_members_modal
+ click_element :invite_members_button
+ end
+
+ def open_invite_group_modal
+ click_element :invite_a_group_button
+ end
+
+ def add_member(username, access_level = Resource::Members::AccessLevel::DEVELOPER)
+ open_invite_members_modal
+
+ within_element(:invite_members_modal_content) do
+ fill_element :access_level_dropdown, with: access_level
+
+ fill_in 'Search for members to invite', with: username
+
+ Support::WaitForRequests.wait_for_requests
+
+ click_button username
+
+ click_element :invite_button
+ end
+
+ Support::WaitForRequests.wait_for_requests
+
+ page.refresh
+ end
+
+ def invite_group(group_name, group_access = Resource::Members::AccessLevel::GUEST)
+ open_invite_group_modal
+
+ fill_element :access_level_dropdown, with: group_access
+
+ click_button 'Select a group'
+ fill_element :group_select_dropdown_search_field, group_name
+
+ Support::WaitForRequests.wait_for_requests
+
+ click_button group_name
+
+ click_element :invite_button
+
+ Support::WaitForRequests.wait_for_requests
+
+ page.refresh
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/page/component/issue_board/show.rb b/qa/qa/page/component/issue_board/show.rb
index 4c1f03fbe86..d7dfb0757bc 100644
--- a/qa/qa/page/component/issue_board/show.rb
+++ b/qa/qa/page/component/issue_board/show.rb
@@ -43,6 +43,10 @@ module QA
element :focus_mode_button
end
+ view 'app/assets/javascripts/boards/components/config_toggle.vue' do
+ element :boards_config_button
+ end
+
# The `focused_board` method does not use `find_element` with an element defined
# with the attribute `data-qa-selector` since such element is not unique when the
# `is-focused` class is not set, and it was not possible to find a better solution.
@@ -82,6 +86,10 @@ module QA
end
end
+ def click_boards_config_button
+ click_element(:boards_config_button)
+ end
+
def click_boards_dropdown_button
# The dropdown button comes from the `GlDropdown` component of `@gitlab/ui`,
# so it wasn't possible to add a `data-qa-selector` to it.
diff --git a/qa/qa/page/group/members.rb b/qa/qa/page/group/members.rb
index 87423ae9d75..68a169d5a7f 100644
--- a/qa/qa/page/group/members.rb
+++ b/qa/qa/page/group/members.rb
@@ -4,18 +4,13 @@ module QA
module Page
module Group
class Members < Page::Base
- include QA::Page::Component::Select2
+ include Page::Component::InviteMembersModal
include Page::Component::UsersSelect
view 'app/assets/javascripts/vue_shared/components/remove_member_modal.vue' do
element :remove_member_modal_content
end
- view 'app/views/shared/members/_invite_member.html.haml' do
- element :member_select_field
- element :invite_member_button
- end
-
view 'app/assets/javascripts/pages/groups/group_members/index.js' do
element :member_row
element :groups_list
@@ -32,31 +27,9 @@ module QA
end
view 'app/views/groups/group_members/index.html.haml' do
- element :invite_group_tab
element :groups_list_tab
end
- view 'app/views/shared/members/_invite_group.html.haml' do
- element :group_select_field
- element :invite_group_button
- end
-
- def select_group(group_name)
- click_element :group_select_field
- search_and_select(group_name)
- end
-
- def invite_group(group_name)
- click_element :invite_group_tab
- select_group(group_name)
- click_element :invite_group_button
- end
-
- def add_member(username)
- select_user :member_select_field, username
- click_element :invite_member_button
- end
-
def update_access_level(username, access_level)
within_element(:member_row, text: username) do
click_element :access_level_dropdown
diff --git a/qa/qa/page/merge_request/show.rb b/qa/qa/page/merge_request/show.rb
index 18676807fd6..1a25c9349da 100644
--- a/qa/qa/page/merge_request/show.rb
+++ b/qa/qa/page/merge_request/show.rb
@@ -224,8 +224,7 @@ module QA
end
def merge!
- wait_until_ready_to_merge
- click_element(:merge_button)
+ try_to_merge!
finished_loading?
raise "Merge did not appear to be successful" unless merged?
@@ -237,7 +236,11 @@ module QA
end
def merged?
- has_element?(:merged_status_content, text: 'The changes were merged into', wait: 60)
+ # Revisit after merge page re-architect is done https://gitlab.com/gitlab-org/gitlab/-/issues/300042
+ # To remove page refresh logic if possible
+ retry_until(max_attempts: 3, reload: true) do
+ has_element?(:merged_status_content, text: 'The changes were merged into', wait: 20)
+ end
end
# Check if the MR is able to be merged
@@ -280,7 +283,10 @@ module QA
end
def try_to_merge!
+ # Revisit after merge page re-architect is done https://gitlab.com/gitlab-org/gitlab/-/issues/300042
+ # To remove page refresh logic if possible
wait_until_ready_to_merge
+ wait_until { !find_element(:merge_button).has_text?("when pipeline succeeds") }
click_element(:merge_button)
end
diff --git a/qa/qa/page/project/members.rb b/qa/qa/page/project/members.rb
index 7e722e02ad0..09264d95aed 100644
--- a/qa/qa/page/project/members.rb
+++ b/qa/qa/page/project/members.rb
@@ -4,21 +4,18 @@ module QA
module Page
module Project
class Members < Page::Base
- include QA::Page::Component::Select2
-
- view 'app/views/shared/members/_invite_member.html.haml' do
- element :member_select_field
- element :invite_member_button
- end
+ include QA::Page::Component::InviteMembersModal
view 'app/views/projects/project_members/index.html.haml' do
- element :invite_group_tab
element :groups_list_tab
end
- view 'app/views/shared/members/_invite_group.html.haml' do
- element :group_select_field
- element :invite_group_button
+ view 'app/assets/javascripts/invite_members/components/invite_group_trigger.vue' do
+ element :invite_a_group_button
+ end
+
+ view 'app/assets/javascripts/invite_members/components/invite_members_trigger.vue' do
+ element :invite_members_button
end
view 'app/assets/javascripts/pages/projects/project_members/index.js' do
@@ -33,25 +30,7 @@ module QA
element :remove_group_link_modal_content
end
- def select_group(group_name)
- click_element :group_select_field
- search_and_select(group_name)
- end
-
- def invite_group(group_name)
- click_element :invite_group_tab
- select_group(group_name)
- click_element :invite_group_button
- end
-
- def add_member(username)
- click_element :member_select_field
- search_and_select username
- click_element :invite_member_button
- end
-
def remove_group(group_name)
- click_element :invite_group_tab
click_element :groups_list_tab
within_element(:group_row, text: group_name) do
diff --git a/qa/qa/page/project/settings/main.rb b/qa/qa/page/project/settings/main.rb
index 4db66543a25..48af635bb79 100644
--- a/qa/qa/page/project/settings/main.rb
+++ b/qa/qa/page/project/settings/main.rb
@@ -11,8 +11,9 @@ module QA
include Component::Breadcrumbs
view 'app/views/projects/edit.html.haml' do
- element :advanced_settings
- element :merge_request_settings
+ element :advanced_settings_content
+ element :merge_request_settings_content
+ element :visibility_features_permissions_content
end
view 'app/views/projects/settings/_general.html.haml' do
@@ -20,10 +21,6 @@ module QA
element :save_naming_topics_avatar_button
end
- view 'app/views/projects/edit.html.haml' do
- element :visibility_features_permissions_content
- end
-
def rename_project_to(name)
fill_project_name(name)
click_save_changes
@@ -38,13 +35,13 @@ module QA
end
def expand_advanced_settings(&block)
- expand_content(:advanced_settings) do
+ expand_content(:advanced_settings_content) do
Advanced.perform(&block)
end
end
def expand_merge_requests_settings(&block)
- expand_content(:merge_request_settings) do
+ expand_content(:merge_request_settings_content) do
MergeRequest.perform(&block)
end
end
diff --git a/qa/qa/page/project/settings/merge_request.rb b/qa/qa/page/project/settings/merge_request.rb
index ec8d73df1b3..34754124931 100644
--- a/qa/qa/page/project/settings/merge_request.rb
+++ b/qa/qa/page/project/settings/merge_request.rb
@@ -8,11 +8,11 @@ module QA
include QA::Page::Settings::Common
view 'app/views/projects/edit.html.haml' do
- element :save_merge_request_changes
+ element :save_merge_request_changes_button
end
view 'app/views/projects/_merge_request_merge_method_settings.html.haml' do
- element :radio_button_merge_ff
+ element :merge_ff_radio_button
end
view 'app/views/projects/_merge_request_merge_checks_settings.html.haml' do
@@ -20,11 +20,11 @@ module QA
end
def click_save_changes
- click_element :save_merge_request_changes
+ click_element :save_merge_request_changes_button
end
def enable_ff_only
- click_element :radio_button_merge_ff
+ click_element :merge_ff_radio_button
click_save_changes
end
diff --git a/qa/qa/page/project/settings/services/jira.rb b/qa/qa/page/project/settings/services/jira.rb
index eaa3e90db78..a9409d0223a 100644
--- a/qa/qa/page/project/settings/services/jira.rb
+++ b/qa/qa/page/project/settings/services/jira.rb
@@ -10,7 +10,12 @@ module QA
element :service_url_field, ':data-qa-selector="`${fieldId}_field`"' # rubocop:disable QA/ElementWithPattern
element :service_username_field, ':data-qa-selector="`${fieldId}_field`"' # rubocop:disable QA/ElementWithPattern
element :service_password_field, ':data-qa-selector="`${fieldId}_field`"' # rubocop:disable QA/ElementWithPattern
- element :service_jira_issue_transition_id_field, ':data-qa-selector="`${fieldId}_field`"' # rubocop:disable QA/ElementWithPattern
+ end
+
+ view 'app/assets/javascripts/integrations/edit/components/jira_trigger_fields.vue' do
+ element :service_issue_transition_mode_auto, ':data-qa-selector="`service_issue_transition_mode_${issueTransitionOption.value}`"' # rubocop:disable QA/ElementWithPattern
+ element :service_issue_transition_mode_custom, ':data-qa-selector="`service_issue_transition_mode_${issueTransitionOption.value}`"' # rubocop:disable QA/ElementWithPattern
+ element :service_jira_issue_transition_id_field
end
view 'app/assets/javascripts/integrations/edit/components/integration_form.vue' do
@@ -23,7 +28,9 @@ module QA
set_jira_server_url(url)
set_username(Runtime::Env.jira_admin_username)
set_password(Runtime::Env.jira_admin_password)
- set_transaction_ids('11,21,31,41')
+
+ use_custom_transitions
+ set_transition_ids('11,21,31,41')
click_save_changes_button
wait_until(reload: false) do
@@ -45,8 +52,16 @@ module QA
fill_element(:service_password_field, password)
end
- def set_transaction_ids(transaction_ids)
- fill_element(:service_jira_issue_transition_id_field, transaction_ids)
+ def use_automatic_transitions
+ click_element :service_issue_transition_mode_auto
+ end
+
+ def use_custom_transitions
+ click_element :service_issue_transition_mode_custom
+ end
+
+ def set_transition_ids(transition_ids)
+ fill_element(:service_jira_issue_transition_id_field, transition_ids)
end
def click_save_changes_button
diff --git a/qa/qa/resource/members.rb b/qa/qa/resource/members.rb
index a88980f26d8..c8f9feeca15 100644
--- a/qa/qa/resource/members.rb
+++ b/qa/qa/resource/members.rb
@@ -26,10 +26,23 @@ module QA
JSON.parse(get(Runtime::API::Request.new(api_client, api_members_path).url).body)
end
+ def invite_group(group, access_level = AccessLevel::GUEST)
+ Support::Retrier.retry_until do
+ QA::Runtime::Logger.debug(%Q[Sharing #{self.class.name} with #{group.name}])
+
+ response = post Runtime::API::Request.new(api_client, api_share_path).url, { group_id: group.id, group_access: access_level }
+ response.code == QA::Support::Api::HTTP_STATUS_CREATED
+ end
+ end
+
def api_members_path
"#{api_get_path}/members"
end
+ def api_share_path
+ "#{api_get_path}/share"
+ end
+
class AccessLevel
NO_ACCESS = 0
MINIMAL_ACCESS = 5
diff --git a/qa/qa/resource/merge_request.rb b/qa/qa/resource/merge_request.rb
index fd5f454f134..869be06c542 100644
--- a/qa/qa/resource/merge_request.rb
+++ b/qa/qa/resource/merge_request.rb
@@ -75,7 +75,7 @@ module QA
Page::MergeRequest::New.perform do |new_page|
new_page.fill_title(@title)
new_page.choose_template(@template) if @template
- new_page.fill_description(@description) unless @template
+ new_page.fill_description(@description) if @description && !@template
new_page.choose_milestone(@milestone) if @milestone
new_page.assign_to_me if @assignee == 'me'
labels.each do |label|
diff --git a/qa/qa/resource/personal_access_token.rb b/qa/qa/resource/personal_access_token.rb
index 6b2301ba916..463e780f89b 100644
--- a/qa/qa/resource/personal_access_token.rb
+++ b/qa/qa/resource/personal_access_token.rb
@@ -22,7 +22,7 @@ module QA
token_page.fill_token_name(name || 'api-test-token')
token_page.check_api
# Expire in 2 days just in case the token is created just before midnight
- token_page.fill_expiry_date(Date.today + 2)
+ token_page.fill_expiry_date(Time.now.utc.to_date + 2)
token_page.click_create_token_button
end
end
diff --git a/qa/qa/resource/project.rb b/qa/qa/resource/project.rb
index efb6c2c0591..28d0844e71c 100644
--- a/qa/qa/resource/project.rb
+++ b/qa/qa/resource/project.rb
@@ -272,10 +272,6 @@ module QA
parse_body(get(Runtime::API::Request.new(api_client, api_pipelines_path).url))
end
- def share_with_group(invitee, access_level = Resource::Members::AccessLevel::DEVELOPER)
- post Runtime::API::Request.new(api_client, "/projects/#{id}/share").url, { group_id: invitee.id, group_access: access_level }
- end
-
private
def transform_api_resource(api_resource)
diff --git a/qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb
index 5f38907f89f..7ab5ffdf014 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb
@@ -44,8 +44,7 @@ module QA
end
it 'user transfers a project between groups',
- testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/406',
- quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/283925', type: :investigating, only: :production } do
+ testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1703' do
# Retry is needed here as the target group is not avaliable for transfer right away.
QA::Support::Retrier.retry_on_exception(reload_page: page) do
Page::File::Show.perform(&:go_to_general_settings)
diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb
index e38a9f47bd6..8e03444b113 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb
@@ -29,6 +29,7 @@ module QA
end
before do
+ Runtime::Feature.enable(:invite_members_group_modal, group: group)
group.add_member(developer_user, Resource::Members::AccessLevel::DEVELOPER)
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb
index 2fc3ff2f18f..a8650d633c8 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb
@@ -31,6 +31,7 @@ module QA
let(:two_fa_expected_text) { /The group settings for.*require you to enable Two-Factor Authentication for your account.*You need to do this before/ }
before do
+ Runtime::Feature.enable(:invite_members_group_modal, group: group)
group.add_member(developer_user, Resource::Members::AccessLevel::DEVELOPER)
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb
index 85cfefd6c5c..728df77a266 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb
@@ -6,7 +6,6 @@ module QA
before do
Runtime::Feature.enable('vue_project_members_list')
end
-
after do
Runtime::Feature.disable('vue_project_members_list')
end
@@ -16,9 +15,13 @@ module QA
user = Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1)
- Resource::Project.fabricate_via_api! do |project|
+ project = Resource::Project.fabricate_via_api! do |project|
project.name = 'add-member-project'
- end.visit!
+ end
+
+ Runtime::Feature.enable(:invite_members_group_modal)
+
+ project.visit!
Page::Project::Menu.perform(&:click_members)
Page::Project::Members.perform do |members|
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb
index d54ce0ac0fc..c8c483fc2aa 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb
@@ -21,6 +21,7 @@ module QA
end
before do
+ Runtime::Feature.enable(:invite_members_group_modal, group: group)
group.add_member(user, Resource::Members::AccessLevel::MAINTAINER)
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb
index e40dde64675..600ce36d1e4 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb
@@ -10,6 +10,10 @@ module QA
end
end
+ before do
+ Runtime::Feature.enable(:invite_members_group_modal, project: project)
+ end
+
let(:developer_user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) }
let(:maintainer_user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2) }
let(:tag_name) { 'v0.0.1' }
diff --git a/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb
index f623efe5a3a..7c15937ef5e 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb
@@ -17,6 +17,7 @@ module QA
before do
Runtime::Feature.enable('vue_project_members_list', project: project)
+ Runtime::Feature.enable(:invite_members_group_modal)
Flow::Login.sign_in
end
diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb
index a7f862e8911..9129584d110 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb
@@ -18,6 +18,8 @@ module QA
describe 'check xss occurence in @mentions in issues', :requires_admin do
before do
+ Runtime::Feature.enable(:invite_members_group_modal)
+
Flow::Login.sign_in
project.add_member(user)
diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb
index cc815fd0e67..2ce8c749e43 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb
@@ -13,6 +13,7 @@ module QA
before do
Flow::Login.sign_in
+ Runtime::Feature.enable(:invite_members_group_modal, project: project)
project.add_member(user)
diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb
index 11f93d6a97e..2654531bc2c 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb
@@ -14,6 +14,7 @@ module QA
before do
Runtime::Feature.enable('real_time_issue_sidebar', project: project)
Runtime::Feature.enable('broadcast_issue_updates', project: project)
+ Runtime::Feature.enable(:invite_members_group_modal, project: project)
Flow::Login.sign_in
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb
index d2ba97400e6..8d12042bd85 100644
--- a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb
@@ -9,7 +9,7 @@ module QA
end
end
- it 'can merge feature branch fork to mainline', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/928' do
+ it 'can merge feature branch fork to mainline', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1701' do
Flow::Login.while_signed_in do
merge_request.visit!
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb
index 7a727ffb291..0f6edca654b 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb
@@ -19,6 +19,7 @@ module QA
end
before do
+ Runtime::Feature.enable(:invite_members_group_modal, project: parent_project)
parent_project.add_member(user)
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb
index cf14017b7f1..0857ae05167 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb
@@ -3,7 +3,7 @@
module QA
RSpec.describe 'Create' do
describe 'Git push over HTTP', :ldap_no_tls do
- it 'user pushes code to the repository', :smoke, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/426' do
+ it 'user pushes code to the repository', :smoke, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1702' do
Flow::Login.sign_in
Resource::Repository::ProjectPush.fabricate! do |push|
diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb
index b74f27389a0..ddbc98c4a1a 100644
--- a/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb
@@ -3,7 +3,7 @@
module QA
RSpec.describe 'Create', :smoke do
describe 'Personal snippet creation' do
- it 'user creates a personal snippet', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/840' do
+ it 'user creates a personal snippet', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1704' do
Flow::Login.sign_in
Page::Main::Menu.perform do |menu|
diff --git a/qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb
index fa88ace1556..0b1b6e649a1 100644
--- a/qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Package', :orchestrated, :packages do
- describe 'NPM registry' do
+ describe 'npm registry' do
include Runtime::Fixtures
let(:registry_scope) { project.group.sandbox.path }
@@ -31,7 +31,7 @@ module QA
{
"name": "#{package_name}",
"version": "1.0.0",
- "description": "Example package for GitLab NPM registry",
+ "description": "Example package for GitLab npm registry",
"publishConfig": {
"@#{registry_scope}:registry": "#{gitlab_address_with_port}/api/v4/projects/#{project.id}/packages/npm/"
}
diff --git a/qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb
index 8c3f0930207..0072b6dbf01 100644
--- a/qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb
@@ -54,7 +54,7 @@ module QA
{
file_path: '.gitlab-ci.yml',
content: <<~YAML
- image: mcr.microsoft.com/dotnet/core/sdk:3.1
+ image: mcr.microsoft.com/dotnet/sdk:5.0
stages:
- deploy
@@ -102,7 +102,7 @@ module QA
<PropertyGroup>
<OutputType>Exe</OutputType>
- <TargetFramework>netcoreapp3.1</TargetFramework>
+ <TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
</Project>
@@ -115,7 +115,7 @@ module QA
{
file_path: '.gitlab-ci.yml',
content: <<~YAML
- image: mcr.microsoft.com/dotnet/core/sdk:3.1
+ image: mcr.microsoft.com/dotnet/sdk:5.0
stages:
- install
diff --git a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb
index 171a4776eaf..6bbc3c8c479 100644
--- a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb
+++ b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb
@@ -24,8 +24,6 @@ module QA
end
it 'runs auto devops', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/702' do
- skip('Test requires tunnel: see https://gitlab.com/gitlab-org/gitlab/-/issues/251090')
-
Flow::Login.sign_in
# Set an application secret CI variable (prefixed with K8S_SECRET_)
diff --git a/rubocop/cop/migration/add_columns_to_wide_tables.rb b/rubocop/cop/migration/add_columns_to_wide_tables.rb
index 2880783dc3e..41056379515 100644
--- a/rubocop/cop/migration/add_columns_to_wide_tables.rb
+++ b/rubocop/cop/migration/add_columns_to_wide_tables.rb
@@ -9,8 +9,8 @@ module RuboCop
class AddColumnsToWideTables < RuboCop::Cop::Cop
include MigrationHelpers
- MSG = '`%s` is a wide table with several columns, addig more should be avoided unless absolutely necessary.' \
- ' Consider storing the column in a different table or creating a new one.'.freeze
+ MSG = '`%s` is a wide table with several columns, adding more should be avoided unless absolutely necessary.' \
+ ' Consider storing the column in a different table or creating a new one.'
BLACKLISTED_METHODS = %i[
add_column
diff --git a/rubocop/cop/migration/with_lock_retries_disallowed_method.rb b/rubocop/cop/migration/with_lock_retries_disallowed_method.rb
index aef19517a9d..f423bde8343 100644
--- a/rubocop/cop/migration/with_lock_retries_disallowed_method.rb
+++ b/rubocop/cop/migration/with_lock_retries_disallowed_method.rb
@@ -21,6 +21,7 @@ module RuboCop
change_column_null
remove_foreign_key_if_exists
remove_foreign_key_without_error
+ rename_index
table_exists?
index_exists_by_name?
foreign_key_exists?
diff --git a/rubocop/rubocop-migrations.yml b/rubocop/rubocop-migrations.yml
index 45f8270b34d..c1ad3cc8abb 100644
--- a/rubocop/rubocop-migrations.yml
+++ b/rubocop/rubocop-migrations.yml
@@ -27,6 +27,7 @@ Migration/UpdateLargeTable:
- :project_ci_cd_settings
- :project_settings
- :project_features
+ - :protected_branches
- :push_event_payloads
- :resource_label_events
- :routes
diff --git a/scripts/frontend/execute-on-staged-files.sh b/scripts/frontend/execute-on-staged-files.sh
new file mode 100755
index 00000000000..f218926f098
--- /dev/null
+++ b/scripts/frontend/execute-on-staged-files.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+set -euo pipefail
+IFS=$'\n\t'
+
+# The yarn run command we'd like to run
+command="$1"
+# The file types we'd like to target, use something like '(js|vue)'
+file_types="$2"
+
+# Removing first two arguments
+shift
+shift
+
+# Read all staged non-deleted files into an array
+staged_files=()
+while IFS= read -r line; do
+ staged_files+=( "$line" )
+done < <( git diff --diff-filter=d --cached --name-only | { grep -E ".$file_types$" || true; })
+
+if [ "${#staged_files[@]}" == "0" ]; then
+ echo "No staged '$file_types' files"
+else
+ echo "Running $command on ${#staged_files[@]} staged '$file_types' files"
+ yarn run "$command" "$@" "${staged_files[@]}"
+fi
diff --git a/scripts/frontend/frontend_script_utils.js b/scripts/frontend/frontend_script_utils.js
deleted file mode 100644
index 43016dce6a4..00000000000
--- a/scripts/frontend/frontend_script_utils.js
+++ /dev/null
@@ -1,20 +0,0 @@
-const execFileSync = require('child_process').execFileSync;
-
-const exec = (command, args) => {
- const options = {
- cwd: process.cwd(),
- env: process.env,
- encoding: 'utf-8',
- };
- return execFileSync(command, args, options);
-};
-
-const execGitCmd = (args) => exec('git', args).trim().toString().split('\n').filter(Boolean);
-
-module.exports = {
- getStagedFiles: (fileExtensionFilter) => {
- const gitOptions = ['diff', '--name-only', '--cached', '--diff-filter=ACMRTUB'];
- if (fileExtensionFilter) gitOptions.push(...fileExtensionFilter);
- return execGitCmd(gitOptions);
- },
-};
diff --git a/scripts/frontend/prettier.js b/scripts/frontend/prettier.js
deleted file mode 100644
index f721e46f36b..00000000000
--- a/scripts/frontend/prettier.js
+++ /dev/null
@@ -1,121 +0,0 @@
-const glob = require('glob');
-const prettier = require('prettier');
-const fs = require('fs');
-const { getStagedFiles } = require('./frontend_script_utils');
-
-const matchExtensions = ['js', 'vue', 'graphql'];
-
-// This will improve glob performance by excluding certain directories.
-// The .prettierignore file will also be respected, but after the glob has executed.
-const globIgnore = ['**/node_modules/**', 'vendor/**', 'public/**', 'fixtures/**'];
-
-const readFileAsync = (file, options) =>
- new Promise((resolve, reject) => {
- fs.readFile(file, options, function (err, data) {
- if (err) reject(err);
- else resolve(data);
- });
- });
-
-const writeFileAsync = (file, data, options) =>
- new Promise((resolve, reject) => {
- fs.writeFile(file, data, options, function (err) {
- if (err) reject(err);
- else resolve();
- });
- });
-
-const mode = process.argv[2] || 'check';
-const shouldSave = mode === 'save' || mode === 'save-all';
-const allFiles = mode === 'check-all' || mode === 'save-all';
-let globDir = process.argv[3] || '';
-if (globDir && globDir.charAt(globDir.length - 1) !== '/') globDir += '/';
-
-console.log(
- `Loading all ${allFiles ? '' : 'staged '}files ${globDir ? `within ${globDir} ` : ''}...`,
-);
-
-const globPatterns = matchExtensions.map((ext) => `${globDir}**/*.${ext}`);
-const matchedFiles = allFiles
- ? glob.sync(`{${globPatterns.join(',')}}`, { ignore: globIgnore })
- : getStagedFiles(globPatterns);
-const matchedCount = matchedFiles.length;
-
-if (!matchedCount) {
- console.log('No files found to process with prettier');
- process.exit(0);
-}
-
-let didWarn = false;
-let passedCount = 0;
-let failedCount = 0;
-let ignoredCount = 0;
-
-console.log(`${shouldSave ? 'Updating' : 'Checking'} ${matchedCount} file(s)`);
-
-const fixCommand = `yarn prettier-${allFiles ? 'all' : 'staged'}-save`;
-const warningMessage = `
-===============================
-GitLab uses Prettier to format all JavaScript code.
-Please format each file listed below or run "${fixCommand}"
-===============================
-`;
-
-const checkFileWithOptions = (filePath, options) =>
- readFileAsync(filePath, 'utf8').then((input) => {
- if (shouldSave) {
- const output = prettier.format(input, options);
- if (input === output) {
- passedCount += 1;
- } else {
- return writeFileAsync(filePath, output, 'utf8').then(() => {
- console.log(`Prettified : ${filePath}`);
- failedCount += 1;
- });
- }
- } else {
- if (prettier.check(input, options)) {
- passedCount += 1;
- } else {
- if (!didWarn) {
- // \x1b[31m make text red
- // \x1b[1m make text bold
- // %s warningMessage
- // \x1b[0m reset text color (so logs after aren't red)
- const redBoldText = '\x1b[1m\x1b[31;1m%s\x1b[0m';
- console.log(redBoldText, warningMessage);
- didWarn = true;
- }
- console.log(`yarn prettier --write ${filePath}`);
- failedCount += 1;
- }
- }
- });
-
-const checkFileWithPrettierConfig = (filePath) =>
- prettier
- .getFileInfo(filePath, { ignorePath: '.prettierignore' })
- .then(({ ignored, inferredParser }) => {
- if (ignored || !inferredParser) {
- ignoredCount += 1;
- return;
- }
- return prettier.resolveConfig(filePath).then((fileOptions) => {
- const options = { ...fileOptions, parser: inferredParser };
- return checkFileWithOptions(filePath, options);
- });
- });
-
-Promise.all(matchedFiles.map(checkFileWithPrettierConfig))
- .then(() => {
- const failAction = shouldSave ? 'fixed' : 'failed';
- console.log(
- `\nSummary:\n ${matchedCount} files processed (${passedCount} passed, ${failedCount} ${failAction}, ${ignoredCount} ignored)\n`,
- );
-
- if (didWarn) process.exit(1);
- })
- .catch((e) => {
- console.log(`\nAn error occurred while processing files with prettier: ${e.message}\n`);
- process.exit(1);
- });
diff --git a/scripts/static-analysis b/scripts/static-analysis
index febfdbd1da4..11b460e7c1b 100755
--- a/scripts/static-analysis
+++ b/scripts/static-analysis
@@ -25,11 +25,10 @@ class StaticAnalysis
# Most of the time, RuboCop finishes in 30 seconds, but sometimes it can take around 1200 seconds so we set a
# duration of 300 to lower the likelihood that it will run in the same job as another long task...
%w[bundle exec rubocop --parallel] => 300,
- %w[yarn run eslint] => 197,
- %w[yarn run prettier-all] => 124,
+ %w[yarn run lint:eslint] => 197,
+ %w[yarn run lint:prettier] => 124,
%w[bin/rake gettext:lint] => 96,
%w[bundle exec license_finder] => 49,
- %w[bin/rake scss_lint] => 38,
%w[bin/rake lint:static_verification] => 22,
%w[bin/rake gitlab:sidekiq:all_queues_yml:check] => 13,
(Gitlab.ee? ? %w[bin/rake gitlab:sidekiq:sidekiq_queues_yml:check] : nil) => 13,
diff --git a/scripts/validate_migration_schema b/scripts/validate_migration_schema
index 95a9ae9f93f..0b909f7ac77 100755
--- a/scripts/validate_migration_schema
+++ b/scripts/validate_migration_schema
@@ -27,7 +27,7 @@ class MigrationSchemaValidator
private
def validate_schema_on_rollback!
- committed_migrations.each do |filename|
+ committed_migrations.reverse_each do |filename|
version = find_migration_version(filename)
run("bin/rails db:migrate:down VERSION=#{version}")
diff --git a/spec/controllers/admin/instance_statistics_controller_spec.rb b/spec/controllers/admin/usage_trends_controller_spec.rb
index c589e46857f..35fb005aacb 100644
--- a/spec/controllers/admin/instance_statistics_controller_spec.rb
+++ b/spec/controllers/admin/usage_trends_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Admin::InstanceStatisticsController do
+RSpec.describe Admin::UsageTrendsController do
let(:admin) { create(:user, :admin) }
before do
diff --git a/spec/controllers/projects/blob_controller_spec.rb b/spec/controllers/projects/blob_controller_spec.rb
index 68551ce4858..c9a76049e19 100644
--- a/spec/controllers/projects/blob_controller_spec.rb
+++ b/spec/controllers/projects/blob_controller_spec.rb
@@ -20,8 +20,8 @@ RSpec.describe Projects::BlobController do
project.add_maintainer(user)
sign_in(user)
- stub_experiment(ci_syntax_templates: experiment_active)
- stub_experiment_for_subject(ci_syntax_templates: in_experiment_group)
+ stub_experiment(ci_syntax_templates_b: experiment_active)
+ stub_experiment_for_subject(ci_syntax_templates_b: in_experiment_group)
end
context 'when the experiment is not active' do
@@ -35,48 +35,62 @@ RSpec.describe Projects::BlobController do
end
end
- context 'when the experiment is active and the user is in the control group' do
+ context 'when the experiment is active' do
let(:experiment_active) { true }
- let(:in_experiment_group) { false }
-
- it 'records the experiment user in the control group' do
- expect(Experiment).to receive(:add_user)
- .with(:ci_syntax_templates, :control, user, namespace_id: project.namespace_id)
- request
- end
- end
+ context 'when the user is in the control group' do
+ let(:in_experiment_group) { false }
- context 'when the experiment is active and the user is in the experimental group' do
- let(:experiment_active) { true }
- let(:in_experiment_group) { true }
-
- it 'records the experiment user in the experimental group' do
- expect(Experiment).to receive(:add_user)
- .with(:ci_syntax_templates, :experimental, user, namespace_id: project.namespace_id)
+ it 'records the experiment user in the control group' do
+ expect(Experiment).to receive(:add_user)
+ .with(:ci_syntax_templates_b, :control, user, namespace_id: project.namespace_id)
- request
+ request
+ end
end
- context 'when requesting a non default config file type' do
- let(:file_name) { '.non_default_ci_config' }
- let(:project) { create(:project, :public, :repository, ci_config_path: file_name) }
+ context 'when the user is in the experimental group' do
+ let(:in_experiment_group) { true }
it 'records the experiment user in the experimental group' do
expect(Experiment).to receive(:add_user)
- .with(:ci_syntax_templates, :experimental, user, namespace_id: project.namespace_id)
+ .with(:ci_syntax_templates_b, :experimental, user, namespace_id: project.namespace_id)
request
end
- end
- context 'when requesting a different file type' do
- let(:file_name) { '.gitignore' }
+ context 'when requesting a non default config file type' do
+ let(:file_name) { '.non_default_ci_config' }
+ let(:project) { create(:project, :public, :repository, ci_config_path: file_name) }
- it 'does not record the experiment user' do
- expect(Experiment).not_to receive(:add_user)
+ it 'records the experiment user in the experimental group' do
+ expect(Experiment).to receive(:add_user)
+ .with(:ci_syntax_templates_b, :experimental, user, namespace_id: project.namespace_id)
- request
+ request
+ end
+ end
+
+ context 'when requesting a different file type' do
+ let(:file_name) { '.gitignore' }
+
+ it 'does not record the experiment user' do
+ expect(Experiment).not_to receive(:add_user)
+
+ request
+ end
+ end
+
+ context 'when the group is created longer than 90 days ago' do
+ before do
+ project.namespace.update_attribute(:created_at, 91.days.ago)
+ end
+
+ it 'does not record the experiment user' do
+ expect(Experiment).not_to receive(:add_user)
+
+ request
+ end
end
end
end
diff --git a/spec/controllers/projects/notes_controller_spec.rb b/spec/controllers/projects/notes_controller_spec.rb
index edebaf294c4..add249e2c74 100644
--- a/spec/controllers/projects/notes_controller_spec.rb
+++ b/spec/controllers/projects/notes_controller_spec.rb
@@ -150,7 +150,7 @@ RSpec.describe Projects::NotesController do
end
it 'returns an empty page of notes' do
- expect(Gitlab::EtagCaching::Middleware).to receive(:skip!)
+ expect(Gitlab::EtagCaching::Middleware).not_to receive(:skip!)
request.headers['X-Last-Fetched-At'] = microseconds(Time.zone.now)
@@ -169,8 +169,6 @@ RSpec.describe Projects::NotesController do
end
it 'returns all notes' do
- expect(Gitlab::EtagCaching::Middleware).to receive(:skip!)
-
get :index, params: request_params
expect(json_response['notes'].count).to eq((page_1 + page_2 + page_3).size + 1)
@@ -764,49 +762,9 @@ RSpec.describe Projects::NotesController do
end
end
- context 'when the endpoint receives requests above the limit' do
- before do
- stub_application_setting(notes_create_limit: 3)
- end
-
- it 'prevents from creating more notes', :request_store do
- 3.times { create! }
-
- expect { create! }
- .to change { Gitlab::GitalyClient.get_request_count }.by(0)
-
- create!
- expect(response.body).to eq(_('This endpoint has been requested too many times. Try again later.'))
- expect(response).to have_gitlab_http_status(:too_many_requests)
- end
-
- it 'logs the event in auth.log' do
- attributes = {
- message: 'Application_Rate_Limiter_Request',
- env: :notes_create_request_limit,
- remote_ip: '0.0.0.0',
- request_method: 'POST',
- path: "/#{project.full_path}/notes",
- user_id: user.id,
- username: user.username
- }
-
- expect(Gitlab::AuthLogger).to receive(:error).with(attributes).once
-
- project.add_developer(user)
- sign_in(user)
-
- 4.times { create! }
- end
-
- it 'allows user in allow-list to create notes, even if the case is different' do
- user.update_attribute(:username, user.username.titleize)
- stub_application_setting(notes_create_limit_allowlist: ["#{user.username.downcase}"])
- 3.times { create! }
-
- create!
- expect(response).to have_gitlab_http_status(:found)
- end
+ it_behaves_like 'request exceeding rate limit', :clean_gitlab_redis_cache do
+ let(:params) { request_params.except(:format) }
+ let(:request_full_path) { project_notes_path(project) }
end
end
diff --git a/spec/controllers/projects/snippets_controller_spec.rb b/spec/controllers/projects/snippets_controller_spec.rb
index f9221c5a4ef..793ffbbfad9 100644
--- a/spec/controllers/projects/snippets_controller_spec.rb
+++ b/spec/controllers/projects/snippets_controller_spec.rb
@@ -207,14 +207,14 @@ RSpec.describe Projects::SnippetsController do
subject
expect(assigns(:snippet)).to eq(project_snippet)
- expect(assigns(:blobs)).to eq(project_snippet.blobs)
+ expect(assigns(:blobs).map(&:name)).to eq(project_snippet.blobs.map(&:name))
expect(response).to have_gitlab_http_status(:ok)
end
it 'does not show the blobs expanded by default' do
subject
- expect(project_snippet.blobs.map(&:expanded?)).to be_all(false)
+ expect(assigns(:blobs).map(&:expanded?)).to be_all(false)
end
context 'when param expanded is set' do
@@ -223,7 +223,7 @@ RSpec.describe Projects::SnippetsController do
it 'shows all blobs expanded' do
subject
- expect(project_snippet.blobs.map(&:expanded?)).to be_all(true)
+ expect(assigns(:blobs).map(&:expanded?)).to be_all(true)
end
end
end
diff --git a/spec/controllers/projects/templates_controller_spec.rb b/spec/controllers/projects/templates_controller_spec.rb
index fe282baf769..bd299efb5b5 100644
--- a/spec/controllers/projects/templates_controller_spec.rb
+++ b/spec/controllers/projects/templates_controller_spec.rb
@@ -160,13 +160,28 @@ RSpec.describe Projects::TemplatesController do
end
shared_examples 'template names request' do
- it 'returns the template names' do
- get(:names, params: { namespace_id: project.namespace, template_type: template_type, project_id: project }, format: :json)
+ context 'when feature flag enabled' do
+ it 'returns the template names', :aggregate_failures do
+ get(:names, params: { namespace_id: project.namespace, template_type: template_type, project_id: project }, format: :json)
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response.size).to eq(2)
- expect(json_response.size).to eq(2)
- expect(json_response.map { |x| x.slice('name') }).to match(expected_template_names)
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['Project Templates'].size).to eq(2)
+ expect(json_response['Project Templates'].map { |x| x.slice('name') }).to match(expected_template_names)
+ end
+ end
+
+ context 'when feature flag disabled' do
+ before do
+ stub_feature_flags(inherited_issuable_templates: false)
+ end
+
+ it 'returns the template names', :aggregate_failures do
+ get(:names, params: { namespace_id: project.namespace, template_type: template_type, project_id: project }, format: :json)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.size).to eq(2)
+ expect(json_response.map { |x| x.slice('name') }).to match(expected_template_names)
+ end
end
it 'fails for user with no access' do
diff --git a/spec/controllers/projects/web_ide_schemas_controller_spec.rb b/spec/controllers/projects/web_ide_schemas_controller_spec.rb
index fbec941aecc..136edd2f7ad 100644
--- a/spec/controllers/projects/web_ide_schemas_controller_spec.rb
+++ b/spec/controllers/projects/web_ide_schemas_controller_spec.rb
@@ -53,13 +53,13 @@ RSpec.describe Projects::WebIdeSchemasController do
end
context 'when an error occurs parsing the schema' do
- let(:result) { { status: :error, message: 'Some error occured' } }
+ let(:result) { { status: :error, message: 'Some error occurred' } }
it 'returns 422 with the error' do
subject
expect(response).to have_gitlab_http_status(:unprocessable_entity)
- expect(response.body).to eq('{"status":"error","message":"Some error occured"}')
+ expect(response.body).to eq('{"status":"error","message":"Some error occurred"}')
end
end
end
diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb
index 1e4ec48b119..281b69af605 100644
--- a/spec/controllers/projects_controller_spec.rb
+++ b/spec/controllers/projects_controller_spec.rb
@@ -221,6 +221,20 @@ RSpec.describe ProjectsController do
allow(controller).to receive(:record_experiment_user)
end
+ context 'when user can push to default branch' do
+ let(:user) { empty_project.owner }
+
+ it 'creates an "view_project_show" experiment tracking event', :snowplow do
+ allow_next_instance_of(ApplicationExperiment) do |e|
+ allow(e).to receive(:should_track?).and_return(true)
+ end
+
+ get :show, params: { namespace_id: empty_project.namespace, id: empty_project }
+
+ expect_snowplow_event(category: 'empty_repo_upload', action: 'view_project_show', context: [{ schema: 'iglu:com.gitlab/gitlab_experiment/jsonschema/0-3-0', data: anything }])
+ end
+ end
+
User.project_views.keys.each do |project_view|
context "with #{project_view} view set" do
before do
@@ -416,7 +430,8 @@ RSpec.describe ProjectsController do
path: 'foo',
description: 'bar',
namespace_id: user.namespace.id,
- visibility_level: Gitlab::VisibilityLevel::PUBLIC
+ visibility_level: Gitlab::VisibilityLevel::PUBLIC,
+ initialize_with_readme: 1
}
end
@@ -425,9 +440,11 @@ RSpec.describe ProjectsController do
end
it 'tracks a created event for the new_project_readme experiment', :experiment do
- expect(experiment(:new_project_readme)).to track(:created, property: 'blank').on_any_instance.with_context(
- actor: user
- )
+ expect(experiment(:new_project_readme)).to track(
+ :created,
+ property: 'blank',
+ value: 1
+ ).on_any_instance.with_context(actor: user)
post :create, params: { project: project_params }
end
diff --git a/spec/controllers/root_controller_spec.rb b/spec/controllers/root_controller_spec.rb
index 85f9ea66c5f..7622f82afa7 100644
--- a/spec/controllers/root_controller_spec.rb
+++ b/spec/controllers/root_controller_spec.rb
@@ -123,11 +123,7 @@ RSpec.describe RootController do
expect(response).to render_template 'dashboard/projects/index'
end
- context 'when experiment is enabled' do
- before do
- stub_experiment_for_subject(customize_homepage: true)
- end
-
+ context 'when customize_homepage is enabled' do
it 'renders the default dashboard' do
get :index
@@ -135,9 +131,9 @@ RSpec.describe RootController do
end
end
- context 'when experiment not enabled' do
+ context 'when customize_homepage is not enabled' do
before do
- stub_experiment(customize_homepage: false)
+ stub_feature_flags(customize_homepage: false)
end
it 'renders the default dashboard' do
diff --git a/spec/controllers/snippets/notes_controller_spec.rb b/spec/controllers/snippets/notes_controller_spec.rb
index 487635169fc..558e68fbb8f 100644
--- a/spec/controllers/snippets/notes_controller_spec.rb
+++ b/spec/controllers/snippets/notes_controller_spec.rb
@@ -141,6 +141,11 @@ RSpec.describe Snippets::NotesController do
it 'creates the note' do
expect { post :create, params: request_params }.to change { Note.count }.by(1)
end
+
+ it_behaves_like 'request exceeding rate limit', :clean_gitlab_redis_cache do
+ let(:params) { request_params }
+ let(:request_full_path) { snippet_notes_path(public_snippet) }
+ end
end
context 'when a snippet is internal' do
@@ -164,6 +169,11 @@ RSpec.describe Snippets::NotesController do
it 'creates the note' do
expect { post :create, params: request_params }.to change { Note.count }.by(1)
end
+
+ it_behaves_like 'request exceeding rate limit', :clean_gitlab_redis_cache do
+ let(:params) { request_params }
+ let(:request_full_path) { snippet_notes_path(internal_snippet) }
+ end
end
context 'when a snippet is private' do
@@ -228,6 +238,12 @@ RSpec.describe Snippets::NotesController do
it 'creates the note' do
expect { post :create, params: request_params }.to change { Note.count }.by(1)
end
+
+ it_behaves_like 'request exceeding rate limit', :clean_gitlab_redis_cache do
+ let(:params) { request_params }
+ let(:request_full_path) { snippet_notes_path(private_snippet) }
+ let(:user) { private_snippet.author }
+ end
end
end
end
diff --git a/spec/factories/analytics/instance_statistics/measurement.rb b/spec/factories/analytics/usage_trends/measurement.rb
index f9398cd3061..ec80174e967 100644
--- a/spec/factories/analytics/instance_statistics/measurement.rb
+++ b/spec/factories/analytics/usage_trends/measurement.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
FactoryBot.define do
- factory :instance_statistics_measurement, class: 'Analytics::InstanceStatistics::Measurement' do
+ factory :usage_trends_measurement, class: 'Analytics::UsageTrends::Measurement' do
recorded_at { Time.now }
identifier { :projects }
count { 1_000 }
diff --git a/spec/factories/custom_emoji.rb b/spec/factories/custom_emoji.rb
index ba1ae11c18d..88e50eafa7c 100644
--- a/spec/factories/custom_emoji.rb
+++ b/spec/factories/custom_emoji.rb
@@ -6,5 +6,6 @@ FactoryBot.define do
namespace
group
file { 'https://gitlab.com/images/partyparrot.png' }
+ creator { namespace.owner }
end
end
diff --git a/spec/factories/iteration_cadences.rb b/spec/factories/iteration_cadences.rb
new file mode 100644
index 00000000000..b36f15e3dd4
--- /dev/null
+++ b/spec/factories/iteration_cadences.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ sequence(:cadence_sequential_date) do |n|
+ n.days.from_now
+ end
+
+ factory :iterations_cadence, class: 'Iterations::Cadence' do
+ title
+ group
+ start_date { generate(:cadence_sequential_date) }
+ end
+end
diff --git a/spec/factories_spec.rb b/spec/factories_spec.rb
index 38ade20de28..c381fb82ba0 100644
--- a/spec/factories_spec.rb
+++ b/spec/factories_spec.rb
@@ -5,6 +5,41 @@ require 'spec_helper'
RSpec.describe 'factories' do
include Database::DatabaseHelpers
+ def skipped_traits
+ [
+ [:alert_management_alert, :with_ended_at],
+ [:audit_event, :unauthenticated],
+ [:ci_build_trace_chunk, :fog_with_data],
+ [:ci_job_artifact, :remote_store],
+ [:ci_job_artifact, :raw],
+ [:ci_job_artifact, :gzip],
+ [:ci_job_artifact, :correct_checksum],
+ [:design_version, :empty],
+ [:environment, :non_playable],
+ [:go_module_commit, :files],
+ [:go_module_commit, :package],
+ [:go_module_version, :pseudo],
+ [:composer_cache_file, :object_storage],
+ [:debian_project_component_file, :object_storage],
+ [:debian_project_distribution, :object_storage],
+ [:debian_file_metadatum, :unknown],
+ [:package_file, :object_storage],
+ [:pages_domain, :without_certificate],
+ [:pages_domain, :without_key],
+ [:pages_domain, :with_missing_chain],
+ [:pages_domain, :with_trusted_chain],
+ [:pages_domain, :with_trusted_expired_chain],
+ [:pages_domain, :explicit_ecdsa],
+ [:project_member, :blocked],
+ [:project, :remote_mirror],
+ [:prometheus_alert_event, :none],
+ [:remote_mirror, :ssh],
+ [:self_managed_prometheus_alert_event, :resolved],
+ [:self_managed_prometheus_alert_event, :none],
+ [:user_preference, :only_comments]
+ ]
+ end
+
shared_examples 'factory' do |factory|
describe "#{factory.name} factory" do
it 'does not raise error when built' do
@@ -16,8 +51,10 @@ RSpec.describe 'factories' do
end
factory.definition.defined_traits.map(&:name).each do |trait_name|
- describe "linting #{trait_name} trait" do
- skip 'does not raise error when created' do
+ describe "linting :#{trait_name} trait" do
+ it 'does not raise error when created' do
+ pending("Trait skipped linting due to legacy error") if skipped_traits.include?([factory.name, trait_name.to_sym])
+
expect { create(factory.name, trait_name) }.not_to raise_error
end
end
@@ -29,9 +66,21 @@ RSpec.describe 'factories' do
# and reuse them in other factories.
#
# However, for some factories we cannot use FactoryDefault because the
- # associations must be unique and cannot be reused.
+ # associations must be unique and cannot be reused, or the factory default
+ # is being mutated.
skip_factory_defaults = %i[
fork_network_member
+ group_member
+ import_state
+ namespace
+ project_broken_repo
+ prometheus_alert
+ prometheus_alert_event
+ prometheus_metric
+ self_managed_prometheus_alert_event
+ users_star_project
+ wiki_page
+ wiki_page_meta
].to_set.freeze
# Some factories and their corresponding models are based on
@@ -46,9 +95,9 @@ RSpec.describe 'factories' do
.partition { |factory| skip_factory_defaults.include?(factory.name) }
context 'with factory defaults', factory_default: :keep do
- let_it_be(:namespace) { create_default(:namespace) }
- let_it_be(:project) { create_default(:project, :repository) }
- let_it_be(:user) { create_default(:user) }
+ let_it_be(:namespace) { create_default(:namespace).freeze }
+ let_it_be(:project) { create_default(:project, :repository).freeze }
+ let_it_be(:user) { create_default(:user).freeze }
before do
factories_based_on_view.each do |factory|
diff --git a/spec/features/commit_spec.rb b/spec/features/commit_spec.rb
index 02754cc803e..80a30ab01b2 100644
--- a/spec/features/commit_spec.rb
+++ b/spec/features/commit_spec.rb
@@ -35,9 +35,8 @@ RSpec.describe 'Commit' do
end
end
- context "pagination enabled" do
+ describe "pagination" do
before do
- stub_feature_flags(paginate_commit_view: true)
stub_const("Projects::CommitController::COMMIT_DIFFS_PER_PAGE", 1)
visit project_commit_path(project, commit)
@@ -61,18 +60,5 @@ RSpec.describe 'Commit' do
expect(page).to have_selector(".files ##{files[1].file_hash}")
end
end
-
- context "pagination disabled" do
- before do
- stub_feature_flags(paginate_commit_view: false)
-
- visit project_commit_path(project, commit)
- end
-
- it "shows both diffs on the page" do
- expect(page).to have_selector(".files ##{files[0].file_hash}")
- expect(page).to have_selector(".files ##{files[1].file_hash}")
- end
- end
end
end
diff --git a/spec/features/groups/members/manage_members_spec.rb b/spec/features/groups/members/manage_members_spec.rb
index c27d0afba6f..3b637a10abe 100644
--- a/spec/features/groups/members/manage_members_spec.rb
+++ b/spec/features/groups/members/manage_members_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe 'Groups > Members > Manage members' do
sign_in(user1)
end
- shared_examples 'includes the correct Invite Members link' do |should_include, should_not_include|
+ shared_examples 'includes the correct Invite link' do |should_include, should_not_include|
it 'includes either the form or the modal trigger' do
group.add_owner(user1)
@@ -31,15 +31,13 @@ RSpec.describe 'Groups > Members > Manage members' do
stub_feature_flags(invite_members_group_modal: true)
end
- it_behaves_like 'includes the correct Invite Members link', '.js-invite-members-trigger', '.invite-users-form'
+ it_behaves_like 'includes the correct Invite link', '.js-invite-members-trigger', '.invite-users-form'
+ it_behaves_like 'includes the correct Invite link', '.js-invite-group-trigger', '.invite-group-form'
end
context 'when Invite Members modal is disabled' do
- before do
- stub_feature_flags(invite_members_group_modal: false)
- end
-
- it_behaves_like 'includes the correct Invite Members link', '.invite-users-form', '.js-invite-members-trigger'
+ it_behaves_like 'includes the correct Invite link', '.invite-users-form', '.js-invite-members-trigger'
+ it_behaves_like 'includes the correct Invite link', '.invite-group-form', '.js-invite-group-trigger'
end
it 'update user to owner level', :js do
diff --git a/spec/features/groups/settings/user_searches_in_settings_spec.rb b/spec/features/groups/settings/user_searches_in_settings_spec.rb
new file mode 100644
index 00000000000..819d0c4faba
--- /dev/null
+++ b/spec/features/groups/settings/user_searches_in_settings_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'User searches group settings', :js do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, :repository, namespace: group) }
+
+ before do
+ group.add_owner(user)
+ sign_in(user)
+ end
+
+ context 'in general settings page' do
+ let(:visit_path) { edit_group_path(group) }
+
+ it_behaves_like 'can search settings with feature flag check', 'Naming', 'Permissions'
+ end
+
+ context 'in Repository page' do
+ before do
+ visit group_settings_repository_path(group)
+ end
+
+ it_behaves_like 'can search settings', 'Deploy tokens', 'Default initial branch name'
+ end
+
+ context 'in CI/CD page' do
+ before do
+ visit group_settings_ci_cd_path(group)
+ end
+
+ it_behaves_like 'can search settings', 'Variables', 'Runners'
+ end
+end
diff --git a/spec/features/issues/gfm_autocomplete_spec.rb b/spec/features/issues/gfm_autocomplete_spec.rb
index e2087868035..eb3d0f223db 100644
--- a/spec/features/issues/gfm_autocomplete_spec.rb
+++ b/spec/features/issues/gfm_autocomplete_spec.rb
@@ -994,7 +994,7 @@ RSpec.describe 'GFM autocomplete', :js do
end
def start_and_cancel_discussion
- click_button('Reply...')
+ find_field('Reply…').click
fill_in('note_note', with: 'Whoops!')
diff --git a/spec/features/merge_request/batch_comments_spec.rb b/spec/features/merge_request/batch_comments_spec.rb
index c8fc23bebf9..25f2707146d 100644
--- a/spec/features/merge_request/batch_comments_spec.rb
+++ b/spec/features/merge_request/batch_comments_spec.rb
@@ -223,7 +223,7 @@ end
def write_reply_to_discussion(button_text: 'Start a review', text: 'Line is wrong', resolve: false, unresolve: false)
page.within(first('.diff-files-holder .discussion-reply-holder')) do
- click_button('Reply...')
+ find_field('Reply…', match: :first).click
fill_in('note_note', with: text)
diff --git a/spec/features/merge_request/user_posts_diff_notes_spec.rb b/spec/features/merge_request/user_posts_diff_notes_spec.rb
index 794dfd7c8da..163ce10132e 100644
--- a/spec/features/merge_request/user_posts_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_diff_notes_spec.rb
@@ -192,7 +192,7 @@ RSpec.describe 'Merge request > User posts diff notes', :js do
it 'adds as discussion' do
should_allow_commenting(find('[id="6eb14e00385d2fb284765eb1cd8d420d33d63fc9_22_22"]'), asset_form_reset: false)
expect(page).to have_css('.notes_holder .note.note-discussion', count: 1)
- expect(page).to have_button('Reply...')
+ expect(page).to have_field('Reply…')
end
end
end
diff --git a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
index b86586d53e2..caa04059469 100644
--- a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
+++ b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
@@ -149,7 +149,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
it 'allows user to comment' do
page.within '.diff-content' do
- click_button 'Reply...'
+ find_field('Reply…').click
find(".js-unresolve-checkbox").set false
find('.js-note-text').set 'testing'
@@ -179,7 +179,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
it 'allows user to comment & unresolve thread' do
page.within '.diff-content' do
- click_button 'Reply...'
+ find_field('Reply…').click
find('.js-note-text').set 'testing'
@@ -208,7 +208,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
it 'allows user to comment & resolve thread' do
page.within '.diff-content' do
- click_button 'Reply...'
+ find_field('Reply…').click
find('.js-note-text').set 'testing'
@@ -442,7 +442,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
it 'allows user to comment & resolve thread' do
page.within '.diff-content' do
- click_button 'Reply...'
+ find_field('Reply…').click
find('.js-note-text').set 'testing'
@@ -461,7 +461,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
page.within '.diff-content' do
click_button 'Resolve thread'
- click_button 'Reply...'
+ find_field('Reply…').click
find('.js-note-text').set 'testing'
diff --git a/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb b/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
index d15d5b3bc73..90cdc28d1bd 100644
--- a/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb
@@ -37,7 +37,7 @@ RSpec.describe 'Merge request > User sees avatars on diff notes', :js do
end
it 'does not render avatars after commenting on discussion tab' do
- click_button 'Reply...'
+ find_field('Reply…').click
page.within('.js-discussion-note-form') do
find('.note-textarea').native.send_keys('Test comment')
@@ -132,7 +132,7 @@ RSpec.describe 'Merge request > User sees avatars on diff notes', :js do
end
it 'adds avatar when commenting' do
- click_button 'Reply...'
+ find_field('Reply…', match: :first).click
page.within '.js-discussion-note-form' do
find('.js-note-text').native.send_keys('Test')
@@ -151,7 +151,7 @@ RSpec.describe 'Merge request > User sees avatars on diff notes', :js do
it 'adds multiple comments' do
3.times do
- click_button 'Reply...'
+ find_field('Reply…', match: :first).click
page.within '.js-discussion-note-form' do
find('.js-note-text').native.send_keys('Test')
diff --git a/spec/features/merge_request/user_sees_discussions_spec.rb b/spec/features/merge_request/user_sees_discussions_spec.rb
index 289c861739f..d79763ba5e0 100644
--- a/spec/features/merge_request/user_sees_discussions_spec.rb
+++ b/spec/features/merge_request/user_sees_discussions_spec.rb
@@ -60,7 +60,7 @@ RSpec.describe 'Merge request > User sees threads', :js do
it 'can be replied to' do
within(".discussion[data-discussion-id='#{discussion_id}']") do
- click_button 'Reply...'
+ find_field('Reply…').click
fill_in 'note[note]', with: 'Test!'
click_button 'Comment'
diff --git a/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb b/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb
index 20c45a1d652..ea46ae06329 100644
--- a/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb
+++ b/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb
@@ -27,7 +27,7 @@ RSpec.describe 'Merge request > User sees notes from forked project', :js do
expect(page).to have_content('A commit comment')
page.within('.discussion-notes') do
- find('.btn-text-field').click
+ find_field('Reply…').click
scroll_to(page.find('#note_note', visible: false))
find('#note_note').send_keys('A reply comment')
find('.js-comment-button').click
diff --git a/spec/features/merge_request/user_suggests_changes_on_diff_spec.rb b/spec/features/merge_request/user_suggests_changes_on_diff_spec.rb
index bbeb91bbd19..dbc88d0cce2 100644
--- a/spec/features/merge_request/user_suggests_changes_on_diff_spec.rb
+++ b/spec/features/merge_request/user_suggests_changes_on_diff_spec.rb
@@ -83,7 +83,7 @@ RSpec.describe 'User comments on a diff', :js do
wait_for_requests
- click_button 'Reply...'
+ find_field('Reply…', match: :first).click
find('.js-suggestion-btn').click
diff --git a/spec/features/projects/files/gitlab_ci_syntax_yml_dropdown_spec.rb b/spec/features/projects/files/gitlab_ci_syntax_yml_dropdown_spec.rb
index ca6f03472dd..cd796d45aba 100644
--- a/spec/features/projects/files/gitlab_ci_syntax_yml_dropdown_spec.rb
+++ b/spec/features/projects/files/gitlab_ci_syntax_yml_dropdown_spec.rb
@@ -5,11 +5,13 @@ require 'spec_helper'
RSpec.describe 'Projects > Files > User wants to add a .gitlab-ci.yml file' do
include Spec::Support::Helpers::Features::EditorLiteSpecHelpers
+ let_it_be(:namespace) { create(:namespace) }
+ let(:project) { create(:project, :repository, namespace: namespace) }
+
before do
- project = create(:project, :repository)
sign_in project.owner
- stub_experiment(ci_syntax_templates: experiment_active)
- stub_experiment_for_subject(ci_syntax_templates: in_experiment_group)
+ stub_experiment(ci_syntax_templates_b: experiment_active)
+ stub_experiment_for_subject(ci_syntax_templates_b: in_experiment_group)
visit project_new_blob_path(project, 'master', file_name: '.gitlab-ci.yml')
end
@@ -23,35 +25,45 @@ RSpec.describe 'Projects > Files > User wants to add a .gitlab-ci.yml file' do
end
end
- context 'when experiment is active and the user is in the control group' do
+ context 'when experiment is active' do
let(:experiment_active) { true }
- let(:in_experiment_group) { false }
- it 'does not show the "Learn CI/CD syntax" template dropdown' do
- expect(page).not_to have_css('.gitlab-ci-syntax-yml-selector')
+ context 'when the user is in the control group' do
+ let(:in_experiment_group) { false }
+
+ it 'does not show the "Learn CI/CD syntax" template dropdown' do
+ expect(page).not_to have_css('.gitlab-ci-syntax-yml-selector')
+ end
end
- end
- context 'when experiment is active and the user is in the experimental group' do
- let(:experiment_active) { true }
- let(:in_experiment_group) { true }
+ context 'when the user is in the experimental group' do
+ let(:in_experiment_group) { true }
+
+ it 'allows the user to pick a "Learn CI/CD syntax" template from the dropdown', :js do
+ expect(page).to have_css('.gitlab-ci-syntax-yml-selector')
- it 'allows the user to pick a "Learn CI/CD syntax" template from the dropdown', :js do
- expect(page).to have_css('.gitlab-ci-syntax-yml-selector')
+ find('.js-gitlab-ci-syntax-yml-selector').click
- find('.js-gitlab-ci-syntax-yml-selector').click
+ wait_for_requests
- wait_for_requests
+ within '.gitlab-ci-syntax-yml-selector' do
+ find('.dropdown-input-field').set('Artifacts example')
+ find('.dropdown-content .is-focused', text: 'Artifacts example').click
+ end
- within '.gitlab-ci-syntax-yml-selector' do
- find('.dropdown-input-field').set('Artifacts example')
- find('.dropdown-content .is-focused', text: 'Artifacts example').click
+ wait_for_requests
+
+ expect(page).to have_css('.gitlab-ci-syntax-yml-selector .dropdown-toggle-text', text: 'Learn CI/CD syntax')
+ expect(editor_get_value).to have_content('You can use artifacts to pass data to jobs in later stages.')
end
- wait_for_requests
+ context 'when the group is created longer than 90 days ago' do
+ let(:namespace) { create(:namespace, created_at: 91.days.ago) }
- expect(page).to have_css('.gitlab-ci-syntax-yml-selector .dropdown-toggle-text', text: 'Learn CI/CD syntax')
- expect(editor_get_value).to have_content('You can use artifacts to pass data to jobs in later stages.')
+ it 'does not show the "Learn CI/CD syntax" template dropdown' do
+ expect(page).not_to have_css('.gitlab-ci-syntax-yml-selector')
+ end
+ end
end
end
end
diff --git a/spec/features/projects/pages/user_edits_settings_spec.rb b/spec/features/projects/pages/user_edits_settings_spec.rb
index 3649fae17ce..6156b5243de 100644
--- a/spec/features/projects/pages/user_edits_settings_spec.rb
+++ b/spec/features/projects/pages/user_edits_settings_spec.rb
@@ -140,7 +140,7 @@ RSpec.describe 'Pages edits pages settings', :js do
before do
allow(Projects::UpdateService).to receive(:new).and_return(service)
- allow(service).to receive(:execute).and_return(status: :error, message: 'Some error has occured')
+ allow(service).to receive(:execute).and_return(status: :error, message: 'Some error has occurred')
end
it 'tries to change the setting' do
@@ -150,7 +150,7 @@ RSpec.describe 'Pages edits pages settings', :js do
click_button 'Save'
- expect(page).to have_text('Some error has occured')
+ expect(page).to have_text('Some error has occurred')
end
end
diff --git a/spec/features/projects/services/user_activates_jira_spec.rb b/spec/features/projects/services/user_activates_jira_spec.rb
index 85afc54be48..3b8032e1d0d 100644
--- a/spec/features/projects/services/user_activates_jira_spec.rb
+++ b/spec/features/projects/services/user_activates_jira_spec.rb
@@ -6,12 +6,14 @@ RSpec.describe 'User activates Jira', :js do
include_context 'project service activation'
include_context 'project service Jira context'
+ before do
+ server_info = { key: 'value' }.to_json
+ stub_request(:get, test_url).to_return(body: server_info)
+ end
+
describe 'user tests Jira Service' do
context 'when Jira connection test succeeds' do
before do
- server_info = { key: 'value' }.to_json
- stub_request(:get, test_url).with(basic_auth: %w(username password)).to_return(body: server_info)
-
visit_project_integration('Jira')
fill_form
click_test_then_save_integration(expect_test_to_fail: false)
@@ -81,4 +83,40 @@ RSpec.describe 'User activates Jira', :js do
end
end
end
+
+ describe 'issue transition settings' do
+ it 'shows validation errors' do
+ visit_project_integration('Jira')
+
+ expect(page).to have_field('Move to Done', checked: true)
+
+ fill_form
+ choose 'Use custom transitions'
+ click_save_integration
+
+ within '[data-testid="issue-transition-settings"]' do
+ expect(page).to have_content('This field is required.')
+ end
+
+ fill_in 'service[jira_issue_transition_id]', with: '1, 2, 3'
+ click_save_integration
+
+ expect(page).to have_content('Jira settings saved and active.')
+ expect(project.reload.jira_service.jira_issue_transition_id).to eq('1, 2, 3')
+ end
+
+ it 'clears the transition IDs when using automatic transitions' do
+ create(:jira_service, project: project, jira_issue_transition_id: '1, 2, 3')
+ visit_project_integration('Jira')
+
+ expect(page).to have_field('Use custom transitions', checked: true)
+ expect(page).to have_field('service[jira_issue_transition_id]', with: '1, 2, 3')
+
+ choose 'Move to Done'
+ click_save_integration
+
+ expect(page).to have_content('Jira settings saved and active.')
+ expect(project.reload.jira_service.jira_issue_transition_id).to eq('')
+ end
+ end
end
diff --git a/spec/features/projects/settings/service_desk_setting_spec.rb b/spec/features/projects/settings/service_desk_setting_spec.rb
index d31913d2dcf..50451075db5 100644
--- a/spec/features/projects/settings/service_desk_setting_spec.rb
+++ b/spec/features/projects/settings/service_desk_setting_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Service Desk Setting', :js do
+RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache do
let(:project) { create(:project_empty_repo, :private, service_desk_enabled: false) }
let(:presenter) { project.present(current_user: user) }
let(:user) { create(:user) }
@@ -66,5 +66,48 @@ RSpec.describe 'Service Desk Setting', :js do
expect(find('[data-testid="incoming-email"]').value).to eq('address-suffix@example.com')
end
+
+ context 'issue description templates' do
+ let_it_be(:issuable_project_template_files) do
+ {
+ '.gitlab/issue_templates/project-issue-bar.md' => 'Project Issue Template Bar',
+ '.gitlab/issue_templates/project-issue-foo.md' => 'Project Issue Template Foo'
+ }
+ end
+
+ let_it_be(:issuable_group_template_files) do
+ {
+ '.gitlab/issue_templates/group-issue-bar.md' => 'Group Issue Template Bar',
+ '.gitlab/issue_templates/group-issue-foo.md' => 'Group Issue Template Foo'
+ }
+ end
+
+ let_it_be_with_reload(:group) { create(:group)}
+ let_it_be_with_reload(:project) { create(:project, :custom_repo, group: group, files: issuable_project_template_files) }
+ let_it_be(:group_template_repo) { create(:project, :custom_repo, group: group, files: issuable_group_template_files) }
+
+ before do
+ stub_licensed_features(custom_file_templates_for_namespace: false, custom_file_templates: false)
+ group.update_columns(file_template_project_id: group_template_repo.id)
+ end
+
+ context 'when inherited_issuable_templates enabled' do
+ before do
+ stub_feature_flags(inherited_issuable_templates: true)
+ visit edit_project_path(project)
+ end
+
+ it_behaves_like 'issue description templates from current project only'
+ end
+
+ context 'when inherited_issuable_templates disabled' do
+ before do
+ stub_feature_flags(inherited_issuable_templates: false)
+ visit edit_project_path(project)
+ end
+
+ it_behaves_like 'issue description templates from current project only'
+ end
+ end
end
end
diff --git a/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb b/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb
index e8e32d93f7b..397c334a2b8 100644
--- a/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb
+++ b/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb
@@ -133,7 +133,7 @@ RSpec.describe 'Projects > Settings > User manages merge request settings' do
it 'when unchecked sets :remove_source_branch_after_merge to false' do
uncheck('project_remove_source_branch_after_merge')
within('.merge-request-settings-form') do
- find('.qa-save-merge-request-changes')
+ find('.rspec-save-merge-request-changes')
click_on('Save changes')
end
@@ -157,7 +157,7 @@ RSpec.describe 'Projects > Settings > User manages merge request settings' do
choose('project_project_setting_attributes_squash_option_default_on')
within('.merge-request-settings-form') do
- find('.qa-save-merge-request-changes')
+ find('.rspec-save-merge-request-changes')
click_on('Save changes')
end
@@ -172,7 +172,7 @@ RSpec.describe 'Projects > Settings > User manages merge request settings' do
choose('project_project_setting_attributes_squash_option_always')
within('.merge-request-settings-form') do
- find('.qa-save-merge-request-changes')
+ find('.rspec-save-merge-request-changes')
click_on('Save changes')
end
@@ -187,7 +187,7 @@ RSpec.describe 'Projects > Settings > User manages merge request settings' do
choose('project_project_setting_attributes_squash_option_never')
within('.merge-request-settings-form') do
- find('.qa-save-merge-request-changes')
+ find('.rspec-save-merge-request-changes')
click_on('Save changes')
end
diff --git a/spec/features/projects/settings/user_searches_in_settings_spec.rb b/spec/features/projects/settings/user_searches_in_settings_spec.rb
new file mode 100644
index 00000000000..563dff615d6
--- /dev/null
+++ b/spec/features/projects/settings/user_searches_in_settings_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'User searches project settings', :js do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :repository, namespace: user.namespace) }
+
+ before do
+ sign_in(user)
+ end
+
+ context 'in general settings page' do
+ let(:visit_path) { edit_project_path(project) }
+
+ it_behaves_like 'can search settings with feature flag check', 'Naming', 'Visibility'
+ end
+
+ context 'in Repository page' do
+ before do
+ visit project_settings_repository_path(project)
+ end
+
+ it_behaves_like 'can search settings', 'Deploy keys', 'Mirroring repositories'
+ end
+
+ context 'in CI/CD page' do
+ before do
+ visit project_settings_ci_cd_path(project)
+ end
+
+ it_behaves_like 'can search settings', 'General pipelines', 'Auto DevOps'
+ end
+
+ context 'in Operations page' do
+ before do
+ visit project_settings_operations_path(project)
+ end
+
+ it_behaves_like 'can search settings', 'Alerts', 'Incidents'
+ end
+end
diff --git a/spec/features/projects/show/user_uploads_files_spec.rb b/spec/features/projects/show/user_uploads_files_spec.rb
index 053598a528e..b7c5d324d93 100644
--- a/spec/features/projects/show/user_uploads_files_spec.rb
+++ b/spec/features/projects/show/user_uploads_files_spec.rb
@@ -33,4 +33,34 @@ RSpec.describe 'Projects > Show > User uploads files' do
include_examples 'it uploads and commit a new file to a forked project'
end
+
+ context 'with an empty repo' do
+ let(:project) { create(:project, :empty_repo, creator: user) }
+
+ context 'when in the empty_repo_upload experiment' do
+ before do
+ stub_experiments(empty_repo_upload: :candidate)
+
+ visit(project_path(project))
+ end
+
+ it 'uploads and commits a new text file', :js do
+ click_link('Upload file')
+
+ drop_in_dropzone(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'))
+
+ page.within('#modal-upload-blob') do
+ fill_in(:commit_message, with: 'New commit message')
+ end
+
+ click_button('Upload file')
+
+ wait_for_requests
+
+ expect(page).to have_content('New commit message')
+ expect(page).to have_content('Lorem ipsum dolor sit amet')
+ expect(page).to have_content('Sed ut perspiciatis unde omnis')
+ end
+ end
+ end
end
diff --git a/spec/features/sentry_js_spec.rb b/spec/features/sentry_js_spec.rb
index aa0ad17340a..1d277ba7b3c 100644
--- a/spec/features/sentry_js_spec.rb
+++ b/spec/features/sentry_js_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe 'Sentry' do
expect(has_requested_sentry).to eq(false)
end
- xit 'loads sentry if sentry is enabled' do
+ it 'loads sentry if sentry is enabled' do
stub_sentry_settings
visit new_user_session_path
diff --git a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
index 31e29810c65..900cd72c17f 100644
--- a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
+++ b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
@@ -23,7 +23,7 @@ RSpec.describe 'User uploads avatar to profile' do
expect(user.reload.avatar.file).to exist
end
- it 'their new avatar is immediately visible in the header', :js do
+ it 'their new avatar is immediately visible in the header and setting sidebar', :js do
find('.js-user-avatar-input', visible: false).set(avatar_file_path)
click_button 'Set new profile picture'
@@ -33,5 +33,6 @@ RSpec.describe 'User uploads avatar to profile' do
data_uri = find('.avatar-image .avatar')['src']
expect(page.find('.header-user-avatar')['src']).to eq data_uri
+ expect(page.find('[data-testid="sidebar-user-avatar"]')['src']).to eq data_uri
end
end
diff --git a/spec/features/user_can_display_performance_bar_spec.rb b/spec/features/user_can_display_performance_bar_spec.rb
index 9c67523f88f..b8f41925156 100644
--- a/spec/features/user_can_display_performance_bar_spec.rb
+++ b/spec/features/user_can_display_performance_bar_spec.rb
@@ -49,6 +49,10 @@ RSpec.describe 'User can display performance bar', :js do
let(:group) { create(:group) }
+ before do
+ allow(GitlabPerformanceBarStatsWorker).to receive(:perform_in)
+ end
+
context 'when user is logged-out' do
before do
visit root_path
@@ -97,6 +101,26 @@ RSpec.describe 'User can display performance bar', :js do
it_behaves_like 'performance bar is enabled by default in development'
it_behaves_like 'performance bar can be displayed'
+
+ it 'does not show Stats link by default' do
+ find('body').native.send_keys('pb')
+
+ expect(page).not_to have_link('Stats', visible: :all)
+ end
+
+ context 'when GITLAB_PERFORMANCE_BAR_STATS_URL environment variable is set' do
+ let(:stats_url) { 'https://log.gprd.gitlab.net/app/dashboards#/view/' }
+
+ before do
+ stub_env('GITLAB_PERFORMANCE_BAR_STATS_URL', stats_url)
+ end
+
+ it 'shows Stats link' do
+ find('body').native.send_keys('pb')
+
+ expect(page).to have_link('Stats', href: stats_url, visible: :all)
+ end
+ end
end
end
end
diff --git a/spec/finders/packages/group_packages_finder_spec.rb b/spec/finders/packages/group_packages_finder_spec.rb
index 445482a5a96..d6daf73aba2 100644
--- a/spec/finders/packages/group_packages_finder_spec.rb
+++ b/spec/finders/packages/group_packages_finder_spec.rb
@@ -122,7 +122,7 @@ RSpec.describe Packages::GroupPackagesFinder do
end
context 'when there are processing packages' do
- let_it_be(:package4) { create(:nuget_package, project: project, name: Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME) }
+ let_it_be(:package4) { create(:nuget_package, project: project, name: Packages::Nuget::TEMPORARY_PACKAGE_NAME) }
it { is_expected.to match_array([package1, package2]) }
end
diff --git a/spec/finders/packages/npm/package_finder_spec.rb b/spec/finders/packages/npm/package_finder_spec.rb
index 78c23971f92..f021d800f31 100644
--- a/spec/finders/packages/npm/package_finder_spec.rb
+++ b/spec/finders/packages/npm/package_finder_spec.rb
@@ -2,39 +2,139 @@
require 'spec_helper'
RSpec.describe ::Packages::Npm::PackageFinder do
- let(:package) { create(:npm_package) }
+ let_it_be_with_reload(:project) { create(:project)}
+ let_it_be(:package) { create(:npm_package, project: project) }
+
let(:project) { package.project }
let(:package_name) { package.name }
- describe '#execute!' do
- subject { described_class.new(project, package_name).execute }
+ shared_examples 'accepting a namespace for' do |example_name|
+ before do
+ project.update!(namespace: namespace)
+ end
+
+ context 'that is a group' do
+ let_it_be(:namespace) { create(:group) }
+
+ it_behaves_like example_name
+
+ context 'within another group' do
+ let_it_be(:subgroup) { create(:group, parent: namespace) }
+
+ before do
+ project.update!(namespace: subgroup)
+ end
+
+ it_behaves_like example_name
+ end
+ end
+
+ context 'that is a user namespace' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:namespace) { user.namespace }
+
+ it_behaves_like example_name
+ end
+ end
+
+ describe '#execute' do
+ shared_examples 'finding packages by name' do
+ it { is_expected.to eq([package]) }
+
+ context 'with unknown package name' do
+ let(:package_name) { 'baz' }
+
+ it { is_expected.to be_empty }
+ end
+ end
+
+ subject { finder.execute }
+
+ context 'with a project' do
+ let(:finder) { described_class.new(package_name, project: project) }
- it { is_expected.to eq([package]) }
+ it_behaves_like 'finding packages by name'
- context 'with unknown package name' do
- let(:package_name) { 'baz' }
+ context 'set to nil' do
+ let(:project) { nil }
- it { is_expected.to be_empty }
+ it { is_expected.to be_empty }
+ end
end
- context 'with nil project' do
- let(:project) { nil }
+ context 'with a namespace' do
+ let(:finder) { described_class.new(package_name, namespace: namespace) }
+
+ it_behaves_like 'accepting a namespace for', 'finding packages by name'
+
+ context 'set to nil' do
+ let_it_be(:namespace) { nil }
- it { is_expected.to be_empty }
+ it { is_expected.to be_empty }
+ end
end
end
describe '#find_by_version' do
let(:version) { package.version }
- subject { described_class.new(project, package.name).find_by_version(version) }
+ subject { finder.find_by_version(version) }
+
+ shared_examples 'finding packages by version' do
+ it { is_expected.to eq(package) }
+
+ context 'with unknown version' do
+ let(:version) { 'foobar' }
+
+ it { is_expected.to be_nil }
+ end
+ end
+
+ context 'with a project' do
+ let(:finder) { described_class.new(package_name, project: project) }
+
+ it_behaves_like 'finding packages by version'
+ end
+
+ context 'with a namespace' do
+ let(:finder) { described_class.new(package_name, namespace: namespace) }
+
+ it_behaves_like 'accepting a namespace for', 'finding packages by version'
+ end
+ end
+
+ describe '#last' do
+ subject { finder.last }
+
+ shared_examples 'finding package by last' do
+ it { is_expected.to eq(package) }
+ end
+
+ context 'with a project' do
+ let(:finder) { described_class.new(package_name, project: project) }
+
+ it_behaves_like 'finding package by last'
+ end
+
+ context 'with a namespace' do
+ let(:finder) { described_class.new(package_name, namespace: namespace) }
+
+ it_behaves_like 'accepting a namespace for', 'finding package by last'
- it { is_expected.to eq(package) }
+ context 'with duplicate packages' do
+ let_it_be(:namespace) { create(:group) }
+ let_it_be(:subgroup1) { create(:group, parent: namespace) }
+ let_it_be(:subgroup2) { create(:group, parent: namespace) }
+ let_it_be(:project2) { create(:project, namespace: subgroup2) }
+ let_it_be(:package2) { create(:npm_package, name: package.name, project: project2) }
- context 'with unknown version' do
- let(:version) { 'foobar' }
+ before do
+ project.update!(namespace: subgroup1)
+ end
- it { is_expected.to be_nil }
+ # the most recent one is returned
+ it { is_expected.to eq(package2) }
+ end
end
end
end
diff --git a/spec/finders/packages/package_finder_spec.rb b/spec/finders/packages/package_finder_spec.rb
index ef07e7575d1..e8c7404a612 100644
--- a/spec/finders/packages/package_finder_spec.rb
+++ b/spec/finders/packages/package_finder_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe ::Packages::PackageFinder do
it { is_expected.to eq(maven_package) }
context 'processing packages' do
- let_it_be(:nuget_package) { create(:nuget_package, project: project, name: Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME) }
+ let_it_be(:nuget_package) { create(:nuget_package, project: project, name: Packages::Nuget::TEMPORARY_PACKAGE_NAME) }
let(:package_id) { nuget_package.id }
it 'are not returned' do
diff --git a/spec/finders/packages/packages_finder_spec.rb b/spec/finders/packages/packages_finder_spec.rb
index 6e92616bafa..0add77a8478 100644
--- a/spec/finders/packages/packages_finder_spec.rb
+++ b/spec/finders/packages/packages_finder_spec.rb
@@ -76,7 +76,7 @@ RSpec.describe ::Packages::PackagesFinder do
end
context 'with processing packages' do
- let_it_be(:nuget_package) { create(:nuget_package, project: project, name: Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME) }
+ let_it_be(:nuget_package) { create(:nuget_package, project: project, name: Packages::Nuget::TEMPORARY_PACKAGE_NAME) }
it { is_expected.to match_array([conan_package, maven_package]) }
end
diff --git a/spec/frontend/__helpers__/vue_test_utils_helper.js b/spec/frontend/__helpers__/vue_test_utils_helper.js
index ffccfb249c2..d6132ef84ac 100644
--- a/spec/frontend/__helpers__/vue_test_utils_helper.js
+++ b/spec/frontend/__helpers__/vue_test_utils_helper.js
@@ -45,9 +45,16 @@ export const extendedWrapper = (wrapper) => {
return wrapper;
}
- return Object.defineProperty(wrapper, 'findByTestId', {
- value(id) {
- return this.find(`[data-testid="${id}"]`);
+ return Object.defineProperties(wrapper, {
+ findByTestId: {
+ value(id) {
+ return this.find(`[data-testid="${id}"]`);
+ },
+ },
+ findAllByTestId: {
+ value(id) {
+ return this.findAll(`[data-testid="${id}"]`);
+ },
},
});
};
diff --git a/spec/frontend/__helpers__/vue_test_utils_helper_spec.js b/spec/frontend/__helpers__/vue_test_utils_helper_spec.js
index 31c4ccd5dbb..d4f8e36c169 100644
--- a/spec/frontend/__helpers__/vue_test_utils_helper_spec.js
+++ b/spec/frontend/__helpers__/vue_test_utils_helper_spec.js
@@ -88,5 +88,22 @@ describe('Vue test utils helpers', () => {
expect(mockComponent.findByTestId(testId).exists()).toBe(true);
});
});
+
+ describe('findAllByTestId', () => {
+ const testId = 'a-component';
+ let mockComponent;
+
+ beforeEach(() => {
+ mockComponent = extendedWrapper(
+ shallowMount({
+ template: `<div><div data-testid="${testId}"></div><div data-testid="${testId}"></div></div>`,
+ }),
+ );
+ });
+
+ it('should find all components by test id', () => {
+ expect(mockComponent.findAllByTestId(testId)).toHaveLength(2);
+ });
+ });
});
});
diff --git a/spec/frontend/admin/users/tabs_spec.js b/spec/frontend/admin/users/tabs_spec.js
new file mode 100644
index 00000000000..39ba8618486
--- /dev/null
+++ b/spec/frontend/admin/users/tabs_spec.js
@@ -0,0 +1,37 @@
+import initTabs from '~/admin/users/tabs';
+import Api from '~/api';
+
+jest.mock('~/api.js');
+jest.mock('~/lib/utils/common_utils');
+
+describe('tabs', () => {
+ beforeEach(() => {
+ setFixtures(`
+ <div>
+ <div class="js-users-tab-item">
+ <a href="#users" data-testid='users-tab'>Users</a>
+ </div>
+ <div class="js-users-tab-item">
+ <a href="#cohorts" data-testid='cohorts-tab'>Cohorts</a>
+ </div>
+ </div`);
+
+ initTabs();
+ });
+
+ afterEach(() => {});
+
+ describe('tracking', () => {
+ it('tracks event when cohorts tab is clicked', () => {
+ document.querySelector('[data-testid="cohorts-tab"]').click();
+
+ expect(Api.trackRedisHllUserEvent).toHaveBeenCalledWith('i_analytics_cohorts');
+ });
+
+ it('does not track an event when users tab is clicked', () => {
+ document.querySelector('[data-testid="users-tab"]').click();
+
+ expect(Api.trackRedisHllUserEvent).not.toHaveBeenCalled();
+ });
+ });
+});
diff --git a/spec/frontend/analytics/instance_statistics/components/app_spec.js b/spec/frontend/analytics/instance_statistics/components/app_spec.js
deleted file mode 100644
index b945cc20bd6..00000000000
--- a/spec/frontend/analytics/instance_statistics/components/app_spec.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import InstanceCounts from '~/analytics/instance_statistics/components//instance_counts.vue';
-import InstanceStatisticsApp from '~/analytics/instance_statistics/components/app.vue';
-import InstanceStatisticsCountChart from '~/analytics/instance_statistics/components/instance_statistics_count_chart.vue';
-import ProjectsAndGroupsChart from '~/analytics/instance_statistics/components/projects_and_groups_chart.vue';
-import UsersChart from '~/analytics/instance_statistics/components/users_chart.vue';
-
-describe('InstanceStatisticsApp', () => {
- let wrapper;
-
- const createComponent = () => {
- wrapper = shallowMount(InstanceStatisticsApp);
- };
-
- beforeEach(() => {
- createComponent();
- });
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- it('displays the instance counts component', () => {
- expect(wrapper.find(InstanceCounts).exists()).toBe(true);
- });
-
- ['Pipelines', 'Issues & Merge Requests'].forEach((instance) => {
- it(`displays the ${instance} chart`, () => {
- const chartTitles = wrapper
- .findAll(InstanceStatisticsCountChart)
- .wrappers.map((chartComponent) => chartComponent.props('chartTitle'));
-
- expect(chartTitles).toContain(instance);
- });
- });
-
- it('displays the users chart component', () => {
- expect(wrapper.find(UsersChart).exists()).toBe(true);
- });
-
- it('displays the projects and groups chart component', () => {
- expect(wrapper.find(ProjectsAndGroupsChart).exists()).toBe(true);
- });
-});
diff --git a/spec/frontend/analytics/instance_statistics/apollo_mock_data.js b/spec/frontend/analytics/usage_trends/apollo_mock_data.js
index 98eabd577ee..98eabd577ee 100644
--- a/spec/frontend/analytics/instance_statistics/apollo_mock_data.js
+++ b/spec/frontend/analytics/usage_trends/apollo_mock_data.js
diff --git a/spec/frontend/analytics/instance_statistics/components/__snapshots__/instance_statistics_count_chart_spec.js.snap b/spec/frontend/analytics/usage_trends/components/__snapshots__/usage_trends_count_chart_spec.js.snap
index 29bcd5f223b..65de69c2692 100644
--- a/spec/frontend/analytics/instance_statistics/components/__snapshots__/instance_statistics_count_chart_spec.js.snap
+++ b/spec/frontend/analytics/usage_trends/components/__snapshots__/usage_trends_count_chart_spec.js.snap
@@ -1,6 +1,6 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`InstanceStatisticsCountChart when fetching more data when the fetchMore query returns data passes the data to the line chart 1`] = `
+exports[`UsageTrendsCountChart when fetching more data when the fetchMore query returns data passes the data to the line chart 1`] = `
Array [
Object {
"data": Array [
@@ -22,7 +22,7 @@ Array [
]
`;
-exports[`InstanceStatisticsCountChart with data passes the data to the line chart 1`] = `
+exports[`UsageTrendsCountChart with data passes the data to the line chart 1`] = `
Array [
Object {
"data": Array [
diff --git a/spec/frontend/analytics/usage_trends/components/app_spec.js b/spec/frontend/analytics/usage_trends/components/app_spec.js
new file mode 100644
index 00000000000..8f1dd3c445c
--- /dev/null
+++ b/spec/frontend/analytics/usage_trends/components/app_spec.js
@@ -0,0 +1,45 @@
+import { shallowMount } from '@vue/test-utils';
+import UsageTrendsApp from '~/analytics/usage_trends/components/app.vue';
+import ProjectsAndGroupsChart from '~/analytics/usage_trends/components/projects_and_groups_chart.vue';
+import UsageCounts from '~/analytics/usage_trends/components/usage_counts.vue';
+import UsageTrendsCountChart from '~/analytics/usage_trends/components/usage_trends_count_chart.vue';
+import UsersChart from '~/analytics/usage_trends/components/users_chart.vue';
+
+describe('UsageTrendsApp', () => {
+ let wrapper;
+
+ const createComponent = () => {
+ wrapper = shallowMount(UsageTrendsApp);
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ it('displays the usage counts component', () => {
+ expect(wrapper.find(UsageCounts).exists()).toBe(true);
+ });
+
+ ['Pipelines', 'Issues & Merge Requests'].forEach((usage) => {
+ it(`displays the ${usage} chart`, () => {
+ const chartTitles = wrapper
+ .findAll(UsageTrendsCountChart)
+ .wrappers.map((chartComponent) => chartComponent.props('chartTitle'));
+
+ expect(chartTitles).toContain(usage);
+ });
+ });
+
+ it('displays the users chart component', () => {
+ expect(wrapper.find(UsersChart).exists()).toBe(true);
+ });
+
+ it('displays the projects and groups chart component', () => {
+ expect(wrapper.find(ProjectsAndGroupsChart).exists()).toBe(true);
+ });
+});
diff --git a/spec/frontend/analytics/instance_statistics/components/instance_counts_spec.js b/spec/frontend/analytics/usage_trends/components/instance_counts_spec.js
index 12b5e14b9c4..707d2cc310f 100644
--- a/spec/frontend/analytics/instance_statistics/components/instance_counts_spec.js
+++ b/spec/frontend/analytics/usage_trends/components/instance_counts_spec.js
@@ -1,9 +1,9 @@
import { shallowMount } from '@vue/test-utils';
-import InstanceCounts from '~/analytics/instance_statistics/components/instance_counts.vue';
import MetricCard from '~/analytics/shared/components/metric_card.vue';
-import { mockInstanceCounts } from '../mock_data';
+import UsageCounts from '~/analytics/usage_trends/components/usage_counts.vue';
+import { mockUsageCounts } from '../mock_data';
-describe('InstanceCounts', () => {
+describe('UsageCounts', () => {
let wrapper;
const createComponent = ({ loading = false, data = {} } = {}) => {
@@ -15,7 +15,7 @@ describe('InstanceCounts', () => {
},
};
- wrapper = shallowMount(InstanceCounts, {
+ wrapper = shallowMount(UsageCounts, {
mocks: { $apollo },
data() {
return {
@@ -44,11 +44,11 @@ describe('InstanceCounts', () => {
describe('with data', () => {
beforeEach(() => {
- createComponent({ data: { counts: mockInstanceCounts } });
+ createComponent({ data: { counts: mockUsageCounts } });
});
it('passes the counts data to the metric card', () => {
- expect(findMetricCard().props('metrics')).toEqual(mockInstanceCounts);
+ expect(findMetricCard().props('metrics')).toEqual(mockUsageCounts);
});
});
});
diff --git a/spec/frontend/analytics/instance_statistics/components/projects_and_groups_chart_spec.js b/spec/frontend/analytics/usage_trends/components/projects_and_groups_chart_spec.js
index bbfc65f19b1..09215da32e0 100644
--- a/spec/frontend/analytics/instance_statistics/components/projects_and_groups_chart_spec.js
+++ b/spec/frontend/analytics/usage_trends/components/projects_and_groups_chart_spec.js
@@ -3,9 +3,9 @@ import { GlLineChart } from '@gitlab/ui/dist/charts';
import { createLocalVue, shallowMount } from '@vue/test-utils';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
-import ProjectsAndGroupChart from '~/analytics/instance_statistics/components/projects_and_groups_chart.vue';
-import groupsQuery from '~/analytics/instance_statistics/graphql/queries/groups.query.graphql';
-import projectsQuery from '~/analytics/instance_statistics/graphql/queries/projects.query.graphql';
+import ProjectsAndGroupChart from '~/analytics/usage_trends/components/projects_and_groups_chart.vue';
+import groupsQuery from '~/analytics/usage_trends/graphql/queries/groups.query.graphql';
+import projectsQuery from '~/analytics/usage_trends/graphql/queries/projects.query.graphql';
import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleton_loader.vue';
import { mockQueryResponse } from '../apollo_mock_data';
import { mockCountsData2, roundedSortedCountsMonthlyChartData2 } from '../mock_data';
diff --git a/spec/frontend/analytics/instance_statistics/components/instance_statistics_count_chart_spec.js b/spec/frontend/analytics/usage_trends/components/usage_trends_count_chart_spec.js
index e80dcdff426..7c2df3fe8c4 100644
--- a/spec/frontend/analytics/instance_statistics/components/instance_statistics_count_chart_spec.js
+++ b/spec/frontend/analytics/usage_trends/components/usage_trends_count_chart_spec.js
@@ -3,8 +3,8 @@ import { GlLineChart } from '@gitlab/ui/dist/charts';
import { createLocalVue, shallowMount } from '@vue/test-utils';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
-import InstanceStatisticsCountChart from '~/analytics/instance_statistics/components/instance_statistics_count_chart.vue';
-import statsQuery from '~/analytics/instance_statistics/graphql/queries/instance_count.query.graphql';
+import UsageTrendsCountChart from '~/analytics/usage_trends/components/usage_trends_count_chart.vue';
+import statsQuery from '~/analytics/usage_trends/graphql/queries/usage_count.query.graphql';
import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleton_loader.vue';
import { mockQueryResponse, mockApolloResponse } from '../apollo_mock_data';
import { mockCountsData1 } from '../mock_data';
@@ -15,7 +15,7 @@ localVue.use(VueApollo);
const loadChartErrorMessage = 'My load error message';
const noDataMessage = 'My no data message';
-const queryResponseDataKey = 'instanceStatisticsMeasurements';
+const queryResponseDataKey = 'usageTrendsMeasurements';
const identifier = 'MOCK_QUERY';
const mockQueryConfig = {
identifier,
@@ -33,12 +33,12 @@ const mockChartConfig = {
queries: [mockQueryConfig],
};
-describe('InstanceStatisticsCountChart', () => {
+describe('UsageTrendsCountChart', () => {
let wrapper;
let queryHandler;
const createComponent = ({ responseHandler }) => {
- return shallowMount(InstanceStatisticsCountChart, {
+ return shallowMount(UsageTrendsCountChart, {
localVue,
apolloProvider: createMockApollo([[statsQuery, responseHandler]]),
propsData: { ...mockChartConfig },
diff --git a/spec/frontend/analytics/instance_statistics/components/users_chart_spec.js b/spec/frontend/analytics/usage_trends/components/users_chart_spec.js
index d857b7fae61..6adfcca11ac 100644
--- a/spec/frontend/analytics/instance_statistics/components/users_chart_spec.js
+++ b/spec/frontend/analytics/usage_trends/components/users_chart_spec.js
@@ -3,8 +3,8 @@ import { GlAreaChart } from '@gitlab/ui/dist/charts';
import { createLocalVue, shallowMount } from '@vue/test-utils';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
-import UsersChart from '~/analytics/instance_statistics/components/users_chart.vue';
-import usersQuery from '~/analytics/instance_statistics/graphql/queries/users.query.graphql';
+import UsersChart from '~/analytics/usage_trends/components/users_chart.vue';
+import usersQuery from '~/analytics/usage_trends/graphql/queries/users.query.graphql';
import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleton_loader.vue';
import { mockQueryResponse } from '../apollo_mock_data';
import {
diff --git a/spec/frontend/analytics/instance_statistics/mock_data.js b/spec/frontend/analytics/usage_trends/mock_data.js
index e86e552a952..d96dfa26209 100644
--- a/spec/frontend/analytics/instance_statistics/mock_data.js
+++ b/spec/frontend/analytics/usage_trends/mock_data.js
@@ -1,4 +1,4 @@
-export const mockInstanceCounts = [
+export const mockUsageCounts = [
{ key: 'projects', value: 10, label: 'Projects' },
{ key: 'groups', value: 20, label: 'Group' },
];
diff --git a/spec/frontend/analytics/instance_statistics/utils_spec.js b/spec/frontend/analytics/usage_trends/utils_spec.js
index 3fd89c7f740..656f310dda7 100644
--- a/spec/frontend/analytics/instance_statistics/utils_spec.js
+++ b/spec/frontend/analytics/usage_trends/utils_spec.js
@@ -2,7 +2,7 @@ import {
getAverageByMonth,
getEarliestDate,
generateDataKeys,
-} from '~/analytics/instance_statistics/utils';
+} from '~/analytics/usage_trends/utils';
import {
mockCountsData1,
mockCountsData2,
diff --git a/spec/frontend/api_spec.js b/spec/frontend/api_spec.js
index d2522a0124a..d6e1b170dd3 100644
--- a/spec/frontend/api_spec.js
+++ b/spec/frontend/api_spec.js
@@ -482,6 +482,30 @@ describe('Api', () => {
});
});
+ describe('projectShareWithGroup', () => {
+ it('invites a group to share access with the authenticated project', () => {
+ const projectId = 1;
+ const sharedGroupId = 99;
+ const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectId}/share`;
+ const options = {
+ group_id: sharedGroupId,
+ group_access: 10,
+ expires_at: undefined,
+ };
+
+ jest.spyOn(axios, 'post');
+
+ mock.onPost(expectedUrl).reply(200, {
+ status: 'success',
+ });
+
+ return Api.projectShareWithGroup(projectId, options).then(({ data }) => {
+ expect(data.status).toBe('success');
+ expect(axios.post).toHaveBeenCalledWith(expectedUrl, options);
+ });
+ });
+ });
+
describe('projectMilestones', () => {
it('fetches project milestones', (done) => {
const projectId = 1;
@@ -638,6 +662,30 @@ describe('Api', () => {
});
});
+ describe('groupShareWithGroup', () => {
+ it('invites a group to share access with the authenticated group', () => {
+ const groupId = 1;
+ const sharedGroupId = 99;
+ const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${groupId}/share`;
+ const options = {
+ group_id: sharedGroupId,
+ group_access: 10,
+ expires_at: undefined,
+ };
+
+ jest.spyOn(axios, 'post');
+
+ mock.onPost(expectedUrl).reply(200, {
+ status: 'success',
+ });
+
+ return Api.groupShareWithGroup(groupId, options).then(({ data }) => {
+ expect(data.status).toBe('success');
+ expect(axios.post).toHaveBeenCalledWith(expectedUrl, options);
+ });
+ });
+ });
+
describe('commit', () => {
const projectId = 'user/project';
const sha = 'abcd0123';
diff --git a/spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap b/spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap
index bfe7e40fb32..bf33aa731ef 100644
--- a/spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap
+++ b/spec/frontend/artifacts_settings/components/__snapshots__/keep_latest_artifact_checkbox_spec.js.snap
@@ -1,37 +1,5 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`Keep latest artifact checkbox when application keep latest artifact setting is disabled checkbox is disabled when application setting is disabled 1`] = `
-<div>
- <!---->
-
- <b-form-checkbox-stub
- checked="true"
- class="gl-form-checkbox"
- disabled="true"
- plain="true"
- value="true"
- >
- <strong
- class="gl-mr-3"
- >
- Keep artifacts from most recent successful jobs
- </strong>
-
- <gl-link-stub
- href="/help/ci/pipelines/job_artifacts"
- >
- More information
- </gl-link-stub>
-
- <p
- class="help-text"
- >
- This feature is disabled at the instance level.
- </p>
- </b-form-checkbox-stub>
-</div>
-`;
-
exports[`Keep latest artifact checkbox when application keep latest artifact setting is enabled sets correct setting value in checkbox with query result 1`] = `
<div>
<!---->
diff --git a/spec/frontend/artifacts_settings/components/keep_latest_artifact_checkbox_spec.js b/spec/frontend/artifacts_settings/components/keep_latest_artifact_checkbox_spec.js
index fe2886d6c95..b0d1b70c198 100644
--- a/spec/frontend/artifacts_settings/components/keep_latest_artifact_checkbox_spec.js
+++ b/spec/frontend/artifacts_settings/components/keep_latest_artifact_checkbox_spec.js
@@ -120,23 +120,4 @@ describe('Keep latest artifact checkbox', () => {
expect(findCheckbox().attributes('disabled')).toBeUndefined();
});
});
-
- describe('when application keep latest artifact setting is disabled', () => {
- it('checkbox is disabled when application setting is disabled', async () => {
- createComponent({
- keepLatestArtifactApplicationQueryHandler: jest.fn().mockResolvedValue({
- data: {
- ciApplicationSettings: {
- keepLatestArtifact: false,
- },
- },
- }),
- });
-
- await wrapper.vm.$nextTick();
-
- expect(wrapper.element).toMatchSnapshot();
- expect(findCheckbox().attributes('disabled')).toBe('true');
- });
- });
});
diff --git a/spec/frontend/blob/blob_file_dropzone_spec.js b/spec/frontend/blob/blob_file_dropzone_spec.js
index cbd36abd4ff..95520577e9a 100644
--- a/spec/frontend/blob/blob_file_dropzone_spec.js
+++ b/spec/frontend/blob/blob_file_dropzone_spec.js
@@ -1,5 +1,10 @@
import $ from 'jquery';
import BlobFileDropzone from '~/blob/blob_file_dropzone';
+import { trackUploadFileFormSubmitted } from '~/projects/upload_file_experiment';
+
+jest.mock('~/projects/upload_file_experiment', () => ({
+ trackUploadFileFormSubmitted: jest.fn(),
+}));
describe('BlobFileDropzone', () => {
preloadFixtures('blob/show.html');
@@ -41,5 +46,13 @@ describe('BlobFileDropzone', () => {
expect(replaceFileButton.is(':disabled')).toEqual(true);
expect(dropzone.processQueue).toHaveBeenCalled();
});
+
+ it('calls the tracking event', () => {
+ jest.spyOn(window, 'alert').mockImplementation(() => {});
+
+ replaceFileButton.click();
+
+ expect(trackUploadFileFormSubmitted).toHaveBeenCalled();
+ });
});
});
diff --git a/spec/frontend/boards/board_list_spec.js b/spec/frontend/boards/board_list_spec.js
index 7ed20f20882..ca9aa673359 100644
--- a/spec/frontend/boards/board_list_spec.js
+++ b/spec/frontend/boards/board_list_spec.js
@@ -1,8 +1,9 @@
-import { createLocalVue, mount } from '@vue/test-utils';
+import { createLocalVue, shallowMount } from '@vue/test-utils';
import Vuex from 'vuex';
import { useFakeRequestAnimationFrame } from 'helpers/fake_request_animation_frame';
import BoardCard from '~/boards/components/board_card.vue';
import BoardList from '~/boards/components/board_list.vue';
+import BoardNewIssue from '~/boards/components/board_new_issue.vue';
import eventHub from '~/boards/eventhub';
import defaultState from '~/boards/stores/state';
import { mockList, mockIssuesByListId, issues, mockIssues } from './mock_data';
@@ -11,7 +12,7 @@ const localVue = createLocalVue();
localVue.use(Vuex);
const actions = {
- fetchIssuesForList: jest.fn(),
+ fetchItemsForList: jest.fn(),
};
const createStore = (state = defaultState) => {
@@ -28,8 +29,8 @@ const createComponent = ({
state = {},
} = {}) => {
const store = createStore({
- issuesByListId: mockIssuesByListId,
- issues,
+ boardItemsByListId: mockIssuesByListId,
+ boardItems: issues,
pageInfoByListId: {
'gid://gitlab/List/1': { hasNextPage: true },
'gid://gitlab/List/2': {},
@@ -38,6 +39,7 @@ const createComponent = ({
'gid://gitlab/List/1': {},
'gid://gitlab/List/2': {},
},
+ selectedBoardItems: [],
...state,
});
@@ -58,12 +60,12 @@ const createComponent = ({
list.issuesCount = 1;
}
- const component = mount(BoardList, {
+ const component = shallowMount(BoardList, {
localVue,
propsData: {
disabled: false,
list,
- issues: [issue],
+ boardItems: [issue],
canAdminList: true,
...componentProps,
},
@@ -74,6 +76,10 @@ const createComponent = ({
weightFeatureAvailable: false,
boardWeight: null,
},
+ stubs: {
+ BoardCard,
+ BoardNewIssue,
+ },
});
return component;
@@ -81,7 +87,10 @@ const createComponent = ({
describe('Board list component', () => {
let wrapper;
+
const findByTestId = (testId) => wrapper.find(`[data-testid="${testId}"]`);
+ const findIssueCountLoadingIcon = () => wrapper.find('[data-testid="count-loading-icon"]');
+
useFakeRequestAnimationFrame();
afterEach(() => {
@@ -170,7 +179,7 @@ describe('Board list component', () => {
it('loads more issues after scrolling', () => {
wrapper.vm.listRef.dispatchEvent(new Event('scroll'));
- expect(actions.fetchIssuesForList).toHaveBeenCalled();
+ expect(actions.fetchItemsForList).toHaveBeenCalled();
});
it('does not load issues if already loading', () => {
@@ -179,7 +188,7 @@ describe('Board list component', () => {
});
wrapper.vm.listRef.dispatchEvent(new Event('scroll'));
- expect(actions.fetchIssuesForList).not.toHaveBeenCalled();
+ expect(actions.fetchItemsForList).not.toHaveBeenCalled();
});
it('shows loading more spinner', async () => {
@@ -189,7 +198,8 @@ describe('Board list component', () => {
wrapper.vm.showCount = true;
await wrapper.vm.$nextTick();
- expect(wrapper.find('.board-list-count .gl-spinner').exists()).toBe(true);
+
+ expect(findIssueCountLoadingIcon().exists()).toBe(true);
});
});
diff --git a/spec/frontend/boards/components/board_card_deprecated_spec.js b/spec/frontend/boards/components/board_card_deprecated_spec.js
new file mode 100644
index 00000000000..6be84f6f111
--- /dev/null
+++ b/spec/frontend/boards/components/board_card_deprecated_spec.js
@@ -0,0 +1,219 @@
+/* global List */
+/* global ListAssignee */
+/* global ListLabel */
+
+import { mount } from '@vue/test-utils';
+
+import MockAdapter from 'axios-mock-adapter';
+import waitForPromises from 'helpers/wait_for_promises';
+import BoardCardDeprecated from '~/boards/components/board_card_deprecated.vue';
+import issueCardInner from '~/boards/components/issue_card_inner.vue';
+import eventHub from '~/boards/eventhub';
+import store from '~/boards/stores';
+import boardsStore from '~/boards/stores/boards_store';
+import axios from '~/lib/utils/axios_utils';
+
+import sidebarEventHub from '~/sidebar/event_hub';
+import '~/boards/models/label';
+import '~/boards/models/assignee';
+import '~/boards/models/list';
+import userAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
+import { listObj, boardsMockInterceptor, setMockEndpoints } from '../mock_data';
+
+describe('BoardCard', () => {
+ let wrapper;
+ let mock;
+ let list;
+
+ const findIssueCardInner = () => wrapper.find(issueCardInner);
+ const findUserAvatarLink = () => wrapper.find(userAvatarLink);
+
+ // this particular mount component needs to be used after the root beforeEach because it depends on list being initialized
+ const mountComponent = (propsData) => {
+ wrapper = mount(BoardCardDeprecated, {
+ stubs: {
+ issueCardInner,
+ },
+ store,
+ propsData: {
+ list,
+ issue: list.issues[0],
+ disabled: false,
+ index: 0,
+ ...propsData,
+ },
+ provide: {
+ groupId: null,
+ rootPath: '/',
+ scopedLabelsAvailable: false,
+ },
+ });
+ };
+
+ const setupData = async () => {
+ list = new List(listObj);
+ boardsStore.create();
+ boardsStore.detail.issue = {};
+ const label1 = new ListLabel({
+ id: 3,
+ title: 'testing 123',
+ color: '#000cff',
+ text_color: 'white',
+ description: 'test',
+ });
+ await waitForPromises();
+
+ list.issues[0].labels.push(label1);
+ };
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ mock.onAny().reply(boardsMockInterceptor);
+ setMockEndpoints();
+ return setupData();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ list = null;
+ mock.restore();
+ });
+
+ it('when details issue is empty does not show the element', () => {
+ mountComponent();
+ expect(wrapper.find('[data-testid="board_card"').classes()).not.toContain('is-active');
+ });
+
+ it('when detailIssue is equal to card issue shows the element', () => {
+ [boardsStore.detail.issue] = list.issues;
+ mountComponent();
+
+ expect(wrapper.classes()).toContain('is-active');
+ });
+
+ it('when multiSelect does not contain issue removes multi select class', () => {
+ mountComponent();
+ expect(wrapper.classes()).not.toContain('multi-select');
+ });
+
+ it('when multiSelect contain issue add multi select class', () => {
+ boardsStore.multiSelect.list = [list.issues[0]];
+ mountComponent();
+
+ expect(wrapper.classes()).toContain('multi-select');
+ });
+
+ it('adds user-can-drag class if not disabled', () => {
+ mountComponent();
+ expect(wrapper.classes()).toContain('user-can-drag');
+ });
+
+ it('does not add user-can-drag class disabled', () => {
+ mountComponent({ disabled: true });
+
+ expect(wrapper.classes()).not.toContain('user-can-drag');
+ });
+
+ it('does not add disabled class', () => {
+ mountComponent();
+ expect(wrapper.classes()).not.toContain('is-disabled');
+ });
+
+ it('adds disabled class is disabled is true', () => {
+ mountComponent({ disabled: true });
+
+ expect(wrapper.classes()).toContain('is-disabled');
+ });
+
+ describe('mouse events', () => {
+ it('does not set detail issue if showDetail is false', () => {
+ mountComponent();
+ expect(boardsStore.detail.issue).toEqual({});
+ });
+
+ it('does not set detail issue if link is clicked', () => {
+ mountComponent();
+ findIssueCardInner().find('a').trigger('mouseup');
+
+ expect(boardsStore.detail.issue).toEqual({});
+ });
+
+ it('does not set detail issue if img is clicked', () => {
+ mountComponent({
+ issue: {
+ ...list.issues[0],
+ assignees: [
+ new ListAssignee({
+ id: 1,
+ name: 'testing 123',
+ username: 'test',
+ avatar: 'test_image',
+ }),
+ ],
+ },
+ });
+
+ findUserAvatarLink().trigger('mouseup');
+
+ expect(boardsStore.detail.issue).toEqual({});
+ });
+
+ it('does not set detail issue if showDetail is false after mouseup', () => {
+ mountComponent();
+ wrapper.trigger('mouseup');
+
+ expect(boardsStore.detail.issue).toEqual({});
+ });
+
+ it('sets detail issue to card issue on mouse up', () => {
+ jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
+
+ mountComponent();
+
+ wrapper.trigger('mousedown');
+ wrapper.trigger('mouseup');
+
+ expect(eventHub.$emit).toHaveBeenCalledWith('newDetailIssue', wrapper.vm.issue, false);
+ expect(boardsStore.detail.list).toEqual(wrapper.vm.list);
+ });
+
+ it('resets detail issue to empty if already set', () => {
+ jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
+ const [issue] = list.issues;
+ boardsStore.detail.issue = issue;
+ mountComponent();
+
+ wrapper.trigger('mousedown');
+ wrapper.trigger('mouseup');
+
+ expect(eventHub.$emit).toHaveBeenCalledWith('clearDetailIssue', false);
+ });
+ });
+
+ describe('sidebarHub events', () => {
+ it('closes all sidebars before showing an issue if no issues are opened', () => {
+ jest.spyOn(sidebarEventHub, '$emit').mockImplementation(() => {});
+ boardsStore.detail.issue = {};
+ mountComponent();
+
+ // sets conditional so that event is emitted.
+ wrapper.trigger('mousedown');
+
+ wrapper.trigger('mouseup');
+
+ expect(sidebarEventHub.$emit).toHaveBeenCalledWith('sidebar.closeAll');
+ });
+
+ it('it does not closes all sidebars before showing an issue if an issue is opened', () => {
+ jest.spyOn(sidebarEventHub, '$emit').mockImplementation(() => {});
+ const [issue] = list.issues;
+ boardsStore.detail.issue = issue;
+ mountComponent();
+
+ wrapper.trigger('mousedown');
+
+ expect(sidebarEventHub.$emit).not.toHaveBeenCalledWith('sidebar.closeAll');
+ });
+ });
+});
diff --git a/spec/frontend/boards/components/board_card_layout_spec.js b/spec/frontend/boards/components/board_card_layout_spec.js
deleted file mode 100644
index 3fa8714807c..00000000000
--- a/spec/frontend/boards/components/board_card_layout_spec.js
+++ /dev/null
@@ -1,116 +0,0 @@
-import { createLocalVue, shallowMount } from '@vue/test-utils';
-import Vuex from 'vuex';
-
-import BoardCardLayout from '~/boards/components/board_card_layout.vue';
-import IssueCardInner from '~/boards/components/issue_card_inner.vue';
-import { ISSUABLE } from '~/boards/constants';
-import defaultState from '~/boards/stores/state';
-import { mockLabelList, mockIssue } from '../mock_data';
-
-describe('Board card layout', () => {
- let wrapper;
- let store;
-
- const localVue = createLocalVue();
- localVue.use(Vuex);
-
- const createStore = ({ getters = {}, actions = {} } = {}) => {
- store = new Vuex.Store({
- state: defaultState,
- actions,
- getters,
- });
- };
-
- // this particular mount component needs to be used after the root beforeEach because it depends on list being initialized
- const mountComponent = ({ propsData = {}, provide = {} } = {}) => {
- wrapper = shallowMount(BoardCardLayout, {
- localVue,
- stubs: {
- IssueCardInner,
- },
- store,
- propsData: {
- list: mockLabelList,
- issue: mockIssue,
- disabled: false,
- index: 0,
- ...propsData,
- },
- provide: {
- groupId: null,
- rootPath: '/',
- scopedLabelsAvailable: false,
- ...provide,
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- describe('mouse events', () => {
- it('sets showDetail to true on mousedown', async () => {
- createStore();
- mountComponent();
-
- wrapper.trigger('mousedown');
- await wrapper.vm.$nextTick();
-
- expect(wrapper.vm.showDetail).toBe(true);
- });
-
- it('sets showDetail to false on mousemove', async () => {
- createStore();
- mountComponent();
- wrapper.trigger('mousedown');
- await wrapper.vm.$nextTick();
- expect(wrapper.vm.showDetail).toBe(true);
- wrapper.trigger('mousemove');
- await wrapper.vm.$nextTick();
- expect(wrapper.vm.showDetail).toBe(false);
- });
-
- it("calls 'setActiveId'", async () => {
- const setActiveId = jest.fn();
- createStore({
- actions: {
- setActiveId,
- },
- });
- mountComponent();
-
- wrapper.trigger('mouseup');
- await wrapper.vm.$nextTick();
-
- expect(setActiveId).toHaveBeenCalledTimes(1);
- expect(setActiveId).toHaveBeenCalledWith(expect.any(Object), {
- id: mockIssue.id,
- sidebarType: ISSUABLE,
- });
- });
-
- it("calls 'setActiveId' when epic swimlanes is active", async () => {
- const setActiveId = jest.fn();
- const isSwimlanesOn = () => true;
- createStore({
- getters: { isSwimlanesOn },
- actions: {
- setActiveId,
- },
- });
- mountComponent();
-
- wrapper.trigger('mouseup');
- await wrapper.vm.$nextTick();
-
- expect(setActiveId).toHaveBeenCalledTimes(1);
- expect(setActiveId).toHaveBeenCalledWith(expect.any(Object), {
- id: mockIssue.id,
- sidebarType: ISSUABLE,
- });
- });
- });
-});
diff --git a/spec/frontend/boards/components/board_card_spec.js b/spec/frontend/boards/components/board_card_spec.js
index 5f26ae1bb3b..d68e0f9fc23 100644
--- a/spec/frontend/boards/components/board_card_spec.js
+++ b/spec/frontend/boards/components/board_card_spec.js
@@ -1,43 +1,49 @@
-/* global List */
-/* global ListAssignee */
-/* global ListLabel */
+import { createLocalVue, shallowMount } from '@vue/test-utils';
+import Vuex from 'vuex';
-import { mount } from '@vue/test-utils';
-
-import MockAdapter from 'axios-mock-adapter';
-import waitForPromises from 'helpers/wait_for_promises';
import BoardCard from '~/boards/components/board_card.vue';
-import issueCardInner from '~/boards/components/issue_card_inner.vue';
-import eventHub from '~/boards/eventhub';
-import store from '~/boards/stores';
-import boardsStore from '~/boards/stores/boards_store';
-import axios from '~/lib/utils/axios_utils';
-
-import sidebarEventHub from '~/sidebar/event_hub';
-import '~/boards/models/label';
-import '~/boards/models/assignee';
-import '~/boards/models/list';
-import userAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
-import { listObj, boardsMockInterceptor, setMockEndpoints } from '../mock_data';
-
-describe('BoardCard', () => {
- let wrapper;
- let mock;
- let list;
+import IssueCardInner from '~/boards/components/issue_card_inner.vue';
+import { inactiveId } from '~/boards/constants';
+import { mockLabelList, mockIssue } from '../mock_data';
- const findIssueCardInner = () => wrapper.find(issueCardInner);
- const findUserAvatarLink = () => wrapper.find(userAvatarLink);
+describe('Board card layout', () => {
+ let wrapper;
+ let store;
+ let mockActions;
+
+ const localVue = createLocalVue();
+ localVue.use(Vuex);
+
+ const createStore = ({ initialState = {}, isSwimlanesOn = false } = {}) => {
+ mockActions = {
+ toggleBoardItem: jest.fn(),
+ toggleBoardItemMultiSelection: jest.fn(),
+ };
+
+ store = new Vuex.Store({
+ state: {
+ activeId: inactiveId,
+ selectedBoardItems: [],
+ ...initialState,
+ },
+ actions: mockActions,
+ getters: {
+ isSwimlanesOn: () => isSwimlanesOn,
+ },
+ });
+ };
// this particular mount component needs to be used after the root beforeEach because it depends on list being initialized
- const mountComponent = (propsData) => {
- wrapper = mount(BoardCard, {
+ const mountComponent = ({ propsData = {}, provide = {} } = {}) => {
+ wrapper = shallowMount(BoardCard, {
+ localVue,
stubs: {
- issueCardInner,
+ IssueCardInner,
},
store,
propsData: {
- list,
- issue: list.issues[0],
+ list: mockLabelList,
+ issue: mockIssue,
disabled: false,
index: 0,
...propsData,
@@ -46,174 +52,94 @@ describe('BoardCard', () => {
groupId: null,
rootPath: '/',
scopedLabelsAvailable: false,
+ ...provide,
},
});
};
- const setupData = async () => {
- list = new List(listObj);
- boardsStore.create();
- boardsStore.detail.issue = {};
- const label1 = new ListLabel({
- id: 3,
- title: 'testing 123',
- color: '#000cff',
- text_color: 'white',
- description: 'test',
- });
- await waitForPromises();
-
- list.issues[0].labels.push(label1);
+ const selectCard = async () => {
+ wrapper.trigger('mouseup');
+ await wrapper.vm.$nextTick();
};
- beforeEach(() => {
- mock = new MockAdapter(axios);
- mock.onAny().reply(boardsMockInterceptor);
- setMockEndpoints();
- return setupData();
- });
+ const multiSelectCard = async () => {
+ wrapper.trigger('mouseup', { ctrlKey: true });
+ await wrapper.vm.$nextTick();
+ };
afterEach(() => {
wrapper.destroy();
wrapper = null;
- list = null;
- mock.restore();
- });
-
- it('when details issue is empty does not show the element', () => {
- mountComponent();
- expect(wrapper.find('[data-testid="board_card"').classes()).not.toContain('is-active');
- });
-
- it('when detailIssue is equal to card issue shows the element', () => {
- [boardsStore.detail.issue] = list.issues;
- mountComponent();
-
- expect(wrapper.classes()).toContain('is-active');
- });
-
- it('when multiSelect does not contain issue removes multi select class', () => {
- mountComponent();
- expect(wrapper.classes()).not.toContain('multi-select');
- });
-
- it('when multiSelect contain issue add multi select class', () => {
- boardsStore.multiSelect.list = [list.issues[0]];
- mountComponent();
-
- expect(wrapper.classes()).toContain('multi-select');
- });
-
- it('adds user-can-drag class if not disabled', () => {
- mountComponent();
- expect(wrapper.classes()).toContain('user-can-drag');
- });
-
- it('does not add user-can-drag class disabled', () => {
- mountComponent({ disabled: true });
-
- expect(wrapper.classes()).not.toContain('user-can-drag');
- });
-
- it('does not add disabled class', () => {
- mountComponent();
- expect(wrapper.classes()).not.toContain('is-disabled');
+ store = null;
});
- it('adds disabled class is disabled is true', () => {
- mountComponent({ disabled: true });
-
- expect(wrapper.classes()).toContain('is-disabled');
- });
-
- describe('mouse events', () => {
- it('does not set detail issue if showDetail is false', () => {
+ describe.each`
+ isSwimlanesOn
+ ${true} | ${false}
+ `('when isSwimlanesOn is $isSwimlanesOn', ({ isSwimlanesOn }) => {
+ it('should not highlight the card by default', async () => {
+ createStore({ isSwimlanesOn });
mountComponent();
- expect(boardsStore.detail.issue).toEqual({});
- });
- it('does not set detail issue if link is clicked', () => {
- mountComponent();
- findIssueCardInner().find('a').trigger('mouseup');
-
- expect(boardsStore.detail.issue).toEqual({});
+ expect(wrapper.classes()).not.toContain('is-active');
+ expect(wrapper.classes()).not.toContain('multi-select');
});
- it('does not set detail issue if img is clicked', () => {
- mountComponent({
- issue: {
- ...list.issues[0],
- assignees: [
- new ListAssignee({
- id: 1,
- name: 'testing 123',
- username: 'test',
- avatar: 'test_image',
- }),
- ],
+ it('should highlight the card with a correct style when selected', async () => {
+ createStore({
+ initialState: {
+ activeId: mockIssue.id,
},
+ isSwimlanesOn,
});
-
- findUserAvatarLink().trigger('mouseup');
-
- expect(boardsStore.detail.issue).toEqual({});
- });
-
- it('does not set detail issue if showDetail is false after mouseup', () => {
- mountComponent();
- wrapper.trigger('mouseup');
-
- expect(boardsStore.detail.issue).toEqual({});
- });
-
- it('sets detail issue to card issue on mouse up', () => {
- jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
-
mountComponent();
- wrapper.trigger('mousedown');
- wrapper.trigger('mouseup');
-
- expect(eventHub.$emit).toHaveBeenCalledWith('newDetailIssue', wrapper.vm.issue, false);
- expect(boardsStore.detail.list).toEqual(wrapper.vm.list);
+ expect(wrapper.classes()).toContain('is-active');
+ expect(wrapper.classes()).not.toContain('multi-select');
});
- it('resets detail issue to empty if already set', () => {
- jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
- const [issue] = list.issues;
- boardsStore.detail.issue = issue;
+ it('should highlight the card with a correct style when multi-selected', async () => {
+ createStore({
+ initialState: {
+ activeId: inactiveId,
+ selectedBoardItems: [mockIssue],
+ },
+ isSwimlanesOn,
+ });
mountComponent();
- wrapper.trigger('mousedown');
- wrapper.trigger('mouseup');
-
- expect(eventHub.$emit).toHaveBeenCalledWith('clearDetailIssue', false);
+ expect(wrapper.classes()).toContain('multi-select');
+ expect(wrapper.classes()).not.toContain('is-active');
});
- });
-
- describe('sidebarHub events', () => {
- it('closes all sidebars before showing an issue if no issues are opened', () => {
- jest.spyOn(sidebarEventHub, '$emit').mockImplementation(() => {});
- boardsStore.detail.issue = {};
- mountComponent();
-
- // sets conditional so that event is emitted.
- wrapper.trigger('mousedown');
- wrapper.trigger('mouseup');
+ describe('when mouseup event is called on the issue card', () => {
+ beforeEach(() => {
+ createStore({ isSwimlanesOn });
+ mountComponent();
+ });
- expect(sidebarEventHub.$emit).toHaveBeenCalledWith('sidebar.closeAll');
- });
+ describe('when not using multi-select', () => {
+ it('should call vuex action "toggleBoardItem" with correct parameters', async () => {
+ await selectCard();
- it('it does not closes all sidebars before showing an issue if an issue is opened', () => {
- jest.spyOn(sidebarEventHub, '$emit').mockImplementation(() => {});
- const [issue] = list.issues;
- boardsStore.detail.issue = issue;
- mountComponent();
+ expect(mockActions.toggleBoardItem).toHaveBeenCalledTimes(1);
+ expect(mockActions.toggleBoardItem).toHaveBeenCalledWith(expect.any(Object), {
+ boardItem: mockIssue,
+ });
+ });
+ });
- wrapper.trigger('mousedown');
+ describe('when using multi-select', () => {
+ it('should call vuex action "multiSelectBoardItem" with correct parameters', async () => {
+ await multiSelectCard();
- expect(sidebarEventHub.$emit).not.toHaveBeenCalledWith('sidebar.closeAll');
+ expect(mockActions.toggleBoardItemMultiSelection).toHaveBeenCalledTimes(1);
+ expect(mockActions.toggleBoardItemMultiSelection).toHaveBeenCalledWith(
+ expect.any(Object),
+ mockIssue,
+ );
+ });
+ });
});
});
});
diff --git a/spec/frontend/boards/components/sidebar/board_sidebar_due_date_spec.js b/spec/frontend/boards/components/sidebar/board_sidebar_due_date_spec.js
index 7838b5a0b2f..8fd178a0856 100644
--- a/spec/frontend/boards/components/sidebar/board_sidebar_due_date_spec.js
+++ b/spec/frontend/boards/components/sidebar/board_sidebar_due_date_spec.js
@@ -24,7 +24,7 @@ describe('~/boards/components/sidebar/board_sidebar_due_date.vue', () => {
const createWrapper = ({ dueDate = null } = {}) => {
store = createStore();
- store.state.issues = { [TEST_ISSUE.id]: { ...TEST_ISSUE, dueDate } };
+ store.state.boardItems = { [TEST_ISSUE.id]: { ...TEST_ISSUE, dueDate } };
store.state.activeId = TEST_ISSUE.id;
wrapper = shallowMount(BoardSidebarDueDate, {
@@ -61,7 +61,7 @@ describe('~/boards/components/sidebar/board_sidebar_due_date.vue', () => {
createWrapper();
jest.spyOn(wrapper.vm, 'setActiveIssueDueDate').mockImplementation(() => {
- store.state.issues[TEST_ISSUE.id].dueDate = TEST_DUE_DATE;
+ store.state.boardItems[TEST_ISSUE.id].dueDate = TEST_DUE_DATE;
});
findDatePicker().vm.$emit('input', TEST_PARSED_DATE);
await wrapper.vm.$nextTick();
@@ -86,7 +86,7 @@ describe('~/boards/components/sidebar/board_sidebar_due_date.vue', () => {
createWrapper();
jest.spyOn(wrapper.vm, 'setActiveIssueDueDate').mockImplementation(() => {
- store.state.issues[TEST_ISSUE.id].dueDate = null;
+ store.state.boardItems[TEST_ISSUE.id].dueDate = null;
});
findDatePicker().vm.$emit('clear');
await wrapper.vm.$nextTick();
@@ -104,7 +104,7 @@ describe('~/boards/components/sidebar/board_sidebar_due_date.vue', () => {
createWrapper({ dueDate: TEST_DUE_DATE });
jest.spyOn(wrapper.vm, 'setActiveIssueDueDate').mockImplementation(() => {
- store.state.issues[TEST_ISSUE.id].dueDate = null;
+ store.state.boardItems[TEST_ISSUE.id].dueDate = null;
});
findResetButton().vm.$emit('click');
await wrapper.vm.$nextTick();
diff --git a/spec/frontend/boards/components/sidebar/board_sidebar_issue_title_spec.js b/spec/frontend/boards/components/sidebar/board_sidebar_issue_title_spec.js
index bc7df1c76c6..723d0345f76 100644
--- a/spec/frontend/boards/components/sidebar/board_sidebar_issue_title_spec.js
+++ b/spec/frontend/boards/components/sidebar/board_sidebar_issue_title_spec.js
@@ -34,7 +34,7 @@ describe('~/boards/components/sidebar/board_sidebar_issue_title.vue', () => {
const createWrapper = (issue = TEST_ISSUE_A) => {
store = createStore();
- store.state.issues = { [issue.id]: { ...issue } };
+ store.state.boardItems = { [issue.id]: { ...issue } };
store.dispatch('setActiveId', { id: issue.id });
wrapper = shallowMount(BoardSidebarIssueTitle, {
@@ -74,7 +74,7 @@ describe('~/boards/components/sidebar/board_sidebar_issue_title.vue', () => {
createWrapper();
jest.spyOn(wrapper.vm, 'setActiveIssueTitle').mockImplementation(() => {
- store.state.issues[TEST_ISSUE_A.id].title = TEST_TITLE;
+ store.state.boardItems[TEST_ISSUE_A.id].title = TEST_TITLE;
});
findFormInput().vm.$emit('input', TEST_TITLE);
findForm().vm.$emit('submit', { preventDefault: () => {} });
@@ -147,7 +147,7 @@ describe('~/boards/components/sidebar/board_sidebar_issue_title.vue', () => {
createWrapper(TEST_ISSUE_B);
jest.spyOn(wrapper.vm, 'setActiveIssueTitle').mockImplementation(() => {
- store.state.issues[TEST_ISSUE_B.id].title = TEST_TITLE;
+ store.state.boardItems[TEST_ISSUE_B.id].title = TEST_TITLE;
});
findFormInput().vm.$emit('input', TEST_TITLE);
findCancelButton().vm.$emit('click');
diff --git a/spec/frontend/boards/components/sidebar/board_sidebar_labels_select_spec.js b/spec/frontend/boards/components/sidebar/board_sidebar_labels_select_spec.js
index 12b873ba7d8..98ac211238c 100644
--- a/spec/frontend/boards/components/sidebar/board_sidebar_labels_select_spec.js
+++ b/spec/frontend/boards/components/sidebar/board_sidebar_labels_select_spec.js
@@ -25,7 +25,7 @@ describe('~/boards/components/sidebar/board_sidebar_labels_select.vue', () => {
const createWrapper = ({ labels = [] } = {}) => {
store = createStore();
- store.state.issues = { [TEST_ISSUE.id]: { ...TEST_ISSUE, labels } };
+ store.state.boardItems = { [TEST_ISSUE.id]: { ...TEST_ISSUE, labels } };
store.state.activeId = TEST_ISSUE.id;
wrapper = shallowMount(BoardSidebarLabelsSelect, {
@@ -66,7 +66,7 @@ describe('~/boards/components/sidebar/board_sidebar_labels_select.vue', () => {
jest.spyOn(wrapper.vm, 'setActiveIssueLabels').mockImplementation(() => TEST_LABELS);
findLabelsSelect().vm.$emit('updateSelectedLabels', TEST_LABELS_PAYLOAD);
- store.state.issues[TEST_ISSUE.id].labels = TEST_LABELS;
+ store.state.boardItems[TEST_ISSUE.id].labels = TEST_LABELS;
await wrapper.vm.$nextTick();
});
diff --git a/spec/frontend/boards/components/sidebar/board_sidebar_milestone_select_spec.js b/spec/frontend/boards/components/sidebar/board_sidebar_milestone_select_spec.js
index 8820ec7ae63..8706424a296 100644
--- a/spec/frontend/boards/components/sidebar/board_sidebar_milestone_select_spec.js
+++ b/spec/frontend/boards/components/sidebar/board_sidebar_milestone_select_spec.js
@@ -22,7 +22,7 @@ describe('~/boards/components/sidebar/board_sidebar_milestone_select.vue', () =>
const createWrapper = ({ milestone = null, loading = false } = {}) => {
store = createStore();
- store.state.issues = { [TEST_ISSUE.id]: { ...TEST_ISSUE, milestone } };
+ store.state.boardItems = { [TEST_ISSUE.id]: { ...TEST_ISSUE, milestone } };
store.state.activeId = TEST_ISSUE.id;
wrapper = shallowMount(BoardSidebarMilestoneSelect, {
@@ -113,7 +113,7 @@ describe('~/boards/components/sidebar/board_sidebar_milestone_select.vue', () =>
createWrapper();
jest.spyOn(wrapper.vm, 'setActiveIssueMilestone').mockImplementation(() => {
- store.state.issues[TEST_ISSUE.id].milestone = TEST_MILESTONE;
+ store.state.boardItems[TEST_ISSUE.id].milestone = TEST_MILESTONE;
});
findDropdownItem().vm.$emit('click');
await wrapper.vm.$nextTick();
@@ -137,7 +137,7 @@ describe('~/boards/components/sidebar/board_sidebar_milestone_select.vue', () =>
createWrapper({ milestone: TEST_MILESTONE });
jest.spyOn(wrapper.vm, 'setActiveIssueMilestone').mockImplementation(() => {
- store.state.issues[TEST_ISSUE.id].milestone = null;
+ store.state.boardItems[TEST_ISSUE.id].milestone = null;
});
findUnsetMilestoneItem().vm.$emit('click');
await wrapper.vm.$nextTick();
diff --git a/spec/frontend/boards/components/sidebar/board_sidebar_subscription_spec.js b/spec/frontend/boards/components/sidebar/board_sidebar_subscription_spec.js
index 3e6b0be0267..d2d10563ae5 100644
--- a/spec/frontend/boards/components/sidebar/board_sidebar_subscription_spec.js
+++ b/spec/frontend/boards/components/sidebar/board_sidebar_subscription_spec.js
@@ -22,7 +22,7 @@ describe('~/boards/components/sidebar/board_sidebar_subscription_spec.vue', () =
const createComponent = (activeIssue = { ...mockActiveIssue }) => {
store = createStore();
- store.state.issues = { [activeIssue.id]: activeIssue };
+ store.state.boardItems = { [activeIssue.id]: activeIssue };
store.state.activeId = activeIssue.id;
wrapper = mount(BoardSidebarSubscription, {
diff --git a/spec/frontend/boards/stores/actions_spec.js b/spec/frontend/boards/stores/actions_spec.js
index 32d0e7ae886..80d98c5eb6b 100644
--- a/spec/frontend/boards/stores/actions_spec.js
+++ b/spec/frontend/boards/stores/actions_spec.js
@@ -5,7 +5,7 @@ import {
formatBoardLists,
formatIssueInput,
} from '~/boards/boards_util';
-import { inactiveId } from '~/boards/constants';
+import { inactiveId, ISSUABLE } from '~/boards/constants';
import destroyBoardListMutation from '~/boards/graphql/board_list_destroy.mutation.graphql';
import issueCreateMutation from '~/boards/graphql/issue_create.mutation.graphql';
import issueMoveListMutation from '~/boards/graphql/issue_move_list.mutation.graphql';
@@ -112,6 +112,15 @@ describe('setActiveId', () => {
});
describe('fetchLists', () => {
+ it('should dispatch fetchIssueLists action', () => {
+ testAction({
+ action: actions.fetchLists,
+ expectedActions: [{ type: 'fetchIssueLists' }],
+ });
+ });
+});
+
+describe('fetchIssueLists', () => {
const state = {
fullPath: 'gitlab-org',
boardId: '1',
@@ -138,7 +147,7 @@ describe('fetchLists', () => {
jest.spyOn(gqlClient, 'query').mockResolvedValue(queryResponse);
testAction(
- actions.fetchLists,
+ actions.fetchIssueLists,
{},
state,
[
@@ -152,6 +161,23 @@ describe('fetchLists', () => {
);
});
+ it('should commit mutations RECEIVE_BOARD_LISTS_FAILURE on failure', (done) => {
+ jest.spyOn(gqlClient, 'query').mockResolvedValue(Promise.reject());
+
+ testAction(
+ actions.fetchIssueLists,
+ {},
+ state,
+ [
+ {
+ type: types.RECEIVE_BOARD_LISTS_FAILURE,
+ },
+ ],
+ [],
+ done,
+ );
+ });
+
it('dispatch createList action when backlog list does not exist and is not hidden', (done) => {
queryResponse = {
data: {
@@ -168,7 +194,7 @@ describe('fetchLists', () => {
jest.spyOn(gqlClient, 'query').mockResolvedValue(queryResponse);
testAction(
- actions.fetchLists,
+ actions.fetchIssueLists,
{},
state,
[
@@ -490,7 +516,7 @@ describe('removeList', () => {
});
});
-describe('fetchIssuesForList', () => {
+describe('fetchItemsForList', () => {
const listId = mockLists[0].id;
const state = {
@@ -533,21 +559,21 @@ describe('fetchIssuesForList', () => {
[listId]: pageInfo,
};
- it('should commit mutations REQUEST_ISSUES_FOR_LIST and RECEIVE_ISSUES_FOR_LIST_SUCCESS on success', (done) => {
+ it('should commit mutations REQUEST_ITEMS_FOR_LIST and RECEIVE_ITEMS_FOR_LIST_SUCCESS on success', (done) => {
jest.spyOn(gqlClient, 'query').mockResolvedValue(queryResponse);
testAction(
- actions.fetchIssuesForList,
+ actions.fetchItemsForList,
{ listId },
state,
[
{
- type: types.REQUEST_ISSUES_FOR_LIST,
+ type: types.REQUEST_ITEMS_FOR_LIST,
payload: { listId, fetchNext: false },
},
{
- type: types.RECEIVE_ISSUES_FOR_LIST_SUCCESS,
- payload: { listIssues: formattedIssues, listPageInfo, listId },
+ type: types.RECEIVE_ITEMS_FOR_LIST_SUCCESS,
+ payload: { listItems: formattedIssues, listPageInfo, listId },
},
],
[],
@@ -555,19 +581,19 @@ describe('fetchIssuesForList', () => {
);
});
- it('should commit mutations REQUEST_ISSUES_FOR_LIST and RECEIVE_ISSUES_FOR_LIST_FAILURE on failure', (done) => {
+ it('should commit mutations REQUEST_ITEMS_FOR_LIST and RECEIVE_ITEMS_FOR_LIST_FAILURE on failure', (done) => {
jest.spyOn(gqlClient, 'query').mockResolvedValue(Promise.reject());
testAction(
- actions.fetchIssuesForList,
+ actions.fetchItemsForList,
{ listId },
state,
[
{
- type: types.REQUEST_ISSUES_FOR_LIST,
+ type: types.REQUEST_ITEMS_FOR_LIST,
payload: { listId, fetchNext: false },
},
- { type: types.RECEIVE_ISSUES_FOR_LIST_FAILURE, payload: listId },
+ { type: types.RECEIVE_ITEMS_FOR_LIST_FAILURE, payload: listId },
],
[],
done,
@@ -598,8 +624,8 @@ describe('moveIssue', () => {
boardType: 'group',
disabled: false,
boardLists: mockLists,
- issuesByListId: listIssues,
- issues,
+ boardItemsByListId: listIssues,
+ boardItems: issues,
};
it('should commit MOVE_ISSUE mutation and MOVE_ISSUE_SUCCESS mutation when successful', (done) => {
@@ -879,7 +905,7 @@ describe('addListIssue', () => {
});
describe('setActiveIssueLabels', () => {
- const state = { issues: { [mockIssue.id]: mockIssue } };
+ const state = { boardItems: { [mockIssue.id]: mockIssue } };
const getters = { activeIssue: mockIssue };
const testLabelIds = labels.map((label) => label.id);
const input = {
@@ -924,7 +950,7 @@ describe('setActiveIssueLabels', () => {
});
describe('setActiveIssueDueDate', () => {
- const state = { issues: { [mockIssue.id]: mockIssue } };
+ const state = { boardItems: { [mockIssue.id]: mockIssue } };
const getters = { activeIssue: mockIssue };
const testDueDate = '2020-02-20';
const input = {
@@ -975,7 +1001,7 @@ describe('setActiveIssueDueDate', () => {
});
describe('setActiveIssueSubscribed', () => {
- const state = { issues: { [mockActiveIssue.id]: mockActiveIssue } };
+ const state = { boardItems: { [mockActiveIssue.id]: mockActiveIssue } };
const getters = { activeIssue: mockActiveIssue };
const subscribedState = true;
const input = {
@@ -1026,7 +1052,7 @@ describe('setActiveIssueSubscribed', () => {
});
describe('setActiveIssueMilestone', () => {
- const state = { issues: { [mockIssue.id]: mockIssue } };
+ const state = { boardItems: { [mockIssue.id]: mockIssue } };
const getters = { activeIssue: mockIssue };
const testMilestone = {
...mockMilestone,
@@ -1080,7 +1106,7 @@ describe('setActiveIssueMilestone', () => {
});
describe('setActiveIssueTitle', () => {
- const state = { issues: { [mockIssue.id]: mockIssue } };
+ const state = { boardItems: { [mockIssue.id]: mockIssue } };
const getters = { activeIssue: mockIssue };
const testTitle = 'Test Title';
const input = {
@@ -1220,6 +1246,7 @@ describe('setSelectedProject', () => {
describe('toggleBoardItemMultiSelection', () => {
const boardItem = mockIssue;
+ const boardItem2 = mockIssue2;
it('should commit mutation ADD_BOARD_ITEM_TO_SELECTION if item is not on selection state', () => {
testAction(
@@ -1250,6 +1277,66 @@ describe('toggleBoardItemMultiSelection', () => {
[],
);
});
+
+ it('should additionally commit mutation ADD_BOARD_ITEM_TO_SELECTION for active issue and dispatch unsetActiveId', () => {
+ testAction(
+ actions.toggleBoardItemMultiSelection,
+ boardItem2,
+ { activeId: mockActiveIssue.id, activeIssue: mockActiveIssue, selectedBoardItems: [] },
+ [
+ {
+ type: types.ADD_BOARD_ITEM_TO_SELECTION,
+ payload: mockActiveIssue,
+ },
+ {
+ type: types.ADD_BOARD_ITEM_TO_SELECTION,
+ payload: boardItem2,
+ },
+ ],
+ [{ type: 'unsetActiveId' }],
+ );
+ });
+});
+
+describe('resetBoardItemMultiSelection', () => {
+ it('should commit mutation RESET_BOARD_ITEM_SELECTION', () => {
+ testAction({
+ action: actions.resetBoardItemMultiSelection,
+ state: { selectedBoardItems: [mockIssue] },
+ expectedMutations: [
+ {
+ type: types.RESET_BOARD_ITEM_SELECTION,
+ },
+ ],
+ });
+ });
+});
+
+describe('toggleBoardItem', () => {
+ it('should dispatch resetBoardItemMultiSelection and unsetActiveId when boardItem is the active item', () => {
+ testAction({
+ action: actions.toggleBoardItem,
+ payload: { boardItem: mockIssue },
+ state: {
+ activeId: mockIssue.id,
+ },
+ expectedActions: [{ type: 'resetBoardItemMultiSelection' }, { type: 'unsetActiveId' }],
+ });
+ });
+
+ it('should dispatch resetBoardItemMultiSelection and setActiveId when boardItem is not the active item', () => {
+ testAction({
+ action: actions.toggleBoardItem,
+ payload: { boardItem: mockIssue },
+ state: {
+ activeId: inactiveId,
+ },
+ expectedActions: [
+ { type: 'resetBoardItemMultiSelection' },
+ { type: 'setActiveId', payload: { id: mockIssue.id, sidebarType: ISSUABLE } },
+ ],
+ });
+ });
});
describe('fetchBacklog', () => {
diff --git a/spec/frontend/boards/stores/getters_spec.js b/spec/frontend/boards/stores/getters_spec.js
index d5a19bf613f..d030b34ef80 100644
--- a/spec/frontend/boards/stores/getters_spec.js
+++ b/spec/frontend/boards/stores/getters_spec.js
@@ -38,15 +38,15 @@ describe('Boards - Getters', () => {
});
});
- describe('getIssueById', () => {
- const state = { issues: { 1: 'issue' } };
+ describe('getBoardItemById', () => {
+ const state = { boardItems: { 1: 'issue' } };
it.each`
id | expected
${'1'} | ${'issue'}
${''} | ${{}}
`('returns $expected when $id is passed to state', ({ id, expected }) => {
- expect(getters.getIssueById(state)(id)).toEqual(expected);
+ expect(getters.getBoardItemById(state)(id)).toEqual(expected);
});
});
@@ -56,7 +56,7 @@ describe('Boards - Getters', () => {
${'1'} | ${'issue'}
${''} | ${{}}
`('returns $expected when $id is passed to state', ({ id, expected }) => {
- const state = { issues: { 1: 'issue' }, activeId: id };
+ const state = { boardItems: { 1: 'issue' }, activeId: id };
expect(getters.activeIssue(state)).toEqual(expected);
});
@@ -94,17 +94,18 @@ describe('Boards - Getters', () => {
});
});
- describe('getIssuesByList', () => {
+ describe('getBoardItemsByList', () => {
const boardsState = {
- issuesByListId: mockIssuesByListId,
- issues,
+ boardItemsByListId: mockIssuesByListId,
+ boardItems: issues,
};
it('returns issues for a given listId', () => {
- const getIssueById = (issueId) => [mockIssue, mockIssue2].find(({ id }) => id === issueId);
+ const getBoardItemById = (issueId) =>
+ [mockIssue, mockIssue2].find(({ id }) => id === issueId);
- expect(getters.getIssuesByList(boardsState, { getIssueById })('gid://gitlab/List/2')).toEqual(
- mockIssues,
- );
+ expect(
+ getters.getBoardItemsByList(boardsState, { getBoardItemById })('gid://gitlab/List/2'),
+ ).toEqual(mockIssues);
});
});
diff --git a/spec/frontend/boards/stores/mutations_spec.js b/spec/frontend/boards/stores/mutations_spec.js
index 9423f2ed583..2d7b80a997a 100644
--- a/spec/frontend/boards/stores/mutations_spec.js
+++ b/spec/frontend/boards/stores/mutations_spec.js
@@ -37,6 +37,7 @@ describe('Board Store Mutations', () => {
const boardConfig = {
milestoneTitle: 'Milestone 1',
};
+ const isEpicBoard = true;
mutations[types.SET_INITIAL_BOARD_DATA](state, {
boardId,
@@ -44,6 +45,7 @@ describe('Board Store Mutations', () => {
boardType,
disabled,
boardConfig,
+ isEpicBoard,
});
expect(state.boardId).toEqual(boardId);
@@ -51,6 +53,7 @@ describe('Board Store Mutations', () => {
expect(state.boardType).toEqual(boardType);
expect(state.disabled).toEqual(disabled);
expect(state.boardConfig).toEqual(boardConfig);
+ expect(state.isEpicBoard).toEqual(isEpicBoard);
});
});
@@ -219,24 +222,24 @@ describe('Board Store Mutations', () => {
});
describe('RESET_ISSUES', () => {
- it('should remove issues from issuesByListId state', () => {
- const issuesByListId = {
+ it('should remove issues from boardItemsByListId state', () => {
+ const boardItemsByListId = {
'gid://gitlab/List/1': [mockIssue.id],
};
state = {
...state,
- issuesByListId,
+ boardItemsByListId,
};
mutations[types.RESET_ISSUES](state);
- expect(state.issuesByListId).toEqual({ 'gid://gitlab/List/1': [] });
+ expect(state.boardItemsByListId).toEqual({ 'gid://gitlab/List/1': [] });
});
});
- describe('RECEIVE_ISSUES_FOR_LIST_SUCCESS', () => {
- it('updates issuesByListId and issues on state', () => {
+ describe('RECEIVE_ITEMS_FOR_LIST_SUCCESS', () => {
+ it('updates boardItemsByListId and issues on state', () => {
const listIssues = {
'gid://gitlab/List/1': [mockIssue.id],
};
@@ -246,10 +249,10 @@ describe('Board Store Mutations', () => {
state = {
...state,
- issuesByListId: {
+ boardItemsByListId: {
'gid://gitlab/List/1': [],
},
- issues: {},
+ boardItems: {},
boardLists: initialBoardListsState,
};
@@ -260,18 +263,18 @@ describe('Board Store Mutations', () => {
},
};
- mutations.RECEIVE_ISSUES_FOR_LIST_SUCCESS(state, {
- listIssues: { listData: listIssues, issues },
+ mutations.RECEIVE_ITEMS_FOR_LIST_SUCCESS(state, {
+ listItems: { listData: listIssues, boardItems: issues },
listPageInfo,
listId: 'gid://gitlab/List/1',
});
- expect(state.issuesByListId).toEqual(listIssues);
- expect(state.issues).toEqual(issues);
+ expect(state.boardItemsByListId).toEqual(listIssues);
+ expect(state.boardItems).toEqual(issues);
});
});
- describe('RECEIVE_ISSUES_FOR_LIST_FAILURE', () => {
+ describe('RECEIVE_ITEMS_FOR_LIST_FAILURE', () => {
it('sets error message', () => {
state = {
...state,
@@ -281,7 +284,7 @@ describe('Board Store Mutations', () => {
const listId = 'gid://gitlab/List/1';
- mutations.RECEIVE_ISSUES_FOR_LIST_FAILURE(state, listId);
+ mutations.RECEIVE_ITEMS_FOR_LIST_FAILURE(state, listId);
expect(state.error).toEqual(
'An error occurred while fetching the board issues. Please reload the page.',
@@ -303,7 +306,7 @@ describe('Board Store Mutations', () => {
state = {
...state,
error: undefined,
- issues: {
+ boardItems: {
...issue,
},
};
@@ -317,7 +320,7 @@ describe('Board Store Mutations', () => {
value,
});
- expect(state.issues[issueId]).toEqual({ ...issue[issueId], id: '2' });
+ expect(state.boardItems[issueId]).toEqual({ ...issue[issueId], id: '2' });
});
});
@@ -343,7 +346,7 @@ describe('Board Store Mutations', () => {
});
describe('MOVE_ISSUE', () => {
- it('updates issuesByListId, moving issue between lists', () => {
+ it('updates boardItemsByListId, moving issue between lists', () => {
const listIssues = {
'gid://gitlab/List/1': [mockIssue.id, mockIssue2.id],
'gid://gitlab/List/2': [],
@@ -356,9 +359,9 @@ describe('Board Store Mutations', () => {
state = {
...state,
- issuesByListId: listIssues,
+ boardItemsByListId: listIssues,
boardLists: initialBoardListsState,
- issues,
+ boardItems: issues,
};
mutations.MOVE_ISSUE(state, {
@@ -372,7 +375,7 @@ describe('Board Store Mutations', () => {
'gid://gitlab/List/2': [mockIssue2.id],
};
- expect(state.issuesByListId).toEqual(updatedListIssues);
+ expect(state.boardItemsByListId).toEqual(updatedListIssues);
});
});
@@ -384,19 +387,19 @@ describe('Board Store Mutations', () => {
state = {
...state,
- issues,
+ boardItems: issues,
};
mutations.MOVE_ISSUE_SUCCESS(state, {
issue: rawIssue,
});
- expect(state.issues).toEqual({ 436: { ...mockIssue, id: 436 } });
+ expect(state.boardItems).toEqual({ 436: { ...mockIssue, id: 436 } });
});
});
describe('MOVE_ISSUE_FAILURE', () => {
- it('updates issuesByListId, reverting moving issue between lists, and sets error message', () => {
+ it('updates boardItemsByListId, reverting moving issue between lists, and sets error message', () => {
const listIssues = {
'gid://gitlab/List/1': [mockIssue.id],
'gid://gitlab/List/2': [mockIssue2.id],
@@ -404,7 +407,7 @@ describe('Board Store Mutations', () => {
state = {
...state,
- issuesByListId: listIssues,
+ boardItemsByListId: listIssues,
boardLists: initialBoardListsState,
};
@@ -420,7 +423,7 @@ describe('Board Store Mutations', () => {
'gid://gitlab/List/2': [],
};
- expect(state.issuesByListId).toEqual(updatedListIssues);
+ expect(state.boardItemsByListId).toEqual(updatedListIssues);
expect(state.error).toEqual('An error occurred while moving the issue. Please try again.');
});
});
@@ -446,7 +449,7 @@ describe('Board Store Mutations', () => {
});
describe('ADD_ISSUE_TO_LIST', () => {
- it('adds issue to issues state and issue id in list in issuesByListId', () => {
+ it('adds issue to issues state and issue id in list in boardItemsByListId', () => {
const listIssues = {
'gid://gitlab/List/1': [mockIssue.id],
};
@@ -456,8 +459,8 @@ describe('Board Store Mutations', () => {
state = {
...state,
- issuesByListId: listIssues,
- issues,
+ boardItemsByListId: listIssues,
+ boardItems: issues,
boardLists: initialBoardListsState,
};
@@ -465,14 +468,14 @@ describe('Board Store Mutations', () => {
mutations.ADD_ISSUE_TO_LIST(state, { list: mockLists[0], issue: mockIssue2 });
- expect(state.issuesByListId['gid://gitlab/List/1']).toContain(mockIssue2.id);
- expect(state.issues[mockIssue2.id]).toEqual(mockIssue2);
+ expect(state.boardItemsByListId['gid://gitlab/List/1']).toContain(mockIssue2.id);
+ expect(state.boardItems[mockIssue2.id]).toEqual(mockIssue2);
expect(state.boardLists['gid://gitlab/List/1'].issuesCount).toBe(2);
});
});
describe('ADD_ISSUE_TO_LIST_FAILURE', () => {
- it('removes issue id from list in issuesByListId and sets error message', () => {
+ it('removes issue id from list in boardItemsByListId and sets error message', () => {
const listIssues = {
'gid://gitlab/List/1': [mockIssue.id, mockIssue2.id],
};
@@ -483,20 +486,20 @@ describe('Board Store Mutations', () => {
state = {
...state,
- issuesByListId: listIssues,
- issues,
+ boardItemsByListId: listIssues,
+ boardItems: issues,
boardLists: initialBoardListsState,
};
mutations.ADD_ISSUE_TO_LIST_FAILURE(state, { list: mockLists[0], issueId: mockIssue2.id });
- expect(state.issuesByListId['gid://gitlab/List/1']).not.toContain(mockIssue2.id);
+ expect(state.boardItemsByListId['gid://gitlab/List/1']).not.toContain(mockIssue2.id);
expect(state.error).toBe('An error occurred while creating the issue. Please try again.');
});
});
describe('REMOVE_ISSUE_FROM_LIST', () => {
- it('removes issue id from list in issuesByListId and deletes issue from state', () => {
+ it('removes issue id from list in boardItemsByListId and deletes issue from state', () => {
const listIssues = {
'gid://gitlab/List/1': [mockIssue.id, mockIssue2.id],
};
@@ -507,15 +510,15 @@ describe('Board Store Mutations', () => {
state = {
...state,
- issuesByListId: listIssues,
- issues,
+ boardItemsByListId: listIssues,
+ boardItems: issues,
boardLists: initialBoardListsState,
};
mutations.ADD_ISSUE_TO_LIST_FAILURE(state, { list: mockLists[0], issueId: mockIssue2.id });
- expect(state.issuesByListId['gid://gitlab/List/1']).not.toContain(mockIssue2.id);
- expect(state.issues).not.toContain(mockIssue2);
+ expect(state.boardItemsByListId['gid://gitlab/List/1']).not.toContain(mockIssue2.id);
+ expect(state.boardItems).not.toContain(mockIssue2);
});
});
@@ -607,14 +610,21 @@ describe('Board Store Mutations', () => {
describe('REMOVE_BOARD_ITEM_FROM_SELECTION', () => {
it('Should remove boardItem to selectedBoardItems state', () => {
- state = {
- ...state,
- selectedBoardItems: [mockIssue],
- };
+ state.selectedBoardItems = [mockIssue];
mutations[types.REMOVE_BOARD_ITEM_FROM_SELECTION](state, mockIssue);
expect(state.selectedBoardItems).toEqual([]);
});
});
+
+ describe('RESET_BOARD_ITEM_SELECTION', () => {
+ it('Should reset selectedBoardItems state', () => {
+ state.selectedBoardItems = [mockIssue];
+
+ mutations[types.RESET_BOARD_ITEM_SELECTION](state, mockIssue);
+
+ expect(state.selectedBoardItems).toEqual([]);
+ });
+ });
});
diff --git a/spec/frontend/clusters_list/components/clusters_spec.js b/spec/frontend/clusters_list/components/clusters_spec.js
index f398d7a0965..941a3adb625 100644
--- a/spec/frontend/clusters_list/components/clusters_spec.js
+++ b/spec/frontend/clusters_list/components/clusters_spec.js
@@ -4,12 +4,12 @@ import {
GlDeprecatedSkeletonLoading as GlSkeletonLoading,
GlTable,
} from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
import { mount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import Clusters from '~/clusters_list/components/clusters.vue';
import ClusterStore from '~/clusters_list/store';
import axios from '~/lib/utils/axios_utils';
-import * as Sentry from '~/sentry/wrapper';
import { apiData } from '../mock_data';
describe('Clusters', () => {
diff --git a/spec/frontend/clusters_list/store/actions_spec.js b/spec/frontend/clusters_list/store/actions_spec.js
index 00b998166aa..b2ef3c2138a 100644
--- a/spec/frontend/clusters_list/store/actions_spec.js
+++ b/spec/frontend/clusters_list/store/actions_spec.js
@@ -1,3 +1,4 @@
+import * as Sentry from '@sentry/browser';
import MockAdapter from 'axios-mock-adapter';
import testAction from 'helpers/vuex_action_helper';
import waitForPromises from 'helpers/wait_for_promises';
@@ -7,7 +8,6 @@ import * as types from '~/clusters_list/store/mutation_types';
import { deprecatedCreateFlash as flashError } from '~/flash';
import axios from '~/lib/utils/axios_utils';
import Poll from '~/lib/utils/poll';
-import * as Sentry from '~/sentry/wrapper';
import { apiData } from '../mock_data';
jest.mock('~/flash.js');
diff --git a/spec/frontend/commit/pipelines/pipelines_spec.js b/spec/frontend/commit/pipelines/pipelines_spec.js
index f8bdd00f5da..3d6debda520 100644
--- a/spec/frontend/commit/pipelines/pipelines_spec.js
+++ b/spec/frontend/commit/pipelines/pipelines_spec.js
@@ -13,10 +13,8 @@ describe('Pipelines table in Commits and Merge requests', () => {
let vm;
const props = {
endpoint: 'endpoint.json',
- helpPagePath: 'foo',
emptyStateSvgPath: 'foo',
errorStateSvgPath: 'foo',
- autoDevopsHelpPath: 'foo',
};
preloadFixtures(jsonFixtureName);
diff --git a/spec/frontend/design_management/components/design_notes/design_discussion_spec.js b/spec/frontend/design_management/components/design_notes/design_discussion_spec.js
index 92e188f4bcc..efadb9b717d 100644
--- a/spec/frontend/design_management/components/design_notes/design_discussion_spec.js
+++ b/spec/frontend/design_management/components/design_notes/design_discussion_spec.js
@@ -93,7 +93,7 @@ describe('Design discussions component', () => {
});
it('does not render a checkbox in reply form', () => {
- findReplyPlaceholder().vm.$emit('onClick');
+ findReplyPlaceholder().vm.$emit('focus');
return wrapper.vm.$nextTick().then(() => {
expect(findResolveCheckbox().exists()).toBe(false);
@@ -124,7 +124,7 @@ describe('Design discussions component', () => {
});
it('renders a checkbox with Resolve thread text in reply form', () => {
- findReplyPlaceholder().vm.$emit('onClick');
+ findReplyPlaceholder().vm.$emit('focus');
wrapper.setProps({ discussionWithOpenForm: defaultMockDiscussion.id });
return wrapper.vm.$nextTick().then(() => {
@@ -193,7 +193,7 @@ describe('Design discussions component', () => {
});
it('renders a checkbox with Unresolve thread text in reply form', () => {
- findReplyPlaceholder().vm.$emit('onClick');
+ findReplyPlaceholder().vm.$emit('focus');
wrapper.setProps({ discussionWithOpenForm: defaultMockDiscussion.id });
return wrapper.vm.$nextTick().then(() => {
@@ -205,7 +205,7 @@ describe('Design discussions component', () => {
it('hides reply placeholder and opens form on placeholder click', () => {
createComponent();
- findReplyPlaceholder().vm.$emit('onClick');
+ findReplyPlaceholder().vm.$emit('focus');
wrapper.setProps({ discussionWithOpenForm: defaultMockDiscussion.id });
return wrapper.vm.$nextTick().then(() => {
@@ -307,7 +307,7 @@ describe('Design discussions component', () => {
it('emits openForm event on opening the form', () => {
createComponent();
- findReplyPlaceholder().vm.$emit('onClick');
+ findReplyPlaceholder().vm.$emit('focus');
expect(wrapper.emitted('open-form')).toBeTruthy();
});
diff --git a/spec/frontend/design_management/components/list/item_spec.js b/spec/frontend/design_management/components/list/item_spec.js
index caf0f8bb5bc..58636ece91e 100644
--- a/spec/frontend/design_management/components/list/item_spec.js
+++ b/spec/frontend/design_management/components/list/item_spec.js
@@ -8,7 +8,7 @@ const localVue = createLocalVue();
localVue.use(VueRouter);
const router = new VueRouter();
-// Referenced from: doc/api/graphql/reference/gitlab_schema.graphql:DesignVersionEvent
+// Referenced from: gitlab_schema.graphql:DesignVersionEvent
const DESIGN_VERSION_EVENT = {
CREATION: 'CREATION',
DELETION: 'DELETION',
diff --git a/spec/frontend/diffs/store/utils_spec.js b/spec/frontend/diffs/store/utils_spec.js
index dcb58f7a380..6af38590610 100644
--- a/spec/frontend/diffs/store/utils_spec.js
+++ b/spec/frontend/diffs/store/utils_spec.js
@@ -275,24 +275,28 @@ describe('DiffsStoreUtils', () => {
describe('trimFirstCharOfLineContent', () => {
it('trims the line when it starts with a space', () => {
+ // eslint-disable-next-line import/no-deprecated
expect(utils.trimFirstCharOfLineContent({ rich_text: ' diff' })).toEqual({
rich_text: 'diff',
});
});
it('trims the line when it starts with a +', () => {
+ // eslint-disable-next-line import/no-deprecated
expect(utils.trimFirstCharOfLineContent({ rich_text: '+diff' })).toEqual({
rich_text: 'diff',
});
});
it('trims the line when it starts with a -', () => {
+ // eslint-disable-next-line import/no-deprecated
expect(utils.trimFirstCharOfLineContent({ rich_text: '-diff' })).toEqual({
rich_text: 'diff',
});
});
it('does not trims the line when it starts with a letter', () => {
+ // eslint-disable-next-line import/no-deprecated
expect(utils.trimFirstCharOfLineContent({ rich_text: 'diff' })).toEqual({
rich_text: 'diff',
});
@@ -303,12 +307,14 @@ describe('DiffsStoreUtils', () => {
rich_text: ' diff',
};
+ // eslint-disable-next-line import/no-deprecated
utils.trimFirstCharOfLineContent(lineObj);
expect(lineObj).toEqual({ rich_text: ' diff' });
});
it('handles a undefined or null parameter', () => {
+ // eslint-disable-next-line import/no-deprecated
expect(utils.trimFirstCharOfLineContent()).toEqual({});
});
});
diff --git a/spec/frontend/experiment_tracking_spec.js b/spec/frontend/experiment_tracking_spec.js
new file mode 100644
index 00000000000..ac05419cecd
--- /dev/null
+++ b/spec/frontend/experiment_tracking_spec.js
@@ -0,0 +1,77 @@
+import ExperimentTracking from '~/experiment_tracking';
+import Tracking from '~/tracking';
+
+jest.mock('~/tracking');
+
+const oldGon = window.gon;
+
+let experimentTracking;
+let label;
+let newGon = {};
+
+const setup = () => {
+ window.gon = newGon;
+ experimentTracking = new ExperimentTracking('sidebar_experiment', label);
+};
+
+beforeEach(() => {
+ document.body.dataset.page = 'issues-page';
+});
+
+afterEach(() => {
+ window.gon = oldGon;
+ Tracking.mockClear();
+ label = undefined;
+});
+
+describe('event', () => {
+ describe('when experiment data exists for experimentName', () => {
+ beforeEach(() => {
+ newGon = { global: { experiment: { sidebar_experiment: 'experiment-data' } } };
+ setup();
+ });
+
+ describe('when providing options', () => {
+ label = { label: 'sidebar-drawer' };
+
+ it('passes them to the tracking call', () => {
+ experimentTracking.event('click_sidebar_close');
+
+ expect(Tracking.event).toHaveBeenCalledTimes(1);
+ expect(Tracking.event).toHaveBeenCalledWith('issues-page', 'click_sidebar_close', {
+ label: 'sidebar-drawer',
+ context: {
+ schema: 'iglu:com.gitlab/gitlab_experiment/jsonschema/1-0-0',
+ data: 'experiment-data',
+ },
+ });
+ });
+ });
+
+ it('tracks with the correct context', () => {
+ experimentTracking.event('click_sidebar_trigger');
+
+ expect(Tracking.event).toHaveBeenCalledTimes(1);
+ expect(Tracking.event).toHaveBeenCalledWith('issues-page', 'click_sidebar_trigger', {
+ label: undefined,
+ context: {
+ schema: 'iglu:com.gitlab/gitlab_experiment/jsonschema/1-0-0',
+ data: 'experiment-data',
+ },
+ });
+ });
+ });
+
+ describe('when experiment data does NOT exists for the experimentName', () => {
+ beforeEach(() => {
+ newGon = { global: { experiment: { unrelated_experiment: 'not happening' } } };
+ setup();
+ });
+
+ it('does not track', () => {
+ experimentTracking.event('click_sidebar_close');
+
+ expect(Tracking.event).not.toHaveBeenCalled();
+ });
+ });
+});
diff --git a/spec/frontend/feature_flags/components/edit_feature_flag_spec.js b/spec/frontend/feature_flags/components/edit_feature_flag_spec.js
index e2717b98ea9..2fd8e524e7a 100644
--- a/spec/frontend/feature_flags/components/edit_feature_flag_spec.js
+++ b/spec/frontend/feature_flags/components/edit_feature_flag_spec.js
@@ -150,5 +150,12 @@ describe('Edit feature flag form', () => {
label: 'feature_flag_toggle',
});
});
+
+ it('should render the toggle with a visually hidden label', () => {
+ expect(wrapper.find(GlToggle).props()).toMatchObject({
+ label: 'Feature flag status',
+ labelPosition: 'hidden',
+ });
+ });
});
});
diff --git a/spec/frontend/fixtures/pipelines.rb b/spec/frontend/fixtures/pipelines.rb
index b4b7f0e332f..2a538352abe 100644
--- a/spec/frontend/fixtures/pipelines.rb
+++ b/spec/frontend/fixtures/pipelines.rb
@@ -5,16 +5,22 @@ require 'spec_helper'
RSpec.describe Projects::PipelinesController, '(JavaScript fixtures)', type: :controller do
include JavaScriptFixturesHelpers
- let(:namespace) { create(:namespace, name: 'frontend-fixtures' )}
- let(:project) { create(:project, :repository, namespace: namespace, path: 'pipelines-project') }
- let(:commit) { create(:commit, project: project) }
- let(:commit_without_author) { RepoHelpers.another_sample_commit }
- let!(:user) { create(:user, developer_projects: [project], email: commit.author_email) }
- let!(:pipeline) { create(:ci_pipeline, project: project, sha: commit.id, user: user) }
+ let_it_be(:namespace) { create(:namespace, name: 'frontend-fixtures' )}
+ let_it_be(:project) { create(:project, :repository, namespace: namespace, path: 'pipelines-project') }
+
+ let_it_be(:commit_without_author) { RepoHelpers.another_sample_commit }
let!(:pipeline_without_author) { create(:ci_pipeline, project: project, sha: commit_without_author.id) }
- let!(:pipeline_without_commit) { create(:ci_pipeline, status: :success, project: project, sha: '0000') }
+ let!(:build_pipeline_without_author) { create(:ci_build, pipeline: pipeline_without_author, stage: 'test') }
- render_views
+ let_it_be(:pipeline_without_commit) { create(:ci_pipeline, status: :success, project: project, sha: '0000') }
+ let!(:build_pipeline_without_commit) { create(:ci_build, pipeline: pipeline_without_commit, stage: 'test') }
+
+ let(:commit) { create(:commit, project: project) }
+ let(:user) { create(:user, developer_projects: [project], email: commit.author_email) }
+ let!(:pipeline) { create(:ci_pipeline, :with_test_reports, project: project, sha: commit.id, user: user) }
+ let!(:build_success) { create(:ci_build, pipeline: pipeline, stage: 'build') }
+ let!(:build_test) { create(:ci_build, pipeline: pipeline, stage: 'test') }
+ let!(:build_deploy_failed) { create(:ci_build, status: :failed, pipeline: pipeline, stage: 'deploy') }
before(:all) do
clean_frontend_fixtures('pipelines/')
@@ -32,4 +38,14 @@ RSpec.describe Projects::PipelinesController, '(JavaScript fixtures)', type: :co
expect(response).to be_successful
end
+
+ it "pipelines/test_report.json" do
+ get :test_report, params: {
+ namespace_id: namespace,
+ project_id: project,
+ id: pipeline.id
+ }, format: :json
+
+ expect(response).to be_successful
+ end
end
diff --git a/spec/frontend/fixtures/test_report.rb b/spec/frontend/fixtures/test_report.rb
deleted file mode 100644
index 3d09078ba68..00000000000
--- a/spec/frontend/fixtures/test_report.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-RSpec.describe Projects::PipelinesController, "(JavaScript fixtures)", type: :controller do
- include JavaScriptFixturesHelpers
-
- let(:namespace) { create(:namespace, name: "frontend-fixtures") }
- let(:project) { create(:project, :repository, namespace: namespace, path: "pipelines-project") }
- let(:commit) { create(:commit, project: project) }
- let(:user) { create(:user, developer_projects: [project], email: commit.author_email) }
- let(:pipeline) { create(:ci_pipeline, :with_test_reports, project: project, user: user) }
-
- render_views
-
- before do
- sign_in(user)
- end
-
- it "pipelines/test_report.json" do
- get :test_report, params: {
- namespace_id: project.namespace,
- project_id: project,
- id: pipeline.id
- }, format: :json
-
- expect(response).to be_successful
- end
-end
diff --git a/spec/frontend/ide/components/pipelines/__snapshots__/list_spec.js.snap b/spec/frontend/ide/components/pipelines/__snapshots__/list_spec.js.snap
index efa58a4a47b..194a619c4aa 100644
--- a/spec/frontend/ide/components/pipelines/__snapshots__/list_spec.js.snap
+++ b/spec/frontend/ide/components/pipelines/__snapshots__/list_spec.js.snap
@@ -10,7 +10,6 @@ exports[`IDE pipelines list when loaded renders empty state when no latestPipeli
cansetci="true"
class="mb-auto mt-auto"
emptystatesvgpath="http://test.host"
- helppagepath="http://test.host"
/>
</div>
`;
diff --git a/spec/frontend/ide/components/pipelines/list_spec.js b/spec/frontend/ide/components/pipelines/list_spec.js
index 58d8c0629fb..a917f4c0230 100644
--- a/spec/frontend/ide/components/pipelines/list_spec.js
+++ b/spec/frontend/ide/components/pipelines/list_spec.js
@@ -19,7 +19,6 @@ describe('IDE pipelines list', () => {
let wrapper;
const defaultState = {
- links: { ciHelpPagePath: TEST_HOST },
pipelinesEmptyStateSvgPath: TEST_HOST,
};
const defaultPipelinesState = {
diff --git a/spec/frontend/ide/components/repo_editor_spec.js b/spec/frontend/ide/components/repo_editor_spec.js
index 1985feb1615..a3b327343e5 100644
--- a/spec/frontend/ide/components/repo_editor_spec.js
+++ b/spec/frontend/ide/components/repo_editor_spec.js
@@ -1,11 +1,15 @@
+import { shallowMount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
-import { Range } from 'monaco-editor';
+import { editor as monacoEditor, Range } from 'monaco-editor';
import Vue from 'vue';
import Vuex from 'vuex';
import '~/behaviors/markdown/render_gfm';
-import { createComponentWithStore } from 'helpers/vue_mount_component_helper';
import waitForPromises from 'helpers/wait_for_promises';
import waitUsingRealTimer from 'helpers/wait_using_real_timer';
+import { exampleConfigs, exampleFiles } from 'jest/ide/lib/editorconfig/mock_data';
+import { EDITOR_CODE_INSTANCE_FN, EDITOR_DIFF_INSTANCE_FN } from '~/editor/constants';
+import EditorLite from '~/editor/editor_lite';
+import { EditorWebIdeExtension } from '~/editor/extensions/editor_lite_webide_ext';
import RepoEditor from '~/ide/components/repo_editor.vue';
import {
leftSidebarViews,
@@ -13,733 +17,723 @@ import {
FILE_VIEW_MODE_PREVIEW,
viewerTypes,
} from '~/ide/constants';
-import Editor from '~/ide/lib/editor';
+import ModelManager from '~/ide/lib/common/model_manager';
import service from '~/ide/services';
import { createStoreOptions } from '~/ide/stores';
import axios from '~/lib/utils/axios_utils';
+import ContentViewer from '~/vue_shared/components/content_viewer/content_viewer.vue';
import { file } from '../helpers';
-import { exampleConfigs, exampleFiles } from '../lib/editorconfig/mock_data';
+
+const defaultFileProps = {
+ ...file('file.txt'),
+ content: 'hello world',
+ active: true,
+ tempFile: true,
+};
+const createActiveFile = (props) => {
+ return {
+ ...defaultFileProps,
+ ...props,
+ };
+};
+
+const dummyFile = {
+ markdown: (() =>
+ createActiveFile({
+ projectId: 'namespace/project',
+ path: 'sample.md',
+ name: 'sample.md',
+ }))(),
+ binary: (() =>
+ createActiveFile({
+ name: 'file.dat',
+ content: '🐱', // non-ascii binary content,
+ }))(),
+ empty: (() =>
+ createActiveFile({
+ tempFile: false,
+ content: '',
+ raw: '',
+ }))(),
+};
+
+const prepareStore = (state, activeFile) => {
+ const localState = {
+ openFiles: [activeFile],
+ projects: {
+ 'gitlab-org/gitlab': {
+ branches: {
+ master: {
+ name: 'master',
+ commit: {
+ id: 'abcdefgh',
+ },
+ },
+ },
+ },
+ },
+ currentProjectId: 'gitlab-org/gitlab',
+ currentBranchId: 'master',
+ entries: {
+ [activeFile.path]: activeFile,
+ },
+ };
+ const storeOptions = createStoreOptions();
+ return new Vuex.Store({
+ ...createStoreOptions(),
+ state: {
+ ...storeOptions.state,
+ ...localState,
+ ...state,
+ },
+ });
+};
describe('RepoEditor', () => {
+ let wrapper;
let vm;
- let store;
+ let createInstanceSpy;
+ let createDiffInstanceSpy;
+ let createModelSpy;
const waitForEditorSetup = () =>
new Promise((resolve) => {
vm.$once('editorSetup', resolve);
});
- const createComponent = () => {
- if (vm) {
- throw new Error('vm already exists');
- }
- vm = createComponentWithStore(Vue.extend(RepoEditor), store, {
- file: store.state.openFiles[0],
+ const createComponent = async ({ state = {}, activeFile = defaultFileProps } = {}) => {
+ const store = prepareStore(state, activeFile);
+ wrapper = shallowMount(RepoEditor, {
+ store,
+ propsData: {
+ file: store.state.openFiles[0],
+ },
+ mocks: {
+ ContentViewer,
+ },
});
-
+ await waitForPromises();
+ vm = wrapper.vm;
jest.spyOn(vm, 'getFileData').mockResolvedValue();
jest.spyOn(vm, 'getRawFileData').mockResolvedValue();
-
- vm.$mount();
};
- const createOpenFile = (path) => {
- const origFile = store.state.openFiles[0];
- const newFile = { ...origFile, path, key: path, name: 'myfile.txt', content: 'hello world' };
-
- store.state.entries[path] = newFile;
-
- store.state.openFiles = [newFile];
- };
+ const findEditor = () => wrapper.find('[data-testid="editor-container"]');
+ const findTabs = () => wrapper.findAll('.ide-mode-tabs .nav-links li');
+ const findPreviewTab = () => wrapper.find('[data-testid="preview-tab"]');
beforeEach(() => {
- const f = {
- ...file('file.txt'),
- content: 'hello world',
- };
-
- const storeOptions = createStoreOptions();
- store = new Vuex.Store(storeOptions);
-
- f.active = true;
- f.tempFile = true;
-
- store.state.openFiles.push(f);
- store.state.projects = {
- 'gitlab-org/gitlab': {
- branches: {
- master: {
- name: 'master',
- commit: {
- id: 'abcdefgh',
- },
- },
- },
- },
- };
- store.state.currentProjectId = 'gitlab-org/gitlab';
- store.state.currentBranchId = 'master';
-
- Vue.set(store.state.entries, f.path, f);
+ createInstanceSpy = jest.spyOn(EditorLite.prototype, EDITOR_CODE_INSTANCE_FN);
+ createDiffInstanceSpy = jest.spyOn(EditorLite.prototype, EDITOR_DIFF_INSTANCE_FN);
+ createModelSpy = jest.spyOn(monacoEditor, 'createModel');
+ jest.spyOn(service, 'getFileData').mockResolvedValue();
+ jest.spyOn(service, 'getRawFileData').mockResolvedValue();
});
afterEach(() => {
- vm.$destroy();
- vm = null;
-
- Editor.editorInstance.dispose();
+ jest.clearAllMocks();
+ // create a new model each time, otherwise tests conflict with each other
+ // because of same model being used in multiple tests
+ // eslint-disable-next-line no-undef
+ monaco.editor.getModels().forEach((model) => model.dispose());
+ wrapper.destroy();
+ wrapper = null;
});
- const findEditor = () => vm.$el.querySelector('.multi-file-editor-holder');
- const changeViewMode = (viewMode) =>
- store.dispatch('editor/updateFileEditor', { path: vm.file.path, data: { viewMode } });
-
describe('default', () => {
- beforeEach(() => {
- createComponent();
-
- return waitForEditorSetup();
+ it.each`
+ boolVal | textVal
+ ${true} | ${'all'}
+ ${false} | ${'none'}
+ `('sets renderWhitespace to "$textVal"', async ({ boolVal, textVal } = {}) => {
+ await createComponent({
+ state: {
+ renderWhitespaceInCode: boolVal,
+ },
+ });
+ expect(vm.editorOptions.renderWhitespace).toEqual(textVal);
});
- it('sets renderWhitespace to `all`', () => {
- vm.$store.state.renderWhitespaceInCode = true;
-
- expect(vm.editorOptions.renderWhitespace).toEqual('all');
+ it('renders an ide container', async () => {
+ await createComponent();
+ expect(findEditor().isVisible()).toBe(true);
});
- it('sets renderWhitespace to `none`', () => {
- vm.$store.state.renderWhitespaceInCode = false;
+ it('renders only an edit tab', async () => {
+ await createComponent();
+ const tabs = findTabs();
- expect(vm.editorOptions.renderWhitespace).toEqual('none');
+ expect(tabs).toHaveLength(1);
+ expect(tabs.at(0).text()).toBe('Edit');
});
+ });
- it('renders an ide container', () => {
- expect(vm.shouldHideEditor).toBeFalsy();
- expect(vm.showEditor).toBe(true);
- expect(findEditor()).not.toHaveCss({ display: 'none' });
- });
+ describe('when file is markdown', () => {
+ let mock;
+ let activeFile;
- it('renders only an edit tab', (done) => {
- Vue.nextTick(() => {
- const tabs = vm.$el.querySelectorAll('.ide-mode-tabs .nav-links li');
+ beforeEach(() => {
+ activeFile = dummyFile.markdown;
- expect(tabs.length).toBe(1);
- expect(tabs[0].textContent.trim()).toBe('Edit');
+ mock = new MockAdapter(axios);
- done();
+ mock.onPost(/(.*)\/preview_markdown/).reply(200, {
+ body: `<p>${defaultFileProps.content}</p>`,
});
});
- describe('when file is markdown', () => {
- let mock;
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
-
- mock.onPost(/(.*)\/preview_markdown/).reply(200, {
- body: '<p>testing 123</p>',
- });
-
- Vue.set(vm, 'file', {
- ...vm.file,
- projectId: 'namespace/project',
- path: 'sample.md',
- name: 'sample.md',
- content: 'testing 123',
- });
-
- vm.$store.state.entries[vm.file.path] = vm.file;
+ afterEach(() => {
+ mock.restore();
+ });
- return vm.$nextTick();
- });
+ it('renders an Edit and a Preview Tab', async () => {
+ await createComponent({ activeFile });
+ const tabs = findTabs();
- afterEach(() => {
- mock.restore();
- });
+ expect(tabs).toHaveLength(2);
+ expect(tabs.at(0).text()).toBe('Edit');
+ expect(tabs.at(1).text()).toBe('Preview Markdown');
+ });
- it('renders an Edit and a Preview Tab', (done) => {
- Vue.nextTick(() => {
- const tabs = vm.$el.querySelectorAll('.ide-mode-tabs .nav-links li');
+ it('renders markdown for tempFile', async () => {
+ // by default files created in the spec are temp: no need for explicitly sending the param
+ await createComponent({ activeFile });
- expect(tabs.length).toBe(2);
- expect(tabs[0].textContent.trim()).toBe('Edit');
- expect(tabs[1].textContent.trim()).toBe('Preview Markdown');
+ findPreviewTab().trigger('click');
+ await waitForPromises();
+ expect(wrapper.find(ContentViewer).html()).toContain(defaultFileProps.content);
+ });
- done();
- });
+ it('shows no tabs when not in Edit mode', async () => {
+ await createComponent({
+ state: {
+ currentActivityView: leftSidebarViews.review.name,
+ },
+ activeFile,
});
+ expect(findTabs()).toHaveLength(0);
+ });
+ });
- it('renders markdown for tempFile', (done) => {
- vm.file.tempFile = true;
-
- vm.$nextTick()
- .then(() => {
- vm.$el.querySelectorAll('.ide-mode-tabs .nav-links a')[1].click();
- })
- .then(waitForPromises)
- .then(() => {
- expect(vm.$el.querySelector('.preview-container').innerHTML).toContain(
- '<p>testing 123</p>',
- );
- })
- .then(done)
- .catch(done.fail);
- });
+ describe('when file is binary and not raw', () => {
+ beforeEach(async () => {
+ const activeFile = dummyFile.binary;
+ await createComponent({ activeFile });
+ });
- describe('when not in edit mode', () => {
- beforeEach(async () => {
- await vm.$nextTick();
+ it('does not render the IDE', () => {
+ expect(findEditor().isVisible()).toBe(false);
+ });
- vm.$store.state.currentActivityView = leftSidebarViews.review.name;
+ it('does not create an instance', () => {
+ expect(createInstanceSpy).not.toHaveBeenCalled();
+ expect(createDiffInstanceSpy).not.toHaveBeenCalled();
+ });
+ });
- return vm.$nextTick();
+ describe('createEditorInstance', () => {
+ it.each`
+ viewer | diffInstance
+ ${viewerTypes.edit} | ${undefined}
+ ${viewerTypes.diff} | ${true}
+ ${viewerTypes.mr} | ${true}
+ `(
+ 'creates instance of correct type when viewer is $viewer',
+ async ({ viewer, diffInstance }) => {
+ await createComponent({
+ state: { viewer },
});
+ const isDiff = () => {
+ return diffInstance ? { isDiff: true } : {};
+ };
+ expect(createInstanceSpy).toHaveBeenCalledWith(expect.objectContaining(isDiff()));
+ expect(createDiffInstanceSpy).toHaveBeenCalledTimes((diffInstance && 1) || 0);
+ },
+ );
- it('shows no tabs', () => {
- expect(vm.$el.querySelectorAll('.ide-mode-tabs .nav-links a')).toHaveLength(0);
+ it('installs the WebIDE extension', async () => {
+ const extensionSpy = jest.spyOn(EditorLite, 'instanceApplyExtension');
+ await createComponent();
+ expect(extensionSpy).toHaveBeenCalled();
+ Reflect.ownKeys(EditorWebIdeExtension.prototype)
+ .filter((fn) => fn !== 'constructor')
+ .forEach((fn) => {
+ expect(vm.editor[fn]).toBe(EditorWebIdeExtension.prototype[fn]);
});
- });
});
+ });
- describe('when open file is binary and not raw', () => {
- beforeEach((done) => {
- vm.file.name = 'file.dat';
- vm.file.content = '🐱'; // non-ascii binary content
- jest.spyOn(vm.editor, 'createInstance').mockImplementation();
- jest.spyOn(vm.editor, 'createDiffInstance').mockImplementation();
-
- vm.$nextTick(done);
- });
-
- it('does not render the IDE', () => {
- expect(vm.shouldHideEditor).toBeTruthy();
- });
-
- it('does not call createInstance', async () => {
- // Mirror the act's in the `createEditorInstance`
- vm.createEditorInstance();
-
- await vm.$nextTick();
+ describe('setupEditor', () => {
+ beforeEach(async () => {
+ await createComponent();
+ });
- expect(vm.editor.createInstance).not.toHaveBeenCalled();
- expect(vm.editor.createDiffInstance).not.toHaveBeenCalled();
- });
+ it('creates new model on load', () => {
+ // We always create two models per file to be able to build a diff of changes
+ expect(createModelSpy).toHaveBeenCalledTimes(2);
+ // The model with the most recent changes is the last one
+ const [content] = createModelSpy.mock.calls[1];
+ expect(content).toBe(defaultFileProps.content);
});
- describe('createEditorInstance', () => {
- it('calls createInstance when viewer is editor', (done) => {
- jest.spyOn(vm.editor, 'createInstance').mockImplementation();
+ it('does not create a new model on subsequent calls to setupEditor and re-uses the already-existing model', () => {
+ const existingModel = vm.model;
+ createModelSpy.mockClear();
- vm.createEditorInstance();
+ vm.setupEditor();
- vm.$nextTick(() => {
- expect(vm.editor.createInstance).toHaveBeenCalled();
+ expect(createModelSpy).not.toHaveBeenCalled();
+ expect(vm.model).toBe(existingModel);
+ });
- done();
- });
- });
+ it('adds callback methods', () => {
+ jest.spyOn(vm.editor, 'onPositionChange');
+ jest.spyOn(vm.model, 'onChange');
+ jest.spyOn(vm.model, 'updateOptions');
- it('calls createDiffInstance when viewer is diff', (done) => {
- vm.$store.state.viewer = 'diff';
+ vm.setupEditor();
- jest.spyOn(vm.editor, 'createDiffInstance').mockImplementation();
+ expect(vm.editor.onPositionChange).toHaveBeenCalledTimes(1);
+ expect(vm.model.onChange).toHaveBeenCalledTimes(1);
+ expect(vm.model.updateOptions).toHaveBeenCalledWith(vm.rules);
+ });
- vm.createEditorInstance();
+ it('updates state with the value of the model', () => {
+ const newContent = 'As Gregor Samsa\n awoke one morning\n';
+ vm.model.setValue(newContent);
- vm.$nextTick(() => {
- expect(vm.editor.createDiffInstance).toHaveBeenCalled();
+ vm.setupEditor();
- done();
- });
- });
+ expect(vm.file.content).toBe(newContent);
+ });
- it('calls createDiffInstance when viewer is a merge request diff', (done) => {
- vm.$store.state.viewer = 'mrdiff';
+ it('sets head model as staged file', () => {
+ vm.modelManager.dispose();
+ const addModelSpy = jest.spyOn(ModelManager.prototype, 'addModel');
- jest.spyOn(vm.editor, 'createDiffInstance').mockImplementation();
+ vm.$store.state.stagedFiles.push({ ...vm.file, key: 'staged' });
+ vm.file.staged = true;
+ vm.file.key = `unstaged-${vm.file.key}`;
- vm.createEditorInstance();
+ vm.setupEditor();
- vm.$nextTick(() => {
- expect(vm.editor.createDiffInstance).toHaveBeenCalled();
+ expect(addModelSpy).toHaveBeenCalledWith(vm.file, vm.$store.state.stagedFiles[0]);
+ });
+ });
- done();
- });
- });
+ describe('editor updateDimensions', () => {
+ let updateDimensionsSpy;
+ let updateDiffViewSpy;
+ beforeEach(async () => {
+ await createComponent();
+ updateDimensionsSpy = jest.spyOn(vm.editor, 'updateDimensions');
+ updateDiffViewSpy = jest.spyOn(vm.editor, 'updateDiffView').mockImplementation();
});
- describe('setupEditor', () => {
- it('creates new model', () => {
- jest.spyOn(vm.editor, 'createModel');
+ it('calls updateDimensions only when panelResizing is false', async () => {
+ expect(updateDimensionsSpy).not.toHaveBeenCalled();
+ expect(updateDiffViewSpy).not.toHaveBeenCalled();
+ expect(vm.$store.state.panelResizing).toBe(false); // default value
- Editor.editorInstance.modelManager.dispose();
+ vm.$store.state.panelResizing = true;
+ await vm.$nextTick();
- vm.setupEditor();
+ expect(updateDimensionsSpy).not.toHaveBeenCalled();
+ expect(updateDiffViewSpy).not.toHaveBeenCalled();
- expect(vm.editor.createModel).toHaveBeenCalledWith(vm.file, null);
- expect(vm.model).not.toBeNull();
- });
+ vm.$store.state.panelResizing = false;
+ await vm.$nextTick();
- it('attaches model to editor', () => {
- jest.spyOn(vm.editor, 'attachModel');
+ expect(updateDimensionsSpy).toHaveBeenCalledTimes(1);
+ expect(updateDiffViewSpy).toHaveBeenCalledTimes(1);
- Editor.editorInstance.modelManager.dispose();
+ vm.$store.state.panelResizing = true;
+ await vm.$nextTick();
- vm.setupEditor();
+ expect(updateDimensionsSpy).toHaveBeenCalledTimes(1);
+ expect(updateDiffViewSpy).toHaveBeenCalledTimes(1);
+ });
- expect(vm.editor.attachModel).toHaveBeenCalledWith(vm.model);
- });
+ it('calls updateDimensions when rightPane is toggled', async () => {
+ expect(updateDimensionsSpy).not.toHaveBeenCalled();
+ expect(updateDiffViewSpy).not.toHaveBeenCalled();
+ expect(vm.$store.state.rightPane.isOpen).toBe(false); // default value
- it('attaches model to merge request editor', () => {
- vm.$store.state.viewer = 'mrdiff';
- vm.file.mrChange = true;
- jest.spyOn(vm.editor, 'attachMergeRequestModel').mockImplementation();
+ vm.$store.state.rightPane.isOpen = true;
+ await vm.$nextTick();
- Editor.editorInstance.modelManager.dispose();
+ expect(updateDimensionsSpy).toHaveBeenCalledTimes(1);
+ expect(updateDiffViewSpy).toHaveBeenCalledTimes(1);
- vm.setupEditor();
+ vm.$store.state.rightPane.isOpen = false;
+ await vm.$nextTick();
- expect(vm.editor.attachMergeRequestModel).toHaveBeenCalledWith(vm.model);
- });
+ expect(updateDimensionsSpy).toHaveBeenCalledTimes(2);
+ expect(updateDiffViewSpy).toHaveBeenCalledTimes(2);
+ });
+ });
- it('does not attach model to merge request editor when not a MR change', () => {
- vm.$store.state.viewer = 'mrdiff';
- vm.file.mrChange = false;
- jest.spyOn(vm.editor, 'attachMergeRequestModel').mockImplementation();
+ describe('editor tabs', () => {
+ beforeEach(async () => {
+ await createComponent();
+ });
- Editor.editorInstance.modelManager.dispose();
+ it.each`
+ mode | isVisible
+ ${'edit'} | ${true}
+ ${'review'} | ${false}
+ ${'commit'} | ${false}
+ `('tabs in $mode are $isVisible', async ({ mode, isVisible } = {}) => {
+ vm.$store.state.currentActivityView = leftSidebarViews[mode].name;
- vm.setupEditor();
+ await vm.$nextTick();
+ expect(wrapper.find('.nav-links').exists()).toBe(isVisible);
+ });
+ });
- expect(vm.editor.attachMergeRequestModel).not.toHaveBeenCalledWith(vm.model);
+ describe('files in preview mode', () => {
+ let updateDimensionsSpy;
+ const changeViewMode = (viewMode) =>
+ vm.$store.dispatch('editor/updateFileEditor', {
+ path: vm.file.path,
+ data: { viewMode },
});
- it('adds callback methods', () => {
- jest.spyOn(vm.editor, 'onPositionChange');
-
- Editor.editorInstance.modelManager.dispose();
-
- vm.setupEditor();
-
- expect(vm.editor.onPositionChange).toHaveBeenCalled();
- expect(vm.model.events.size).toBe(2);
+ beforeEach(async () => {
+ await createComponent({
+ activeFile: dummyFile.markdown,
});
- it('updates state with the value of the model', () => {
- vm.model.setValue('testing 1234\n');
-
- vm.setupEditor();
-
- expect(vm.file.content).toBe('testing 1234\n');
- });
+ updateDimensionsSpy = jest.spyOn(vm.editor, 'updateDimensions');
- it('sets head model as staged file', () => {
- jest.spyOn(vm.editor, 'createModel');
+ changeViewMode(FILE_VIEW_MODE_PREVIEW);
+ await vm.$nextTick();
+ });
- Editor.editorInstance.modelManager.dispose();
+ it('do not show the editor', () => {
+ expect(vm.showEditor).toBe(false);
+ expect(findEditor().isVisible()).toBe(false);
+ });
- vm.$store.state.stagedFiles.push({ ...vm.file, key: 'staged' });
- vm.file.staged = true;
- vm.file.key = `unstaged-${vm.file.key}`;
+ it('updates dimensions when switching view back to edit', async () => {
+ expect(updateDimensionsSpy).not.toHaveBeenCalled();
- vm.setupEditor();
+ changeViewMode(FILE_VIEW_MODE_EDITOR);
+ await vm.$nextTick();
- expect(vm.editor.createModel).toHaveBeenCalledWith(vm.file, vm.$store.state.stagedFiles[0]);
- });
+ expect(updateDimensionsSpy).toHaveBeenCalled();
});
+ });
- describe('editor updateDimensions', () => {
- beforeEach(() => {
- jest.spyOn(vm.editor, 'updateDimensions');
- jest.spyOn(vm.editor, 'updateDiffView').mockImplementation();
- });
-
- it('calls updateDimensions when panelResizing is false', (done) => {
- vm.$store.state.panelResizing = true;
-
- vm.$nextTick()
- .then(() => {
- vm.$store.state.panelResizing = false;
- })
- .then(vm.$nextTick)
- .then(() => {
- expect(vm.editor.updateDimensions).toHaveBeenCalled();
- expect(vm.editor.updateDiffView).toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('does not call updateDimensions when panelResizing is true', (done) => {
- vm.$store.state.panelResizing = true;
+ describe('initEditor', () => {
+ const hideEditorAndRunFn = async () => {
+ jest.clearAllMocks();
+ jest.spyOn(vm, 'shouldHideEditor', 'get').mockReturnValue(true);
- vm.$nextTick(() => {
- expect(vm.editor.updateDimensions).not.toHaveBeenCalled();
- expect(vm.editor.updateDiffView).not.toHaveBeenCalled();
+ vm.initEditor();
+ await vm.$nextTick();
+ };
- done();
- });
+ it('does not fetch file information for temp entries', async () => {
+ await createComponent({
+ activeFile: createActiveFile(),
});
- it('calls updateDimensions when rightPane is opened', (done) => {
- vm.$store.state.rightPane.isOpen = true;
-
- vm.$nextTick(() => {
- expect(vm.editor.updateDimensions).toHaveBeenCalled();
- expect(vm.editor.updateDiffView).toHaveBeenCalled();
-
- done();
- });
- });
+ expect(vm.getFileData).not.toHaveBeenCalled();
});
- describe('show tabs', () => {
- it('shows tabs in edit mode', () => {
- expect(vm.$el.querySelector('.nav-links')).not.toBe(null);
+ it('is being initialised for files without content even if shouldHideEditor is `true`', async () => {
+ await createComponent({
+ activeFile: dummyFile.empty,
});
- it('hides tabs in review mode', (done) => {
- vm.$store.state.currentActivityView = leftSidebarViews.review.name;
+ await hideEditorAndRunFn();
- vm.$nextTick(() => {
- expect(vm.$el.querySelector('.nav-links')).toBe(null);
+ expect(vm.getFileData).toHaveBeenCalled();
+ expect(vm.getRawFileData).toHaveBeenCalled();
+ });
- done();
- });
+ it('does not initialize editor for files already with content when shouldHideEditor is `true`', async () => {
+ await createComponent({
+ activeFile: createActiveFile(),
});
- it('hides tabs in commit mode', (done) => {
- vm.$store.state.currentActivityView = leftSidebarViews.commit.name;
+ await hideEditorAndRunFn();
- vm.$nextTick(() => {
- expect(vm.$el.querySelector('.nav-links')).toBe(null);
+ expect(vm.getFileData).not.toHaveBeenCalled();
+ expect(vm.getRawFileData).not.toHaveBeenCalled();
+ expect(createInstanceSpy).not.toHaveBeenCalled();
+ });
+ });
- done();
- });
+ describe('updates on file changes', () => {
+ beforeEach(async () => {
+ await createComponent({
+ activeFile: createActiveFile({
+ content: 'foo', // need to prevent full cycle of initEditor
+ }),
});
+ jest.spyOn(vm, 'initEditor').mockImplementation();
});
- describe('when files view mode is preview', () => {
- beforeEach((done) => {
- jest.spyOn(vm.editor, 'updateDimensions').mockImplementation();
- changeViewMode(FILE_VIEW_MODE_PREVIEW);
- vm.file.name = 'myfile.md';
- vm.file.content = 'hello world';
+ it('calls removePendingTab when old file is pending', async () => {
+ jest.spyOn(vm, 'shouldHideEditor', 'get').mockReturnValue(true);
+ jest.spyOn(vm, 'removePendingTab').mockImplementation();
- vm.$nextTick(done);
- });
+ const origFile = vm.file;
+ vm.file.pending = true;
+ await vm.$nextTick();
- it('should hide editor', () => {
- expect(vm.showEditor).toBe(false);
- expect(findEditor()).toHaveCss({ display: 'none' });
+ wrapper.setProps({
+ file: file('testing'),
});
+ vm.file.content = 'foo'; // need to prevent full cycle of initEditor
+ await vm.$nextTick();
- describe('when file view mode changes to editor', () => {
- it('should update dimensions', () => {
- changeViewMode(FILE_VIEW_MODE_EDITOR);
-
- return vm.$nextTick().then(() => {
- expect(vm.editor.updateDimensions).toHaveBeenCalled();
- });
- });
- });
+ expect(vm.removePendingTab).toHaveBeenCalledWith(origFile);
});
- describe('initEditor', () => {
- beforeEach(() => {
- vm.file.tempFile = false;
- jest.spyOn(vm.editor, 'createInstance').mockImplementation();
- jest.spyOn(vm, 'shouldHideEditor', 'get').mockReturnValue(true);
- });
+ it('does not call initEditor if the file did not change', async () => {
+ Vue.set(vm, 'file', vm.file);
+ await vm.$nextTick();
- it('does not fetch file information for temp entries', (done) => {
- vm.file.tempFile = true;
-
- vm.initEditor();
- vm.$nextTick()
- .then(() => {
- expect(vm.getFileData).not.toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('is being initialised for files without content even if shouldHideEditor is `true`', (done) => {
- vm.file.content = '';
- vm.file.raw = '';
+ expect(vm.initEditor).not.toHaveBeenCalled();
+ });
- vm.initEditor();
+ it('calls initEditor when file key is changed', async () => {
+ expect(vm.initEditor).not.toHaveBeenCalled();
- vm.$nextTick()
- .then(() => {
- expect(vm.getFileData).toHaveBeenCalled();
- expect(vm.getRawFileData).toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ wrapper.setProps({
+ file: {
+ ...vm.file,
+ key: 'new',
+ },
});
+ await vm.$nextTick();
- it('does not initialize editor for files already with content', (done) => {
- vm.file.content = 'foo';
-
- vm.initEditor();
- vm.$nextTick()
- .then(() => {
- expect(vm.getFileData).not.toHaveBeenCalled();
- expect(vm.getRawFileData).not.toHaveBeenCalled();
- expect(vm.editor.createInstance).not.toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
- });
+ expect(vm.initEditor).toHaveBeenCalled();
+ });
+ });
+
+ describe('populates editor with the fetched content', () => {
+ const createRemoteFile = (name) => ({
+ ...file(name),
+ tmpFile: false,
});
- describe('updates on file changes', () => {
- beforeEach(() => {
- jest.spyOn(vm, 'initEditor').mockImplementation();
- });
+ beforeEach(async () => {
+ await createComponent();
+ vm.getRawFileData.mockRestore();
+ });
- it('calls removePendingTab when old file is pending', (done) => {
- jest.spyOn(vm, 'shouldHideEditor', 'get').mockReturnValue(true);
- jest.spyOn(vm, 'removePendingTab').mockImplementation();
+ it('after switching viewer from edit to diff', async () => {
+ const f = createRemoteFile('newFile');
+ Vue.set(vm.$store.state.entries, f.path, f);
- vm.file.pending = true;
+ jest.spyOn(service, 'getRawFileData').mockImplementation(async () => {
+ expect(vm.file.loading).toBe(true);
- vm.$nextTick()
- .then(() => {
- vm.file = file('testing');
- vm.file.content = 'foo'; // need to prevent full cycle of initEditor
+ // switching from edit to diff mode usually triggers editor initialization
+ vm.$store.state.viewer = viewerTypes.diff;
- return vm.$nextTick();
- })
- .then(() => {
- expect(vm.removePendingTab).toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ // we delay returning the file to make sure editor doesn't initialize before we fetch file content
+ await waitUsingRealTimer(30);
+ return 'rawFileData123\n';
});
- it('does not call initEditor if the file did not change', (done) => {
- Vue.set(vm, 'file', vm.file);
-
- vm.$nextTick()
- .then(() => {
- expect(vm.initEditor).not.toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ wrapper.setProps({
+ file: f,
});
- it('calls initEditor when file key is changed', (done) => {
- expect(vm.initEditor).not.toHaveBeenCalled();
+ await waitForEditorSetup();
+ expect(vm.model.getModel().getValue()).toBe('rawFileData123\n');
+ });
- Vue.set(vm, 'file', {
- ...vm.file,
- key: 'new',
+ it('after opening multiple files at the same time', async () => {
+ const fileA = createRemoteFile('fileA');
+ const aContent = 'fileA-rawContent\n';
+ const bContent = 'fileB-rawContent\n';
+ const fileB = createRemoteFile('fileB');
+ Vue.set(vm.$store.state.entries, fileA.path, fileA);
+ Vue.set(vm.$store.state.entries, fileB.path, fileB);
+
+ jest
+ .spyOn(service, 'getRawFileData')
+ .mockImplementation(async () => {
+ // opening fileB while the content of fileA is still being fetched
+ wrapper.setProps({
+ file: fileB,
+ });
+ return aContent;
+ })
+ .mockImplementationOnce(async () => {
+ // we delay returning fileB content to make sure the editor doesn't initialize prematurely
+ await waitUsingRealTimer(30);
+ return bContent;
});
- vm.$nextTick()
- .then(() => {
- expect(vm.initEditor).toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ wrapper.setProps({
+ file: fileA,
});
- });
- describe('populates editor with the fetched content', () => {
- beforeEach(() => {
- vm.getRawFileData.mockRestore();
- });
+ await waitForEditorSetup();
+ expect(vm.model.getModel().getValue()).toBe(bContent);
+ });
+ });
- const createRemoteFile = (name) => ({
- ...file(name),
- tmpFile: false,
+ describe('onPaste', () => {
+ const setFileName = (name) =>
+ createActiveFile({
+ content: 'hello world\n',
+ name,
+ path: `foo/${name}`,
+ key: 'new',
});
- it('after switching viewer from edit to diff', async () => {
- jest.spyOn(service, 'getRawFileData').mockImplementation(async () => {
- expect(vm.file.loading).toBe(true);
-
- // switching from edit to diff mode usually triggers editor initialization
- store.state.viewer = viewerTypes.diff;
+ const pasteImage = () => {
+ window.dispatchEvent(
+ Object.assign(new Event('paste'), {
+ clipboardData: {
+ files: [new File(['foo'], 'foo.png', { type: 'image/png' })],
+ },
+ }),
+ );
+ };
- // we delay returning the file to make sure editor doesn't initialize before we fetch file content
- await waitUsingRealTimer(30);
- return 'rawFileData123\n';
+ const watchState = (watched) =>
+ new Promise((resolve) => {
+ const unwatch = vm.$store.watch(watched, () => {
+ unwatch();
+ resolve();
});
-
- const f = createRemoteFile('newFile');
- Vue.set(store.state.entries, f.path, f);
-
- vm.file = f;
-
- await waitForEditorSetup();
- expect(vm.model.getModel().getValue()).toBe('rawFileData123\n');
});
- it('after opening multiple files at the same time', async () => {
- const fileA = createRemoteFile('fileA');
- const fileB = createRemoteFile('fileB');
- Vue.set(store.state.entries, fileA.path, fileA);
- Vue.set(store.state.entries, fileB.path, fileB);
-
- jest
- .spyOn(service, 'getRawFileData')
- .mockImplementationOnce(async () => {
- // opening fileB while the content of fileA is still being fetched
- vm.file = fileB;
- return 'fileA-rawContent\n';
- })
- .mockImplementationOnce(async () => {
- // we delay returning fileB content to make sure the editor doesn't initialize prematurely
- await waitUsingRealTimer(30);
- return 'fileB-rawContent\n';
- });
+ // Pasting an image does a lot of things like using the FileReader API,
+ // so, waitForPromises isn't very reliable (and causes a flaky spec)
+ // Read more about state.watch: https://vuex.vuejs.org/api/#watch
+ const waitForFileContentChange = () => watchState((s) => s.entries['foo/bar.md'].content);
- vm.file = fileA;
-
- await waitForEditorSetup();
- expect(vm.model.getModel().getValue()).toBe('fileB-rawContent\n');
+ beforeEach(async () => {
+ await createComponent({
+ state: {
+ trees: {
+ 'gitlab-org/gitlab': { tree: [] },
+ },
+ currentProjectId: 'gitlab-org',
+ currentBranchId: 'gitlab',
+ },
+ activeFile: setFileName('bar.md'),
});
- });
-
- describe('onPaste', () => {
- const setFileName = (name) => {
- Vue.set(vm, 'file', {
- ...vm.file,
- content: 'hello world\n',
- name,
- path: `foo/${name}`,
- key: 'new',
- });
- vm.$store.state.entries[vm.file.path] = vm.file;
- };
+ vm.setupEditor();
- const pasteImage = () => {
- window.dispatchEvent(
- Object.assign(new Event('paste'), {
- clipboardData: {
- files: [new File(['foo'], 'foo.png', { type: 'image/png' })],
- },
- }),
- );
- };
-
- const watchState = (watched) =>
- new Promise((resolve) => {
- const unwatch = vm.$store.watch(watched, () => {
- unwatch();
- resolve();
- });
- });
+ await waitForPromises();
+ // set cursor to line 2, column 1
+ vm.editor.setSelection(new Range(2, 1, 2, 1));
+ vm.editor.focus();
- // Pasting an image does a lot of things like using the FileReader API,
- // so, waitForPromises isn't very reliable (and causes a flaky spec)
- // Read more about state.watch: https://vuex.vuejs.org/api/#watch
- const waitForFileContentChange = () => watchState((s) => s.entries['foo/bar.md'].content);
-
- beforeEach(() => {
- setFileName('bar.md');
-
- vm.$store.state.trees['gitlab-org/gitlab'] = { tree: [] };
- vm.$store.state.currentProjectId = 'gitlab-org';
- vm.$store.state.currentBranchId = 'gitlab';
-
- // create a new model each time, otherwise tests conflict with each other
- // because of same model being used in multiple tests
- Editor.editorInstance.modelManager.dispose();
- vm.setupEditor();
+ jest.spyOn(vm.editor, 'hasTextFocus').mockReturnValue(true);
+ });
- return waitForPromises().then(() => {
- // set cursor to line 2, column 1
- vm.editor.instance.setSelection(new Range(2, 1, 2, 1));
- vm.editor.instance.focus();
+ it('adds an image entry to the same folder for a pasted image in a markdown file', async () => {
+ pasteImage();
- jest.spyOn(vm.editor.instance, 'hasTextFocus').mockReturnValue(true);
- });
+ await waitForFileContentChange();
+ expect(vm.$store.state.entries['foo/foo.png']).toMatchObject({
+ path: 'foo/foo.png',
+ type: 'blob',
+ content: 'Zm9v',
+ rawPath: 'data:image/png;base64,Zm9v',
});
+ });
- it('adds an image entry to the same folder for a pasted image in a markdown file', () => {
- pasteImage();
-
- return waitForFileContentChange().then(() => {
- expect(vm.$store.state.entries['foo/foo.png']).toMatchObject({
- path: 'foo/foo.png',
- type: 'blob',
- content: 'Zm9v',
- rawPath: 'data:image/png;base64,Zm9v',
- });
- });
- });
+ it("adds a markdown image tag to the file's contents", async () => {
+ pasteImage();
- it("adds a markdown image tag to the file's contents", () => {
- pasteImage();
+ await waitForFileContentChange();
+ expect(vm.file.content).toBe('hello world\n![foo.png](./foo.png)');
+ });
- return waitForFileContentChange().then(() => {
- expect(vm.file.content).toBe('hello world\n![foo.png](./foo.png)');
- });
+ it("does not add file to state or set markdown image syntax if the file isn't markdown", async () => {
+ wrapper.setProps({
+ file: setFileName('myfile.txt'),
});
+ pasteImage();
- it("does not add file to state or set markdown image syntax if the file isn't markdown", () => {
- setFileName('myfile.txt');
- pasteImage();
-
- return waitForPromises().then(() => {
- expect(vm.$store.state.entries['foo/foo.png']).toBeUndefined();
- expect(vm.file.content).toBe('hello world\n');
- });
- });
+ await waitForPromises();
+ expect(vm.$store.state.entries['foo/foo.png']).toBeUndefined();
+ expect(vm.file.content).toBe('hello world\n');
});
});
describe('fetchEditorconfigRules', () => {
- beforeEach(() => {
- exampleConfigs.forEach(({ path, content }) => {
- store.state.entries[path] = { ...file(), path, content };
- });
- });
-
it.each(exampleFiles)(
'does not fetch content from remote for .editorconfig files present locally (case %#)',
- ({ path, monacoRules }) => {
- createOpenFile(path);
- createComponent();
-
- return waitForEditorSetup().then(() => {
- expect(vm.rules).toEqual(monacoRules);
- expect(vm.model.options).toMatchObject(monacoRules);
- expect(vm.getFileData).not.toHaveBeenCalled();
- expect(vm.getRawFileData).not.toHaveBeenCalled();
+ async ({ path, monacoRules }) => {
+ await createComponent({
+ state: {
+ entries: (() => {
+ const res = {};
+ exampleConfigs.forEach(({ path: configPath, content }) => {
+ res[configPath] = { ...file(), path: configPath, content };
+ });
+ return res;
+ })(),
+ },
+ activeFile: createActiveFile({
+ path,
+ key: path,
+ name: 'myfile.txt',
+ content: 'hello world',
+ }),
});
+
+ expect(vm.rules).toEqual(monacoRules);
+ expect(vm.model.options).toMatchObject(monacoRules);
+ expect(vm.getFileData).not.toHaveBeenCalled();
+ expect(vm.getRawFileData).not.toHaveBeenCalled();
},
);
- it('fetches content from remote for .editorconfig files not available locally', () => {
- exampleConfigs.forEach(({ path }) => {
- delete store.state.entries[path].content;
- delete store.state.entries[path].raw;
+ it('fetches content from remote for .editorconfig files not available locally', async () => {
+ const activeFile = createActiveFile({
+ path: 'foo/bar/baz/test/my_spec.js',
+ key: 'foo/bar/baz/test/my_spec.js',
+ name: 'myfile.txt',
+ content: 'hello world',
+ });
+
+ const expectations = [
+ 'foo/bar/baz/.editorconfig',
+ 'foo/bar/.editorconfig',
+ 'foo/.editorconfig',
+ '.editorconfig',
+ ];
+
+ await createComponent({
+ state: {
+ entries: (() => {
+ const res = {
+ [activeFile.path]: activeFile,
+ };
+ exampleConfigs.forEach(({ path: configPath }) => {
+ const f = { ...file(), path: configPath };
+ delete f.content;
+ delete f.raw;
+ res[configPath] = f;
+ });
+ return res;
+ })(),
+ },
+ activeFile,
});
- // Include a "test" directory which does not exist in store. This one should be skipped.
- createOpenFile('foo/bar/baz/test/my_spec.js');
- createComponent();
-
- return waitForEditorSetup().then(() => {
- expect(vm.getFileData.mock.calls.map(([args]) => args)).toEqual([
- { makeFileActive: false, path: 'foo/bar/baz/.editorconfig' },
- { makeFileActive: false, path: 'foo/bar/.editorconfig' },
- { makeFileActive: false, path: 'foo/.editorconfig' },
- { makeFileActive: false, path: '.editorconfig' },
- ]);
- expect(vm.getRawFileData.mock.calls.map(([args]) => args)).toEqual([
- { path: 'foo/bar/baz/.editorconfig' },
- { path: 'foo/bar/.editorconfig' },
- { path: 'foo/.editorconfig' },
- { path: '.editorconfig' },
- ]);
- });
+ expect(service.getFileData.mock.calls.map(([args]) => args)).toEqual(
+ expectations.map((expectation) => expect.stringContaining(expectation)),
+ );
+ expect(service.getRawFileData.mock.calls.map(([args]) => args)).toEqual(
+ expectations.map((expectation) => expect.objectContaining({ path: expectation })),
+ );
});
});
});
diff --git a/spec/frontend/ide/components/repo_tab_spec.js b/spec/frontend/ide/components/repo_tab_spec.js
index b39a488b034..95d52e8f7a9 100644
--- a/spec/frontend/ide/components/repo_tab_spec.js
+++ b/spec/frontend/ide/components/repo_tab_spec.js
@@ -1,5 +1,7 @@
+import { GlTab } from '@gitlab/ui';
import { mount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
+import { stubComponent } from 'helpers/stub_component';
import RepoTab from '~/ide/components/repo_tab.vue';
import { createRouter } from '~/ide/ide_router';
import { createStore } from '~/ide/stores';
@@ -8,16 +10,25 @@ import { file } from '../helpers';
const localVue = createLocalVue();
localVue.use(Vuex);
+const GlTabStub = stubComponent(GlTab, {
+ template: '<li><slot name="title" /></li>',
+});
+
describe('RepoTab', () => {
let wrapper;
let store;
let router;
+ const findTab = () => wrapper.find(GlTabStub);
+
function createComponent(propsData) {
wrapper = mount(RepoTab, {
localVue,
store,
propsData,
+ stubs: {
+ GlTab: GlTabStub,
+ },
});
}
@@ -55,7 +66,7 @@ describe('RepoTab', () => {
jest.spyOn(wrapper.vm, 'openPendingTab').mockImplementation(() => {});
- await wrapper.trigger('click');
+ await findTab().vm.$emit('click');
expect(wrapper.vm.openPendingTab).not.toHaveBeenCalled();
});
@@ -67,7 +78,7 @@ describe('RepoTab', () => {
jest.spyOn(wrapper.vm, 'clickFile').mockImplementation(() => {});
- wrapper.trigger('click');
+ findTab().vm.$emit('click');
expect(wrapper.vm.clickFile).toHaveBeenCalledWith(wrapper.vm.tab);
});
@@ -91,11 +102,11 @@ describe('RepoTab', () => {
tab,
});
- await wrapper.trigger('mouseover');
+ await findTab().vm.$emit('mouseover');
expect(wrapper.find('.file-modified').exists()).toBe(false);
- await wrapper.trigger('mouseout');
+ await findTab().vm.$emit('mouseout');
expect(wrapper.find('.file-modified').exists()).toBe(true);
});
diff --git a/spec/frontend/import_entities/import_groups/components/import_table_row_spec.js b/spec/frontend/import_entities/import_groups/components/import_table_row_spec.js
index cdef4b1ee62..9811532126f 100644
--- a/spec/frontend/import_entities/import_groups/components/import_table_row_spec.js
+++ b/spec/frontend/import_entities/import_groups/components/import_table_row_spec.js
@@ -75,6 +75,33 @@ describe('import table row', () => {
});
});
+ it('renders only namespaces if user cannot create new group', () => {
+ createComponent({
+ canCreateGroup: false,
+ group: getFakeGroup(STATUSES.NONE),
+ });
+
+ const dropdownData = findNamespaceDropdown().props().options.data;
+ const noParentOption = dropdownData.find((o) => o.text === 'No parent');
+
+ expect(noParentOption).toBeUndefined();
+ expect(dropdownData).toHaveLength(availableNamespacesFixture.length);
+ });
+
+ it('renders no parent option in available namespaces if user can create new group', () => {
+ createComponent({
+ canCreateGroup: true,
+ group: getFakeGroup(STATUSES.NONE),
+ });
+
+ const dropdownData = findNamespaceDropdown().props().options.data;
+ const noParentOption = dropdownData.find((o) => o.text === 'No parent');
+ const existingGroupOption = dropdownData.find((o) => o.text === 'Existing groups');
+
+ expect(noParentOption.id).toBe('');
+ expect(existingGroupOption.children).toHaveLength(availableNamespacesFixture.length);
+ });
+
describe('when entity status is SCHEDULING', () => {
beforeEach(() => {
group = getFakeGroup(STATUSES.SCHEDULING);
diff --git a/spec/frontend/import_entities/import_groups/components/import_table_spec.js b/spec/frontend/import_entities/import_groups/components/import_table_spec.js
index dd734782169..4b9fac96380 100644
--- a/spec/frontend/import_entities/import_groups/components/import_table_spec.js
+++ b/spec/frontend/import_entities/import_groups/components/import_table_spec.js
@@ -21,9 +21,13 @@ describe('import table', () => {
let apolloProvider;
const FAKE_GROUP = generateFakeEntry({ id: 1, status: STATUSES.NONE });
+ const FAKE_GROUPS = [
+ generateFakeEntry({ id: 1, status: STATUSES.NONE }),
+ generateFakeEntry({ id: 2, status: STATUSES.FINISHED }),
+ ];
const FAKE_PAGE_INFO = { page: 1, perPage: 20, total: 40, totalPages: 2 };
- const createComponent = ({ bulkImportSourceGroups }) => {
+ const createComponent = ({ bulkImportSourceGroups, canCreateGroup }) => {
apolloProvider = createMockApollo([], {
Query: {
availableNamespaces: () => availableNamespacesFixture,
@@ -39,6 +43,7 @@ describe('import table', () => {
wrapper = shallowMount(ImportTable, {
propsData: {
sourceUrl: 'https://demo.host',
+ canCreateGroup,
},
stubs: {
GlSprintf,
@@ -80,14 +85,10 @@ describe('import table', () => {
});
await waitForPromises();
- expect(wrapper.find(GlEmptyState).props().title).toBe('No groups available for import');
+ expect(wrapper.find(GlEmptyState).props().title).toBe('You have no groups to import');
});
it('renders import row for each group in response', async () => {
- const FAKE_GROUPS = [
- generateFakeEntry({ id: 1, status: STATUSES.NONE }),
- generateFakeEntry({ id: 2, status: STATUSES.FINISHED }),
- ];
createComponent({
bulkImportSourceGroups: () => ({
nodes: FAKE_GROUPS,
@@ -99,6 +100,25 @@ describe('import table', () => {
expect(wrapper.findAll(ImportTableRow)).toHaveLength(FAKE_GROUPS.length);
});
+ it.each`
+ canCreateGroup | userPermissions
+ ${true} | ${'user can create new top-level group'}
+ ${false} | ${'user cannot create new top-level group'}
+ `('correctly passes canCreateGroup to rows when $userPermissions', async ({ canCreateGroup }) => {
+ createComponent({
+ bulkImportSourceGroups: () => ({
+ nodes: FAKE_GROUPS,
+ pageInfo: FAKE_PAGE_INFO,
+ }),
+ canCreateGroup,
+ });
+ await waitForPromises();
+
+ wrapper.findAllComponents(ImportTableRow).wrappers.forEach((w) => {
+ expect(w.props().canCreateGroup).toBe(canCreateGroup);
+ });
+ });
+
it('does not render status string when result list is empty', async () => {
createComponent({
bulkImportSourceGroups: jest.fn().mockResolvedValue({
diff --git a/spec/frontend/incidents_settings/components/__snapshots__/alerts_form_spec.js.snap b/spec/frontend/incidents_settings/components/__snapshots__/alerts_form_spec.js.snap
index 82d7f691efd..6a4999c42db 100644
--- a/spec/frontend/incidents_settings/components/__snapshots__/alerts_form_spec.js.snap
+++ b/spec/frontend/incidents_settings/components/__snapshots__/alerts_form_spec.js.snap
@@ -35,7 +35,7 @@ exports[`Alert integration settings form default state should match the default
Incident template (optional)
<gl-link-stub
- href="/help/user/project/description_templates#creating-issue-templates"
+ href="/help/user/project/description_templates#create-an-issue-template"
target="_blank"
>
<gl-icon-stub
diff --git a/spec/frontend/integrations/edit/components/jira_trigger_fields_spec.js b/spec/frontend/integrations/edit/components/jira_trigger_fields_spec.js
index c6e7ee44355..6a8ab02a69a 100644
--- a/spec/frontend/integrations/edit/components/jira_trigger_fields_spec.js
+++ b/spec/frontend/integrations/edit/components/jira_trigger_fields_spec.js
@@ -30,14 +30,21 @@ describe('JiraTriggerFields', () => {
const findCommentSettings = () => wrapper.find('[data-testid="comment-settings"]');
const findCommentDetail = () => wrapper.find('[data-testid="comment-detail"]');
const findCommentSettingsCheckbox = () => findCommentSettings().find(GlFormCheckbox);
+ const findIssueTransitionSettings = () =>
+ wrapper.find('[data-testid="issue-transition-settings"]');
+ const findIssueTransitionModeRadios = () =>
+ findIssueTransitionSettings().findAll('input[type="radio"]');
+ const findIssueTransitionIdsField = () =>
+ wrapper.find('input[type="text"][name="service[jira_issue_transition_id]"]');
describe('template', () => {
describe('initialTriggerCommit and initialTriggerMergeRequest are false', () => {
- it('does not show comment settings', () => {
+ it('does not show trigger settings', () => {
createComponent();
expect(findCommentSettings().isVisible()).toBe(false);
expect(findCommentDetail().isVisible()).toBe(false);
+ expect(findIssueTransitionSettings().isVisible()).toBe(false);
});
});
@@ -48,9 +55,10 @@ describe('JiraTriggerFields', () => {
});
});
- it('shows comment settings', () => {
+ it('shows trigger settings', () => {
expect(findCommentSettings().isVisible()).toBe(true);
expect(findCommentDetail().isVisible()).toBe(false);
+ expect(findIssueTransitionSettings().isVisible()).toBe(true);
});
// As per https://vuejs.org/v2/guide/forms.html#Checkbox-1,
@@ -73,13 +81,14 @@ describe('JiraTriggerFields', () => {
});
describe('initialTriggerMergeRequest is true', () => {
- it('shows comment settings', () => {
+ it('shows trigger settings', () => {
createComponent({
initialTriggerMergeRequest: true,
});
expect(findCommentSettings().isVisible()).toBe(true);
expect(findCommentDetail().isVisible()).toBe(false);
+ expect(findIssueTransitionSettings().isVisible()).toBe(true);
});
});
@@ -95,7 +104,41 @@ describe('JiraTriggerFields', () => {
});
});
- it('disables checkboxes and radios if inheriting', () => {
+ describe('initialJiraIssueTransitionId is not set', () => {
+ it('uses automatic transitions', () => {
+ createComponent({
+ initialTriggerCommit: true,
+ });
+
+ const [radio1, radio2] = findIssueTransitionModeRadios().wrappers;
+ expect(radio1.element.checked).toBe(true);
+ expect(radio2.element.checked).toBe(false);
+
+ expect(findIssueTransitionIdsField().exists()).toBe(false);
+ });
+ });
+
+ describe('initialJiraIssueTransitionId is set', () => {
+ it('uses custom transitions', () => {
+ createComponent({
+ initialJiraIssueTransitionId: '1, 2, 3',
+ initialTriggerCommit: true,
+ });
+
+ const [radio1, radio2] = findIssueTransitionModeRadios().wrappers;
+ expect(radio1.element.checked).toBe(false);
+ expect(radio2.element.checked).toBe(true);
+
+ const field = findIssueTransitionIdsField();
+ expect(field.isVisible()).toBe(true);
+ expect(field.element).toMatchObject({
+ type: 'text',
+ value: '1, 2, 3',
+ });
+ });
+ });
+
+ it('disables input fields if inheriting', () => {
createComponent(
{
initialTriggerCommit: true,
@@ -104,12 +147,8 @@ describe('JiraTriggerFields', () => {
true,
);
- wrapper.findAll('[type=checkbox]').wrappers.forEach((checkbox) => {
- expect(checkbox.attributes('disabled')).toBe('disabled');
- });
-
- wrapper.findAll('[type=radio]').wrappers.forEach((radio) => {
- expect(radio.attributes('disabled')).toBe('disabled');
+ wrapper.findAll('[type=text], [type=checkbox], [type=radio]').wrappers.forEach((input) => {
+ expect(input.attributes('disabled')).toBe('disabled');
});
});
});
diff --git a/spec/frontend/invite_members/components/group_select_spec.js b/spec/frontend/invite_members/components/group_select_spec.js
new file mode 100644
index 00000000000..2a6985de136
--- /dev/null
+++ b/spec/frontend/invite_members/components/group_select_spec.js
@@ -0,0 +1,90 @@
+import { GlDropdown, GlDropdownItem, GlSearchBoxByType } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import waitForPromises from 'helpers/wait_for_promises';
+import Api from '~/api';
+import GroupSelect from '~/invite_members/components/group_select.vue';
+
+const createComponent = () => {
+ return mount(GroupSelect, {});
+};
+
+const group1 = { id: 1, full_name: 'Group One' };
+const group2 = { id: 2, full_name: 'Group Two' };
+const allGroups = [group1, group2];
+
+describe('GroupSelect', () => {
+ let wrapper;
+
+ beforeEach(() => {
+ jest.spyOn(Api, 'groups').mockResolvedValue(allGroups);
+
+ wrapper = createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ const findSearchBoxByType = () => wrapper.findComponent(GlSearchBoxByType);
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findDropdownToggle = () => findDropdown().find('button[aria-haspopup="true"]');
+ const findDropdownItemByText = (text) =>
+ wrapper
+ .findAllComponents(GlDropdownItem)
+ .wrappers.find((dropdownItemWrapper) => dropdownItemWrapper.text() === text);
+
+ it('renders GlSearchBoxByType with default attributes', () => {
+ expect(findSearchBoxByType().exists()).toBe(true);
+ expect(findSearchBoxByType().vm.$attrs).toMatchObject({
+ placeholder: 'Search groups',
+ });
+ });
+
+ describe('when user types in the search input', () => {
+ let resolveApiRequest;
+
+ beforeEach(() => {
+ jest.spyOn(Api, 'groups').mockImplementation(
+ () =>
+ new Promise((resolve) => {
+ resolveApiRequest = resolve;
+ }),
+ );
+
+ findSearchBoxByType().vm.$emit('input', group1.name);
+ });
+
+ it('calls the API', () => {
+ resolveApiRequest({ data: allGroups });
+
+ expect(Api.groups).toHaveBeenCalledWith(group1.name, {
+ active: true,
+ exclude_internal: true,
+ });
+ });
+
+ it('displays loading icon while waiting for API call to resolve', async () => {
+ expect(findSearchBoxByType().props('isLoading')).toBe(true);
+
+ resolveApiRequest({ data: allGroups });
+ await waitForPromises();
+
+ expect(findSearchBoxByType().props('isLoading')).toBe(false);
+ });
+ });
+
+ describe('when group is selected from the dropdown', () => {
+ beforeEach(() => {
+ findDropdownItemByText(group1.full_name).vm.$emit('click');
+ });
+
+ it('emits `input` event used by `v-model`', () => {
+ expect(wrapper.emitted('input')[0][0].id).toEqual(group1.id);
+ });
+
+ it('sets dropdown toggle text to selected item', () => {
+ expect(findDropdownToggle().text()).toBe(group1.full_name);
+ });
+ });
+});
diff --git a/spec/frontend/invite_members/components/invite_group_trigger_spec.js b/spec/frontend/invite_members/components/invite_group_trigger_spec.js
new file mode 100644
index 00000000000..cb9967ebe8c
--- /dev/null
+++ b/spec/frontend/invite_members/components/invite_group_trigger_spec.js
@@ -0,0 +1,50 @@
+import { GlButton } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import InviteGroupTrigger from '~/invite_members/components/invite_group_trigger.vue';
+import eventHub from '~/invite_members/event_hub';
+
+const displayText = 'Invite a group';
+
+const createComponent = (props = {}) => {
+ return mount(InviteGroupTrigger, {
+ propsData: {
+ displayText,
+ ...props,
+ },
+ });
+};
+
+describe('InviteGroupTrigger', () => {
+ let wrapper;
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ const findButton = () => wrapper.findComponent(GlButton);
+
+ describe('displayText', () => {
+ beforeEach(() => {
+ wrapper = createComponent();
+ });
+
+ it('includes the correct displayText for the link', () => {
+ expect(findButton().text()).toBe(displayText);
+ });
+ });
+
+ describe('when button is clicked', () => {
+ beforeEach(() => {
+ eventHub.$emit = jest.fn();
+
+ wrapper = createComponent();
+
+ findButton().trigger('click');
+ });
+
+ it('emits event that triggers opening the modal', () => {
+ expect(eventHub.$emit).toHaveBeenLastCalledWith('openModal', { inviteeType: 'group' });
+ });
+ });
+});
diff --git a/spec/frontend/invite_members/components/invite_members_modal_spec.js b/spec/frontend/invite_members/components/invite_members_modal_spec.js
index e310a00133c..ca086549f3f 100644
--- a/spec/frontend/invite_members/components/invite_members_modal_spec.js
+++ b/spec/frontend/invite_members/components/invite_members_modal_spec.js
@@ -6,8 +6,9 @@ import Api from '~/api';
import InviteMembersModal from '~/invite_members/components/invite_members_modal.vue';
const id = '1';
-const name = 'testgroup';
+const name = 'test name';
const isProject = false;
+const inviteeType = 'members';
const accessLevels = { Guest: 10, Reporter: 20, Developer: 30, Maintainer: 40, Owner: 50 };
const defaultAccessLevel = '10';
const helpLink = 'https://example.com';
@@ -20,16 +21,19 @@ const user3 = {
username: 'one_2',
avatar_url: '',
};
+const sharedGroup = { id: '981' };
-const createComponent = (data = {}) => {
+const createComponent = (data = {}, props = {}) => {
return shallowMount(InviteMembersModal, {
propsData: {
id,
name,
isProject,
+ inviteeType,
accessLevels,
defaultAccessLevel,
helpLink,
+ ...props,
},
data() {
return data;
@@ -46,6 +50,22 @@ const createComponent = (data = {}) => {
});
};
+const createInviteMembersToProjectWrapper = () => {
+ return createComponent({ inviteeType: 'members' }, { isProject: true });
+};
+
+const createInviteMembersToGroupWrapper = () => {
+ return createComponent({ inviteeType: 'members' }, { isProject: false });
+};
+
+const createInviteGroupToProjectWrapper = () => {
+ return createComponent({ inviteeType: 'group' }, { isProject: true });
+};
+
+const createInviteGroupToGroupWrapper = () => {
+ return createComponent({ inviteeType: 'group' }, { isProject: false });
+};
+
describe('InviteMembersModal', () => {
let wrapper;
@@ -54,12 +74,13 @@ describe('InviteMembersModal', () => {
wrapper = null;
});
- const findDropdown = () => wrapper.find(GlDropdown);
- const findDropdownItems = () => findDropdown().findAll(GlDropdownItem);
- const findDatepicker = () => wrapper.find(GlDatepicker);
- const findLink = () => wrapper.find(GlLink);
- const findCancelButton = () => wrapper.find({ ref: 'cancelButton' });
- const findInviteButton = () => wrapper.find({ ref: 'inviteButton' });
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findDropdownItems = () => findDropdown().findAllComponents(GlDropdownItem);
+ const findDatepicker = () => wrapper.findComponent(GlDatepicker);
+ const findLink = () => wrapper.findComponent(GlLink);
+ const findIntroText = () => wrapper.find({ ref: 'introText' }).text();
+ const findCancelButton = () => wrapper.findComponent({ ref: 'cancelButton' });
+ const findInviteButton = () => wrapper.findComponent({ ref: 'inviteButton' });
const clickInviteButton = () => findInviteButton().vm.$emit('click');
describe('rendering the modal', () => {
@@ -68,7 +89,7 @@ describe('InviteMembersModal', () => {
});
it('renders the modal with the correct title', () => {
- expect(wrapper.find(GlModal).props('title')).toBe('Invite team members');
+ expect(wrapper.findComponent(GlModal).props('title')).toBe('Invite team members');
});
it('renders the Cancel button text correctly', () => {
@@ -102,6 +123,44 @@ describe('InviteMembersModal', () => {
});
});
+ describe('displaying the correct introText', () => {
+ describe('when inviting to a project', () => {
+ describe('when inviting members', () => {
+ it('includes the correct invitee, type, and formatted name', () => {
+ wrapper = createInviteMembersToProjectWrapper();
+
+ expect(findIntroText()).toBe("You're inviting members to the TEST NAME project");
+ });
+ });
+
+ describe('when sharing with a group', () => {
+ it('includes the correct invitee, type, and formatted name', () => {
+ wrapper = createInviteGroupToProjectWrapper();
+
+ expect(findIntroText()).toBe("You're inviting a group to the TEST NAME project");
+ });
+ });
+ });
+
+ describe('when inviting to a group', () => {
+ describe('when inviting members', () => {
+ it('includes the correct invitee, type, and formatted name', () => {
+ wrapper = createInviteMembersToGroupWrapper();
+
+ expect(wrapper.html()).toContain("You're inviting members to the TEST NAME group");
+ });
+ });
+
+ describe('when sharing with a group', () => {
+ it('includes the correct invitee, type, and formatted name', () => {
+ wrapper = createInviteGroupToGroupWrapper();
+
+ expect(wrapper.html()).toContain("You're inviting a group to the TEST NAME group");
+ });
+ });
+ });
+ });
+
describe('submitting the invite form', () => {
const apiErrorMessage = 'Member already exists';
@@ -115,8 +174,9 @@ describe('InviteMembersModal', () => {
describe('when invites are sent successfully', () => {
beforeEach(() => {
- wrapper = createComponent({ newUsersToInvite: [user1] });
+ wrapper = createInviteMembersToGroupWrapper();
+ wrapper.setData({ newUsersToInvite: [user1] });
wrapper.vm.$toast = { show: jest.fn() };
jest.spyOn(Api, 'addGroupMembersByUserId').mockResolvedValue({ data: postData });
jest.spyOn(wrapper.vm, 'showToastMessageSuccess');
@@ -283,5 +343,58 @@ describe('InviteMembersModal', () => {
});
});
});
+
+ describe('when inviting a group to share', () => {
+ describe('when sharing the group is successful', () => {
+ const groupPostData = {
+ group_id: sharedGroup.id,
+ group_access: '10',
+ expires_at: undefined,
+ format: 'json',
+ };
+
+ beforeEach(() => {
+ wrapper = createComponent({ groupToBeSharedWith: sharedGroup });
+
+ wrapper.setData({ inviteeType: 'group' });
+ wrapper.vm.$toast = { show: jest.fn() };
+ jest.spyOn(Api, 'groupShareWithGroup').mockResolvedValue({ data: groupPostData });
+ jest.spyOn(wrapper.vm, 'showToastMessageSuccess');
+
+ clickInviteButton();
+ });
+
+ it('calls Api groupShareWithGroup with the correct params', () => {
+ expect(Api.groupShareWithGroup).toHaveBeenCalledWith(id, groupPostData);
+ });
+
+ it('displays the successful toastMessage', () => {
+ expect(wrapper.vm.showToastMessageSuccess).toHaveBeenCalled();
+ });
+ });
+
+ describe('when sharing the group fails', () => {
+ beforeEach(() => {
+ wrapper = createComponent({ groupToBeSharedWith: sharedGroup });
+
+ wrapper.setData({ inviteeType: 'group' });
+ wrapper.vm.$toast = { show: jest.fn() };
+
+ jest
+ .spyOn(Api, 'groupShareWithGroup')
+ .mockRejectedValue({ response: { data: { success: false } } });
+
+ jest.spyOn(wrapper.vm, 'showToastMessageError');
+
+ clickInviteButton();
+ });
+
+ it('displays the generic error toastMessage', async () => {
+ await waitForPromises();
+
+ expect(wrapper.vm.showToastMessageError).toHaveBeenCalled();
+ });
+ });
+ });
});
});
diff --git a/spec/frontend/invite_members/components/invite_members_trigger_spec.js b/spec/frontend/invite_members/components/invite_members_trigger_spec.js
index 18d6662d2d4..8beadf12a36 100644
--- a/spec/frontend/invite_members/components/invite_members_trigger_spec.js
+++ b/spec/frontend/invite_members/components/invite_members_trigger_spec.js
@@ -23,7 +23,7 @@ describe('InviteMembersTrigger', () => {
});
describe('displayText', () => {
- const findLink = () => wrapper.find(GlLink);
+ const findLink = () => wrapper.findComponent(GlLink);
beforeEach(() => {
wrapper = createComponent();
@@ -35,7 +35,7 @@ describe('InviteMembersTrigger', () => {
});
describe('icon', () => {
- const findIcon = () => wrapper.find(GlIcon);
+ const findIcon = () => wrapper.findComponent(GlIcon);
it('includes the correct icon when an icon is sent', () => {
wrapper = createComponent({ icon });
diff --git a/spec/frontend/invite_members/components/members_token_select_spec.js b/spec/frontend/invite_members/components/members_token_select_spec.js
index a945b99bd54..f6e79d3607f 100644
--- a/spec/frontend/invite_members/components/members_token_select_spec.js
+++ b/spec/frontend/invite_members/components/members_token_select_spec.js
@@ -37,7 +37,7 @@ describe('MembersTokenSelect', () => {
wrapper = null;
});
- const findTokenSelector = () => wrapper.find(GlTokenSelector);
+ const findTokenSelector = () => wrapper.findComponent(GlTokenSelector);
describe('rendering the token-selector component', () => {
it('renders with the correct props', () => {
diff --git a/spec/frontend/issue_show/components/app_spec.js b/spec/frontend/issue_show/components/app_spec.js
index 9e1bc8242fe..d5d1e1d9cf8 100644
--- a/spec/frontend/issue_show/components/app_spec.js
+++ b/spec/frontend/issue_show/components/app_spec.js
@@ -422,7 +422,18 @@ describe('Issuable output', () => {
formSpy = jest.spyOn(wrapper.vm, 'updateAndShowForm');
});
- it('shows the form if template names request is successful', () => {
+ it('shows the form if template names as hash request is successful', () => {
+ const mockData = {
+ test: [{ name: 'test', id: 'test', project_path: '/', namespace_path: '/' }],
+ };
+ mock.onGet('/issuable-templates-path').reply(() => Promise.resolve([200, mockData]));
+
+ return wrapper.vm.requestTemplatesAndShowForm().then(() => {
+ expect(formSpy).toHaveBeenCalledWith(mockData);
+ });
+ });
+
+ it('shows the form if template names as array request is successful', () => {
const mockData = [{ name: 'test', id: 'test', project_path: '/', namespace_path: '/' }];
mock.onGet('/issuable-templates-path').reply(() => Promise.resolve([200, mockData]));
diff --git a/spec/frontend/issue_show/components/fields/description_template_spec.js b/spec/frontend/issue_show/components/fields/description_template_spec.js
index 1193d4f8add..dc126c53f5e 100644
--- a/spec/frontend/issue_show/components/fields/description_template_spec.js
+++ b/spec/frontend/issue_show/components/fields/description_template_spec.js
@@ -1,7 +1,7 @@
import Vue from 'vue';
import descriptionTemplate from '~/issue_show/components/fields/description_template.vue';
-describe('Issue description template component', () => {
+describe('Issue description template component with templates as hash', () => {
let vm;
let formState;
@@ -14,7 +14,9 @@ describe('Issue description template component', () => {
vm = new Component({
propsData: {
formState,
- issuableTemplates: [{ name: 'test', id: 'test', project_path: '/', namespace_path: '/' }],
+ issuableTemplates: {
+ test: [{ name: 'test', id: 'test', project_path: '/', namespace_path: '/' }],
+ },
projectId: 1,
projectPath: '/',
namespacePath: '/',
@@ -23,9 +25,9 @@ describe('Issue description template component', () => {
}).$mount();
});
- it('renders templates as JSON array in data attribute', () => {
+ it('renders templates as JSON hash in data attribute', () => {
expect(vm.$el.querySelector('.js-issuable-selector').getAttribute('data-data')).toBe(
- '[{"name":"test","id":"test","project_path":"/","namespace_path":"/"}]',
+ '{"test":[{"name":"test","id":"test","project_path":"/","namespace_path":"/"}]}',
);
});
@@ -41,3 +43,32 @@ describe('Issue description template component', () => {
expect(vm.issuableTemplate.editor.getValue()).toBe('testing new template');
});
});
+
+describe('Issue description template component with templates as array', () => {
+ let vm;
+ let formState;
+
+ beforeEach(() => {
+ const Component = Vue.extend(descriptionTemplate);
+ formState = {
+ description: 'test',
+ };
+
+ vm = new Component({
+ propsData: {
+ formState,
+ issuableTemplates: [{ name: 'test', id: 'test', project_path: '/', namespace_path: '/' }],
+ projectId: 1,
+ projectPath: '/',
+ namespacePath: '/',
+ projectNamespace: '/',
+ },
+ }).$mount();
+ });
+
+ it('renders templates as JSON array in data attribute', () => {
+ expect(vm.$el.querySelector('.js-issuable-selector').getAttribute('data-data')).toBe(
+ '[{"name":"test","id":"test","project_path":"/","namespace_path":"/"}]',
+ );
+ });
+});
diff --git a/spec/frontend/issue_show/components/form_spec.js b/spec/frontend/issue_show/components/form_spec.js
index 4a8ec3cf66a..fc2e224ad92 100644
--- a/spec/frontend/issue_show/components/form_spec.js
+++ b/spec/frontend/issue_show/components/form_spec.js
@@ -42,7 +42,7 @@ describe('Inline edit form component', () => {
expect(vm.$el.querySelector('.js-issuable-selector-wrap')).toBeNull();
});
- it('renders template selector when templates exists', () => {
+ it('renders template selector when templates as array exists', () => {
createComponent({
issuableTemplates: [
{ name: 'test', id: 'test', project_path: 'test', namespace_path: 'test' },
@@ -52,6 +52,16 @@ describe('Inline edit form component', () => {
expect(vm.$el.querySelector('.js-issuable-selector-wrap')).not.toBeNull();
});
+ it('renders template selector when templates as hash exists', () => {
+ createComponent({
+ issuableTemplates: {
+ test: [{ name: 'test', id: 'test', project_path: 'test', namespace_path: 'test' }],
+ },
+ });
+
+ expect(vm.$el.querySelector('.js-issuable-selector-wrap')).not.toBeNull();
+ });
+
it('hides locked warning by default', () => {
createComponent();
diff --git a/spec/frontend/monitoring/components/dashboard_panel_builder_spec.js b/spec/frontend/monitoring/components/dashboard_panel_builder_spec.js
index b794d0c571e..400ac2e8f85 100644
--- a/spec/frontend/monitoring/components/dashboard_panel_builder_spec.js
+++ b/spec/frontend/monitoring/components/dashboard_panel_builder_spec.js
@@ -188,7 +188,7 @@ describe('dashboard invalid url parameters', () => {
});
describe('when there is an error', () => {
- const mockError = 'an error ocurred!';
+ const mockError = 'an error occurred!';
beforeEach(() => {
store.commit(`monitoringDashboard/${types.RECEIVE_PANEL_PREVIEW_FAILURE}`, mockError);
diff --git a/spec/frontend/monitoring/requests/index_spec.js b/spec/frontend/monitoring/requests/index_spec.js
index b30b1e60575..03bf5d70153 100644
--- a/spec/frontend/monitoring/requests/index_spec.js
+++ b/spec/frontend/monitoring/requests/index_spec.js
@@ -94,7 +94,7 @@ describe('monitoring metrics_requests', () => {
it('rejects after getting an HTTP 500 error', () => {
mock.onGet(prometheusEndpoint).reply(500, {
status: 'error',
- error: 'An error ocurred',
+ error: 'An error occurred',
});
return getPrometheusQueryData(prometheusEndpoint, params).catch((error) => {
@@ -106,7 +106,7 @@ describe('monitoring metrics_requests', () => {
// Mock multiple attempts while the cache is filling up and fails
mock.onGet(prometheusEndpoint).reply(statusCodes.UNAUTHORIZED, {
status: 'error',
- error: 'An error ocurred',
+ error: 'An error occurred',
});
return getPrometheusQueryData(prometheusEndpoint, params).catch((error) => {
@@ -120,7 +120,7 @@ describe('monitoring metrics_requests', () => {
mock.onGet(prometheusEndpoint).replyOnce(statusCodes.NO_CONTENT);
mock.onGet(prometheusEndpoint).reply(500, {
status: 'error',
- error: 'An error ocurred',
+ error: 'An error occurred',
}); // 3rd attempt
return getPrometheusQueryData(prometheusEndpoint, params).catch((error) => {
diff --git a/spec/frontend/notes/components/discussion_actions_spec.js b/spec/frontend/notes/components/discussion_actions_spec.js
index 03e5842bb0f..c6a7d7ead98 100644
--- a/spec/frontend/notes/components/discussion_actions_spec.js
+++ b/spec/frontend/notes/components/discussion_actions_spec.js
@@ -96,7 +96,7 @@ describe('DiscussionActions', () => {
it('emits showReplyForm event when clicking on reply placeholder', () => {
jest.spyOn(wrapper.vm, '$emit');
- wrapper.find(ReplyPlaceholder).find('button').trigger('click');
+ wrapper.find(ReplyPlaceholder).find('textarea').trigger('focus');
expect(wrapper.vm.$emit).toHaveBeenCalledWith('showReplyForm');
});
diff --git a/spec/frontend/notes/components/discussion_reply_placeholder_spec.js b/spec/frontend/notes/components/discussion_reply_placeholder_spec.js
index b7b7ec08867..2a4cd0df0c7 100644
--- a/spec/frontend/notes/components/discussion_reply_placeholder_spec.js
+++ b/spec/frontend/notes/components/discussion_reply_placeholder_spec.js
@@ -1,17 +1,17 @@
import { shallowMount } from '@vue/test-utils';
import ReplyPlaceholder from '~/notes/components/discussion_reply_placeholder.vue';
-const buttonText = 'Test Button Text';
+const placeholderText = 'Test Button Text';
describe('ReplyPlaceholder', () => {
let wrapper;
- const findButton = () => wrapper.find({ ref: 'button' });
+ const findTextarea = () => wrapper.find({ ref: 'textarea' });
beforeEach(() => {
wrapper = shallowMount(ReplyPlaceholder, {
propsData: {
- buttonText,
+ placeholderText,
},
});
});
@@ -20,17 +20,17 @@ describe('ReplyPlaceholder', () => {
wrapper.destroy();
});
- it('emits onClick event on button click', () => {
- findButton().trigger('click');
+ it('emits focus event on button click', () => {
+ findTextarea().trigger('focus');
return wrapper.vm.$nextTick().then(() => {
expect(wrapper.emitted()).toEqual({
- onClick: [[]],
+ focus: [[]],
});
});
});
it('should render reply button', () => {
- expect(findButton().text()).toEqual(buttonText);
+ expect(findTextarea().attributes('placeholder')).toEqual(placeholderText);
});
});
diff --git a/spec/frontend/notes/components/noteable_discussion_spec.js b/spec/frontend/notes/components/noteable_discussion_spec.js
index 87538279c3d..34df39bf1c7 100644
--- a/spec/frontend/notes/components/noteable_discussion_spec.js
+++ b/spec/frontend/notes/components/noteable_discussion_spec.js
@@ -65,7 +65,7 @@ describe('noteable_discussion component', () => {
expect(wrapper.vm.isReplying).toEqual(false);
const replyPlaceholder = wrapper.find(ReplyPlaceholder);
- replyPlaceholder.vm.$emit('onClick');
+ replyPlaceholder.vm.$emit('focus');
await nextTick();
expect(wrapper.vm.isReplying).toEqual(true);
diff --git a/spec/frontend/notifications/components/custom_notifications_modal_spec.js b/spec/frontend/notifications/components/custom_notifications_modal_spec.js
index 3e87f3107bd..5e4114d91f5 100644
--- a/spec/frontend/notifications/components/custom_notifications_modal_spec.js
+++ b/spec/frontend/notifications/components/custom_notifications_modal_spec.js
@@ -180,7 +180,7 @@ describe('CustomNotificationsModal', () => {
expect(
mockToastShow,
).toHaveBeenCalledWith(
- 'An error occured while loading the notification settings. Please try again.',
+ 'An error occurred while loading the notification settings. Please try again.',
{ type: 'error' },
);
});
@@ -258,7 +258,7 @@ describe('CustomNotificationsModal', () => {
expect(
mockToastShow,
).toHaveBeenCalledWith(
- 'An error occured while updating the notification settings. Please try again.',
+ 'An error occurred while updating the notification settings. Please try again.',
{ type: 'error' },
);
});
diff --git a/spec/frontend/notifications/components/notifications_dropdown_spec.js b/spec/frontend/notifications/components/notifications_dropdown_spec.js
index 0673fb51a91..88534a6d690 100644
--- a/spec/frontend/notifications/components/notifications_dropdown_spec.js
+++ b/spec/frontend/notifications/components/notifications_dropdown_spec.js
@@ -255,7 +255,7 @@ describe('NotificationsDropdown', () => {
expect(
mockToastShow,
).toHaveBeenCalledWith(
- 'An error occured while updating the notification settings. Please try again.',
+ 'An error occurred while updating the notification settings. Please try again.',
{ type: 'error' },
);
});
diff --git a/spec/frontend/packages/details/store/getters_spec.js b/spec/frontend/packages/details/store/getters_spec.js
index 07c120f57f7..4642dbc1ea6 100644
--- a/spec/frontend/packages/details/store/getters_spec.js
+++ b/spec/frontend/packages/details/store/getters_spec.js
@@ -99,7 +99,7 @@ describe('Getters PackageDetails Store', () => {
packageEntity | expectedResult
${conanPackage} | ${'Conan'}
${packageWithoutBuildInfo} | ${'Maven'}
- ${npmPackage} | ${'NPM'}
+ ${npmPackage} | ${'npm'}
${nugetPackage} | ${'NuGet'}
${pypiPackage} | ${'PyPI'}
`(`package type`, ({ packageEntity, expectedResult }) => {
@@ -168,13 +168,13 @@ describe('Getters PackageDetails Store', () => {
});
describe('npm string getters', () => {
- it('gets the correct npmInstallationCommand for NPM', () => {
+ it('gets the correct npmInstallationCommand for npm', () => {
setupState({ packageEntity: npmPackage });
expect(npmInstallationCommand(state)(NpmManager.NPM)).toBe(npmInstallStr);
});
- it('gets the correct npmSetupCommand for NPM', () => {
+ it('gets the correct npmSetupCommand for npm', () => {
setupState({ packageEntity: npmPackage });
expect(npmSetupCommand(state)(NpmManager.NPM)).toBe(npmSetupStr);
diff --git a/spec/frontend/packages/shared/utils_spec.js b/spec/frontend/packages/shared/utils_spec.js
index 506f37f8895..4a95def1bef 100644
--- a/spec/frontend/packages/shared/utils_spec.js
+++ b/spec/frontend/packages/shared/utils_spec.js
@@ -35,7 +35,7 @@ describe('Packages shared utils', () => {
packageType | expectedResult
${'conan'} | ${'Conan'}
${'maven'} | ${'Maven'}
- ${'npm'} | ${'NPM'}
+ ${'npm'} | ${'npm'}
${'nuget'} | ${'NuGet'}
${'pypi'} | ${'PyPI'}
${'composer'} | ${'Composer'}
diff --git a/spec/frontend/performance_bar/components/performance_bar_app_spec.js b/spec/frontend/performance_bar/components/performance_bar_app_spec.js
index 417a655093c..67a4259a8e3 100644
--- a/spec/frontend/performance_bar/components/performance_bar_app_spec.js
+++ b/spec/frontend/performance_bar/components/performance_bar_app_spec.js
@@ -9,6 +9,7 @@ describe('performance bar app', () => {
store,
env: 'development',
requestId: '123',
+ statsUrl: 'https://log.gprd.gitlab.net/app/dashboards#/view/',
peekUrl: '/-/peek/results',
profileUrl: '?lineprofiler=true',
},
diff --git a/spec/frontend/performance_bar/index_spec.js b/spec/frontend/performance_bar/index_spec.js
index 8d9c32b7f12..819b2bcbacf 100644
--- a/spec/frontend/performance_bar/index_spec.js
+++ b/spec/frontend/performance_bar/index_spec.js
@@ -19,6 +19,7 @@ describe('performance bar wrapper', () => {
peekWrapper.setAttribute('data-env', 'development');
peekWrapper.setAttribute('data-request-id', '123');
peekWrapper.setAttribute('data-peek-url', '/-/peek/results');
+ peekWrapper.setAttribute('data-stats-url', 'https://log.gprd.gitlab.net/app/dashboards#/view/');
peekWrapper.setAttribute('data-profile-url', '?lineprofiler=true');
mock = new MockAdapter(axios);
diff --git a/spec/frontend/pipeline_editor/components/header/pipeline_editor_header_spec.js b/spec/frontend/pipeline_editor/components/header/pipeline_editor_header_spec.js
index df15a6c8e7f..5eeccd78265 100644
--- a/spec/frontend/pipeline_editor/components/header/pipeline_editor_header_spec.js
+++ b/spec/frontend/pipeline_editor/components/header/pipeline_editor_header_spec.js
@@ -1,14 +1,24 @@
import { shallowMount } from '@vue/test-utils';
import PipelineEditorHeader from '~/pipeline_editor/components/header/pipeline_editor_header.vue';
+import PipelineStatus from '~/pipeline_editor/components/header/pipeline_status.vue';
import ValidationSegment from '~/pipeline_editor/components/header/validation_segment.vue';
import { mockLintResponse } from '../../mock_data';
describe('Pipeline editor header', () => {
let wrapper;
+ const mockProvide = {
+ glFeatures: {
+ pipelineStatusForPipelineEditor: true,
+ },
+ };
- const createComponent = () => {
+ const createComponent = ({ provide = {} } = {}) => {
wrapper = shallowMount(PipelineEditorHeader, {
+ provide: {
+ ...mockProvide,
+ ...provide,
+ },
props: {
ciConfigData: mockLintResponse,
isCiConfigDataLoading: false,
@@ -16,6 +26,7 @@ describe('Pipeline editor header', () => {
});
};
+ const findPipelineStatus = () => wrapper.findComponent(PipelineStatus);
const findValidationSegment = () => wrapper.findComponent(ValidationSegment);
afterEach(() => {
@@ -27,8 +38,27 @@ describe('Pipeline editor header', () => {
beforeEach(() => {
createComponent();
});
+
+ it('renders the pipeline status', () => {
+ expect(findPipelineStatus().exists()).toBe(true);
+ });
+
it('renders the validation segment', () => {
expect(findValidationSegment().exists()).toBe(true);
});
});
+
+ describe('with pipeline status feature flag off', () => {
+ beforeEach(() => {
+ createComponent({
+ provide: {
+ glFeatures: { pipelineStatusForPipelineEditor: false },
+ },
+ });
+ });
+
+ it('does not render the pipeline status', () => {
+ expect(findPipelineStatus().exists()).toBe(false);
+ });
+ });
});
diff --git a/spec/frontend/pipeline_editor/components/header/pipeline_status_spec.js b/spec/frontend/pipeline_editor/components/header/pipeline_status_spec.js
new file mode 100644
index 00000000000..de6e112866b
--- /dev/null
+++ b/spec/frontend/pipeline_editor/components/header/pipeline_status_spec.js
@@ -0,0 +1,150 @@
+import { GlIcon, GlLink, GlLoadingIcon, GlSprintf } from '@gitlab/ui';
+import { shallowMount, createLocalVue } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import PipelineStatus, { i18n } from '~/pipeline_editor/components/header/pipeline_status.vue';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
+import { mockCommitSha, mockProjectPipeline, mockProjectFullPath } from '../../mock_data';
+
+const localVue = createLocalVue();
+localVue.use(VueApollo);
+
+const mockProvide = {
+ projectFullPath: mockProjectFullPath,
+};
+
+describe('Pipeline Status', () => {
+ let wrapper;
+ let mockApollo;
+ let mockPipelineQuery;
+
+ const createComponent = ({ hasPipeline = true, isQueryLoading = false }) => {
+ const pipeline = hasPipeline
+ ? { loading: isQueryLoading, ...mockProjectPipeline.pipeline }
+ : { loading: isQueryLoading };
+
+ wrapper = shallowMount(PipelineStatus, {
+ provide: mockProvide,
+ stubs: { GlLink, GlSprintf },
+ data: () => (hasPipeline ? { pipeline } : {}),
+ mocks: {
+ $apollo: {
+ queries: {
+ pipeline,
+ },
+ },
+ },
+ });
+ };
+
+ const createComponentWithApollo = () => {
+ const resolvers = {
+ Query: {
+ project: mockPipelineQuery,
+ },
+ };
+ mockApollo = createMockApollo([], resolvers);
+
+ wrapper = shallowMount(PipelineStatus, {
+ localVue,
+ apolloProvider: mockApollo,
+ provide: mockProvide,
+ stubs: { GlLink, GlSprintf },
+ data() {
+ return {
+ commitSha: mockCommitSha,
+ };
+ },
+ });
+ };
+
+ const findIcon = () => wrapper.findComponent(GlIcon);
+ const findCiIcon = () => wrapper.findComponent(CiIcon);
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findPipelineId = () => wrapper.find('[data-testid="pipeline-id"]');
+ const findPipelineCommit = () => wrapper.find('[data-testid="pipeline-commit"]');
+ const findPipelineErrorMsg = () => wrapper.find('[data-testid="pipeline-error-msg"]');
+ const findPipelineLoadingMsg = () => wrapper.find('[data-testid="pipeline-loading-msg"]');
+
+ beforeEach(() => {
+ mockPipelineQuery = jest.fn();
+ });
+
+ afterEach(() => {
+ mockPipelineQuery.mockReset();
+
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ describe('while querying', () => {
+ it('renders loading icon', () => {
+ createComponent({ isQueryLoading: true, hasPipeline: false });
+
+ expect(findLoadingIcon().exists()).toBe(true);
+ expect(findPipelineLoadingMsg().text()).toBe(i18n.fetchLoading);
+ });
+
+ it('does not render loading icon if pipeline data is already set', () => {
+ createComponent({ isQueryLoading: true });
+
+ expect(findLoadingIcon().exists()).toBe(false);
+ });
+ });
+
+ describe('when querying data', () => {
+ describe('when data is set', () => {
+ beforeEach(async () => {
+ mockPipelineQuery.mockResolvedValue(mockProjectPipeline);
+
+ createComponentWithApollo();
+ await waitForPromises();
+ });
+
+ it('query is called with correct variables', async () => {
+ expect(mockPipelineQuery).toHaveBeenCalledTimes(1);
+ expect(mockPipelineQuery).toHaveBeenCalledWith(
+ expect.anything(),
+ {
+ fullPath: mockProjectFullPath,
+ },
+ expect.anything(),
+ expect.anything(),
+ );
+ });
+
+ it('does not render error', () => {
+ expect(findIcon().exists()).toBe(false);
+ });
+
+ it('renders pipeline data', () => {
+ const { id } = mockProjectPipeline.pipeline;
+
+ expect(findCiIcon().exists()).toBe(true);
+ expect(findPipelineId().text()).toBe(`#${id.match(/\d+/g)[0]}`);
+ expect(findPipelineCommit().text()).toBe(mockCommitSha);
+ });
+ });
+
+ describe('when data cannot be fetched', () => {
+ beforeEach(async () => {
+ mockPipelineQuery.mockRejectedValue(new Error());
+
+ createComponentWithApollo();
+ await waitForPromises();
+ });
+
+ it('renders error', () => {
+ expect(findIcon().attributes('name')).toBe('warning-solid');
+ expect(findPipelineErrorMsg().text()).toBe(i18n.fetchError);
+ });
+
+ it('does not render pipeline data', () => {
+ expect(findCiIcon().exists()).toBe(false);
+ expect(findPipelineId().exists()).toBe(false);
+ expect(findPipelineCommit().exists()).toBe(false);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/pipeline_editor/graphql/resolvers_spec.js b/spec/frontend/pipeline_editor/graphql/resolvers_spec.js
index d39c0d80296..196a4133eea 100644
--- a/spec/frontend/pipeline_editor/graphql/resolvers_spec.js
+++ b/spec/frontend/pipeline_editor/graphql/resolvers_spec.js
@@ -46,6 +46,24 @@ describe('~/pipeline_editor/graphql/resolvers', () => {
await expect(result.rawData).resolves.toBe(mockCiYml);
});
});
+
+ describe('pipeline', () => {
+ it('resolves pipeline data with type names', async () => {
+ const result = await resolvers.Query.project(null);
+
+ // eslint-disable-next-line no-underscore-dangle
+ expect(result.__typename).toBe('Project');
+ });
+
+ it('resolves pipeline data with necessary data', async () => {
+ const result = await resolvers.Query.project(null);
+ const pipelineKeys = Object.keys(result.pipeline);
+ const statusKeys = Object.keys(result.pipeline.detailedStatus);
+
+ expect(pipelineKeys).toContain('id', 'commitPath', 'detailedStatus', 'shortSha');
+ expect(statusKeys).toContain('detailsPath', 'text');
+ });
+ });
});
describe('Mutation', () => {
diff --git a/spec/frontend/pipeline_editor/mock_data.js b/spec/frontend/pipeline_editor/mock_data.js
index 8e248c11b87..16d5ba0e714 100644
--- a/spec/frontend/pipeline_editor/mock_data.js
+++ b/spec/frontend/pipeline_editor/mock_data.js
@@ -138,6 +138,22 @@ export const mergeUnwrappedCiConfig = (mergedConfig) => {
};
};
+export const mockProjectPipeline = {
+ pipeline: {
+ commitPath: '/-/commit/aabbccdd',
+ id: 'gid://gitlab/Ci::Pipeline/118',
+ iid: '28',
+ shortSha: mockCommitSha,
+ status: 'SUCCESS',
+ detailedStatus: {
+ detailsPath: '/root/sample-ci-project/-/pipelines/118"',
+ group: 'success',
+ icon: 'status_success',
+ text: 'passed',
+ },
+ },
+};
+
export const mockLintResponse = {
valid: true,
mergedYaml: mockCiYml,
diff --git a/spec/frontend/pipelines/empty_state_spec.js b/spec/frontend/pipelines/empty_state_spec.js
index 3ebedc9ac87..fdbb98dfd55 100644
--- a/spec/frontend/pipelines/empty_state_spec.js
+++ b/spec/frontend/pipelines/empty_state_spec.js
@@ -9,7 +9,6 @@ describe('Pipelines Empty State', () => {
const createWrapper = () => {
wrapper = shallowMount(EmptyState, {
propsData: {
- helpPagePath: 'foo',
emptyStateSvgPath: 'foo',
canSetCi: true,
},
@@ -35,7 +34,7 @@ describe('Pipelines Empty State', () => {
});
it('should render a link with provided help path', () => {
- expect(findGetStartedButton().attributes('href')).toBe('foo');
+ expect(findGetStartedButton().attributes('href')).toBe('/help/ci/quick_start/index.md');
});
it('should render empty state information', () => {
diff --git a/spec/frontend/pipelines/graph_shared/links_inner_spec.js b/spec/frontend/pipelines/graph_shared/links_inner_spec.js
index 6cabe2bc8a7..15a5fbfeffe 100644
--- a/spec/frontend/pipelines/graph_shared/links_inner_spec.js
+++ b/spec/frontend/pipelines/graph_shared/links_inner_spec.js
@@ -1,5 +1,15 @@
import { shallowMount } from '@vue/test-utils';
+import MockAdapter from 'axios-mock-adapter';
import { setHTMLFixture } from 'helpers/fixtures';
+import axios from '~/lib/utils/axios_utils';
+import {
+ PIPELINES_DETAIL_LINK_DURATION,
+ PIPELINES_DETAIL_LINKS_TOTAL,
+ PIPELINES_DETAIL_LINKS_JOB_RATIO,
+} from '~/performance/constants';
+import * as perfUtils from '~/performance/utils';
+import * as sentryUtils from '~/pipelines/components/graph/utils';
+import * as Api from '~/pipelines/components/graph_shared/api';
import LinksInner from '~/pipelines/components/graph_shared/links_inner.vue';
import { createJobsHash } from '~/pipelines/utils';
import {
@@ -18,7 +28,9 @@ describe('Links Inner component', () => {
containerMeasurements: { width: 1019, height: 445 },
pipelineId: 1,
pipelineData: [],
+ totalGroups: 10,
};
+
let wrapper;
const createComponent = (props) => {
@@ -194,4 +206,141 @@ describe('Links Inner component', () => {
expect(firstLink.classes(hoverColorClass)).toBe(true);
});
});
+
+ describe('performance metrics', () => {
+ let markAndMeasure;
+ let reportToSentry;
+ let reportPerformance;
+ let mock;
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ jest.spyOn(window, 'requestAnimationFrame').mockImplementation((cb) => cb());
+ markAndMeasure = jest.spyOn(perfUtils, 'performanceMarkAndMeasure');
+ reportToSentry = jest.spyOn(sentryUtils, 'reportToSentry');
+ reportPerformance = jest.spyOn(Api, 'reportPerformance');
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ describe('with no metrics config object', () => {
+ beforeEach(() => {
+ setFixtures(pipelineData);
+ createComponent({
+ pipelineData: pipelineData.stages,
+ });
+ });
+
+ it('is not called', () => {
+ expect(markAndMeasure).not.toHaveBeenCalled();
+ expect(reportToSentry).not.toHaveBeenCalled();
+ expect(reportPerformance).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('with metrics config set to false', () => {
+ beforeEach(() => {
+ setFixtures(pipelineData);
+ createComponent({
+ pipelineData: pipelineData.stages,
+ metricsConfig: {
+ collectMetrics: false,
+ metricsPath: '/path/to/metrics',
+ },
+ });
+ });
+
+ it('is not called', () => {
+ expect(markAndMeasure).not.toHaveBeenCalled();
+ expect(reportToSentry).not.toHaveBeenCalled();
+ expect(reportPerformance).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('with no metrics path', () => {
+ beforeEach(() => {
+ setFixtures(pipelineData);
+ createComponent({
+ pipelineData: pipelineData.stages,
+ metricsConfig: {
+ collectMetrics: true,
+ metricsPath: '',
+ },
+ });
+ });
+
+ it('is not called', () => {
+ expect(markAndMeasure).not.toHaveBeenCalled();
+ expect(reportToSentry).not.toHaveBeenCalled();
+ expect(reportPerformance).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('with metrics path and collect set to true', () => {
+ const metricsPath = '/root/project/-/ci/prometheus_metrics/histograms.json';
+ const duration = 0.0478;
+ const numLinks = 1;
+ const metricsData = {
+ histograms: [
+ { name: PIPELINES_DETAIL_LINK_DURATION, value: duration },
+ { name: PIPELINES_DETAIL_LINKS_TOTAL, value: numLinks },
+ {
+ name: PIPELINES_DETAIL_LINKS_JOB_RATIO,
+ value: numLinks / defaultProps.totalGroups,
+ },
+ ],
+ };
+
+ describe('when no duration is obtained', () => {
+ beforeEach(() => {
+ jest.spyOn(window.performance, 'getEntriesByName').mockImplementation(() => {
+ return [];
+ });
+
+ setFixtures(pipelineData);
+
+ createComponent({
+ pipelineData: pipelineData.stages,
+ metricsConfig: {
+ collectMetrics: true,
+ path: metricsPath,
+ },
+ });
+ });
+
+ it('attempts to collect metrics', () => {
+ expect(markAndMeasure).toHaveBeenCalled();
+ expect(reportPerformance).not.toHaveBeenCalled();
+ expect(reportToSentry).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('with duration and no error', () => {
+ beforeEach(() => {
+ jest.spyOn(window.performance, 'getEntriesByName').mockImplementation(() => {
+ return [{ duration }];
+ });
+
+ setFixtures(pipelineData);
+
+ createComponent({
+ pipelineData: pipelineData.stages,
+ metricsConfig: {
+ collectMetrics: true,
+ path: metricsPath,
+ },
+ });
+ });
+
+ it('it calls reportPerformance with expected arguments', () => {
+ expect(markAndMeasure).toHaveBeenCalled();
+ expect(reportPerformance).toHaveBeenCalled();
+ expect(reportPerformance).toHaveBeenCalledWith(metricsPath, metricsData);
+ expect(reportToSentry).not.toHaveBeenCalled();
+ });
+ });
+ });
+ });
});
diff --git a/spec/frontend/pipelines/mock_data.js b/spec/frontend/pipelines/mock_data.js
index 2afdbb05107..337838c41b3 100644
--- a/spec/frontend/pipelines/mock_data.js
+++ b/spec/frontend/pipelines/mock_data.js
@@ -2,328 +2,6 @@ const PIPELINE_RUNNING = 'RUNNING';
const PIPELINE_CANCELED = 'CANCELED';
const PIPELINE_FAILED = 'FAILED';
-export const pipelineWithStages = {
- id: 20333396,
- user: {
- id: 128633,
- name: 'Rémy Coutable',
- username: 'rymai',
- state: 'active',
- avatar_url:
- 'https://secure.gravatar.com/avatar/263da227929cc0035cb0eba512bcf81a?s=80\u0026d=identicon',
- web_url: 'https://gitlab.com/rymai',
- path: '/rymai',
- },
- active: true,
- coverage: '58.24',
- source: 'push',
- created_at: '2018-04-11T14:04:53.881Z',
- updated_at: '2018-04-11T14:05:00.792Z',
- path: '/gitlab-org/gitlab/pipelines/20333396',
- flags: {
- latest: true,
- stuck: false,
- auto_devops: false,
- yaml_errors: false,
- retryable: false,
- cancelable: true,
- failure_reason: false,
- },
- details: {
- status: {
- icon: 'status_running',
- text: 'running',
- label: 'running',
- group: 'running',
- has_details: true,
- details_path: '/gitlab-org/gitlab/pipelines/20333396',
- favicon:
- 'https://assets.gitlab-static.net/assets/ci_favicons/favicon_status_running-2eb56be2871937954b2ba6d6f4ee9fdf7e5e1c146ac45f7be98119ccaca1aca9.ico',
- },
- duration: null,
- finished_at: null,
- stages: [
- {
- name: 'build',
- title: 'build: skipped',
- status: {
- icon: 'status_skipped',
- text: 'skipped',
- label: 'skipped',
- group: 'skipped',
- has_details: true,
- details_path: '/gitlab-org/gitlab/pipelines/20333396#build',
- favicon:
- 'https://assets.gitlab-static.net/assets/ci_favicons/favicon_status_skipped-a2eee568a5bffdb494050c7b62dde241de9189280836288ac8923d369f16222d.ico',
- },
- path: '/gitlab-org/gitlab/pipelines/20333396#build',
- dropdown_path: '/gitlab-org/gitlab/pipelines/20333396/stage.json?stage=build',
- },
- {
- name: 'prepare',
- title: 'prepare: passed',
- status: {
- icon: 'status_success',
- text: 'passed',
- label: 'passed',
- group: 'success',
- has_details: true,
- details_path: '/gitlab-org/gitlab/pipelines/20333396#prepare',
- favicon:
- 'https://assets.gitlab-static.net/assets/ci_favicons/favicon_status_success-26f59841becbef8c6fe414e9e74471d8bfd6a91b5855c19fe7f5923a40a7da47.ico',
- },
- path: '/gitlab-org/gitlab/pipelines/20333396#prepare',
- dropdown_path: '/gitlab-org/gitlab/pipelines/20333396/stage.json?stage=prepare',
- },
- {
- name: 'test',
- title: 'test: running',
- status: {
- icon: 'status_running',
- text: 'running',
- label: 'running',
- group: 'running',
- has_details: true,
- details_path: '/gitlab-org/gitlab/pipelines/20333396#test',
- favicon:
- 'https://assets.gitlab-static.net/assets/ci_favicons/favicon_status_running-2eb56be2871937954b2ba6d6f4ee9fdf7e5e1c146ac45f7be98119ccaca1aca9.ico',
- },
- path: '/gitlab-org/gitlab/pipelines/20333396#test',
- dropdown_path: '/gitlab-org/gitlab/pipelines/20333396/stage.json?stage=test',
- },
- {
- name: 'post-test',
- title: 'post-test: created',
- status: {
- icon: 'status_created',
- text: 'created',
- label: 'created',
- group: 'created',
- has_details: true,
- details_path: '/gitlab-org/gitlab/pipelines/20333396#post-test',
- favicon:
- 'https://assets.gitlab-static.net/assets/ci_favicons/favicon_status_created-e997aa0b7db73165df8a9d6803932b18d7b7cc37d604d2d96e378fea2dba9c5f.ico',
- },
- path: '/gitlab-org/gitlab/pipelines/20333396#post-test',
- dropdown_path: '/gitlab-org/gitlab/pipelines/20333396/stage.json?stage=post-test',
- },
- {
- name: 'pages',
- title: 'pages: created',
- status: {
- icon: 'status_created',
- text: 'created',
- label: 'created',
- group: 'created',
- has_details: true,
- details_path: '/gitlab-org/gitlab/pipelines/20333396#pages',
- favicon:
- 'https://assets.gitlab-static.net/assets/ci_favicons/favicon_status_created-e997aa0b7db73165df8a9d6803932b18d7b7cc37d604d2d96e378fea2dba9c5f.ico',
- },
- path: '/gitlab-org/gitlab/pipelines/20333396#pages',
- dropdown_path: '/gitlab-org/gitlab/pipelines/20333396/stage.json?stage=pages',
- },
- {
- name: 'post-cleanup',
- title: 'post-cleanup: created',
- status: {
- icon: 'status_created',
- text: 'created',
- label: 'created',
- group: 'created',
- has_details: true,
- details_path: '/gitlab-org/gitlab/pipelines/20333396#post-cleanup',
- favicon:
- 'https://assets.gitlab-static.net/assets/ci_favicons/favicon_status_created-e997aa0b7db73165df8a9d6803932b18d7b7cc37d604d2d96e378fea2dba9c5f.ico',
- },
- path: '/gitlab-org/gitlab/pipelines/20333396#post-cleanup',
- dropdown_path: '/gitlab-org/gitlab/pipelines/20333396/stage.json?stage=post-cleanup',
- },
- ],
- artifacts: [
- {
- name: 'gitlab:assets:compile',
- expired: false,
- expire_at: '2018-05-12T14:22:54.730Z',
- path: '/gitlab-org/gitlab/-/jobs/62411438/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411438/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411438/artifacts/browse',
- },
- {
- name: 'rspec-mysql 12 28',
- expired: false,
- expire_at: '2018-05-12T14:22:45.136Z',
- path: '/gitlab-org/gitlab/-/jobs/62411397/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411397/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411397/artifacts/browse',
- },
- {
- name: 'rspec-mysql 6 28',
- expired: false,
- expire_at: '2018-05-12T14:22:41.523Z',
- path: '/gitlab-org/gitlab/-/jobs/62411391/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411391/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411391/artifacts/browse',
- },
- {
- name: 'rspec-pg geo 0 1',
- expired: false,
- expire_at: '2018-05-12T14:22:13.287Z',
- path: '/gitlab-org/gitlab/-/jobs/62411353/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411353/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411353/artifacts/browse',
- },
- {
- name: 'rspec-mysql 0 28',
- expired: false,
- expire_at: '2018-05-12T14:22:06.834Z',
- path: '/gitlab-org/gitlab/-/jobs/62411385/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411385/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411385/artifacts/browse',
- },
- {
- name: 'spinach-mysql 0 2',
- expired: false,
- expire_at: '2018-05-12T14:21:51.409Z',
- path: '/gitlab-org/gitlab/-/jobs/62411423/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411423/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411423/artifacts/browse',
- },
- {
- name: 'karma',
- expired: false,
- expire_at: '2018-05-12T14:21:20.934Z',
- path: '/gitlab-org/gitlab/-/jobs/62411440/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411440/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411440/artifacts/browse',
- },
- {
- name: 'spinach-pg 0 2',
- expired: false,
- expire_at: '2018-05-12T14:20:01.028Z',
- path: '/gitlab-org/gitlab/-/jobs/62411419/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411419/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411419/artifacts/browse',
- },
- {
- name: 'spinach-pg 1 2',
- expired: false,
- expire_at: '2018-05-12T14:19:04.336Z',
- path: '/gitlab-org/gitlab/-/jobs/62411421/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411421/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411421/artifacts/browse',
- },
- {
- name: 'sast',
- expired: null,
- expire_at: null,
- path: '/gitlab-org/gitlab/-/jobs/62411442/artifacts/download',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411442/artifacts/browse',
- },
- {
- name: 'code_quality',
- expired: false,
- expire_at: '2018-04-18T14:16:24.484Z',
- path: '/gitlab-org/gitlab/-/jobs/62411441/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411441/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411441/artifacts/browse',
- },
- {
- name: 'cache gems',
- expired: null,
- expire_at: null,
- path: '/gitlab-org/gitlab/-/jobs/62411447/artifacts/download',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411447/artifacts/browse',
- },
- {
- name: 'dependency_scanning',
- expired: null,
- expire_at: null,
- path: '/gitlab-org/gitlab/-/jobs/62411443/artifacts/download',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411443/artifacts/browse',
- },
- {
- name: 'compile-assets',
- expired: false,
- expire_at: '2018-04-18T14:12:07.638Z',
- path: '/gitlab-org/gitlab/-/jobs/62411334/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411334/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411334/artifacts/browse',
- },
- {
- name: 'setup-test-env',
- expired: false,
- expire_at: '2018-04-18T14:10:27.024Z',
- path: '/gitlab-org/gitlab/-/jobs/62411336/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411336/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411336/artifacts/browse',
- },
- {
- name: 'retrieve-tests-metadata',
- expired: false,
- expire_at: '2018-05-12T14:06:35.926Z',
- path: '/gitlab-org/gitlab/-/jobs/62411333/artifacts/download',
- keep_path: '/gitlab-org/gitlab/-/jobs/62411333/artifacts/keep',
- browse_path: '/gitlab-org/gitlab/-/jobs/62411333/artifacts/browse',
- },
- ],
- manual_actions: [
- {
- name: 'package-and-qa',
- path: '/gitlab-org/gitlab/-/jobs/62411330/play',
- playable: true,
- },
- {
- name: 'review-docs-deploy',
- path: '/gitlab-org/gitlab/-/jobs/62411332/play',
- playable: true,
- },
- ],
- },
- ref: {
- name: 'master',
- path: '/gitlab-org/gitlab/commits/master',
- tag: false,
- branch: true,
- },
- commit: {
- id: 'e6a2885c503825792cb8a84a8731295e361bd059',
- short_id: 'e6a2885c',
- title: "Merge branch 'ce-to-ee-2018-04-11' into 'master'",
- created_at: '2018-04-11T14:04:39.000Z',
- parent_ids: [
- '5d9b5118f6055f72cff1a82b88133609912f2c1d',
- '6fdc6ee76a8062fe41b1a33f7c503334a6ebdc02',
- ],
- message:
- "Merge branch 'ce-to-ee-2018-04-11' into 'master'\n\nCE upstream - 2018-04-11 12:26 UTC\n\nSee merge request gitlab-org/gitlab-ee!5326",
- author_name: 'Rémy Coutable',
- author_email: 'remy@rymai.me',
- authored_date: '2018-04-11T14:04:39.000Z',
- committer_name: 'Rémy Coutable',
- committer_email: 'remy@rymai.me',
- committed_date: '2018-04-11T14:04:39.000Z',
- author: {
- id: 128633,
- name: 'Rémy Coutable',
- username: 'rymai',
- state: 'active',
- avatar_url:
- 'https://secure.gravatar.com/avatar/263da227929cc0035cb0eba512bcf81a?s=80\u0026d=identicon',
- web_url: 'https://gitlab.com/rymai',
- path: '/rymai',
- },
- author_gravatar_url:
- 'https://secure.gravatar.com/avatar/263da227929cc0035cb0eba512bcf81a?s=80\u0026d=identicon',
- commit_url:
- 'https://gitlab.com/gitlab-org/gitlab/commit/e6a2885c503825792cb8a84a8731295e361bd059',
- commit_path: '/gitlab-org/gitlab/commit/e6a2885c503825792cb8a84a8731295e361bd059',
- },
- cancel_path: '/gitlab-org/gitlab/pipelines/20333396/cancel',
- triggered_by: null,
- triggered: [],
-};
-
const threeWeeksAgo = new Date();
threeWeeksAgo.setDate(threeWeeksAgo.getDate() - 21);
diff --git a/spec/frontend/pipelines/pipeline_url_spec.js b/spec/frontend/pipelines/pipeline_url_spec.js
index 44c9def99cc..4997e9cf3ec 100644
--- a/spec/frontend/pipelines/pipeline_url_spec.js
+++ b/spec/frontend/pipelines/pipeline_url_spec.js
@@ -1,9 +1,8 @@
import { shallowMount } from '@vue/test-utils';
-import $ from 'jquery';
import { trimText } from 'helpers/text_helper';
import PipelineUrlComponent from '~/pipelines/components/pipelines_list/pipeline_url.vue';
-$.fn.popover = () => {};
+const projectPath = 'test/test';
describe('Pipeline Url Component', () => {
let wrapper;
@@ -14,6 +13,7 @@ describe('Pipeline Url Component', () => {
const findYamlTag = () => wrapper.find('[data-testid="pipeline-url-yaml"]');
const findFailureTag = () => wrapper.find('[data-testid="pipeline-url-failure"]');
const findAutoDevopsTag = () => wrapper.find('[data-testid="pipeline-url-autodevops"]');
+ const findAutoDevopsTagLink = () => wrapper.find('[data-testid="pipeline-url-autodevops-link"]');
const findStuckTag = () => wrapper.find('[data-testid="pipeline-url-stuck"]');
const findDetachedTag = () => wrapper.find('[data-testid="pipeline-url-detached"]');
const findForkTag = () => wrapper.find('[data-testid="pipeline-url-fork"]');
@@ -23,9 +23,9 @@ describe('Pipeline Url Component', () => {
pipeline: {
id: 1,
path: 'foo',
+ project: { full_path: `/${projectPath}` },
flags: {},
},
- autoDevopsHelpPath: 'foo',
pipelineScheduleUrl: 'foo',
};
@@ -33,7 +33,7 @@ describe('Pipeline Url Component', () => {
wrapper = shallowMount(PipelineUrlComponent, {
propsData: { ...defaultProps, ...props },
provide: {
- targetProjectFullPath: 'test/test',
+ targetProjectFullPath: projectPath,
},
});
};
@@ -57,6 +57,19 @@ describe('Pipeline Url Component', () => {
expect(findPipelineUrlLink().text()).toBe('#1');
});
+ it('should not render tags when flags are not set', () => {
+ createComponent();
+
+ expect(findStuckTag().exists()).toBe(false);
+ expect(findLatestTag().exists()).toBe(false);
+ expect(findYamlTag().exists()).toBe(false);
+ expect(findAutoDevopsTag().exists()).toBe(false);
+ expect(findFailureTag().exists()).toBe(false);
+ expect(findScheduledTag().exists()).toBe(false);
+ expect(findForkTag().exists()).toBe(false);
+ expect(findTrainTag().exists()).toBe(false);
+ });
+
it('should render the stuck tag when flag is provided', () => {
createComponent({
pipeline: {
@@ -96,6 +109,7 @@ describe('Pipeline Url Component', () => {
it('should render an autodevops badge when flag is provided', () => {
createComponent({
pipeline: {
+ ...defaultProps.pipeline,
flags: {
auto_devops: true,
},
@@ -103,6 +117,11 @@ describe('Pipeline Url Component', () => {
});
expect(trimText(findAutoDevopsTag().text())).toBe('Auto DevOps');
+
+ expect(findAutoDevopsTagLink().attributes()).toMatchObject({
+ href: '/help/topics/autodevops/index.md',
+ target: '_blank',
+ });
});
it('should render a detached badge when flag is provided', () => {
@@ -147,7 +166,7 @@ describe('Pipeline Url Component', () => {
createComponent({
pipeline: {
flags: {},
- project: { fullPath: 'test/forked' },
+ project: { fullPath: '/test/forked' },
},
});
diff --git a/spec/frontend/pipelines/pipelines_spec.js b/spec/frontend/pipelines/pipelines_spec.js
index 811303a5624..ccf3f0b6667 100644
--- a/spec/frontend/pipelines/pipelines_spec.js
+++ b/spec/frontend/pipelines/pipelines_spec.js
@@ -18,7 +18,7 @@ import Store from '~/pipelines/stores/pipelines_store';
import NavigationTabs from '~/vue_shared/components/navigation_tabs.vue';
import TablePagination from '~/vue_shared/components/pagination/table_pagination.vue';
-import { pipelineWithStages, stageReply, users, mockSearch, branches } from './mock_data';
+import { stageReply, users, mockSearch, branches } from './mock_data';
jest.mock('~/flash');
@@ -27,6 +27,9 @@ const mockProjectId = '21';
const mockPipelinesEndpoint = `/${mockProjectPath}/pipelines.json`;
const mockPipelinesResponse = getJSONFixture('pipelines/pipelines.json');
const mockPipelinesIds = mockPipelinesResponse.pipelines.map(({ id }) => id);
+const mockPipelineWithStages = mockPipelinesResponse.pipelines.find(
+ (p) => p.details.stages && p.details.stages.length,
+);
describe('Pipelines', () => {
let wrapper;
@@ -34,8 +37,6 @@ describe('Pipelines', () => {
let origWindowLocation;
const paths = {
- autoDevopsHelpPath: '/help/topics/autodevops/index.md',
- helpPagePath: '/help/ci/quick_start/README',
emptyStateSvgPath: '/assets/illustrations/pipelines_empty.svg',
errorStateSvgPath: '/assets/illustrations/pipelines_failed.svg',
noPipelinesSvgPath: '/assets/illustrations/pipelines_pending.svg',
@@ -45,8 +46,6 @@ describe('Pipelines', () => {
};
const noPermissions = {
- autoDevopsHelpPath: '/help/topics/autodevops/index.md',
- helpPagePath: '/help/ci/quick_start/README',
emptyStateSvgPath: '/assets/illustrations/pipelines_empty.svg',
errorStateSvgPath: '/assets/illustrations/pipelines_failed.svg',
noPipelinesSvgPath: '/assets/illustrations/pipelines_pending.svg',
@@ -546,7 +545,9 @@ describe('Pipelines', () => {
'GitLab CI/CD can automatically build, test, and deploy your code.',
);
expect(findEmptyState().find(GlButton).text()).toBe('Get started with CI/CD');
- expect(findEmptyState().find(GlButton).attributes('href')).toBe(paths.helpPagePath);
+ expect(findEmptyState().find(GlButton).attributes('href')).toBe(
+ '/help/ci/quick_start/index.md',
+ );
});
it('does not render tabs nor buttons', () => {
@@ -613,14 +614,15 @@ describe('Pipelines', () => {
mock.onGet(mockPipelinesEndpoint, { scope: 'all', page: '1' }).reply(
200,
{
- pipelines: [pipelineWithStages],
+ pipelines: [mockPipelineWithStages],
count: { all: '1' },
},
{
'POLL-INTERVAL': 100,
},
);
- mock.onGet(pipelineWithStages.details.stages[0].dropdown_path).reply(200, stageReply);
+
+ mock.onGet(mockPipelineWithStages.details.stages[0].dropdown_path).reply(200, stageReply);
createComponent();
diff --git a/spec/frontend/pipelines/pipelines_table_row_spec.js b/spec/frontend/pipelines/pipelines_table_row_spec.js
index 660651547fc..8edf891b443 100644
--- a/spec/frontend/pipelines/pipelines_table_row_spec.js
+++ b/spec/frontend/pipelines/pipelines_table_row_spec.js
@@ -9,7 +9,6 @@ describe('Pipelines Table Row', () => {
mount(PipelinesTableRowComponent, {
propsData: {
pipeline,
- autoDevopsHelpPath: 'foo',
viewType: 'root',
},
});
@@ -156,7 +155,7 @@ describe('Pipelines Table Row', () => {
it('should render an icon for each stage', () => {
expect(
wrapper.findAll(
- '.table-section:nth-child(4) [data-testid="mini-pipeline-graph-dropdown-toggle"]',
+ '.table-section:nth-child(5) [data-testid="mini-pipeline-graph-dropdown-toggle"]',
).length,
).toEqual(pipeline.details.stages.length);
});
@@ -183,9 +182,10 @@ describe('Pipelines Table Row', () => {
expect(wrapper.find('.js-pipelines-retry-button').attributes('title')).toMatch('Retry');
expect(wrapper.find('.js-pipelines-cancel-button').exists()).toBe(true);
expect(wrapper.find('.js-pipelines-cancel-button').attributes('title')).toMatch('Cancel');
- const dropdownMenu = wrapper.find('.dropdown-menu');
- expect(dropdownMenu.text()).toContain(scheduledJobAction.name);
+ const actionsMenu = wrapper.find('[data-testid="pipelines-manual-actions-dropdown"]');
+
+ expect(actionsMenu.text()).toContain(scheduledJobAction.name);
});
it('emits `retryPipeline` event when retry button is clicked and toggles loading', () => {
diff --git a/spec/frontend/pipelines/pipelines_table_spec.js b/spec/frontend/pipelines/pipelines_table_spec.js
index fd73d507919..64febd7311c 100644
--- a/spec/frontend/pipelines/pipelines_table_spec.js
+++ b/spec/frontend/pipelines/pipelines_table_spec.js
@@ -9,7 +9,6 @@ describe('Pipelines Table', () => {
const defaultProps = {
pipelines: [],
- autoDevopsHelpPath: 'foo',
viewType: 'root',
};
@@ -58,7 +57,7 @@ describe('Pipelines Table', () => {
describe('with data', () => {
it('should render rows', () => {
- createComponent({ pipelines: [pipeline], autoDevopsHelpPath: 'foo', viewType: 'root' });
+ createComponent({ pipelines: [pipeline], viewType: 'root' });
expect(findRows()).toHaveLength(1);
});
diff --git a/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js b/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js
index f9fbb1b3016..8acf2376860 100644
--- a/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js
+++ b/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js
@@ -154,7 +154,7 @@ describe('ServiceDeskRoot', () => {
});
it('shows an error message', () => {
- expect(getAlertText()).toContain('An error occured while saving changes:');
+ expect(getAlertText()).toContain('An error occurred while saving changes:');
});
});
});
diff --git a/spec/frontend/projects/upload_file_experiment_spec.js b/spec/frontend/projects/upload_file_experiment_spec.js
new file mode 100644
index 00000000000..57abce779a5
--- /dev/null
+++ b/spec/frontend/projects/upload_file_experiment_spec.js
@@ -0,0 +1,46 @@
+import ExperimentTracking from '~/experiment_tracking';
+import * as UploadFileExperiment from '~/projects/upload_file_experiment';
+
+const mockExperimentTrackingEvent = jest.fn();
+jest.mock('~/experiment_tracking', () =>
+ jest.fn().mockImplementation(() => ({
+ event: mockExperimentTrackingEvent,
+ })),
+);
+
+const fixture = `<a class='js-upload-file-experiment-trigger' data-toggle='modal' data-target='#modal-upload-blob'></a><div id='modal-upload-blob'></div>`;
+const findModal = () => document.querySelector('[aria-modal="true"]');
+const findTrigger = () => document.querySelector('.js-upload-file-experiment-trigger');
+
+beforeEach(() => {
+ ExperimentTracking.mockClear();
+ mockExperimentTrackingEvent.mockClear();
+
+ document.body.innerHTML = fixture;
+});
+
+afterEach(() => {
+ document.body.innerHTML = '';
+});
+
+describe('trackUploadFileFormSubmitted', () => {
+ it('initializes ExperimentTracking with the correct arguments and calls the tracking event with correct arguments', () => {
+ UploadFileExperiment.trackUploadFileFormSubmitted();
+
+ expect(ExperimentTracking).toHaveBeenCalledWith('empty_repo_upload', {
+ label: 'blob-upload-modal',
+ });
+ expect(mockExperimentTrackingEvent).toHaveBeenCalledWith('click_upload_modal_form_submit');
+ });
+});
+
+describe('initUploadFileTrigger', () => {
+ it('calls modal and tracks event', () => {
+ UploadFileExperiment.initUploadFileTrigger();
+
+ expect(findModal()).not.toExist();
+ findTrigger().click();
+ expect(findModal()).toExist();
+ expect(mockExperimentTrackingEvent).toHaveBeenCalledWith('click_upload_modal_trigger');
+ });
+});
diff --git a/spec/frontend/security_configuration/configuration_table_spec.js b/spec/frontend/security_configuration/configuration_table_spec.js
index 49f9a7a3ea8..a9d9a0dbf1a 100644
--- a/spec/frontend/security_configuration/configuration_table_spec.js
+++ b/spec/frontend/security_configuration/configuration_table_spec.js
@@ -5,11 +5,7 @@ import { features, UPGRADE_CTA } from '~/security_configuration/components/featu
import {
REPORT_TYPE_SAST,
- REPORT_TYPE_DAST,
- REPORT_TYPE_DEPENDENCY_SCANNING,
- REPORT_TYPE_CONTAINER_SCANNING,
- REPORT_TYPE_COVERAGE_FUZZING,
- REPORT_TYPE_LICENSE_COMPLIANCE,
+ REPORT_TYPE_SECRET_DETECTION,
} from '~/vue_shared/security_reports/constants';
describe('Configuration Table Component', () => {
@@ -19,6 +15,8 @@ describe('Configuration Table Component', () => {
wrapper = extendedWrapper(mount(ConfigurationTable, {}));
};
+ const findHelpLinks = () => wrapper.findAll('[data-testid="help-link"]');
+
afterEach(() => {
wrapper.destroy();
});
@@ -27,22 +25,20 @@ describe('Configuration Table Component', () => {
createComponent();
});
- it.each(features)('should match strings', (feature) => {
- expect(wrapper.text()).toContain(feature.name);
- expect(wrapper.text()).toContain(feature.description);
-
- if (feature.type === REPORT_TYPE_SAST) {
- expect(wrapper.findByTestId(feature.type).text()).toBe('Configure via Merge Request');
- } else if (
- [
- REPORT_TYPE_DAST,
- REPORT_TYPE_DEPENDENCY_SCANNING,
- REPORT_TYPE_CONTAINER_SCANNING,
- REPORT_TYPE_COVERAGE_FUZZING,
- REPORT_TYPE_LICENSE_COMPLIANCE,
- ].includes(feature.type)
- ) {
- expect(wrapper.findByTestId(feature.type).text()).toMatchInterpolatedText(UPGRADE_CTA);
- }
+ describe.each(features.map((feature, i) => [feature, i]))('given feature %s', (feature, i) => {
+ it('should match strings', () => {
+ expect(wrapper.text()).toContain(feature.name);
+ expect(wrapper.text()).toContain(feature.description);
+ if (feature.type === REPORT_TYPE_SAST) {
+ expect(wrapper.findByTestId(feature.type).text()).toBe('Configure via Merge Request');
+ } else if (feature.type !== REPORT_TYPE_SECRET_DETECTION) {
+ expect(wrapper.findByTestId(feature.type).text()).toMatchInterpolatedText(UPGRADE_CTA);
+ }
+ });
+
+ it('should show expected help link', () => {
+ const helpLink = findHelpLinks().at(i);
+ expect(helpLink.attributes('href')).toBe(feature.helpPath);
+ });
});
});
diff --git a/spec/frontend/sentry/sentry_config_spec.js b/spec/frontend/sentry/sentry_config_spec.js
index f7102f9b2f9..1f5097ef2a8 100644
--- a/spec/frontend/sentry/sentry_config_spec.js
+++ b/spec/frontend/sentry/sentry_config_spec.js
@@ -1,5 +1,5 @@
+import * as Sentry from '@sentry/browser';
import SentryConfig from '~/sentry/sentry_config';
-import * as Sentry from '~/sentry/wrapper';
describe('SentryConfig', () => {
describe('IGNORE_ERRORS', () => {
diff --git a/spec/frontend/sidebar/subscriptions_spec.js b/spec/frontend/sidebar/subscriptions_spec.js
index e7ae59e26cf..6ab8e1e0ebc 100644
--- a/spec/frontend/sidebar/subscriptions_spec.js
+++ b/spec/frontend/sidebar/subscriptions_spec.js
@@ -84,6 +84,15 @@ describe('Subscriptions', () => {
spy.mockRestore();
});
+ it('has visually hidden label', () => {
+ wrapper = mountComponent();
+
+ expect(findToggleButton().props()).toMatchObject({
+ label: 'Notifications',
+ labelPosition: 'hidden',
+ });
+ });
+
describe('given project emails are disabled', () => {
const subscribeDisabledDescription = 'Notifications have been disabled';
diff --git a/spec/frontend/tracking_spec.js b/spec/frontend/tracking_spec.js
index a516a4a8269..be86e8ed90f 100644
--- a/spec/frontend/tracking_spec.js
+++ b/spec/frontend/tracking_spec.js
@@ -1,5 +1,5 @@
import { setHTMLFixture } from 'helpers/fixtures';
-import Tracking, { initUserTracking, initDefaultTrackers } from '~/tracking';
+import Tracking, { initUserTracking, initDefaultTrackers, STANDARD_CONTEXT } from '~/tracking';
describe('Tracking', () => {
let snowplowSpy;
@@ -45,7 +45,7 @@ describe('Tracking', () => {
it('should activate features based on what has been enabled', () => {
initDefaultTrackers();
expect(snowplowSpy).toHaveBeenCalledWith('enableActivityTracking', 30, 30);
- expect(snowplowSpy).toHaveBeenCalledWith('trackPageView');
+ expect(snowplowSpy).toHaveBeenCalledWith('trackPageView', null, [STANDARD_CONTEXT]);
expect(snowplowSpy).not.toHaveBeenCalledWith('enableFormTracking');
expect(snowplowSpy).not.toHaveBeenCalledWith('enableLinkClickTracking');
@@ -88,7 +88,7 @@ describe('Tracking', () => {
'_label_',
undefined,
undefined,
- undefined,
+ [STANDARD_CONTEXT],
);
});
diff --git a/spec/frontend/user_popovers_spec.js b/spec/frontend/user_popovers_spec.js
index 7c9c3d69efa..5c6053f413f 100644
--- a/spec/frontend/user_popovers_spec.js
+++ b/spec/frontend/user_popovers_spec.js
@@ -6,6 +6,19 @@ describe('User Popovers', () => {
preloadFixtures(fixtureTemplate);
const selector = '.js-user-link, .gfm-project_member';
+ const findFixtureLinks = () => {
+ return Array.from(document.querySelectorAll(selector)).filter(
+ ({ dataset }) => dataset.user || dataset.userId,
+ );
+ };
+ const createUserLink = () => {
+ const link = document.createElement('a');
+
+ link.classList.add('js-user-link');
+ link.setAttribute('data-user', '1');
+
+ return link;
+ };
const dummyUser = { name: 'root' };
const dummyUserStatus = { message: 'active' };
@@ -37,13 +50,20 @@ describe('User Popovers', () => {
});
it('initializes a popover for each user link with a user id', () => {
- const linksWithUsers = Array.from(document.querySelectorAll(selector)).filter(
- ({ dataset }) => dataset.user || dataset.userId,
- );
+ const linksWithUsers = findFixtureLinks();
expect(linksWithUsers.length).toBe(popovers.length);
});
+ it('adds popovers to user links added to the DOM tree after the initial call', async () => {
+ document.body.appendChild(createUserLink());
+ document.body.appendChild(createUserLink());
+
+ const linksWithUsers = findFixtureLinks();
+
+ expect(linksWithUsers.length).toBe(popovers.length + 2);
+ });
+
it('does not initialize the user popovers twice for the same element', () => {
const newPopovers = initUserPopovers(document.querySelectorAll(selector));
const samePopovers = popovers.every((popover, index) => newPopovers[index] === popover);
diff --git a/spec/frontend/vue_shared/alert_details/alert_details_spec.js b/spec/frontend/vue_shared/alert_details/alert_details_spec.js
index dd9a7be6268..ce410a8b3e7 100644
--- a/spec/frontend/vue_shared/alert_details/alert_details_spec.js
+++ b/spec/frontend/vue_shared/alert_details/alert_details_spec.js
@@ -128,6 +128,10 @@ describe('AlertDetails', () => {
expect(wrapper.findByTestId('startTimeItem').exists()).toBe(true);
expect(wrapper.findByTestId('startTimeItem').props('time')).toBe(mockAlert.startedAt);
});
+
+ it('renders the metrics tab', () => {
+ expect(findMetricsTab().exists()).toBe(true);
+ });
});
describe('individual alert fields', () => {
@@ -179,7 +183,8 @@ describe('AlertDetails', () => {
describe('Threat Monitoring details', () => {
it('should not render the metrics tab', () => {
mountComponent({
- data: { alert: mockAlert, provide: { isThreatMonitoringPage: true } },
+ data: { alert: mockAlert },
+ provide: { isThreatMonitoringPage: true },
});
expect(findMetricsTab().exists()).toBe(false);
});
diff --git a/spec/frontend/vue_shared/components/settings/__snapshots__/settings_block_spec.js.snap b/spec/frontend/vue_shared/components/settings/__snapshots__/settings_block_spec.js.snap
index 51b8aa162bc..ed085fb66dc 100644
--- a/spec/frontend/vue_shared/components/settings/__snapshots__/settings_block_spec.js.snap
+++ b/spec/frontend/vue_shared/components/settings/__snapshots__/settings_block_spec.js.snap
@@ -2,7 +2,7 @@
exports[`Settings Block renders the correct markup 1`] = `
<section
- class="settings no-animate"
+ class="settings"
>
<div
class="settings-header"
diff --git a/spec/frontend/vue_shared/components/settings/settings_block_spec.js b/spec/frontend/vue_shared/components/settings/settings_block_spec.js
index 2db0b001b5b..be5a15631eb 100644
--- a/spec/frontend/vue_shared/components/settings/settings_block_spec.js
+++ b/spec/frontend/vue_shared/components/settings/settings_block_spec.js
@@ -50,6 +50,27 @@ describe('Settings Block', () => {
expect(findDescriptionSlot().exists()).toBe(true);
});
+ describe('slide animation behaviour', () => {
+ it('is animated by default', () => {
+ mountComponent();
+
+ expect(wrapper.classes('no-animate')).toBe(false);
+ });
+
+ it.each`
+ slideAnimated | noAnimatedClass
+ ${true} | ${false}
+ ${false} | ${true}
+ `(
+ 'sets the correct state when slideAnimated is $slideAnimated',
+ ({ slideAnimated, noAnimatedClass }) => {
+ mountComponent({ slideAnimated });
+
+ expect(wrapper.classes('no-animate')).toBe(noAnimatedClass);
+ },
+ );
+ });
+
describe('expanded behaviour', () => {
it('is collapsed by default', () => {
mountComponent();
diff --git a/spec/frontend/vue_shared/components/tabs/tab_spec.js b/spec/frontend/vue_shared/components/tabs/tab_spec.js
deleted file mode 100644
index ee0c983c764..00000000000
--- a/spec/frontend/vue_shared/components/tabs/tab_spec.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import Vue from 'vue';
-import mountComponent from 'helpers/vue_mount_component_helper';
-import Tab from '~/vue_shared/components/tabs/tab.vue';
-
-describe('Tab component', () => {
- const Component = Vue.extend(Tab);
- let vm;
-
- beforeEach(() => {
- vm = mountComponent(Component);
- });
-
- it('sets localActive to equal active', (done) => {
- vm.active = true;
-
- vm.$nextTick(() => {
- expect(vm.localActive).toBe(true);
-
- done();
- });
- });
-
- it('sets active class', (done) => {
- vm.active = true;
-
- vm.$nextTick(() => {
- expect(vm.$el.classList).toContain('active');
-
- done();
- });
- });
-});
diff --git a/spec/frontend/vue_shared/components/tabs/tabs_spec.js b/spec/frontend/vue_shared/components/tabs/tabs_spec.js
deleted file mode 100644
index fe7be5be899..00000000000
--- a/spec/frontend/vue_shared/components/tabs/tabs_spec.js
+++ /dev/null
@@ -1,61 +0,0 @@
-import Vue from 'vue';
-import Tab from '~/vue_shared/components/tabs/tab.vue';
-import Tabs from '~/vue_shared/components/tabs/tabs';
-
-describe('Tabs component', () => {
- let vm;
-
- beforeEach(() => {
- vm = new Vue({
- components: {
- Tabs,
- Tab,
- },
- render(h) {
- return h('div', [
- h('tabs', [
- h('tab', { attrs: { title: 'Testing', active: true } }, 'First tab'),
- h('tab', [h('template', { slot: 'title' }, 'Test slot'), 'Second tab']),
- ]),
- ]);
- },
- }).$mount();
-
- return vm.$nextTick();
- });
-
- describe('tab links', () => {
- it('renders links for tabs', () => {
- expect(vm.$el.querySelectorAll('a').length).toBe(2);
- });
-
- it('renders link titles from props', () => {
- expect(vm.$el.querySelector('a').textContent).toContain('Testing');
- });
-
- it('renders link titles from slot', () => {
- expect(vm.$el.querySelectorAll('a')[1].textContent).toContain('Test slot');
- });
-
- it('renders active class', () => {
- expect(vm.$el.querySelector('a').classList).toContain('active');
- });
-
- it('updates active class on click', () => {
- vm.$el.querySelectorAll('a')[1].click();
-
- return vm.$nextTick(() => {
- expect(vm.$el.querySelector('a').classList).not.toContain('active');
- expect(vm.$el.querySelectorAll('a')[1].classList).toContain('active');
- });
- });
- });
-
- describe('content', () => {
- it('renders content panes', () => {
- expect(vm.$el.querySelectorAll('.tab-pane').length).toBe(2);
- expect(vm.$el.querySelectorAll('.tab-pane')[0].textContent).toContain('First tab');
- expect(vm.$el.querySelectorAll('.tab-pane')[1].textContent).toContain('Second tab');
- });
- });
-});
diff --git a/spec/frontend/vue_shared/components/tooltip_on_truncate_spec.js b/spec/frontend/vue_shared/components/tooltip_on_truncate_spec.js
index 27c9b099306..380b7231acd 100644
--- a/spec/frontend/vue_shared/components/tooltip_on_truncate_spec.js
+++ b/spec/frontend/vue_shared/components/tooltip_on_truncate_spec.js
@@ -11,6 +11,15 @@ jest.mock('~/lib/utils/dom_utils', () => ({
throw new Error('this needs to be mocked');
}),
}));
+jest.mock('@gitlab/ui', () => ({
+ GlTooltipDirective: {
+ bind(el, binding) {
+ el.classList.add('gl-tooltip');
+ el.setAttribute('data-original-title', el.title);
+ el.dataset.placement = binding.value.placement;
+ },
+ },
+}));
describe('TooltipOnTruncate component', () => {
let wrapper;
@@ -52,7 +61,7 @@ describe('TooltipOnTruncate component', () => {
wrapper = parent.find(TooltipOnTruncate);
};
- const hasTooltip = () => wrapper.classes('js-show-tooltip');
+ const hasTooltip = () => wrapper.classes('gl-tooltip');
afterEach(() => {
wrapper.destroy();
diff --git a/spec/frontend/vue_shared/components/upload_dropzone/__snapshots__/upload_dropzone_spec.js.snap b/spec/frontend/vue_shared/components/upload_dropzone/__snapshots__/upload_dropzone_spec.js.snap
index d2fe3cd76cb..af4fa462cbf 100644
--- a/spec/frontend/vue_shared/components/upload_dropzone/__snapshots__/upload_dropzone_spec.js.snap
+++ b/spec/frontend/vue_shared/components/upload_dropzone/__snapshots__/upload_dropzone_spec.js.snap
@@ -19,6 +19,7 @@ exports[`Upload dropzone component correctly overrides description and drop mess
<p
class="gl-mb-0"
+ data-testid="upload-text"
>
<span>
Test %{linkStart}description%{linkEnd} message.
@@ -98,10 +99,15 @@ exports[`Upload dropzone component when dragging renders correct template when d
<p
class="gl-mb-0"
+ data-testid="upload-text"
>
- <gl-sprintf-stub
- message="Drop or %{linkStart}upload%{linkEnd} files to attach"
- />
+ Drop or
+ <gl-link-stub>
+
+ upload
+
+ </gl-link-stub>
+ files to attach
</p>
</div>
</button>
@@ -178,10 +184,15 @@ exports[`Upload dropzone component when dragging renders correct template when d
<p
class="gl-mb-0"
+ data-testid="upload-text"
>
- <gl-sprintf-stub
- message="Drop or %{linkStart}upload%{linkEnd} files to attach"
- />
+ Drop or
+ <gl-link-stub>
+
+ upload
+
+ </gl-link-stub>
+ files to attach
</p>
</div>
</button>
@@ -258,10 +269,15 @@ exports[`Upload dropzone component when dragging renders correct template when d
<p
class="gl-mb-0"
+ data-testid="upload-text"
>
- <gl-sprintf-stub
- message="Drop or %{linkStart}upload%{linkEnd} files to attach"
- />
+ Drop or
+ <gl-link-stub>
+
+ upload
+
+ </gl-link-stub>
+ files to attach
</p>
</div>
</button>
@@ -337,10 +353,15 @@ exports[`Upload dropzone component when dragging renders correct template when d
<p
class="gl-mb-0"
+ data-testid="upload-text"
>
- <gl-sprintf-stub
- message="Drop or %{linkStart}upload%{linkEnd} files to attach"
- />
+ Drop or
+ <gl-link-stub>
+
+ upload
+
+ </gl-link-stub>
+ files to attach
</p>
</div>
</button>
@@ -416,10 +437,15 @@ exports[`Upload dropzone component when dragging renders correct template when d
<p
class="gl-mb-0"
+ data-testid="upload-text"
>
- <gl-sprintf-stub
- message="Drop or %{linkStart}upload%{linkEnd} files to attach"
- />
+ Drop or
+ <gl-link-stub>
+
+ upload
+
+ </gl-link-stub>
+ files to attach
</p>
</div>
</button>
@@ -495,10 +521,15 @@ exports[`Upload dropzone component when no slot provided renders default dropzon
<p
class="gl-mb-0"
+ data-testid="upload-text"
>
- <gl-sprintf-stub
- message="Drop or %{linkStart}upload%{linkEnd} files to attach"
- />
+ Drop or
+ <gl-link-stub>
+
+ upload
+
+ </gl-link-stub>
+ files to attach
</p>
</div>
</button>
diff --git a/spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js b/spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js
index ace486b1f32..b3cdbccb271 100644
--- a/spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js
+++ b/spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js
@@ -1,4 +1,4 @@
-import { GlIcon } from '@gitlab/ui';
+import { GlIcon, GlSprintf } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import UploadDropzone from '~/vue_shared/components/upload_dropzone/upload_dropzone.vue';
@@ -14,6 +14,7 @@ describe('Upload dropzone component', () => {
const findDropzoneCard = () => wrapper.find('.upload-dropzone-card');
const findDropzoneArea = () => wrapper.find('[data-testid="dropzone-area"]');
const findIcon = () => wrapper.find(GlIcon);
+ const findUploadText = () => wrapper.find('[data-testid="upload-text"]').text();
function createComponent({ slots = {}, data = {}, props = {} } = {}) {
wrapper = shallowMount(UploadDropzone, {
@@ -22,6 +23,9 @@ describe('Upload dropzone component', () => {
displayAsCard: true,
...props,
},
+ stubs: {
+ GlSprintf,
+ },
data() {
return data;
},
@@ -30,6 +34,7 @@ describe('Upload dropzone component', () => {
afterEach(() => {
wrapper.destroy();
+ wrapper = null;
});
describe('when slot provided', () => {
@@ -60,6 +65,18 @@ describe('Upload dropzone component', () => {
});
});
+ describe('upload text', () => {
+ it.each`
+ collection | description | props | expected
+ ${'multiple'} | ${'by default'} | ${null} | ${'files to attach'}
+ ${'singular'} | ${'when singleFileSelection'} | ${{ singleFileSelection: true }} | ${'file to attach'}
+ `('displays $collection version $description', ({ props, expected }) => {
+ createComponent({ props });
+
+ expect(findUploadText()).toContain(expected);
+ });
+ });
+
describe('when dragging', () => {
it.each`
description | eventPayload
@@ -141,6 +158,21 @@ describe('Upload dropzone component', () => {
wrapper.vm.ondrop(mockEvent);
expect(wrapper.emitted()).not.toHaveProperty('error');
});
+
+ describe('singleFileSelection = true', () => {
+ it('emits a single file on drop', () => {
+ createComponent({
+ data: mockData,
+ props: { singleFileSelection: true },
+ });
+
+ const mockFile = { type: 'image/jpg' };
+ const mockEvent = mockDragEvent({ files: [mockFile] });
+
+ wrapper.vm.ondrop(mockEvent);
+ expect(wrapper.emitted().change[0]).toEqual([mockFile]);
+ });
+ });
});
});
diff --git a/spec/frontend/vue_shared/directives/tooltip_spec.js b/spec/frontend/vue_shared/directives/tooltip_spec.js
deleted file mode 100644
index 99e8b5b552b..00000000000
--- a/spec/frontend/vue_shared/directives/tooltip_spec.js
+++ /dev/null
@@ -1,157 +0,0 @@
-import { mount } from '@vue/test-utils';
-import $ from 'jquery';
-import { escape } from 'lodash';
-import tooltip from '~/vue_shared/directives/tooltip';
-
-const DEFAULT_TOOLTIP_TEMPLATE = '<div v-tooltip :title="tooltip"></div>';
-const HTML_TOOLTIP_TEMPLATE = '<div v-tooltip data-html="true" :title="tooltip"></div>';
-
-describe('Tooltip directive', () => {
- let wrapper;
-
- function createTooltipContainer({
- template = DEFAULT_TOOLTIP_TEMPLATE,
- text = 'some text',
- } = {}) {
- wrapper = mount(
- {
- directives: { tooltip },
- data: () => ({ tooltip: text }),
- template,
- },
- { attachTo: document.body },
- );
- }
-
- async function showTooltip() {
- $(wrapper.vm.$el).tooltip('show');
- jest.runOnlyPendingTimers();
- await wrapper.vm.$nextTick();
- }
-
- function findTooltipInnerHtml() {
- return document.querySelector('.tooltip-inner').innerHTML;
- }
-
- function findTooltipHtml() {
- return document.querySelector('.tooltip').innerHTML;
- }
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- describe('with a single tooltip', () => {
- it('should have tooltip plugin applied', () => {
- createTooltipContainer();
-
- expect($(wrapper.vm.$el).data('bs.tooltip')).toBeDefined();
- });
-
- it('displays the title as tooltip', () => {
- createTooltipContainer();
-
- $(wrapper.vm.$el).tooltip('show');
-
- jest.runOnlyPendingTimers();
-
- const tooltipElement = document.querySelector('.tooltip-inner');
-
- expect(tooltipElement.textContent).toContain('some text');
- });
-
- it.each`
- condition | template | sanitize
- ${'does not contain any html'} | ${DEFAULT_TOOLTIP_TEMPLATE} | ${false}
- ${'contains html'} | ${HTML_TOOLTIP_TEMPLATE} | ${true}
- `('passes sanitize=$sanitize if the tooltip $condition', ({ template, sanitize }) => {
- createTooltipContainer({ template });
-
- expect($(wrapper.vm.$el).data('bs.tooltip').config.sanitize).toEqual(sanitize);
- });
-
- it('updates a visible tooltip', async () => {
- createTooltipContainer();
-
- $(wrapper.vm.$el).tooltip('show');
- jest.runOnlyPendingTimers();
-
- const tooltipElement = document.querySelector('.tooltip-inner');
-
- wrapper.vm.tooltip = 'other text';
-
- jest.runOnlyPendingTimers();
- await wrapper.vm.$nextTick();
-
- expect(tooltipElement.textContent).toContain('other text');
- });
-
- describe('tooltip sanitization', () => {
- it('reads tooltip content as text if data-html is not passed', async () => {
- createTooltipContainer({ text: 'sample text<script>alert("XSS!!")</script>' });
-
- await showTooltip();
-
- const result = findTooltipInnerHtml();
- expect(result).toEqual('sample text&lt;script&gt;alert("XSS!!")&lt;/script&gt;');
- });
-
- it('sanitizes tooltip if data-html is passed', async () => {
- createTooltipContainer({
- template: HTML_TOOLTIP_TEMPLATE,
- text: 'sample text<script>alert("XSS!!")</script>',
- });
-
- await showTooltip();
-
- const result = findTooltipInnerHtml();
- expect(result).toEqual('sample text');
- expect(result).not.toContain('XSS!!');
- });
-
- it('sanitizes tooltip if data-template is passed', async () => {
- const tooltipTemplate = escape(
- '<div class="tooltip" role="tooltip"><div onclick="alert(\'XSS!\')" class="arrow"></div><div class="tooltip-inner"></div></div>',
- );
-
- createTooltipContainer({
- template: `<div v-tooltip :title="tooltip" data-html="false" data-template="${tooltipTemplate}"></div>`,
- });
-
- await showTooltip();
-
- const result = findTooltipHtml();
- expect(result).toEqual(
- // objectionable element is removed
- '<div class="arrow"></div><div class="tooltip-inner">some text</div>',
- );
- expect(result).not.toContain('XSS!!');
- });
- });
- });
-
- describe('with multiple tooltips', () => {
- beforeEach(() => {
- createTooltipContainer({
- template: `
- <div>
- <div
- v-tooltip
- class="js-look-for-tooltip"
- title="foo">
- </div>
- <div
- v-tooltip
- title="bar">
- </div>
- </div>
- `,
- });
- });
-
- it('should have tooltip plugin applied to all instances', () => {
- expect($(wrapper.vm.$el).find('.js-look-for-tooltip').data('bs.tooltip')).toBeDefined();
- });
- });
-});
diff --git a/spec/frontend_integration/ide/helpers/ide_helper.js b/spec/frontend_integration/ide/helpers/ide_helper.js
index 9e6bafc1297..6c09b44d891 100644
--- a/spec/frontend_integration/ide/helpers/ide_helper.js
+++ b/spec/frontend_integration/ide/helpers/ide_helper.js
@@ -25,6 +25,9 @@ export const getStatusBar = () => document.querySelector('.ide-status-bar');
export const waitForMonacoEditor = () =>
new Promise((resolve) => window.monaco.editor.onDidCreateEditor(resolve));
+export const waitForEditorModelChange = (instance) =>
+ new Promise((resolve) => instance.onDidChangeModel(resolve));
+
export const findMonacoEditor = () =>
screen.findAllByLabelText(/Editor content;/).then(([x]) => x.closest('.monaco-editor'));
diff --git a/spec/frontend_integration/ide/helpers/mock_data.js b/spec/frontend_integration/ide/helpers/mock_data.js
index f70739e5ac0..8c9ec74541f 100644
--- a/spec/frontend_integration/ide/helpers/mock_data.js
+++ b/spec/frontend_integration/ide/helpers/mock_data.js
@@ -4,7 +4,6 @@ export const IDE_DATASET = {
committedStateSvgPath: '/test/committed_state.svg',
pipelinesEmptyStateSvgPath: '/test/pipelines_empty_state.svg',
promotionSvgPath: '/test/promotion.svg',
- ciHelpPagePath: '/test/ci_help_page',
webIDEHelpPagePath: '/test/web_ide_help_page',
clientsidePreviewEnabled: 'true',
renderWhitespaceInCode: 'false',
diff --git a/spec/frontend_integration/ide/helpers/start.js b/spec/frontend_integration/ide/helpers/start.js
index 173a9610c84..cc6abd9e01f 100644
--- a/spec/frontend_integration/ide/helpers/start.js
+++ b/spec/frontend_integration/ide/helpers/start.js
@@ -1,6 +1,7 @@
+/* global monaco */
+
import { TEST_HOST } from 'helpers/test_constants';
import { initIde } from '~/ide';
-import Editor from '~/ide/lib/editor';
import extendStore from '~/ide/stores/extend';
import { IDE_DATASET } from './mock_data';
@@ -18,13 +19,7 @@ export default (container, { isRepoEmpty = false, path = '', mrId = '' } = {}) =
const vm = initIde(el, { extendStore });
// We need to dispose of editor Singleton things or tests will bump into eachother
- vm.$on('destroy', () => {
- if (Editor.editorInstance) {
- Editor.editorInstance.modelManager.dispose();
- Editor.editorInstance.dispose();
- Editor.editorInstance = null;
- }
- });
+ vm.$on('destroy', () => monaco.editor.getModels().forEach((model) => model.dispose()));
return vm;
};
diff --git a/spec/frontend_integration/ide/ide_integration_spec.js b/spec/frontend_integration/ide/ide_integration_spec.js
index 3ce88de11fe..5f1a5b0d048 100644
--- a/spec/frontend_integration/ide/ide_integration_spec.js
+++ b/spec/frontend_integration/ide/ide_integration_spec.js
@@ -96,16 +96,6 @@ describe('WebIDE', () => {
let statusBar;
let editor;
- const waitForEditor = async () => {
- editor = await ideHelper.waitForMonacoEditor();
- };
-
- const changeEditorPosition = async (lineNumber, column) => {
- editor.setPosition({ lineNumber, column });
-
- await vm.$nextTick();
- };
-
beforeEach(async () => {
vm = startWebIDE(container);
@@ -134,16 +124,17 @@ describe('WebIDE', () => {
// Need to wait for monaco editor to load so it doesn't through errors on dispose
await ideHelper.openFile('.gitignore');
- await ideHelper.waitForMonacoEditor();
+ await ideHelper.waitForEditorModelChange(editor);
await ideHelper.openFile('README.md');
- await ideHelper.waitForMonacoEditor();
+ await ideHelper.waitForEditorModelChange(editor);
expect(el).toHaveText(markdownPreview);
});
describe('when editor position changes', () => {
beforeEach(async () => {
- await changeEditorPosition(4, 10);
+ editor.setPosition({ lineNumber: 4, column: 10 });
+ await vm.$nextTick();
});
it('shows new line position', () => {
@@ -153,7 +144,8 @@ describe('WebIDE', () => {
it('updates after rename', async () => {
await ideHelper.renameFile('README.md', 'READMEZ.txt');
- await waitForEditor();
+ await ideHelper.waitForEditorModelChange(editor);
+ await vm.$nextTick();
expect(statusBar).toHaveText('1:1');
expect(statusBar).toHaveText('plaintext');
@@ -161,10 +153,10 @@ describe('WebIDE', () => {
it('persists position after opening then rename', async () => {
await ideHelper.openFile('files/js/application.js');
- await waitForEditor();
+ await ideHelper.waitForEditorModelChange(editor);
await ideHelper.renameFile('README.md', 'READING_RAINBOW.md');
await ideHelper.openFile('READING_RAINBOW.md');
- await waitForEditor();
+ await ideHelper.waitForEditorModelChange(editor);
expect(statusBar).toHaveText('4:10');
expect(statusBar).toHaveText('markdown');
@@ -173,7 +165,8 @@ describe('WebIDE', () => {
it('persists position after closing', async () => {
await ideHelper.closeFile('README.md');
await ideHelper.openFile('README.md');
- await waitForEditor();
+ await ideHelper.waitForMonacoEditor();
+ await vm.$nextTick();
expect(statusBar).toHaveText('4:10');
expect(statusBar).toHaveText('markdown');
diff --git a/spec/frontend_integration/ide/user_opens_mr_spec.js b/spec/frontend_integration/ide/user_opens_mr_spec.js
index 9cf0ff5da56..3ffc5169351 100644
--- a/spec/frontend_integration/ide/user_opens_mr_spec.js
+++ b/spec/frontend_integration/ide/user_opens_mr_spec.js
@@ -24,11 +24,11 @@ describe('IDE: User opens Merge Request', () => {
vm = startWebIDE(container, { mrId });
- await ideHelper.waitForTabToOpen(basename(changes[0].new_path));
- await ideHelper.waitForMonacoEditor();
+ const editor = await ideHelper.waitForMonacoEditor();
+ await ideHelper.waitForEditorModelChange(editor);
});
- afterEach(async () => {
+ afterEach(() => {
vm.$destroy();
vm = null;
});
diff --git a/spec/frontend_integration/test_helpers/mock_server/graphql.js b/spec/frontend_integration/test_helpers/mock_server/graphql.js
index 654c373e5a6..e2658852599 100644
--- a/spec/frontend_integration/test_helpers/mock_server/graphql.js
+++ b/spec/frontend_integration/test_helpers/mock_server/graphql.js
@@ -1,5 +1,11 @@
import { buildSchema, graphql } from 'graphql';
-import gitlabSchemaStr from '../../../../doc/api/graphql/reference/gitlab_schema.graphql';
+
+/* eslint-disable import/no-unresolved */
+// This rule is disabled for the following line.
+// The graphql schema is dynamically generated in CI
+// during the `graphql-schema-dump` job.
+import gitlabSchemaStr from '../../../../tmp/tests/graphql/gitlab_schema.graphql';
+/* eslint-enable import/no-unresolved */
const graphqlSchema = buildSchema(gitlabSchemaStr.loc.source.body);
const graphqlResolvers = {
diff --git a/spec/graphql/mutations/boards/update_spec.rb b/spec/graphql/mutations/boards/update_spec.rb
new file mode 100644
index 00000000000..6f05b21b0b4
--- /dev/null
+++ b/spec/graphql/mutations/boards/update_spec.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::Boards::Update do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:board) { create(:board, project: project) }
+
+ let(:mutation) { described_class.new(object: nil, context: { current_user: user }, field: nil) }
+ let(:mutated_board) { subject[:board] }
+
+ let(:mutation_params) do
+ {
+ id: board.to_global_id,
+ hide_backlog_list: true,
+ hide_closed_list: false
+ }
+ end
+
+ subject { mutation.resolve(**mutation_params) }
+
+ specify { expect(described_class).to require_graphql_authorizations(:admin_board) }
+
+ describe '#resolve' do
+ context 'when the user cannot admin the board' do
+ it 'raises an error' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'with invalid params' do
+ it 'raises an error' do
+ mutation_params[:id] = project.to_global_id
+
+ expect { subject }.to raise_error(::GraphQL::CoercionError)
+ end
+ end
+
+ context 'when user can update board' do
+ before do
+ board.resource_parent.add_reporter(user)
+ end
+
+ it 'updates board with correct values' do
+ expected_attributes = {
+ hide_backlog_list: true,
+ hide_closed_list: false
+ }
+
+ subject
+
+ expect(board.reload).to have_attributes(expected_attributes)
+ end
+ end
+ end
+end
diff --git a/spec/graphql/mutations/custom_emoji/create_spec.rb b/spec/graphql/mutations/custom_emoji/create_spec.rb
new file mode 100644
index 00000000000..118c5d67188
--- /dev/null
+++ b/spec/graphql/mutations/custom_emoji/create_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::CustomEmoji::Create do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:user) { create(:user) }
+ let(:args) { { group_path: group.full_path, name: 'tanuki', url: 'https://about.gitlab.com/images/press/logo/png/gitlab-icon-rgb.png' } }
+
+ before do
+ group.add_developer(user)
+ end
+
+ describe '#resolve' do
+ subject(:resolve) { described_class.new(object: nil, context: { current_user: user }, field: nil).resolve(**args) }
+
+ it 'creates the custom emoji' do
+ expect { resolve }.to change(CustomEmoji, :count).by(1)
+ end
+
+ it 'sets the creator to be the user who added the emoji' do
+ resolve
+
+ expect(CustomEmoji.last.creator).to eq(user)
+ end
+ end
+end
diff --git a/spec/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver_spec.rb b/spec/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver_spec.rb
index 578d679ade4..269a1fb1758 100644
--- a/spec/graphql/resolvers/admin/analytics/instance_statistics/measurements_resolver_spec.rb
+++ b/spec/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Resolvers::Admin::Analytics::InstanceStatistics::MeasurementsResolver do
+RSpec.describe Resolvers::Admin::Analytics::UsageTrends::MeasurementsResolver do
include GraphqlHelpers
let_it_be(:admin_user) { create(:user, :admin) }
@@ -11,8 +11,8 @@ RSpec.describe Resolvers::Admin::Analytics::InstanceStatistics::MeasurementsReso
describe '#resolve' do
let_it_be(:user) { create(:user) }
- let_it_be(:project_measurement_new) { create(:instance_statistics_measurement, :project_count, recorded_at: 2.days.ago) }
- let_it_be(:project_measurement_old) { create(:instance_statistics_measurement, :project_count, recorded_at: 10.days.ago) }
+ let_it_be(:project_measurement_new) { create(:usage_trends_measurement, :project_count, recorded_at: 2.days.ago) }
+ let_it_be(:project_measurement_old) { create(:usage_trends_measurement, :project_count, recorded_at: 10.days.ago) }
let(:arguments) { { identifier: 'projects' } }
@@ -63,8 +63,8 @@ RSpec.describe Resolvers::Admin::Analytics::InstanceStatistics::MeasurementsReso
end
context 'when requesting pipeline counts by pipeline status' do
- let_it_be(:pipelines_succeeded_measurement) { create(:instance_statistics_measurement, :pipelines_succeeded_count, recorded_at: 2.days.ago) }
- let_it_be(:pipelines_skipped_measurement) { create(:instance_statistics_measurement, :pipelines_skipped_count, recorded_at: 2.days.ago) }
+ let_it_be(:pipelines_succeeded_measurement) { create(:usage_trends_measurement, :pipelines_succeeded_count, recorded_at: 2.days.ago) }
+ let_it_be(:pipelines_skipped_measurement) { create(:usage_trends_measurement, :pipelines_skipped_count, recorded_at: 2.days.ago) }
subject { resolve_measurements({ identifier: identifier }, { current_user: current_user }) }
diff --git a/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb b/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb
new file mode 100644
index 00000000000..2cd61dd7bcf
--- /dev/null
+++ b/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Resolvers::AlertManagement::HttpIntegrationsResolver do
+ include GraphqlHelpers
+
+ let_it_be(:guest) { create(:user) }
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:maintainer) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:prometheus_integration) { create(:prometheus_service, project: project) }
+ let_it_be(:active_http_integration) { create(:alert_management_http_integration, project: project) }
+ let_it_be(:inactive_http_integration) { create(:alert_management_http_integration, :inactive, project: project) }
+ let_it_be(:other_proj_integration) { create(:alert_management_http_integration) }
+
+ subject { sync(resolve_http_integrations) }
+
+ before do
+ project.add_developer(developer)
+ project.add_maintainer(maintainer)
+ end
+
+ specify do
+ expect(described_class).to have_nullable_graphql_type(Types::AlertManagement::HttpIntegrationType.connection_type)
+ end
+
+ context 'user does not have permission' do
+ let(:current_user) { guest }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'user has developer permission' do
+ let(:current_user) { developer }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'user has maintainer permission' do
+ let(:current_user) { maintainer }
+
+ it { is_expected.to contain_exactly(active_http_integration) }
+ end
+
+ private
+
+ def resolve_http_integrations(args = {}, context = { current_user: current_user })
+ resolve(described_class, obj: project, ctx: context)
+ end
+end
diff --git a/spec/graphql/types/admin/analytics/instance_statistics/measurement_identifier_enum_spec.rb b/spec/graphql/types/admin/analytics/usage_trends/measurement_identifier_enum_spec.rb
index 8a7408224a2..91851c11dc8 100644
--- a/spec/graphql/types/admin/analytics/instance_statistics/measurement_identifier_enum_spec.rb
+++ b/spec/graphql/types/admin/analytics/usage_trends/measurement_identifier_enum_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe GitlabSchema.types['MeasurementIdentifier'] do
it 'exposes all the existing identifier values' do
ee_only_identifiers = %w[billable_users]
- identifiers = Analytics::InstanceStatistics::Measurement.identifiers.keys.reject do |x|
+ identifiers = Analytics::UsageTrends::Measurement.identifiers.keys.reject do |x|
ee_only_identifiers.include?(x)
end.map(&:upcase)
diff --git a/spec/graphql/types/admin/analytics/instance_statistics/measurement_type_spec.rb b/spec/graphql/types/admin/analytics/usage_trends/measurement_type_spec.rb
index ffb1a0f30c9..c50092d7f0e 100644
--- a/spec/graphql/types/admin/analytics/instance_statistics/measurement_type_spec.rb
+++ b/spec/graphql/types/admin/analytics/usage_trends/measurement_type_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe GitlabSchema.types['InstanceStatisticsMeasurement'] do
+RSpec.describe GitlabSchema.types['UsageTrendsMeasurement'] do
subject { described_class }
it { is_expected.to have_graphql_field(:recorded_at) }
@@ -10,13 +10,13 @@ RSpec.describe GitlabSchema.types['InstanceStatisticsMeasurement'] do
it { is_expected.to have_graphql_field(:count) }
describe 'authorization' do
- let_it_be(:measurement) { create(:instance_statistics_measurement, :project_count) }
+ let_it_be(:measurement) { create(:usage_trends_measurement, :project_count) }
let(:user) { create(:user) }
let(:query) do
<<~GRAPHQL
- query instanceStatisticsMeasurements($identifier: MeasurementIdentifier!) {
- instanceStatisticsMeasurements(identifier: $identifier) {
+ query usageTrendsMeasurements($identifier: MeasurementIdentifier!) {
+ usageTrendsMeasurements(identifier: $identifier) {
nodes {
count
identifier
@@ -36,7 +36,7 @@ RSpec.describe GitlabSchema.types['InstanceStatisticsMeasurement'] do
context 'when the user is not admin' do
it 'returns no data' do
- expect(subject.dig('data', 'instanceStatisticsMeasurements')).to be_nil
+ expect(subject.dig('data', 'usageTrendsMeasurements')).to be_nil
end
end
@@ -48,7 +48,7 @@ RSpec.describe GitlabSchema.types['InstanceStatisticsMeasurement'] do
end
it 'returns data' do
- expect(subject.dig('data', 'instanceStatisticsMeasurements', 'nodes')).not_to be_empty
+ expect(subject.dig('data', 'usageTrendsMeasurements', 'nodes')).not_to be_empty
end
end
end
diff --git a/spec/graphql/types/ci/pipeline_type_spec.rb b/spec/graphql/types/ci/pipeline_type_spec.rb
index 2a1e030480d..c4b34ca5316 100644
--- a/spec/graphql/types/ci/pipeline_type_spec.rb
+++ b/spec/graphql/types/ci/pipeline_type_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe Types::Ci::PipelineType do
]
if Gitlab.ee?
- expected_fields << 'security_report_summary'
+ expected_fields += %w[security_report_summary security_report_findings]
end
expect(described_class).to have_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/global_id_type_spec.rb b/spec/graphql/types/global_id_type_spec.rb
index cb129868f7e..8eb023ad2a3 100644
--- a/spec/graphql/types/global_id_type_spec.rb
+++ b/spec/graphql/types/global_id_type_spec.rb
@@ -5,7 +5,6 @@ require 'spec_helper'
RSpec.describe Types::GlobalIDType do
let_it_be(:project) { create(:project) }
let(:gid) { project.to_global_id }
- let(:foreign_gid) { GlobalID.new(::URI::GID.build(app: 'otherapp', model_name: 'Project', model_id: project.id, params: nil)) }
it 'is has the correct name' do
expect(described_class.to_graphql.name).to eq('GlobalID')
@@ -41,16 +40,18 @@ RSpec.describe Types::GlobalIDType do
it 'rejects invalid input' do
expect { described_class.coerce_isolated_input('not valid') }
- .to raise_error(GraphQL::CoercionError)
+ .to raise_error(GraphQL::CoercionError, /not a valid Global ID/)
end
it 'rejects nil' do
expect(described_class.coerce_isolated_input(nil)).to be_nil
end
- it 'rejects gids from different apps' do
- expect { described_class.coerce_isolated_input(foreign_gid) }
- .to raise_error(GraphQL::CoercionError)
+ it 'rejects GIDs from different apps' do
+ invalid_gid = GlobalID.new(::URI::GID.build(app: 'otherapp', model_name: 'Project', model_id: project.id, params: nil))
+
+ expect { described_class.coerce_isolated_input(invalid_gid) }
+ .to raise_error(GraphQL::CoercionError, /is not a Gitlab Global ID/)
end
end
@@ -79,14 +80,22 @@ RSpec.describe Types::GlobalIDType do
let(:gid) { build_stubbed(:user).to_global_id }
it 'raises errors when coercing results' do
- expect { type.coerce_isolated_result(gid) }.to raise_error(GraphQL::CoercionError)
+ expect { type.coerce_isolated_result(gid) }
+ .to raise_error(GraphQL::CoercionError, /Expected a Project ID/)
end
it 'will not coerce invalid input, even if its a valid GID' do
expect { type.coerce_isolated_input(gid.to_s) }
- .to raise_error(GraphQL::CoercionError)
+ .to raise_error(GraphQL::CoercionError, /does not represent an instance of Project/)
end
end
+
+ it 'handles GIDs for invalid resource names gracefully' do
+ invalid_gid = GlobalID.new(::URI::GID.build(app: GlobalID.app, model_name: 'invalid', model_id: 1, params: nil))
+
+ expect { type.coerce_isolated_input(invalid_gid) }
+ .to raise_error(GraphQL::CoercionError, /does not represent an instance of Project/)
+ end
end
describe 'a parameterized type with a namespace' do
diff --git a/spec/graphql/types/label_type_spec.rb b/spec/graphql/types/label_type_spec.rb
index 6a999a2e925..427b5d2dcef 100644
--- a/spec/graphql/types/label_type_spec.rb
+++ b/spec/graphql/types/label_type_spec.rb
@@ -3,7 +3,16 @@ require 'spec_helper'
RSpec.describe GitlabSchema.types['Label'] do
it 'has the correct fields' do
- expected_fields = [:id, :description, :description_html, :title, :color, :text_color]
+ expected_fields = [
+ :id,
+ :description,
+ :description_html,
+ :title,
+ :color,
+ :text_color,
+ :created_at,
+ :updated_at
+ ]
expect(described_class).to have_graphql_fields(*expected_fields)
end
diff --git a/spec/graphql/types/query_type_spec.rb b/spec/graphql/types/query_type_spec.rb
index fea0a3bd37e..cb8e875dbf4 100644
--- a/spec/graphql/types/query_type_spec.rb
+++ b/spec/graphql/types/query_type_spec.rb
@@ -21,7 +21,7 @@ RSpec.describe GitlabSchema.types['Query'] do
user
users
issue
- instance_statistics_measurements
+ usage_trends_measurements
runner_platforms
]
@@ -65,11 +65,11 @@ RSpec.describe GitlabSchema.types['Query'] do
end
end
- describe 'instance_statistics_measurements field' do
- subject { described_class.fields['instanceStatisticsMeasurements'] }
+ describe 'usage_trends_measurements field' do
+ subject { described_class.fields['usageTrendsMeasurements'] }
- it 'returns instance statistics measurements' do
- is_expected.to have_graphql_type(Types::Admin::Analytics::InstanceStatistics::MeasurementType.connection_type)
+ it 'returns usage trends measurements' do
+ is_expected.to have_graphql_type(Types::Admin::Analytics::UsageTrends::MeasurementType.connection_type)
end
end
diff --git a/spec/helpers/boards_helper_spec.rb b/spec/helpers/boards_helper_spec.rb
index b85ebec5545..83aad206547 100644
--- a/spec/helpers/boards_helper_spec.rb
+++ b/spec/helpers/boards_helper_spec.rb
@@ -3,52 +3,71 @@
require 'spec_helper'
RSpec.describe BoardsHelper do
+ let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
+ let_it_be(:base_group) { create(:group, path: 'base') }
+ let_it_be(:project_board) { create(:board, project: project) }
+ let_it_be(:group_board) { create(:board, group: base_group) }
describe '#build_issue_link_base' do
context 'project board' do
it 'returns correct path for project board' do
- @project = project
- @board = create(:board, project: @project)
+ assign(:project, project)
+ assign(:board, project_board)
- expect(build_issue_link_base).to eq("/#{@project.namespace.path}/#{@project.path}/-/issues")
+ expect(helper.build_issue_link_base).to eq("/#{project.namespace.path}/#{project.path}/-/issues")
end
end
context 'group board' do
- let(:base_group) { create(:group, path: 'base') }
-
it 'returns correct path for base group' do
- @board = create(:board, group: base_group)
+ assign(:board, group_board)
- expect(build_issue_link_base).to eq('/base/:project_path/issues')
+ expect(helper.build_issue_link_base).to eq('/base/:project_path/issues')
end
it 'returns correct path for subgroup' do
subgroup = create(:group, parent: base_group, path: 'sub')
- @board = create(:board, group: subgroup)
+ assign(:board, create(:board, group: subgroup))
- expect(build_issue_link_base).to eq('/base/sub/:project_path/issues')
+ expect(helper.build_issue_link_base).to eq('/base/sub/:project_path/issues')
end
end
end
- describe '#board_data' do
- let_it_be(:user) { create(:user) }
- let_it_be(:board) { create(:board, project: project) }
+ describe '#board_base_url' do
+ context 'when project board' do
+ it 'generates the correct url' do
+ assign(:board, group_board)
+ assign(:group, base_group)
+
+ expect(helper.board_base_url).to eq "http://test.host/groups/#{base_group.full_path}/-/boards"
+ end
+ end
+
+ context 'when project board' do
+ it 'generates the correct url' do
+ assign(:board, project_board)
+ assign(:project, project)
+
+ expect(helper.board_base_url).to eq "/#{project.full_path}/-/boards"
+ end
+ end
+ end
+ describe '#board_data' do
context 'project_board' do
before do
assign(:project, project)
- assign(:board, board)
+ assign(:board, project_board)
allow(helper).to receive(:current_user) { user }
- allow(helper).to receive(:can?).with(user, :create_non_backlog_issues, board).and_return(true)
- allow(helper).to receive(:can?).with(user, :admin_issue, board).and_return(true)
+ allow(helper).to receive(:can?).with(user, :create_non_backlog_issues, project_board).and_return(true)
+ allow(helper).to receive(:can?).with(user, :admin_issue, project_board).and_return(true)
end
it 'returns a board_lists_path as lists_endpoint' do
- expect(helper.board_data[:lists_endpoint]).to eq(board_lists_path(board))
+ expect(helper.board_data[:lists_endpoint]).to eq(board_lists_path(project_board))
end
it 'returns board type as parent' do
@@ -66,25 +85,22 @@ RSpec.describe BoardsHelper do
end
context 'group board' do
- let_it_be(:group) { create(:group, path: 'base') }
- let_it_be(:board) { create(:board, group: group) }
-
before do
- assign(:group, group)
- assign(:board, board)
+ assign(:group, base_group)
+ assign(:board, group_board)
allow(helper).to receive(:current_user) { user }
- allow(helper).to receive(:can?).with(user, :create_non_backlog_issues, board).and_return(true)
- allow(helper).to receive(:can?).with(user, :admin_issue, board).and_return(true)
+ allow(helper).to receive(:can?).with(user, :create_non_backlog_issues, group_board).and_return(true)
+ allow(helper).to receive(:can?).with(user, :admin_issue, group_board).and_return(true)
end
it 'returns correct path for base group' do
- expect(helper.build_issue_link_base).to eq('/base/:project_path/issues')
+ expect(helper.build_issue_link_base).to eq("/#{base_group.full_path}/:project_path/issues")
end
it 'returns required label endpoints' do
- expect(helper.board_data[:labels_fetch_path]).to eq("/groups/base/-/labels.json?include_ancestor_groups=true&only_group_labels=true")
- expect(helper.board_data[:labels_manage_path]).to eq("/groups/base/-/labels")
+ expect(helper.board_data[:labels_fetch_path]).to eq("/groups/#{base_group.full_path}/-/labels.json?include_ancestor_groups=true&only_group_labels=true")
+ expect(helper.board_data[:labels_manage_path]).to eq("/groups/#{base_group.full_path}/-/labels")
end
end
end
@@ -93,8 +109,7 @@ RSpec.describe BoardsHelper do
let(:board_json) { helper.current_board_json }
it 'can serialise with a basic set of attributes' do
- board = create(:board, project: project)
- assign(:board, board)
+ assign(:board, project_board)
expect(board_json).to match_schema('current-board')
end
diff --git a/spec/helpers/commits_helper_spec.rb b/spec/helpers/commits_helper_spec.rb
index 2f5f4c4596b..4a841fac064 100644
--- a/spec/helpers/commits_helper_spec.rb
+++ b/spec/helpers/commits_helper_spec.rb
@@ -238,15 +238,5 @@ RSpec.describe CommitsHelper do
expect(subject).to be_a(Gitlab::Git::DiffCollection)
end
end
-
- context "feature flag is disabled" do
- let(:paginate) { true }
-
- it "returns a standard DiffCollection" do
- stub_feature_flags(paginate_commit_view: false)
-
- expect(subject).to be_a(Gitlab::Git::DiffCollection)
- end
- end
end
end
diff --git a/spec/helpers/invite_members_helper_spec.rb b/spec/helpers/invite_members_helper_spec.rb
index 576021b37b3..ef6bc864eef 100644
--- a/spec/helpers/invite_members_helper_spec.rb
+++ b/spec/helpers/invite_members_helper_spec.rb
@@ -11,6 +11,21 @@ RSpec.describe InviteMembersHelper do
helper.extend(Gitlab::Experimentation::ControllerConcern)
end
+ describe '#show_invite_members_track_event' do
+ it 'shows values when can directly invite members' do
+ allow(helper).to receive(:directly_invite_members?).and_return(true)
+
+ expect(helper.show_invite_members_track_event).to eq 'show_invite_members'
+ end
+
+ it 'shows values when can indirectly invite members' do
+ allow(helper).to receive(:directly_invite_members?).and_return(false)
+ allow(helper).to receive(:indirectly_invite_members?).and_return(true)
+
+ expect(helper.show_invite_members_track_event).to eq 'show_invite_members_version_b'
+ end
+ end
+
context 'with project' do
before do
assign(:project, project)
diff --git a/spec/helpers/issuables_description_templates_helper_spec.rb b/spec/helpers/issuables_description_templates_helper_spec.rb
index 42643b755f8..e8961ccb535 100644
--- a/spec/helpers/issuables_description_templates_helper_spec.rb
+++ b/spec/helpers/issuables_description_templates_helper_spec.rb
@@ -13,22 +13,33 @@ RSpec.describe IssuablesDescriptionTemplatesHelper, :clean_gitlab_redis_cache do
let_it_be(:group_member) { create(:group_member, :developer, group: parent_group, user: user) }
let_it_be(:project_member) { create(:project_member, :developer, user: user, project: project) }
- it 'returns empty hash when template type does not exist' do
- expect(helper.issuable_templates(build(:project), 'non-existent-template-type')).to eq([])
+ context 'when feature flag disabled' do
+ before do
+ stub_feature_flags(inherited_issuable_templates: false)
+ end
+
+ it 'returns empty array when template type does not exist' do
+ expect(helper.issuable_templates(project, 'non-existent-template-type')).to eq([])
+ end
end
- context 'with cached issuable templates' do
+ context 'when feature flag enabled' do
before do
- allow(Gitlab::Template::IssueTemplate).to receive(:template_names).and_return({})
- allow(Gitlab::Template::MergeRequestTemplate).to receive(:template_names).and_return({})
+ stub_feature_flags(inherited_issuable_templates: true)
+ end
- helper.issuable_templates(project, 'issues')
- helper.issuable_templates(project, 'merge_request')
+ it 'returns empty hash when template type does not exist' do
+ expect(helper.issuable_templates(build(:project), 'non-existent-template-type')).to eq({})
end
+ end
+ context 'with cached issuable templates' do
it 'does not call TemplateFinder' do
- expect(Gitlab::Template::IssueTemplate).not_to receive(:template_names)
- expect(Gitlab::Template::MergeRequestTemplate).not_to receive(:template_names)
+ expect(Gitlab::Template::IssueTemplate).to receive(:template_names).once.and_call_original
+ expect(Gitlab::Template::MergeRequestTemplate).to receive(:template_names).once.and_call_original
+
+ helper.issuable_templates(project, 'issues')
+ helper.issuable_templates(project, 'merge_request')
helper.issuable_templates(project, 'issues')
helper.issuable_templates(project, 'merge_request')
end
@@ -63,29 +74,78 @@ RSpec.describe IssuablesDescriptionTemplatesHelper, :clean_gitlab_redis_cache do
end
describe '#issuable_templates_names' do
- let(:project) { double(Project, id: 21) }
-
- let(:templates) do
- [
- { name: "another_issue_template", id: "another_issue_template", project_id: project.id },
- { name: "custom_issue_template", id: "custom_issue_template", project_id: project.id }
- ]
- end
+ let_it_be(:project) { build(:project) }
- it 'returns project templates only' do
+ before do
allow(helper).to receive(:ref_project).and_return(project)
allow(helper).to receive(:issuable_templates).and_return(templates)
+ end
+
+ context 'when feature flag disabled' do
+ let(:templates) do
+ [
+ { name: "another_issue_template", id: "another_issue_template", project_id: project.id },
+ { name: "custom_issue_template", id: "custom_issue_template", project_id: project.id }
+ ]
+ end
- expect(helper.issuable_templates_names(Issue.new)).to eq(%w[another_issue_template custom_issue_template])
+ before do
+ stub_feature_flags(inherited_issuable_templates: false)
+ end
+
+ it 'returns project templates only' do
+ expect(helper.issuable_templates_names(Issue.new)).to eq(%w[another_issue_template custom_issue_template])
+ end
+ end
+
+ context 'when feature flag enabled' do
+ before do
+ stub_feature_flags(inherited_issuable_templates: true)
+ end
+
+ context 'with matching project templates' do
+ let(:templates) do
+ {
+ "" => [
+ { name: "another_issue_template", id: "another_issue_template", project_id: project.id },
+ { name: "custom_issue_template", id: "custom_issue_template", project_id: project.id }
+ ],
+ "Instance" => [
+ { name: "first_issue_issue_template", id: "first_issue_issue_template", project_id: non_existing_record_id },
+ { name: "second_instance_issue_template", id: "second_instance_issue_template", project_id: non_existing_record_id }
+ ]
+ }
+ end
+
+ it 'returns project templates only' do
+ expect(helper.issuable_templates_names(Issue.new)).to eq(%w[another_issue_template custom_issue_template])
+ end
+ end
+
+ context 'without matching project templates' do
+ let(:templates) do
+ {
+ "Project Templates" => [
+ { name: "another_issue_template", id: "another_issue_template", project_id: non_existing_record_id },
+ { name: "custom_issue_template", id: "custom_issue_template", project_id: non_existing_record_id }
+ ],
+ "Instance" => [
+ { name: "first_issue_issue_template", id: "first_issue_issue_template", project_id: non_existing_record_id },
+ { name: "second_instance_issue_template", id: "second_instance_issue_template", project_id: non_existing_record_id }
+ ]
+ }
+ end
+
+ it 'returns empty array' do
+ expect(helper.issuable_templates_names(Issue.new)).to eq([])
+ end
+ end
end
context 'when there are not templates in the project' do
let(:templates) { {} }
it 'returns empty array' do
- allow(helper).to receive(:ref_project).and_return(project)
- allow(helper).to receive(:issuable_templates).and_return(templates)
-
expect(helper.issuable_templates_names(Issue.new)).to eq([])
end
end
diff --git a/spec/helpers/services_helper_spec.rb b/spec/helpers/services_helper_spec.rb
index 534f33d9b5a..3b08393ebdf 100644
--- a/spec/helpers/services_helper_spec.rb
+++ b/spec/helpers/services_helper_spec.rb
@@ -4,32 +4,49 @@ require 'spec_helper'
RSpec.describe ServicesHelper do
describe '#integration_form_data' do
+ let(:fields) do
+ [
+ :id,
+ :show_active,
+ :activated,
+ :type,
+ :merge_request_events,
+ :commit_events,
+ :enable_comments,
+ :comment_detail,
+ :learn_more_path,
+ :trigger_events,
+ :fields,
+ :inherit_from_id,
+ :integration_level,
+ :editable,
+ :cancel_path,
+ :can_test,
+ :test_path,
+ :reset_path
+ ]
+ end
+
+ let(:jira_fields) { %i[jira_issue_transition_id] }
+
subject { helper.integration_form_data(integration) }
- context 'Jira service' do
- let(:integration) { build(:jira_service) }
+ context 'Slack service' do
+ let(:integration) { build(:slack_service) }
- it 'includes Jira specific fields' do
- is_expected.to include(
- :id,
- :show_active,
- :activated,
- :type,
- :merge_request_events,
- :commit_events,
- :enable_comments,
- :comment_detail,
- :trigger_events,
- :fields,
- :inherit_from_id,
- :integration_level
- )
- end
+ it { is_expected.to include(*fields) }
+ it { is_expected.not_to include(*jira_fields) }
specify do
expect(subject[:reset_path]).to eq(helper.scoped_reset_integration_path(integration))
end
end
+
+ context 'Jira service' do
+ let(:integration) { build(:jira_service) }
+
+ it { is_expected.to include(*fields, *jira_fields) }
+ end
end
describe '#scoped_reset_integration_path' do
diff --git a/spec/helpers/stat_anchors_helper_spec.rb b/spec/helpers/stat_anchors_helper_spec.rb
index 0615baac3cb..f3830bf4172 100644
--- a/spec/helpers/stat_anchors_helper_spec.rb
+++ b/spec/helpers/stat_anchors_helper_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe StatAnchorsHelper do
context 'when anchor is not a link' do
context 'when class_modifier is set' do
- let(:anchor) { anchor_klass.new(false, nil, nil, 'default') }
+ let(:anchor) { anchor_klass.new(false, nil, nil, 'btn-default') }
it 'returns the proper attributes' do
expect(subject[:class]).to include('gl-button btn btn-default')
@@ -49,5 +49,21 @@ RSpec.describe StatAnchorsHelper do
expect(subject[:itemprop]).to eq true
end
end
+
+ context 'when data is not set' do
+ let(:anchor) { anchor_klass.new(false, nil, nil, nil, nil, nil, nil) }
+
+ it 'returns the data attributes' do
+ expect(subject[:data]).to be_nil
+ end
+ end
+
+ context 'when itemprop is set' do
+ let(:anchor) { anchor_klass.new(false, nil, nil, nil, nil, nil, { 'toggle' => 'modal' }) }
+
+ it 'returns the data attributes' do
+ expect(subject[:data]).to eq({ 'toggle' => 'modal' })
+ end
+ end
end
end
diff --git a/spec/lib/backup/repositories_spec.rb b/spec/lib/backup/repositories_spec.rb
index 492058c6a00..7a8cc713e4f 100644
--- a/spec/lib/backup/repositories_spec.rb
+++ b/spec/lib/backup/repositories_spec.rb
@@ -230,6 +230,16 @@ RSpec.describe Backup::Repositories do
expect(pool_repository).not_to be_failed
expect(pool_repository.object_pool.exists?).to be(true)
end
+
+ it 'skips pools with no source project, :sidekiq_might_not_need_inline' do
+ pool_repository = create(:pool_repository, state: :obsolete)
+ pool_repository.update_column(:source_project_id, nil)
+
+ subject.restore
+
+ pool_repository.reload
+ expect(pool_repository).to be_obsolete
+ end
end
it 'cleans existing repositories' do
diff --git a/spec/lib/banzai/filter/video_link_filter_spec.rb b/spec/lib/banzai/filter/video_link_filter_spec.rb
index 32fbc6b687f..ec954aa9163 100644
--- a/spec/lib/banzai/filter/video_link_filter_spec.rb
+++ b/spec/lib/banzai/filter/video_link_filter_spec.rb
@@ -33,6 +33,7 @@ RSpec.describe Banzai::Filter::VideoLinkFilter do
expect(video.name).to eq 'video'
expect(video['src']).to eq src
expect(video['width']).to eq "400"
+ expect(video['preload']).to eq 'metadata'
expect(paragraph.name).to eq 'p'
diff --git a/spec/lib/bulk_imports/common/loaders/entity_loader_spec.rb b/spec/lib/bulk_imports/common/loaders/entity_loader_spec.rb
deleted file mode 100644
index 57ffdfa9aee..00000000000
--- a/spec/lib/bulk_imports/common/loaders/entity_loader_spec.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe BulkImports::Common::Loaders::EntityLoader do
- describe '#load' do
- it "creates entities for the given data" do
- group = create(:group, path: "imported-group")
- parent_entity = create(:bulk_import_entity, group: group, bulk_import: create(:bulk_import))
- context = BulkImports::Pipeline::Context.new(parent_entity)
-
- data = {
- source_type: :group_entity,
- source_full_path: "parent/subgroup",
- destination_name: "subgroup",
- destination_namespace: parent_entity.group.full_path,
- parent_id: parent_entity.id
- }
-
- expect { subject.load(context, data) }.to change(BulkImports::Entity, :count).by(1)
-
- subgroup_entity = BulkImports::Entity.last
-
- expect(subgroup_entity.source_full_path).to eq 'parent/subgroup'
- expect(subgroup_entity.destination_namespace).to eq 'imported-group'
- expect(subgroup_entity.destination_name).to eq 'subgroup'
- expect(subgroup_entity.parent_id).to eq parent_entity.id
- end
- end
-end
diff --git a/spec/lib/bulk_imports/groups/graphql/get_labels_query_spec.rb b/spec/lib/bulk_imports/groups/graphql/get_labels_query_spec.rb
index 247da200d68..85f82be7d18 100644
--- a/spec/lib/bulk_imports/groups/graphql/get_labels_query_spec.rb
+++ b/spec/lib/bulk_imports/groups/graphql/get_labels_query_spec.rb
@@ -3,15 +3,18 @@
require 'spec_helper'
RSpec.describe BulkImports::Groups::Graphql::GetLabelsQuery do
- describe '#variables' do
- let(:entity) { double(source_full_path: 'test', next_page_for: 'next_page', bulk_import: nil) }
- let(:context) { BulkImports::Pipeline::Context.new(entity) }
-
- it 'returns query variables based on entity information' do
- expected = { full_path: entity.source_full_path, cursor: entity.next_page_for }
-
- expect(described_class.variables(context)).to eq(expected)
- end
+ it 'has a valid query' do
+ entity = create(:bulk_import_entity)
+ context = BulkImports::Pipeline::Context.new(entity)
+
+ query = GraphQL::Query.new(
+ GitlabSchema,
+ described_class.to_s,
+ variables: described_class.variables(context)
+ )
+ result = GitlabSchema.static_validator.validate(query)
+
+ expect(result[:errors]).to be_empty
end
describe '#data_path' do
diff --git a/spec/lib/bulk_imports/groups/loaders/labels_loader_spec.rb b/spec/lib/bulk_imports/groups/loaders/labels_loader_spec.rb
deleted file mode 100644
index ac2f9c8cb1d..00000000000
--- a/spec/lib/bulk_imports/groups/loaders/labels_loader_spec.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe BulkImports::Groups::Loaders::LabelsLoader do
- describe '#load' do
- let(:user) { create(:user) }
- let(:group) { create(:group) }
- let(:entity) { create(:bulk_import_entity, group: group) }
- let(:context) { BulkImports::Pipeline::Context.new(entity) }
-
- let(:data) do
- {
- 'title' => 'label',
- 'description' => 'description',
- 'color' => '#FFFFFF'
- }
- end
-
- it 'creates the label' do
- expect { subject.load(context, data) }.to change(Label, :count).by(1)
-
- label = group.labels.first
-
- expect(label.title).to eq(data['title'])
- expect(label.description).to eq(data['description'])
- expect(label.color).to eq(data['color'])
- end
- end
-end
diff --git a/spec/lib/bulk_imports/groups/loaders/members_loader_spec.rb b/spec/lib/bulk_imports/groups/loaders/members_loader_spec.rb
deleted file mode 100644
index d552578e7be..00000000000
--- a/spec/lib/bulk_imports/groups/loaders/members_loader_spec.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe BulkImports::Groups::Loaders::MembersLoader do
- describe '#load' do
- let_it_be(:user_importer) { create(:user) }
- let_it_be(:user_member) { create(:user) }
- let_it_be(:group) { create(:group) }
- let_it_be(:bulk_import) { create(:bulk_import, user: user_importer) }
- let_it_be(:entity) { create(:bulk_import_entity, bulk_import: bulk_import, group: group) }
- let_it_be(:context) { BulkImports::Pipeline::Context.new(entity) }
-
- let_it_be(:data) do
- {
- 'user_id' => user_member.id,
- 'created_by_id' => user_importer.id,
- 'access_level' => 30,
- 'created_at' => '2020-01-01T00:00:00Z',
- 'updated_at' => '2020-01-01T00:00:00Z',
- 'expires_at' => nil
- }
- end
-
- it 'does nothing when there is no data' do
- expect { subject.load(context, nil) }.not_to change(GroupMember, :count)
- end
-
- it 'creates the member' do
- expect { subject.load(context, data) }.to change(GroupMember, :count).by(1)
-
- member = group.members.last
-
- expect(member.user).to eq(user_member)
- expect(member.created_by).to eq(user_importer)
- expect(member.access_level).to eq(30)
- expect(member.created_at).to eq('2020-01-01T00:00:00Z')
- expect(member.updated_at).to eq('2020-01-01T00:00:00Z')
- expect(member.expires_at).to eq(nil)
- end
- end
-end
diff --git a/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb
index 63f28916d9a..3327a30f1d5 100644
--- a/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe BulkImports::Groups::Pipelines::LabelsPipeline do
let(:user) { create(:user) }
let(:group) { create(:group) }
let(:cursor) { 'cursor' }
+ let(:timestamp) { Time.new(2020, 01, 01).utc }
let(:entity) do
create(
:bulk_import_entity,
@@ -20,21 +21,23 @@ RSpec.describe BulkImports::Groups::Pipelines::LabelsPipeline do
subject { described_class.new(context) }
- def extractor_data(title:, has_next_page:, cursor: nil)
- data = [
- {
- 'title' => title,
- 'description' => 'desc',
- 'color' => '#428BCA'
- }
- ]
+ def label_data(title)
+ {
+ 'title' => title,
+ 'description' => 'desc',
+ 'color' => '#428BCA',
+ 'created_at' => timestamp.to_s,
+ 'updated_at' => timestamp.to_s
+ }
+ end
+ def extractor_data(title:, has_next_page:, cursor: nil)
page_info = {
'end_cursor' => cursor,
'has_next_page' => has_next_page
}
- BulkImports::Pipeline::ExtractedData.new(data: data, page_info: page_info)
+ BulkImports::Pipeline::ExtractedData.new(data: [label_data(title)], page_info: page_info)
end
describe '#run' do
@@ -55,6 +58,8 @@ RSpec.describe BulkImports::Groups::Pipelines::LabelsPipeline do
expect(label.title).to eq('label2')
expect(label.description).to eq('desc')
expect(label.color).to eq('#428BCA')
+ expect(label.created_at).to eq(timestamp)
+ expect(label.updated_at).to eq(timestamp)
end
end
@@ -90,6 +95,20 @@ RSpec.describe BulkImports::Groups::Pipelines::LabelsPipeline do
end
end
+ describe '#load' do
+ it 'creates the label' do
+ data = label_data('label')
+
+ expect { subject.load(context, data) }.to change(Label, :count).by(1)
+
+ label = group.labels.first
+
+ data.each do |key, value|
+ expect(label[key]).to eq(value)
+ end
+ end
+ end
+
describe 'pipeline parts' do
it { expect(described_class).to include_module(BulkImports::Pipeline) }
it { expect(described_class).to include_module(BulkImports::Pipeline::Runner) }
@@ -110,9 +129,5 @@ RSpec.describe BulkImports::Groups::Pipelines::LabelsPipeline do
{ klass: BulkImports::Common::Transformers::ProhibitedAttributesTransformer, options: nil }
)
end
-
- it 'has loaders' do
- expect(described_class.get_loader).to eq(klass: BulkImports::Groups::Loaders::LabelsLoader, options: nil)
- end
end
end
diff --git a/spec/lib/bulk_imports/groups/pipelines/members_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/members_pipeline_spec.rb
index 9f498f8154f..74d3e09d263 100644
--- a/spec/lib/bulk_imports/groups/pipelines/members_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/groups/pipelines/members_pipeline_spec.rb
@@ -37,6 +37,34 @@ RSpec.describe BulkImports::Groups::Pipelines::MembersPipeline do
end
end
+ describe '#load' do
+ it 'does nothing when there is no data' do
+ expect { subject.load(context, nil) }.not_to change(GroupMember, :count)
+ end
+
+ it 'creates the member' do
+ data = {
+ 'user_id' => member_user1.id,
+ 'created_by_id' => member_user2.id,
+ 'access_level' => 30,
+ 'created_at' => '2020-01-01T00:00:00Z',
+ 'updated_at' => '2020-01-01T00:00:00Z',
+ 'expires_at' => nil
+ }
+
+ expect { subject.load(context, data) }.to change(GroupMember, :count).by(1)
+
+ member = group.members.last
+
+ expect(member.user).to eq(member_user1)
+ expect(member.created_by).to eq(member_user2)
+ expect(member.access_level).to eq(30)
+ expect(member.created_at).to eq('2020-01-01T00:00:00Z')
+ expect(member.updated_at).to eq('2020-01-01T00:00:00Z')
+ expect(member.expires_at).to eq(nil)
+ end
+ end
+
describe 'pipeline parts' do
it { expect(described_class).to include_module(BulkImports::Pipeline) }
it { expect(described_class).to include_module(BulkImports::Pipeline::Runner) }
@@ -58,10 +86,6 @@ RSpec.describe BulkImports::Groups::Pipelines::MembersPipeline do
{ klass: BulkImports::Groups::Transformers::MemberAttributesTransformer, options: nil }
)
end
-
- it 'has loaders' do
- expect(described_class.get_loader).to eq(klass: BulkImports::Groups::Loaders::MembersLoader, options: nil)
- end
end
def member_data(email:, has_next_page:, cursor: nil)
diff --git a/spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb
index 0404c52b895..2a99646bb4a 100644
--- a/spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb
@@ -3,9 +3,14 @@
require 'spec_helper'
RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group, path: 'group') }
+ let_it_be(:parent) { create(:group, name: 'imported-group', path: 'imported-group') }
+ let(:context) { BulkImports::Pipeline::Context.new(parent_entity) }
+
+ subject { described_class.new(context) }
+
describe '#run' do
- let_it_be(:user) { create(:user) }
- let(:parent) { create(:group, name: 'imported-group', path: 'imported-group') }
let!(:parent_entity) do
create(
:bulk_import_entity,
@@ -14,8 +19,6 @@ RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
)
end
- let(:context) { BulkImports::Pipeline::Context.new(parent_entity) }
-
let(:subgroup_data) do
[
{
@@ -25,8 +28,6 @@ RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
]
end
- subject { described_class.new(context) }
-
before do
allow_next_instance_of(BulkImports::Groups::Extractors::SubgroupsExtractor) do |extractor|
allow(extractor).to receive(:extract).and_return(subgroup_data)
@@ -47,6 +48,29 @@ RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
end
end
+ describe '#load' do
+ let(:parent_entity) { create(:bulk_import_entity, group: group, bulk_import: create(:bulk_import)) }
+
+ it 'creates entities for the given data' do
+ data = {
+ source_type: :group_entity,
+ source_full_path: 'parent/subgroup',
+ destination_name: 'subgroup',
+ destination_namespace: parent_entity.group.full_path,
+ parent_id: parent_entity.id
+ }
+
+ expect { subject.load(context, data) }.to change(BulkImports::Entity, :count).by(1)
+
+ subgroup_entity = BulkImports::Entity.last
+
+ expect(subgroup_entity.source_full_path).to eq 'parent/subgroup'
+ expect(subgroup_entity.destination_namespace).to eq 'group'
+ expect(subgroup_entity.destination_name).to eq 'subgroup'
+ expect(subgroup_entity.parent_id).to eq parent_entity.id
+ end
+ end
+
describe 'pipeline parts' do
it { expect(described_class).to include_module(BulkImports::Pipeline) }
it { expect(described_class).to include_module(BulkImports::Pipeline::Runner) }
@@ -61,9 +85,5 @@ RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
{ klass: BulkImports::Groups::Transformers::SubgroupToEntityTransformer, options: nil }
)
end
-
- it 'has loaders' do
- expect(described_class.get_loader).to eq(klass: BulkImports::Common::Loaders::EntityLoader, options: nil)
- end
end
end
diff --git a/spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb b/spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb
index 5a7a51675d6..b3fe8a2ba25 100644
--- a/spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb
+++ b/spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb
@@ -80,14 +80,14 @@ RSpec.describe BulkImports::Groups::Transformers::GroupAttributesTransformer do
expect(transformed_data['parent_id']).to eq(parent.id)
end
- context 'when destination namespace is user namespace' do
+ context 'when destination namespace is empty' do
it 'does not set parent id' do
entity = create(
:bulk_import_entity,
bulk_import: bulk_import,
source_full_path: 'source/full/path',
destination_name: group.name,
- destination_namespace: user.namespace.full_path
+ destination_namespace: ''
)
context = BulkImports::Pipeline::Context.new(entity)
diff --git a/spec/lib/bulk_imports/pipeline_spec.rb b/spec/lib/bulk_imports/pipeline_spec.rb
index 3811a02a7fd..2bbb55f9419 100644
--- a/spec/lib/bulk_imports/pipeline_spec.rb
+++ b/spec/lib/bulk_imports/pipeline_spec.rb
@@ -3,25 +3,25 @@
require 'spec_helper'
RSpec.describe BulkImports::Pipeline do
- describe 'pipeline attributes' do
- before do
- stub_const('BulkImports::Extractor', Class.new)
- stub_const('BulkImports::Transformer', Class.new)
- stub_const('BulkImports::Loader', Class.new)
-
- klass = Class.new do
- include BulkImports::Pipeline
+ before do
+ stub_const('BulkImports::Extractor', Class.new)
+ stub_const('BulkImports::Transformer', Class.new)
+ stub_const('BulkImports::Loader', Class.new)
- abort_on_failure!
+ klass = Class.new do
+ include BulkImports::Pipeline
- extractor BulkImports::Extractor, { foo: :bar }
- transformer BulkImports::Transformer, { foo: :bar }
- loader BulkImports::Loader, { foo: :bar }
- end
+ abort_on_failure!
- stub_const('BulkImports::MyPipeline', klass)
+ extractor BulkImports::Extractor, foo: :bar
+ transformer BulkImports::Transformer, foo: :bar
+ loader BulkImports::Loader, foo: :bar
end
+ stub_const('BulkImports::MyPipeline', klass)
+ end
+
+ describe 'pipeline attributes' do
describe 'getters' do
it 'retrieves class attributes' do
expect(BulkImports::MyPipeline.get_extractor).to eq({ klass: BulkImports::Extractor, options: { foo: :bar } })
@@ -29,6 +29,27 @@ RSpec.describe BulkImports::Pipeline do
expect(BulkImports::MyPipeline.get_loader).to eq({ klass: BulkImports::Loader, options: { foo: :bar } })
expect(BulkImports::MyPipeline.abort_on_failure?).to eq(true)
end
+
+ context 'when extractor and loader are defined within the pipeline' do
+ before do
+ klass = Class.new do
+ include BulkImports::Pipeline
+
+ def extract; end
+
+ def load; end
+ end
+
+ stub_const('BulkImports::AnotherPipeline', klass)
+ end
+
+ it 'returns itself when retrieving extractor & loader' do
+ pipeline = BulkImports::AnotherPipeline.new(nil)
+
+ expect(pipeline.send(:extractor)).to eq(pipeline)
+ expect(pipeline.send(:loader)).to eq(pipeline)
+ end
+ end
end
describe 'setters' do
@@ -54,4 +75,46 @@ RSpec.describe BulkImports::Pipeline do
end
end
end
+
+ describe '#instantiate' do
+ context 'when options are present' do
+ it 'instantiates new object with options' do
+ expect(BulkImports::Extractor).to receive(:new).with(foo: :bar)
+ expect(BulkImports::Transformer).to receive(:new).with(foo: :bar)
+ expect(BulkImports::Loader).to receive(:new).with(foo: :bar)
+
+ pipeline = BulkImports::MyPipeline.new(nil)
+
+ pipeline.send(:extractor)
+ pipeline.send(:transformers)
+ pipeline.send(:loader)
+ end
+ end
+
+ context 'when options are missing' do
+ before do
+ klass = Class.new do
+ include BulkImports::Pipeline
+
+ extractor BulkImports::Extractor
+ transformer BulkImports::Transformer
+ loader BulkImports::Loader
+ end
+
+ stub_const('BulkImports::NoOptionsPipeline', klass)
+ end
+
+ it 'instantiates new object without options' do
+ expect(BulkImports::Extractor).to receive(:new).with(no_args)
+ expect(BulkImports::Transformer).to receive(:new).with(no_args)
+ expect(BulkImports::Loader).to receive(:new).with(no_args)
+
+ pipeline = BulkImports::NoOptionsPipeline.new(nil)
+
+ pipeline.send(:extractor)
+ pipeline.send(:transformers)
+ pipeline.send(:loader)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/analytics/cycle_analytics/average_spec.rb b/spec/lib/gitlab/analytics/cycle_analytics/average_spec.rb
new file mode 100644
index 00000000000..e2fdd4918d5
--- /dev/null
+++ b/spec/lib/gitlab/analytics/cycle_analytics/average_spec.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Analytics::CycleAnalytics::Average do
+ let_it_be(:project) { create(:project) }
+
+ let_it_be(:issue_1) do
+ # Duration: 10 days
+ create(:issue, project: project, created_at: 20.days.ago).tap do |issue|
+ issue.metrics.update!(first_mentioned_in_commit_at: 10.days.ago)
+ end
+ end
+
+ let_it_be(:issue_2) do
+ # Duration: 5 days
+ create(:issue, project: project, created_at: 20.days.ago).tap do |issue|
+ issue.metrics.update!(first_mentioned_in_commit_at: 15.days.ago)
+ end
+ end
+
+ let(:stage) do
+ build(
+ :cycle_analytics_project_stage,
+ start_event_identifier: Gitlab::Analytics::CycleAnalytics::StageEvents::IssueCreated.identifier,
+ end_event_identifier: Gitlab::Analytics::CycleAnalytics::StageEvents::IssueFirstMentionedInCommit.identifier,
+ project: project
+ )
+ end
+
+ let(:query) { Issue.joins(:metrics).in_projects(project.id) }
+
+ around do |example|
+ freeze_time { example.run }
+ end
+
+ subject(:average) { described_class.new(stage: stage, query: query) }
+
+ describe '#seconds' do
+ subject(:average_duration_in_seconds) { average.seconds }
+
+ context 'when no results' do
+ let(:query) { Issue.none }
+
+ it { is_expected.to eq(nil) }
+ end
+
+ context 'returns the average duration in seconds' do
+ it { is_expected.to be_within(0.5).of(7.5.days.to_f) }
+ end
+ end
+
+ describe '#days' do
+ subject(:average_duration_in_days) { average.days }
+
+ context 'when no results' do
+ let(:query) { Issue.none }
+
+ it { is_expected.to eq(nil) }
+ end
+
+ context 'returns the average duration in days' do
+ it { is_expected.to be_within(0.01).of(7.5) }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/analytics/instance_statistics/workers_argument_builder_spec.rb b/spec/lib/gitlab/analytics/usage_trends/workers_argument_builder_spec.rb
index 115c8145f59..34c5bd6c6ae 100644
--- a/spec/lib/gitlab/analytics/instance_statistics/workers_argument_builder_spec.rb
+++ b/spec/lib/gitlab/analytics/usage_trends/workers_argument_builder_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Analytics::InstanceStatistics::WorkersArgumentBuilder do
+RSpec.describe Gitlab::Analytics::UsageTrends::WorkersArgumentBuilder do
context 'when no measurement identifiers are given' do
it 'returns empty array' do
expect(described_class.new(measurement_identifiers: []).execute).to be_empty
@@ -16,8 +16,8 @@ RSpec.describe Gitlab::Analytics::InstanceStatistics::WorkersArgumentBuilder do
let_it_be(:project_3) { create(:project, namespace: user_1.namespace, creator: user_1) }
let(:recorded_at) { 2.days.ago }
- let(:projects_measurement_identifier) { ::Analytics::InstanceStatistics::Measurement.identifiers.fetch(:projects) }
- let(:users_measurement_identifier) { ::Analytics::InstanceStatistics::Measurement.identifiers.fetch(:users) }
+ let(:projects_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:projects) }
+ let(:users_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:users) }
let(:measurement_identifiers) { [projects_measurement_identifier, users_measurement_identifier] }
subject { described_class.new(measurement_identifiers: measurement_identifiers, recorded_at: recorded_at).execute }
@@ -46,19 +46,19 @@ RSpec.describe Gitlab::Analytics::InstanceStatistics::WorkersArgumentBuilder do
context 'when custom min and max queries are present' do
let(:min_id) { User.second.id }
let(:max_id) { User.maximum(:id) }
- let(:users_measurement_identifier) { ::Analytics::InstanceStatistics::Measurement.identifiers.fetch(:users) }
+ let(:users_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:users) }
before do
create_list(:user, 2)
min_max_queries = {
- ::Analytics::InstanceStatistics::Measurement.identifiers[:users] => {
+ ::Analytics::UsageTrends::Measurement.identifiers[:users] => {
minimum_query: -> { min_id },
maximum_query: -> { max_id }
}
}
- allow(::Analytics::InstanceStatistics::Measurement).to receive(:identifier_min_max_queries) { min_max_queries }
+ allow(::Analytics::UsageTrends::Measurement).to receive(:identifier_min_max_queries) { min_max_queries }
end
subject do
diff --git a/spec/lib/gitlab/background_migration/set_default_iteration_cadences_spec.rb b/spec/lib/gitlab/background_migration/set_default_iteration_cadences_spec.rb
new file mode 100644
index 00000000000..d0e51593fd4
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/set_default_iteration_cadences_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::SetDefaultIterationCadences, schema: 20201231133921 do
+ let(:namespaces) { table(:namespaces) }
+ let(:iterations) { table(:sprints) }
+ let(:iterations_cadences) { table(:iterations_cadences) }
+
+ describe '#perform' do
+ context 'when no iteration cadences exists' do
+ let!(:group_1) { namespaces.create!(name: 'group 1', path: 'group-1') }
+ let!(:group_2) { namespaces.create!(name: 'group 2', path: 'group-2') }
+ let!(:group_3) { namespaces.create!(name: 'group 3', path: 'group-3') }
+
+ let!(:iteration_1) { iterations.create!(group_id: group_1.id, iid: 1, title: 'Iteration 1', start_date: 10.days.ago, due_date: 8.days.ago) }
+ let!(:iteration_2) { iterations.create!(group_id: group_3.id, iid: 1, title: 'Iteration 2', start_date: 10.days.ago, due_date: 8.days.ago) }
+ let!(:iteration_3) { iterations.create!(group_id: group_3.id, iid: 1, title: 'Iteration 3', start_date: 5.days.ago, due_date: 2.days.ago) }
+
+ before do
+ described_class.new.perform(group_1.id, group_2.id, group_3.id, namespaces.last.id + 1)
+ end
+
+ it 'creates iterations_cadence records for the requested groups' do
+ expect(iterations_cadences.count).to eq(2)
+ end
+
+ it 'assigns the iteration cadences to the iterations correctly' do
+ iterations_cadence = iterations_cadences.find_by(group_id: group_1.id)
+ iteration_records = iterations.where(iterations_cadence_id: iterations_cadence.id)
+
+ expect(iterations_cadence.start_date).to eq(iteration_1.start_date)
+ expect(iterations_cadence.last_run_date).to eq(iteration_1.start_date)
+ expect(iterations_cadence.title).to eq('group 1 Iterations')
+ expect(iteration_records.size).to eq(1)
+ expect(iteration_records.first.id).to eq(iteration_1.id)
+
+ iterations_cadence = iterations_cadences.find_by(group_id: group_3.id)
+ iteration_records = iterations.where(iterations_cadence_id: iterations_cadence.id)
+
+ expect(iterations_cadence.start_date).to eq(iteration_3.start_date)
+ expect(iterations_cadence.last_run_date).to eq(iteration_3.start_date)
+ expect(iterations_cadence.title).to eq('group 3 Iterations')
+ expect(iteration_records.size).to eq(2)
+ expect(iteration_records.first.id).to eq(iteration_2.id)
+ expect(iteration_records.second.id).to eq(iteration_3.id)
+ end
+ end
+
+ context 'when an iteration cadence exists for a group' do
+ let!(:group) { namespaces.create!(name: 'group', path: 'group') }
+
+ let!(:iterations_cadence_1) { iterations_cadences.create!(group_id: group.id, start_date: 5.days.ago, title: 'Cadence 1') }
+ let!(:iterations_cadence_2) { iterations_cadences.create!(group_id: group.id, start_date: 2.days.ago, title: 'Cadence 2') }
+
+ let!(:iteration_1) { iterations.create!(group_id: group.id, iid: 1, title: 'Iteration 1', start_date: 10.days.ago, due_date: 8.days.ago) }
+ let!(:iteration_2) { iterations.create!(group_id: group.id, iterations_cadence_id: iterations_cadence_1.id, iid: 2, title: 'Iteration 2', start_date: 5.days.ago, due_date: 3.days.ago) }
+ let!(:iteration_3) { iterations.create!(group_id: group.id, iterations_cadence_id: iterations_cadence_2.id, iid: 3, title: 'Iteration 3', start_date: 2.days.ago, due_date: 1.day.ago) }
+
+ subject { described_class.new.perform(group.id) }
+
+ it 'does not create a new iterations_cadence' do
+ expect { subject }.not_to change { iterations_cadences.count }
+ end
+
+ it 'assigns iteration cadences to iterations if needed' do
+ subject
+
+ expect(iteration_1.reload.iterations_cadence_id).to eq(iterations_cadence_1.id)
+ expect(iteration_2.reload.iterations_cadence_id).to eq(iterations_cadence_1.id)
+ expect(iteration_3.reload.iterations_cadence_id).to eq(iterations_cadence_2.id)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/charts_spec.rb b/spec/lib/gitlab/ci/charts_spec.rb
index 46d7d4a58f0..3a82d058819 100644
--- a/spec/lib/gitlab/ci/charts_spec.rb
+++ b/spec/lib/gitlab/ci/charts_spec.rb
@@ -98,7 +98,12 @@ RSpec.describe Gitlab::Ci::Charts do
subject { chart.total }
before do
- create(:ci_empty_pipeline, project: project, duration: 120)
+ # The created_at time used by the following execution
+ # can end up being after the creation of the 'today' time
+ # objects created above, and cause the queried counts to
+ # go to zero when the test executes close to midnight on the
+ # CI system, so we explicitly set it to a day earlier
+ create(:ci_empty_pipeline, project: project, duration: 120, created_at: today - 1.day)
end
it 'uses a utc time zone for range times' do
diff --git a/spec/lib/gitlab/ci/jwt_spec.rb b/spec/lib/gitlab/ci/jwt_spec.rb
index 342ca6b8b75..480a4a05379 100644
--- a/spec/lib/gitlab/ci/jwt_spec.rb
+++ b/spec/lib/gitlab/ci/jwt_spec.rb
@@ -114,17 +114,6 @@ RSpec.describe Gitlab::Ci::Jwt do
expect(payload[:environment]).to eq('production')
expect(payload[:environment_protected]).to eq('false')
end
-
- context ':ci_jwt_include_environment feature flag is disabled' do
- before do
- stub_feature_flags(ci_jwt_include_environment: false)
- end
-
- it 'does not include environment attributes' do
- expect(payload).not_to have_key(:environment)
- expect(payload).not_to have_key(:environment_protected)
- end
- end
end
end
diff --git a/spec/lib/gitlab/ci/trace_spec.rb b/spec/lib/gitlab/ci/trace_spec.rb
index 92bf2519588..597e4ca9b03 100644
--- a/spec/lib/gitlab/ci/trace_spec.rb
+++ b/spec/lib/gitlab/ci/trace_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Gitlab::Ci::Trace, :clean_gitlab_redis_shared_state, factory_default: :keep do
- let_it_be(:project) { create_default(:project) }
+ let_it_be(:project) { create_default(:project).freeze }
let_it_be_with_reload(:build) { create(:ci_build) }
let(:trace) { described_class.new(build) }
diff --git a/spec/lib/gitlab/current_settings_spec.rb b/spec/lib/gitlab/current_settings_spec.rb
index 01aceec12c5..f5cb1987c5c 100644
--- a/spec/lib/gitlab/current_settings_spec.rb
+++ b/spec/lib/gitlab/current_settings_spec.rb
@@ -24,6 +24,26 @@ RSpec.describe Gitlab::CurrentSettings do
end
end
+ describe '.signup_disabled?' do
+ subject { described_class.signup_disabled? }
+
+ context 'when signup is enabled' do
+ before do
+ create(:application_setting, signup_enabled: true)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'when signup is disabled' do
+ before do
+ create(:application_setting, signup_enabled: false)
+ end
+
+ it { is_expected.to be_truthy }
+ end
+ end
+
describe '#current_application_settings', :use_clean_rails_memory_store_caching do
it 'allows keys to be called directly' do
db_settings = create(:application_setting,
diff --git a/spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb b/spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb
new file mode 100644
index 00000000000..a3b03050b33
--- /dev/null
+++ b/spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::Migrations::Observers::QueryStatistics do
+ subject { described_class.new }
+
+ let(:connection) { ActiveRecord::Base.connection }
+
+ def mock_pgss(enabled: true)
+ if enabled
+ allow(subject).to receive(:function_exists?).with(:pg_stat_statements_reset).and_return(true)
+ allow(connection).to receive(:view_exists?).with(:pg_stat_statements).and_return(true)
+ else
+ allow(subject).to receive(:function_exists?).with(:pg_stat_statements_reset).and_return(false)
+ allow(connection).to receive(:view_exists?).with(:pg_stat_statements).and_return(false)
+ end
+ end
+
+ describe '#before' do
+ context 'with pgss available' do
+ it 'resets pg_stat_statements' do
+ mock_pgss(enabled: true)
+ expect(connection).to receive(:execute).with('select pg_stat_statements_reset()').once
+
+ subject.before
+ end
+ end
+
+ context 'without pgss available' do
+ it 'executes nothing' do
+ mock_pgss(enabled: false)
+ expect(connection).not_to receive(:execute)
+
+ subject.before
+ end
+ end
+ end
+
+ describe '#record' do
+ let(:observation) { Gitlab::Database::Migrations::Observation.new }
+ let(:result) { double }
+ let(:pgss_query) do
+ <<~SQL
+ SELECT query, calls, total_time, max_time, mean_time, rows
+ FROM pg_stat_statements
+ ORDER BY total_time DESC
+ SQL
+ end
+
+ context 'with pgss available' do
+ it 'fetches data from pg_stat_statements and stores on the observation' do
+ mock_pgss(enabled: true)
+ expect(connection).to receive(:execute).with(pgss_query).once.and_return(result)
+
+ expect { subject.record(observation) }.to change { observation.query_statistics }.from(nil).to(result)
+ end
+ end
+
+ context 'without pgss available' do
+ it 'executes nothing' do
+ mock_pgss(enabled: false)
+ expect(connection).not_to receive(:execute)
+
+ expect { subject.record(observation) }.not_to change { observation.query_statistics }
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb b/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
index eb11c051adc..7436765e8ee 100644
--- a/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe Gitlab::Email::Handler::ServiceDeskHandler do
expect(new_issue.author).to eql(User.support_bot)
expect(new_issue.confidential?).to be true
expect(new_issue.all_references.all).to be_empty
- expect(new_issue.title).to eq("Service Desk (from jake@adventuretime.ooo): The message subject! @all")
+ expect(new_issue.title).to eq("The message subject! @all")
expect(new_issue.description).to eq(expected_description.strip)
end
diff --git a/spec/lib/gitlab/experimentation_spec.rb b/spec/lib/gitlab/experimentation_spec.rb
index 7eeae3f3f33..a4b046a9ed5 100644
--- a/spec/lib/gitlab/experimentation_spec.rb
+++ b/spec/lib/gitlab/experimentation_spec.rb
@@ -13,7 +13,6 @@ RSpec.describe Gitlab::Experimentation::EXPERIMENTS do
:invite_members_version_b,
:invite_members_empty_group_version_a,
:contact_sales_btn_in_app,
- :customize_homepage,
:group_only_trials
]
diff --git a/spec/lib/gitlab/graphql/docs/renderer_spec.rb b/spec/lib/gitlab/graphql/docs/renderer_spec.rb
index 064e0c6828b..2923e589ff7 100644
--- a/spec/lib/gitlab/graphql/docs/renderer_spec.rb
+++ b/spec/lib/gitlab/graphql/docs/renderer_spec.rb
@@ -5,21 +5,25 @@ require 'spec_helper'
RSpec.describe Gitlab::Graphql::Docs::Renderer do
describe '#contents' do
# Returns a Schema that uses the given `type`
- def mock_schema(type)
+ def mock_schema(type, field_description)
query_type = Class.new(Types::BaseObject) do
- graphql_name 'QueryType'
+ graphql_name 'Query'
- field :foo, type, null: true
+ field :foo, type, null: true do
+ description field_description
+ argument :id, GraphQL::ID_TYPE, required: false, description: 'ID of the object.'
+ end
end
GraphQL::Schema.define(query: query_type)
end
let_it_be(:template) { Rails.root.join('lib/gitlab/graphql/docs/templates/', 'default.md.haml') }
+ let(:field_description) { 'List of objects.' }
subject(:contents) do
described_class.new(
- mock_schema(type).graphql_definition,
+ mock_schema(type, field_description).graphql_definition,
output_dir: nil,
template: template
).contents
@@ -45,6 +49,32 @@ RSpec.describe Gitlab::Graphql::Docs::Renderer do
is_expected.to include(expectation)
end
+
+ context 'query generation' do
+ let(:expectation) do
+ <<~DOC
+ ### Foo
+
+ List of objects.
+
+ | Name | Description | Type |
+ | ----- | ---- | ----------- |
+ | `id` | ID of the object. | ID |
+ DOC
+ end
+
+ it 'generates the query with arguments' do
+ expect(subject).to include(expectation)
+ end
+
+ context 'when description does not end with `.`' do
+ let(:field_description) { 'List of objects' }
+
+ it 'adds the `.` to the end' do
+ expect(subject).to include(expectation)
+ end
+ end
+ end
end
context 'A type with fields defined in reverse alphabetical order' do
diff --git a/spec/lib/gitlab/import_export/repo_restorer_spec.rb b/spec/lib/gitlab/import_export/repo_restorer_spec.rb
index fe43a23e242..718a23f80a1 100644
--- a/spec/lib/gitlab/import_export/repo_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/repo_restorer_spec.rb
@@ -46,7 +46,7 @@ RSpec.describe Gitlab::ImportExport::RepoRestorer do
context 'when the repository already exists' do
it 'deletes the existing repository before importing' do
allow(project.repository).to receive(:exists?).and_return(true)
- allow(project.repository).to receive(:path).and_return('repository_path')
+ allow(project.repository).to receive(:disk_path).and_return('repository_path')
expect_next_instance_of(Repositories::DestroyService) do |instance|
expect(instance).to receive(:execute).and_call_original
diff --git a/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb b/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
index edcd5b31941..209eb3f90a4 100644
--- a/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
+++ b/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
@@ -17,6 +17,15 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
)
end
+ # Emulate Marginalia pre-pending comments
+ def sql(query, comments: true)
+ if comments
+ "/*application:web,controller:badges,action:pipeline,correlation_id:01EYN39K9VMJC56Z7808N7RSRH*/ #{query}"
+ else
+ query
+ end
+ end
+
describe '#sql' do
shared_examples 'track query in metrics' do
before do
@@ -101,7 +110,7 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
expect { subscriber.sql(event) }.to change { Thread.current[:uses_db_connection] }.from(nil).to(true)
end
- context 'with read query' do
+ shared_examples 'read queries' do
let(:expected_counters) do
{
db_count: 1,
@@ -114,14 +123,14 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
it_behaves_like 'track query in RequestStore'
context 'with only select' do
- let(:payload) { { sql: 'WITH active_milestones AS (SELECT COUNT(*), state FROM milestones GROUP BY state) SELECT * FROM active_milestones' } }
+ let(:payload) { { sql: sql('WITH active_milestones AS (SELECT COUNT(*), state FROM milestones GROUP BY state) SELECT * FROM active_milestones', comments: comments) } }
it_behaves_like 'track query in metrics'
it_behaves_like 'track query in RequestStore'
end
end
- context 'write query' do
+ shared_examples 'write queries' do
let(:expected_counters) do
{
db_count: 1,
@@ -131,7 +140,7 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
end
context 'with select for update sql event' do
- let(:payload) { { sql: 'SELECT * FROM users WHERE id = 10 FOR UPDATE' } }
+ let(:payload) { { sql: sql('SELECT * FROM users WHERE id = 10 FOR UPDATE', comments: comments) } }
it_behaves_like 'track query in metrics'
it_behaves_like 'track query in RequestStore'
@@ -139,7 +148,7 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
context 'with common table expression' do
context 'with insert' do
- let(:payload) { { sql: 'WITH archived_rows AS (SELECT * FROM users WHERE archived = true) INSERT INTO products_log SELECT * FROM archived_rows' } }
+ let(:payload) { { sql: sql('WITH archived_rows AS (SELECT * FROM users WHERE archived = true) INSERT INTO products_log SELECT * FROM archived_rows', comments: comments) } }
it_behaves_like 'track query in metrics'
it_behaves_like 'track query in RequestStore'
@@ -147,27 +156,41 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
end
context 'with delete sql event' do
- let(:payload) { { sql: 'DELETE FROM users where id = 10' } }
+ let(:payload) { { sql: sql('DELETE FROM users where id = 10', comments: comments) } }
it_behaves_like 'track query in metrics'
it_behaves_like 'track query in RequestStore'
end
context 'with insert sql event' do
- let(:payload) { { sql: 'INSERT INTO project_ci_cd_settings (project_id) SELECT id FROM projects' } }
+ let(:payload) { { sql: sql('INSERT INTO project_ci_cd_settings (project_id) SELECT id FROM projects', comments: comments) } }
it_behaves_like 'track query in metrics'
it_behaves_like 'track query in RequestStore'
end
context 'with update sql event' do
- let(:payload) { { sql: 'UPDATE users SET admin = true WHERE id = 10' } }
+ let(:payload) { { sql: sql('UPDATE users SET admin = true WHERE id = 10', comments: comments) } }
it_behaves_like 'track query in metrics'
it_behaves_like 'track query in RequestStore'
end
end
+ context 'without Marginalia comments' do
+ let(:comments) { false }
+
+ it_behaves_like 'write queries'
+ it_behaves_like 'read queries'
+ end
+
+ context 'with Marginalia comments' do
+ let(:comments) { true }
+
+ it_behaves_like 'write queries'
+ it_behaves_like 'read queries'
+ end
+
context 'with cached query' do
let(:expected_counters) do
{
@@ -180,7 +203,7 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
context 'with cached payload ' do
let(:payload) do
{
- sql: 'SELECT * FROM users WHERE id = 10',
+ sql: sql('SELECT * FROM users WHERE id = 10'),
cached: true
}
end
@@ -192,7 +215,7 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
context 'with cached payload name' do
let(:payload) do
{
- sql: 'SELECT * FROM users WHERE id = 10',
+ sql: sql('SELECT * FROM users WHERE id = 10'),
name: 'CACHE'
}
end
@@ -208,7 +231,7 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
:event,
name: 'sql.active_record',
payload: {
- sql: "SELECT attr.attname FROM pg_attribute attr INNER JOIN pg_constraint cons ON attr.attrelid = cons.conrelid AND attr.attnum = any(cons.conkey) WHERE cons.contype = 'p' AND cons.conrelid = '\"projects\"'::regclass",
+ sql: sql("SELECT attr.attname FROM pg_attribute attr INNER JOIN pg_constraint cons ON attr.attrelid = cons.conrelid AND attr.attnum = any(cons.conkey) WHERE cons.contype = 'p' AND cons.conrelid = '\"projects\"'::regclass"),
name: 'SCHEMA',
connection_id: 135,
statement_name: nil,
diff --git a/spec/lib/gitlab/regex_spec.rb b/spec/lib/gitlab/regex_spec.rb
index 776ca81a338..1aca3dae41b 100644
--- a/spec/lib/gitlab/regex_spec.rb
+++ b/spec/lib/gitlab/regex_spec.rb
@@ -367,6 +367,35 @@ RSpec.describe Gitlab::Regex do
it { is_expected.not_to match('%2e%2e%2f1.2.3') }
end
+ describe '.npm_package_name_regex' do
+ subject { described_class.npm_package_name_regex }
+
+ it { is_expected.to match('@scope/package') }
+ it { is_expected.to match('unscoped-package') }
+ it { is_expected.not_to match('@first-scope@second-scope/package') }
+ it { is_expected.not_to match('scope-without-at-symbol/package') }
+ it { is_expected.not_to match('@not-a-scoped-package') }
+ it { is_expected.not_to match('@scope/sub/package') }
+ it { is_expected.not_to match('@scope/../../package') }
+ it { is_expected.not_to match('@scope%2e%2e%2fpackage') }
+ it { is_expected.not_to match('@%2e%2e%2f/package') }
+
+ context 'capturing group' do
+ [
+ ['@scope/package', 'scope'],
+ ['unscoped-package', nil],
+ ['@not-a-scoped-package', nil],
+ ['@scope/sub/package', nil],
+ ['@inv@lid-scope/package', nil]
+ ].each do |package_name, extracted_scope_name|
+ it "extracts the scope name for #{package_name}" do
+ match = package_name.match(described_class.npm_package_name_regex)
+ expect(match&.captures&.first).to eq(extracted_scope_name)
+ end
+ end
+ end
+ end
+
describe '.nuget_version_regex' do
subject { described_class.nuget_version_regex }
diff --git a/spec/lib/gitlab/tracking/standard_context_spec.rb b/spec/lib/gitlab/tracking/standard_context_spec.rb
index 7a0a4f0cc46..561edbd38f8 100644
--- a/spec/lib/gitlab/tracking/standard_context_spec.rb
+++ b/spec/lib/gitlab/tracking/standard_context_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe Gitlab::Tracking::StandardContext do
context 'staging' do
before do
- allow(Gitlab).to receive(:staging?).and_return(true)
+ stub_config_setting(url: 'https://staging.gitlab.com')
end
include_examples 'contains environment', 'staging'
@@ -30,11 +30,27 @@ RSpec.describe Gitlab::Tracking::StandardContext do
context 'production' do
before do
- allow(Gitlab).to receive(:com_and_canary?).and_return(true)
+ stub_config_setting(url: 'https://gitlab.com')
end
include_examples 'contains environment', 'production'
end
+
+ context 'org' do
+ before do
+ stub_config_setting(url: 'https://dev.gitlab.org')
+ end
+
+ include_examples 'contains environment', 'org'
+ end
+
+ context 'other self-managed instance' do
+ before do
+ stub_rails_env('production')
+ end
+
+ include_examples 'contains environment', 'self-managed'
+ end
end
it 'contains source' do
diff --git a/spec/lib/gitlab/usage/docs/renderer_spec.rb b/spec/lib/gitlab/usage/docs/renderer_spec.rb
index 0677aa2d9d7..07f25cfcfa7 100644
--- a/spec/lib/gitlab/usage/docs/renderer_spec.rb
+++ b/spec/lib/gitlab/usage/docs/renderer_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Usage::Docs::Renderer do
describe 'contents' do
let(:dictionary_path) { Gitlab::Usage::Docs::Renderer::DICTIONARY_PATH }
- let(:items) { Gitlab::Usage::MetricDefinition.definitions }
+ let(:items) { Gitlab::Usage::MetricDefinition.definitions.first(10).to_h }
it 'generates dictionary for given items' do
generated_dictionary = described_class.new(items).contents
diff --git a/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb b/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb
index 5469ded18f9..f8db1d5e8be 100644
--- a/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb
+++ b/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb
@@ -223,7 +223,7 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Aggregate, :clean_gitlab_redi
end
it 'allows for YAML aliases in aggregated metrics configs' do
- expect(YAML).to receive(:safe_load).with(kind_of(String), aliases: true)
+ expect(YAML).to receive(:safe_load).with(kind_of(String), aliases: true).at_least(:once)
described_class.new(recorded_at)
end
diff --git a/spec/lib/gitlab/usage_data_counters/code_review_events_spec.rb b/spec/lib/gitlab/usage_data_counters/code_review_events_spec.rb
new file mode 100644
index 00000000000..664e7938a7e
--- /dev/null
+++ b/spec/lib/gitlab/usage_data_counters/code_review_events_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+# If this spec fails, we need to add the new code review event to the correct aggregated metric
+RSpec.describe 'Code review events' do
+ it 'the aggregated metrics contain all the code review metrics' do
+ path = Rails.root.join('lib/gitlab/usage_data_counters/aggregated_metrics/code_review.yml')
+ aggregated_events = YAML.safe_load(File.read(path), aliases: true)&.map(&:with_indifferent_access)
+
+ code_review_aggregated_events = aggregated_events
+ .map { |event| event['events'] }
+ .flatten
+ .uniq
+
+ code_review_events = Gitlab::UsageDataCounters::HLLRedisCounter.events_for_category("code_review")
+
+ exceptions = %w[i_code_review_mr_diffs i_code_review_mr_single_file_diffs]
+ code_review_aggregated_events += exceptions
+
+ expect(code_review_events - code_review_aggregated_events).to be_empty
+ end
+end
diff --git a/spec/lib/gitlab/usage_data_counters/package_event_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/package_event_counter_spec.rb
index 7b5efb11034..1be2a83f98f 100644
--- a/spec/lib/gitlab/usage_data_counters/package_event_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/package_event_counter_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Gitlab::UsageDataCounters::PackageEventCounter, :clean_gitlab_red
end
it 'includes the right events' do
- expect(described_class::KNOWN_EVENTS.size).to eq 45
+ expect(described_class::KNOWN_EVENTS.size).to eq 48
end
described_class::KNOWN_EVENTS.each do |event|
diff --git a/spec/lib/marginalia_spec.rb b/spec/lib/marginalia_spec.rb
index fa0cd214c7e..2ee27fbe20c 100644
--- a/spec/lib/marginalia_spec.rb
+++ b/spec/lib/marginalia_spec.rb
@@ -37,26 +37,9 @@ RSpec.describe 'Marginalia spec' do
}
end
- context 'when the feature is enabled' do
- before do
- stub_feature(true)
- end
-
- it 'generates a query that includes the component and value' do
- component_map.each do |component, value|
- expect(recorded.log.last).to include("#{component}:#{value}")
- end
- end
- end
-
- context 'when the feature is disabled' do
- before do
- stub_feature(false)
- end
-
- it 'excludes annotations in generated queries' do
- expect(recorded.log.last).not_to include("/*")
- expect(recorded.log.last).not_to include("*/")
+ it 'generates a query that includes the component and value' do
+ component_map.each do |component, value|
+ expect(recorded.log.last).to include("#{component}:#{value}")
end
end
end
@@ -90,59 +73,37 @@ RSpec.describe 'Marginalia spec' do
}
end
- context 'when the feature is enabled' do
- before do
- stub_feature(true)
+ it 'generates a query that includes the component and value' do
+ component_map.each do |component, value|
+ expect(recorded.log.last).to include("#{component}:#{value}")
end
+ end
- it 'generates a query that includes the component and value' do
- component_map.each do |component, value|
- expect(recorded.log.last).to include("#{component}:#{value}")
- end
- end
-
- describe 'for ActionMailer delivery jobs' do
- let(:delivery_job) { MarginaliaTestMailer.first_user.deliver_later }
-
- let(:recorded) do
- ActiveRecord::QueryRecorder.new do
- delivery_job.perform_now
- end
- end
-
- let(:component_map) do
- {
- "application" => "sidekiq",
- "jid" => delivery_job.job_id,
- "job_class" => delivery_job.arguments.first
- }
- end
+ describe 'for ActionMailer delivery jobs' do
+ let(:delivery_job) { MarginaliaTestMailer.first_user.deliver_later }
- it 'generates a query that includes the component and value' do
- component_map.each do |component, value|
- expect(recorded.log.last).to include("#{component}:#{value}")
- end
+ let(:recorded) do
+ ActiveRecord::QueryRecorder.new do
+ delivery_job.perform_now
end
end
- end
- context 'when the feature is disabled' do
- before do
- stub_feature(false)
+ let(:component_map) do
+ {
+ "application" => "sidekiq",
+ "jid" => delivery_job.job_id,
+ "job_class" => delivery_job.arguments.first
+ }
end
- it 'excludes annotations in generated queries' do
- expect(recorded.log.last).not_to include("/*")
- expect(recorded.log.last).not_to include("*/")
+ it 'generates a query that includes the component and value' do
+ component_map.each do |component, value|
+ expect(recorded.log.last).to include("#{component}:#{value}")
+ end
end
end
end
- def stub_feature(value)
- stub_feature_flags(marginalia: value)
- Gitlab::Marginalia.set_enabled_from_feature_flag
- end
-
def make_request(correlation_id)
request_env = Rack::MockRequest.env_for('/')
diff --git a/spec/migrations/schedule_set_default_iteration_cadences_spec.rb b/spec/migrations/schedule_set_default_iteration_cadences_spec.rb
new file mode 100644
index 00000000000..9d7f1ac0dec
--- /dev/null
+++ b/spec/migrations/schedule_set_default_iteration_cadences_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe ScheduleSetDefaultIterationCadences do
+ let(:namespaces) { table(:namespaces) }
+ let(:iterations) { table(:sprints) }
+
+ let(:group_1) { namespaces.create!(name: 'test_1', path: 'test_1') }
+ let!(:group_2) { namespaces.create!(name: 'test_2', path: 'test_2') }
+ let(:group_3) { namespaces.create!(name: 'test_3', path: 'test_3') }
+ let(:group_4) { namespaces.create!(name: 'test_4', path: 'test_4') }
+ let(:group_5) { namespaces.create!(name: 'test_5', path: 'test_5') }
+ let(:group_6) { namespaces.create!(name: 'test_6', path: 'test_6') }
+ let(:group_7) { namespaces.create!(name: 'test_7', path: 'test_7') }
+ let(:group_8) { namespaces.create!(name: 'test_8', path: 'test_8') }
+
+ let!(:iteration_1) { iterations.create!(iid: 1, title: 'iteration 1', group_id: group_1.id) }
+ let!(:iteration_2) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_3.id) }
+ let!(:iteration_3) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_4.id) }
+ let!(:iteration_4) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_5.id) }
+ let!(:iteration_5) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_6.id) }
+ let!(:iteration_6) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_7.id) }
+ let!(:iteration_7) { iterations.create!(iid: 1, title: 'iteration 2', group_id: group_8.id) }
+
+ around do |example|
+ freeze_time { Sidekiq::Testing.fake! { example.run } }
+ end
+
+ it 'schedules the background jobs', :aggregate_failures do
+ stub_const("#{described_class.name}::BATCH_SIZE", 3)
+
+ migrate!
+
+ expect(BackgroundMigrationWorker.jobs.size).to be(3)
+ expect(described_class::MIGRATION_CLASS).to be_scheduled_delayed_migration(2.minutes, group_1.id, group_3.id, group_4.id)
+ expect(described_class::MIGRATION_CLASS).to be_scheduled_delayed_migration(4.minutes, group_5.id, group_6.id, group_7.id)
+ expect(described_class::MIGRATION_CLASS).to be_scheduled_delayed_migration(6.minutes, group_8.id)
+ end
+end
diff --git a/spec/models/analytics/instance_statistics/measurement_spec.rb b/spec/models/analytics/usage_trends/measurement_spec.rb
index dbb16c5ffbe..d9a6b70c87a 100644
--- a/spec/models/analytics/instance_statistics/measurement_spec.rb
+++ b/spec/models/analytics/usage_trends/measurement_spec.rb
@@ -2,9 +2,9 @@
require 'spec_helper'
-RSpec.describe Analytics::InstanceStatistics::Measurement, type: :model do
+RSpec.describe Analytics::UsageTrends::Measurement, type: :model do
describe 'validation' do
- let!(:measurement) { create(:instance_statistics_measurement) }
+ let!(:measurement) { create(:usage_trends_measurement) }
it { is_expected.to validate_presence_of(:recorded_at) }
it { is_expected.to validate_presence_of(:identifier) }
@@ -33,9 +33,9 @@ RSpec.describe Analytics::InstanceStatistics::Measurement, type: :model do
end
describe 'scopes' do
- let_it_be(:measurement_1) { create(:instance_statistics_measurement, :project_count, recorded_at: 10.days.ago) }
- let_it_be(:measurement_2) { create(:instance_statistics_measurement, :project_count, recorded_at: 2.days.ago) }
- let_it_be(:measurement_3) { create(:instance_statistics_measurement, :group_count, recorded_at: 5.days.ago) }
+ let_it_be(:measurement_1) { create(:usage_trends_measurement, :project_count, recorded_at: 10.days.ago) }
+ let_it_be(:measurement_2) { create(:usage_trends_measurement, :project_count, recorded_at: 2.days.ago) }
+ let_it_be(:measurement_3) { create(:usage_trends_measurement, :group_count, recorded_at: 5.days.ago) }
describe '.order_by_latest' do
subject { described_class.order_by_latest }
@@ -101,15 +101,15 @@ RSpec.describe Analytics::InstanceStatistics::Measurement, type: :model do
describe '.find_latest_or_fallback' do
subject(:count) { described_class.find_latest_or_fallback(:pipelines_skipped).count }
- context 'with instance statistics' do
- let!(:measurement) { create(:instance_statistics_measurement, :pipelines_skipped_count) }
+ context 'with usage statistics' do
+ let!(:measurement) { create(:usage_trends_measurement, :pipelines_skipped_count) }
it 'returns the latest stored measurement' do
expect(count).to eq measurement.count
end
end
- context 'without instance statistics' do
+ context 'without usage statistics' do
it 'returns the realtime query of the measurement' do
expect(count).to eq 0
end
diff --git a/spec/models/bulk_imports/entity_spec.rb b/spec/models/bulk_imports/entity_spec.rb
index e5ab96ca514..a3a22c386c9 100644
--- a/spec/models/bulk_imports/entity_spec.rb
+++ b/spec/models/bulk_imports/entity_spec.rb
@@ -14,7 +14,6 @@ RSpec.describe BulkImports::Entity, type: :model do
it { is_expected.to validate_presence_of(:source_type) }
it { is_expected.to validate_presence_of(:source_full_path) }
it { is_expected.to validate_presence_of(:destination_name) }
- it { is_expected.to validate_presence_of(:destination_namespace) }
it { is_expected.to define_enum_for(:source_type).with_values(%i[group_entity project_entity]) }
@@ -38,7 +37,11 @@ RSpec.describe BulkImports::Entity, type: :model do
context 'when associated with a group and no project' do
it 'is valid as a group_entity' do
entity = build(:bulk_import_entity, :group_entity, group: build(:group), project: nil)
+ expect(entity).to be_valid
+ end
+ it 'is valid when destination_namespace is empty' do
+ entity = build(:bulk_import_entity, :group_entity, group: build(:group), project: nil, destination_namespace: '')
expect(entity).to be_valid
end
@@ -57,6 +60,12 @@ RSpec.describe BulkImports::Entity, type: :model do
expect(entity).to be_valid
end
+ it 'is invalid when destination_namespace is nil' do
+ entity = build(:bulk_import_entity, :group_entity, group: build(:group), project: nil, destination_namespace: nil)
+ expect(entity).not_to be_valid
+ expect(entity.errors).to include(:destination_namespace)
+ end
+
it 'is invalid as a project_entity' do
entity = build(:bulk_import_entity, :group_entity, group: nil, project: build(:project))
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index 94943fb3644..351b9f0554c 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -8,8 +8,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
include Ci::SourcePipelineHelpers
let_it_be(:user) { create(:user) }
- let_it_be(:namespace) { create_default(:namespace) }
- let_it_be(:project) { create_default(:project, :repository) }
+ let_it_be(:namespace) { create_default(:namespace).freeze }
+ let_it_be(:project) { create_default(:project, :repository).freeze }
let(:pipeline) do
create(:ci_empty_pipeline, status: :created, project: project)
@@ -3785,17 +3785,11 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
describe '#default_branch?' do
- let(:default_branch) { 'master'}
-
subject { pipeline.default_branch? }
- before do
- allow(project).to receive(:default_branch).and_return(default_branch)
- end
-
context 'when pipeline ref is the default branch of the project' do
let(:pipeline) do
- build(:ci_empty_pipeline, status: :created, project: project, ref: default_branch)
+ build(:ci_empty_pipeline, status: :created, project: project, ref: project.default_branch)
end
it "returns true" do
diff --git a/spec/models/clusters/agent_token_spec.rb b/spec/models/clusters/agent_token_spec.rb
index 5cb84ee131a..8107b5b1388 100644
--- a/spec/models/clusters/agent_token_spec.rb
+++ b/spec/models/clusters/agent_token_spec.rb
@@ -3,8 +3,9 @@
require 'spec_helper'
RSpec.describe Clusters::AgentToken do
- it { is_expected.to belong_to(:agent).class_name('Clusters::Agent') }
+ it { is_expected.to belong_to(:agent).class_name('Clusters::Agent').required }
it { is_expected.to belong_to(:created_by_user).class_name('User').optional }
+ it { is_expected.to validate_length_of(:description).is_at_most(1024) }
describe '#token' do
it 'is generated on save' do
diff --git a/spec/models/concerns/project_features_compatibility_spec.rb b/spec/models/concerns/project_features_compatibility_spec.rb
index 2059e170446..7c2caafcdb7 100644
--- a/spec/models/concerns/project_features_compatibility_spec.rb
+++ b/spec/models/concerns/project_features_compatibility_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe ProjectFeaturesCompatibility do
let(:project) { create(:project) }
- let(:features_enabled) { %w(issues wiki builds merge_requests snippets) }
+ let(:features_enabled) { %w(issues wiki builds merge_requests snippets security_and_compliance) }
let(:features) { features_enabled + %w(repository pages operations) }
# We had issues_enabled, snippets_enabled, builds_enabled, merge_requests_enabled and issues_enabled fields on projects table
diff --git a/spec/models/custom_emoji_spec.rb b/spec/models/custom_emoji_spec.rb
index 41ce480b02f..e34934d393a 100644
--- a/spec/models/custom_emoji_spec.rb
+++ b/spec/models/custom_emoji_spec.rb
@@ -4,8 +4,10 @@ require 'spec_helper'
RSpec.describe CustomEmoji do
describe 'Associations' do
- it { is_expected.to belong_to(:namespace) }
+ it { is_expected.to belong_to(:namespace).inverse_of(:custom_emoji) }
+ it { is_expected.to belong_to(:creator).inverse_of(:created_custom_emoji) }
it { is_expected.to have_db_column(:file) }
+ it { is_expected.to validate_presence_of(:creator) }
it { is_expected.to validate_length_of(:name).is_at_most(36) }
it { is_expected.to validate_presence_of(:name) }
it { is_expected.to have_db_column(:external) }
@@ -36,7 +38,7 @@ RSpec.describe CustomEmoji do
new_emoji = build(:custom_emoji, name: old_emoji.name, namespace: old_emoji.namespace, group: group)
expect(new_emoji).not_to be_valid
- expect(new_emoji.errors.messages).to eq(name: ["has already been taken"])
+ expect(new_emoji.errors.messages).to include(name: ["has already been taken"])
end
it 'disallows non http and https file value' do
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb
index e79b54b4674..6afd422e554 100644
--- a/spec/models/group_spec.rb
+++ b/spec/models/group_spec.rb
@@ -740,6 +740,33 @@ RSpec.describe Group do
end
end
+ describe '#direct_members' do
+ let_it_be(:group) { create(:group, :nested) }
+ let_it_be(:maintainer) { group.parent.add_user(create(:user), GroupMember::MAINTAINER) }
+ let_it_be(:developer) { group.add_user(create(:user), GroupMember::DEVELOPER) }
+
+ it 'does not return members of the parent' do
+ expect(group.direct_members).not_to include(maintainer)
+ end
+
+ it 'returns the direct member of the group' do
+ expect(group.direct_members).to include(developer)
+ end
+
+ context 'group sharing' do
+ let!(:shared_group) { create(:group) }
+
+ before do
+ create(:group_group_link, shared_group: shared_group, shared_with_group: group)
+ end
+
+ it 'does not return members of the shared_with group' do
+ expect(shared_group.direct_members).not_to(
+ include(developer))
+ end
+ end
+ end
+
describe '#members_with_parents' do
let!(:group) { create(:group, :nested) }
let!(:maintainer) { group.parent.add_user(create(:user), GroupMember::MAINTAINER) }
@@ -932,6 +959,65 @@ RSpec.describe Group do
end
end
+ describe '#refresh_members_authorized_projects' do
+ let_it_be(:group) { create(:group, :nested) }
+ let_it_be(:parent_group_user) { create(:user) }
+ let_it_be(:group_user) { create(:user) }
+
+ before do
+ group.parent.add_maintainer(parent_group_user)
+ group.add_developer(group_user)
+ end
+
+ context 'users for which authorizations refresh is executed' do
+ it 'processes authorizations refresh for all members of the group' do
+ expect(UserProjectAccessChangedService).to receive(:new).with(contain_exactly(group_user.id, parent_group_user.id)).and_call_original
+
+ group.refresh_members_authorized_projects
+ end
+
+ context 'when explicitly specified to run only for direct members' do
+ it 'processes authorizations refresh only for direct members of the group' do
+ expect(UserProjectAccessChangedService).to receive(:new).with(contain_exactly(group_user.id)).and_call_original
+
+ group.refresh_members_authorized_projects(direct_members_only: true)
+ end
+ end
+ end
+ end
+
+ describe '#users_ids_of_direct_members' do
+ let_it_be(:group) { create(:group, :nested) }
+ let_it_be(:parent_group_user) { create(:user) }
+ let_it_be(:group_user) { create(:user) }
+
+ before do
+ group.parent.add_maintainer(parent_group_user)
+ group.add_developer(group_user)
+ end
+
+ it 'does not return user ids of the members of the parent' do
+ expect(group.users_ids_of_direct_members).not_to include(parent_group_user.id)
+ end
+
+ it 'returns the user ids of the direct member of the group' do
+ expect(group.users_ids_of_direct_members).to include(group_user.id)
+ end
+
+ context 'group sharing' do
+ let!(:shared_group) { create(:group) }
+
+ before do
+ create(:group_group_link, shared_group: shared_group, shared_with_group: group)
+ end
+
+ it 'does not return the user ids of members of the shared_with group' do
+ expect(shared_group.users_ids_of_direct_members).not_to(
+ include(group_user.id))
+ end
+ end
+ end
+
describe '#user_ids_for_project_authorizations' do
it 'returns the user IDs for which to refresh authorizations' do
maintainer = create(:user)
diff --git a/spec/models/iteration_spec.rb b/spec/models/iteration_spec.rb
index e7ec5de0ef1..7241a07a215 100644
--- a/spec/models/iteration_spec.rb
+++ b/spec/models/iteration_spec.rb
@@ -5,6 +5,13 @@ require 'spec_helper'
RSpec.describe Iteration do
let_it_be(:project) { create(:project) }
let_it_be(:group) { create(:group) }
+ let(:set_cadence) { nil }
+
+ describe 'associations' do
+ it { is_expected.to belong_to(:project) }
+ it { is_expected.to belong_to(:group) }
+ it { is_expected.to belong_to(:iterations_cadence).inverse_of(:iterations) }
+ end
describe "#iid" do
it "is properly scoped on project and group" do
@@ -32,6 +39,59 @@ RSpec.describe Iteration do
end
end
+ describe 'setting iteration cadence' do
+ let_it_be(:iterations_cadence) { create(:iterations_cadence, group: group, start_date: 10.days.ago) }
+ let(:iteration) { create(:iteration, group: group, iterations_cadence: set_cadence, start_date: 2.days.from_now) }
+
+ context 'when iterations_cadence is set correctly' do
+ let(:set_cadence) { iterations_cadence}
+
+ it 'does not change the iterations_cadence' do
+ expect(iteration.iterations_cadence).to eq(iterations_cadence)
+ end
+ end
+
+ context 'when iterations_cadence exists for the group' do
+ let(:set_cadence) { nil }
+
+ it 'sets the iterations_cadence to the existing record' do
+ expect(iteration.iterations_cadence).to eq(iterations_cadence)
+ end
+ end
+
+ context 'when iterations_cadence does not exists for the group' do
+ let_it_be(:group) { create(:group, name: 'Test group')}
+ let(:iteration) { build(:iteration, group: group, iterations_cadence: set_cadence) }
+
+ it 'creates a default iterations_cadence and uses it for the iteration' do
+ expect { iteration.save! }.to change { Iterations::Cadence.count }.by(1)
+ end
+
+ it 'sets the newly created iterations_cadence to the reecord' do
+ iteration.save!
+
+ expect(iteration.iterations_cadence).to eq(Iterations::Cadence.last)
+ end
+
+ it 'creates the iterations_cadence with the correct attributes' do
+ iteration.save!
+
+ cadence = Iterations::Cadence.last
+
+ expect(cadence.reload.start_date).to eq(iteration.start_date)
+ expect(cadence.title).to eq('Test group Iterations')
+ end
+ end
+
+ context 'when iteration is a project iteration' do
+ it 'does not set the iterations_cadence' do
+ iteration = create(:iteration, iterations_cadence: nil, project: project, skip_project_validation: true)
+
+ expect(iteration.reload.iterations_cadence).to be_nil
+ end
+ end
+ end
+
describe '.filter_by_state' do
let_it_be(:closed_iteration) { create(:iteration, :closed, :skip_future_date_validation, group: group, start_date: 8.days.ago, due_date: 2.days.ago) }
let_it_be(:started_iteration) { create(:iteration, :started, :skip_future_date_validation, group: group, start_date: 1.day.ago, due_date: 6.days.from_now) }
@@ -307,6 +367,43 @@ RSpec.describe Iteration do
end
end
+ describe '#validate_group' do
+ let_it_be(:iterations_cadence) { create(:iterations_cadence, group: group) }
+
+ context 'when the iteration and iteration cadence groups are same' do
+ it 'is valid' do
+ iteration = build(:iteration, group: group, iterations_cadence: iterations_cadence)
+
+ expect(iteration).to be_valid
+ end
+ end
+
+ context 'when the iteration and iteration cadence groups are different' do
+ it 'is invalid' do
+ other_group = create(:group)
+ iteration = build(:iteration, group: other_group, iterations_cadence: iterations_cadence)
+
+ expect(iteration).not_to be_valid
+ end
+ end
+
+ context 'when the iteration belongs to a project and the iteration cadence is set' do
+ it 'is invalid' do
+ iteration = build(:iteration, project: project, iterations_cadence: iterations_cadence, skip_project_validation: true)
+
+ expect(iteration).to be_invalid
+ end
+ end
+
+ context 'when the iteration belongs to a project and the iteration cadence is not set' do
+ it 'is valid' do
+ iteration = build(:iteration, project: project, skip_project_validation: true)
+
+ expect(iteration).to be_valid
+ end
+ end
+ end
+
describe '.within_timeframe' do
let_it_be(:now) { Time.current }
let_it_be(:project) { create(:project, :empty_repo) }
diff --git a/spec/models/iterations/cadence_spec.rb b/spec/models/iterations/cadence_spec.rb
new file mode 100644
index 00000000000..cdeeef97580
--- /dev/null
+++ b/spec/models/iterations/cadence_spec.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Iterations::Cadence do
+ describe 'associations' do
+ subject { build(:iterations_cadence) }
+
+ it { is_expected.to belong_to(:group) }
+ it { is_expected.to have_many(:iterations).inverse_of(:iterations_cadence) }
+ end
+
+ describe 'validations' do
+ subject { build(:iterations_cadence) }
+
+ it { is_expected.to validate_presence_of(:title) }
+ it { is_expected.to validate_presence_of(:start_date) }
+ it { is_expected.to validate_presence_of(:group_id) }
+ it { is_expected.to validate_presence_of(:active) }
+ it { is_expected.to validate_presence_of(:automatic) }
+ end
+end
diff --git a/spec/models/list_spec.rb b/spec/models/list_spec.rb
index f0b1bc33e84..922d6b01b82 100644
--- a/spec/models/list_spec.rb
+++ b/spec/models/list_spec.rb
@@ -17,6 +17,19 @@ RSpec.describe List do
it { is_expected.to validate_presence_of(:list_type) }
end
+ describe '.without_types' do
+ it 'exclude lists of given types' do
+ board = create(:list, list_type: :label).board
+ # closed list is created by default
+ backlog_list = create(:list, list_type: :backlog, board: board)
+
+ exclude_type = [described_class.list_types[:label], described_class.list_types[:closed]]
+
+ lists = described_class.without_types(exclude_type)
+ expect(lists.where(board: board)).to match_array([backlog_list])
+ end
+ end
+
describe '#update_preferences_for' do
let(:user) { create(:user) }
let(:list) { create(:list) }
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index ebe2cd2ac03..06b6ba2088f 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -9,8 +9,8 @@ RSpec.describe MergeRequest, factory_default: :keep do
using RSpec::Parameterized::TableSyntax
- let_it_be(:namespace) { create_default(:namespace) }
- let_it_be(:project, refind: true) { create_default(:project, :repository) }
+ let_it_be(:namespace) { create_default(:namespace).freeze }
+ let_it_be(:project, refind: true) { create_default(:project, :repository).freeze }
subject { create(:merge_request) }
@@ -3082,32 +3082,83 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
describe "#head_pipeline_active? " do
- it do
- is_expected
- .to delegate_method(:active?)
- .to(:head_pipeline)
- .with_prefix
- .with_arguments(allow_nil: true)
+ context 'when project lacks a head_pipeline relation' do
+ before do
+ subject.head_pipeline = nil
+ end
+
+ it 'returns false' do
+ expect(subject.head_pipeline_active?).to be false
+ end
+ end
+
+ context 'when project has a head_pipeline relation' do
+ let(:pipeline) { create(:ci_empty_pipeline) }
+
+ before do
+ allow(subject).to receive(:head_pipeline) { pipeline }
+ end
+
+ it 'accesses the value from the head_pipeline' do
+ expect(subject.head_pipeline)
+ .to receive(:active?)
+
+ subject.head_pipeline_active?
+ end
end
end
describe "#actual_head_pipeline_success? " do
- it do
- is_expected
- .to delegate_method(:success?)
- .to(:actual_head_pipeline)
- .with_prefix
- .with_arguments(allow_nil: true)
+ context 'when project lacks an actual_head_pipeline relation' do
+ before do
+ allow(subject).to receive(:actual_head_pipeline) { nil }
+ end
+
+ it 'returns false' do
+ expect(subject.actual_head_pipeline_success?).to be false
+ end
+ end
+
+ context 'when project has a actual_head_pipeline relation' do
+ let(:pipeline) { create(:ci_empty_pipeline) }
+
+ before do
+ allow(subject).to receive(:actual_head_pipeline) { pipeline }
+ end
+
+ it 'accesses the value from the actual_head_pipeline' do
+ expect(subject.actual_head_pipeline)
+ .to receive(:success?)
+
+ subject.actual_head_pipeline_success?
+ end
end
end
describe "#actual_head_pipeline_active? " do
- it do
- is_expected
- .to delegate_method(:active?)
- .to(:actual_head_pipeline)
- .with_prefix
- .with_arguments(allow_nil: true)
+ context 'when project lacks an actual_head_pipeline relation' do
+ before do
+ allow(subject).to receive(:actual_head_pipeline) { nil }
+ end
+
+ it 'returns false' do
+ expect(subject.actual_head_pipeline_active?).to be false
+ end
+ end
+
+ context 'when project has a actual_head_pipeline relation' do
+ let(:pipeline) { create(:ci_empty_pipeline) }
+
+ before do
+ allow(subject).to receive(:actual_head_pipeline) { pipeline }
+ end
+
+ it 'accesses the value from the actual_head_pipeline' do
+ expect(subject.actual_head_pipeline)
+ .to receive(:active?)
+
+ subject.actual_head_pipeline_active?
+ end
end
end
diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb
index 647e279bf83..ed0b9063e32 100644
--- a/spec/models/namespace_spec.rb
+++ b/spec/models/namespace_spec.rb
@@ -285,6 +285,17 @@ RSpec.describe Namespace do
end
end
+ describe '.top_most' do
+ let_it_be(:namespace) { create(:namespace) }
+ let_it_be(:sub_namespace) { create(:namespace, parent: namespace) }
+
+ subject { described_class.top_most.ids }
+
+ it 'only contains root namespace' do
+ is_expected.to eq([namespace.id])
+ end
+ end
+
describe '#ancestors_upto' do
let(:parent) { create(:group) }
let(:child) { create(:group, parent: parent) }
@@ -1449,4 +1460,24 @@ RSpec.describe Namespace do
end
end
end
+
+ describe '#recent?' do
+ subject { namespace.recent? }
+
+ context 'when created more than 90 days ago' do
+ before do
+ namespace.update_attribute(:created_at, 91.days.ago)
+ end
+
+ it { is_expected.to be(false) }
+ end
+
+ context 'when created less than 90 days ago' do
+ before do
+ namespace.update_attribute(:created_at, 89.days.ago)
+ end
+
+ it { is_expected.to be(true) }
+ end
+ end
end
diff --git a/spec/models/notification_recipient_spec.rb b/spec/models/notification_recipient_spec.rb
index 8429f577dc6..4debda0621c 100644
--- a/spec/models/notification_recipient_spec.rb
+++ b/spec/models/notification_recipient_spec.rb
@@ -337,6 +337,39 @@ RSpec.describe NotificationRecipient do
expect(recipient.suitable_notification_level?).to eq true
end
end
+
+ context 'with merge_when_pipeline_succeeds' do
+ let(:notification_setting) { user.notification_settings_for(project) }
+ let(:recipient) do
+ described_class.new(
+ user,
+ :watch,
+ custom_action: :merge_when_pipeline_succeeds,
+ target: target,
+ project: project
+ )
+ end
+
+ context 'custom event enabled' do
+ before do
+ notification_setting.update!(merge_when_pipeline_succeeds: true)
+ end
+
+ it 'returns true' do
+ expect(recipient.suitable_notification_level?).to eq true
+ end
+ end
+
+ context 'custom event disabled' do
+ before do
+ notification_setting.update!(merge_when_pipeline_succeeds: false)
+ end
+
+ it 'returns false' do
+ expect(recipient.suitable_notification_level?).to eq false
+ end
+ end
+ end
end
end
diff --git a/spec/models/notification_setting_spec.rb b/spec/models/notification_setting_spec.rb
index bc50e2af373..4ef5ab7af48 100644
--- a/spec/models/notification_setting_spec.rb
+++ b/spec/models/notification_setting_spec.rb
@@ -180,7 +180,8 @@ RSpec.describe NotificationSetting do
:failed_pipeline,
:success_pipeline,
:fixed_pipeline,
- :moved_project
+ :moved_project,
+ :merge_when_pipeline_succeeds
)
end
diff --git a/spec/models/packages/package_spec.rb b/spec/models/packages/package_spec.rb
index 6c55d37b95f..fc0bd34a331 100644
--- a/spec/models/packages/package_spec.rb
+++ b/spec/models/packages/package_spec.rb
@@ -162,6 +162,18 @@ RSpec.describe Packages::Package, type: :model do
it { is_expected.not_to allow_value('../../../my_package').for(:name) }
it { is_expected.not_to allow_value('%2e%2e%2fmy_package').for(:name) }
end
+
+ context 'npm package' do
+ subject { build_stubbed(:npm_package) }
+
+ it { is_expected.to allow_value("@group-1/package").for(:name) }
+ it { is_expected.to allow_value("@any-scope/package").for(:name) }
+ it { is_expected.to allow_value("unscoped-package").for(:name) }
+ it { is_expected.not_to allow_value("@inv@lid-scope/package").for(:name) }
+ it { is_expected.not_to allow_value("@scope/../../package").for(:name) }
+ it { is_expected.not_to allow_value("@scope%2e%2e%fpackage").for(:name) }
+ it { is_expected.not_to allow_value("@scope/sub/package").for(:name) }
+ end
end
describe '#version' do
@@ -342,16 +354,6 @@ RSpec.describe Packages::Package, type: :model do
end
describe '#package_already_taken' do
- context 'npm package' do
- let!(:package) { create(:npm_package) }
-
- it 'will not allow a package of the same name' do
- new_package = build(:npm_package, project: create(:project), name: package.name)
-
- expect(new_package).not_to be_valid
- end
- end
-
context 'maven package' do
let!(:package) { create(:maven_package) }
@@ -511,7 +513,7 @@ RSpec.describe Packages::Package, type: :model do
describe '.without_nuget_temporary_name' do
let!(:package1) { create(:nuget_package) }
- let!(:package2) { create(:nuget_package, name: Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME) }
+ let!(:package2) { create(:nuget_package, name: Packages::Nuget::TEMPORARY_PACKAGE_NAME) }
subject { described_class.without_nuget_temporary_name }
@@ -530,7 +532,7 @@ RSpec.describe Packages::Package, type: :model do
it { is_expected.to match_array([package1, package2, package3]) }
context 'with temporary packages' do
- let!(:package1) { create(:nuget_package, name: Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME) }
+ let!(:package1) { create(:nuget_package, name: Packages::Nuget::TEMPORARY_PACKAGE_NAME) }
it { is_expected.to match_array([package2, package3]) }
end
diff --git a/spec/models/project_services/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb
index 78bd0e91208..ef0bc930152 100644
--- a/spec/models/project_services/jira_service_spec.rb
+++ b/spec/models/project_services/jira_service_spec.rb
@@ -82,11 +82,8 @@ RSpec.describe JiraService do
subject(:fields) { service.fields }
- it 'includes transition help link' do
- transition_id_field = fields.find { |field| field[:name] == 'jira_issue_transition_id' }
-
- expect(transition_id_field[:title]).to eq('Jira workflow transition IDs')
- expect(transition_id_field[:help]).to include('/help/user/project/integrations/jira')
+ it 'returns custom fields' do
+ expect(fields.pluck(:name)).to eq(%w[url api_url username password])
end
end
@@ -460,10 +457,10 @@ RSpec.describe JiraService do
end
context 'with options' do
- let(:issue_url) { "#{url}/rest/api/2/issue/#{issue_key}?expand=renderedFields" }
+ let(:issue_url) { "#{url}/rest/api/2/issue/#{issue_key}?expand=renderedFields,transitions" }
it 'calls the Jira API with the options to get the issue' do
- jira_service.find_issue(issue_key, rendered_fields: true)
+ jira_service.find_issue(issue_key, rendered_fields: true, transitions: true)
expect(WebMock).to have_requested(:get, issue_url)
end
@@ -474,52 +471,56 @@ RSpec.describe JiraService do
let(:custom_base_url) { 'http://custom_url' }
shared_examples 'close_issue' do
+ let(:issue_key) { 'JIRA-123' }
+ let(:issue_url) { "#{url}/rest/api/2/issue/#{issue_key}" }
+ let(:transitions_url) { "#{issue_url}/transitions" }
+ let(:comment_url) { "#{issue_url}/comment" }
+ let(:remote_link_url) { "#{issue_url}/remotelink" }
+ let(:transitions) { nil }
+
+ let(:issue_fields) do
+ {
+ id: issue_key,
+ self: issue_url,
+ transitions: transitions
+ }
+ end
+
+ subject(:close_issue) do
+ jira_service.close_issue(resource, ExternalIssue.new(issue_key, project))
+ end
+
before do
- @jira_service = described_class.new
- allow(@jira_service).to receive_messages(
- project_id: project.id,
- project: project,
- url: 'http://jira.example.com',
- username: 'gitlab_jira_username',
- password: 'gitlab_jira_password',
- jira_issue_transition_id: '999'
- )
+ allow(jira_service).to receive_messages(jira_issue_transition_id: '999')
# These stubs are needed to test JiraService#close_issue.
# We close the issue then do another request to API to check if it got closed.
# Here is stubbed the API return with a closed and an opened issues.
- open_issue = JIRA::Resource::Issue.new(@jira_service.client, attrs: { 'id' => 'JIRA-123' })
+ open_issue = JIRA::Resource::Issue.new(jira_service.client, attrs: issue_fields.deep_stringify_keys)
closed_issue = open_issue.dup
allow(open_issue).to receive(:resolution).and_return(false)
allow(closed_issue).to receive(:resolution).and_return(true)
allow(JIRA::Resource::Issue).to receive(:find).and_return(open_issue, closed_issue)
- allow_any_instance_of(JIRA::Resource::Issue).to receive(:key).and_return('JIRA-123')
+ allow_any_instance_of(JIRA::Resource::Issue).to receive(:key).and_return(issue_key)
allow(JIRA::Resource::Remotelink).to receive(:all).and_return([])
- @jira_service.save!
-
- project_issues_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123'
- @transitions_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123/transitions'
- @comment_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123/comment'
- @remote_link_url = 'http://jira.example.com/rest/api/2/issue/JIRA-123/remotelink'
-
- WebMock.stub_request(:get, project_issues_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password))
- WebMock.stub_request(:post, @transitions_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password))
- WebMock.stub_request(:post, @comment_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password))
- WebMock.stub_request(:post, @remote_link_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password))
+ WebMock.stub_request(:get, issue_url).with(basic_auth: %w(jira-username jira-password))
+ WebMock.stub_request(:post, transitions_url).with(basic_auth: %w(jira-username jira-password))
+ WebMock.stub_request(:post, comment_url).with(basic_auth: %w(jira-username jira-password))
+ WebMock.stub_request(:post, remote_link_url).with(basic_auth: %w(jira-username jira-password))
end
let(:external_issue) { ExternalIssue.new('JIRA-123', project) }
def close_issue
- @jira_service.close_issue(resource, external_issue, current_user)
+ jira_service.close_issue(resource, external_issue, current_user)
end
it 'calls Jira API' do
close_issue
- expect(WebMock).to have_requested(:post, @comment_url).with(
+ expect(WebMock).to have_requested(:post, comment_url).with(
body: /Issue solved with/
).once
end
@@ -546,9 +547,9 @@ RSpec.describe JiraService do
favicon_path = "http://localhost/assets/#{find_asset('favicon.png').digest_path}"
# Creates comment
- expect(WebMock).to have_requested(:post, @comment_url)
+ expect(WebMock).to have_requested(:post, comment_url)
# Creates Remote Link in Jira issue fields
- expect(WebMock).to have_requested(:post, @remote_link_url).with(
+ expect(WebMock).to have_requested(:post, remote_link_url).with(
body: hash_including(
GlobalID: 'GitLab',
relationship: 'mentioned on',
@@ -564,11 +565,11 @@ RSpec.describe JiraService do
context 'when "comment_on_event_enabled" is set to false' do
it 'creates Remote Link reference but does not create comment' do
- allow(@jira_service).to receive_messages(comment_on_event_enabled: false)
+ allow(jira_service).to receive_messages(comment_on_event_enabled: false)
close_issue
- expect(WebMock).not_to have_requested(:post, @comment_url)
- expect(WebMock).to have_requested(:post, @remote_link_url)
+ expect(WebMock).not_to have_requested(:post, comment_url)
+ expect(WebMock).to have_requested(:post, remote_link_url)
end
end
@@ -589,7 +590,7 @@ RSpec.describe JiraService do
close_issue
- expect(WebMock).not_to have_requested(:post, @comment_url)
+ expect(WebMock).not_to have_requested(:post, comment_url)
end
end
@@ -598,8 +599,8 @@ RSpec.describe JiraService do
close_issue
- expect(WebMock).not_to have_requested(:post, @comment_url)
- expect(WebMock).not_to have_requested(:post, @remote_link_url)
+ expect(WebMock).not_to have_requested(:post, comment_url)
+ expect(WebMock).not_to have_requested(:post, remote_link_url)
end
it 'does not send comment or remote links to issues with unknown resolution' do
@@ -607,8 +608,8 @@ RSpec.describe JiraService do
close_issue
- expect(WebMock).not_to have_requested(:post, @comment_url)
- expect(WebMock).not_to have_requested(:post, @remote_link_url)
+ expect(WebMock).not_to have_requested(:post, comment_url)
+ expect(WebMock).not_to have_requested(:post, remote_link_url)
end
it 'references the GitLab commit' do
@@ -616,7 +617,7 @@ RSpec.describe JiraService do
close_issue
- expect(WebMock).to have_requested(:post, @comment_url).with(
+ expect(WebMock).to have_requested(:post, comment_url).with(
body: %r{#{custom_base_url}/#{project.full_path}/-/commit/#{commit_id}}
).once
end
@@ -631,18 +632,18 @@ RSpec.describe JiraService do
close_issue
- expect(WebMock).to have_requested(:post, @comment_url).with(
+ expect(WebMock).to have_requested(:post, comment_url).with(
body: %r{#{Gitlab.config.gitlab.url}/#{project.full_path}/-/commit/#{commit_id}}
).once
end
it 'logs exception when transition id is not valid' do
- allow(@jira_service).to receive(:log_error)
- WebMock.stub_request(:post, @transitions_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password)).and_raise("Bad Request")
+ allow(jira_service).to receive(:log_error)
+ WebMock.stub_request(:post, transitions_url).with(basic_auth: %w(jira-username jira-password)).and_raise("Bad Request")
close_issue
- expect(@jira_service).to have_received(:log_error).with(
+ expect(jira_service).to have_received(:log_error).with(
"Issue transition failed",
error: hash_including(
exception_class: 'StandardError',
@@ -655,34 +656,107 @@ RSpec.describe JiraService do
it 'calls the api with jira_issue_transition_id' do
close_issue
- expect(WebMock).to have_requested(:post, @transitions_url).with(
- body: /999/
+ expect(WebMock).to have_requested(:post, transitions_url).with(
+ body: /"id":"999"/
).once
end
- context 'when have multiple transition ids' do
- it 'calls the api with transition ids separated by comma' do
- allow(@jira_service).to receive_messages(jira_issue_transition_id: '1,2,3')
+ context 'when using automatic issue transitions' do
+ let(:transitions) do
+ [
+ { id: '1' },
+ { id: '2', to: { statusCategory: { key: 'new' } } },
+ { id: '3', to: { statusCategory: { key: 'done' } } },
+ { id: '4', to: { statusCategory: { key: 'done' } } }
+ ]
+ end
+
+ before do
+ allow(jira_service).to receive_messages(jira_issue_transition_id: '')
close_issue
+ end
+
+ it 'uses the next transition with a status category of done' do
+ expect(WebMock).to have_requested(:post, transitions_url).with(
+ body: /"id":"3"/
+ ).once
+ end
+
+ context 'when no done transition is available' do
+ let(:transitions) do
+ [
+ { id: '1', to: { statusCategory: { key: 'new' } } }
+ ]
+ end
+
+ it 'does not attempt to transition' do
+ expect(WebMock).not_to have_requested(:post, transitions_url)
+ end
+ end
+
+ context 'when no valid transitions are returned' do
+ let(:transitions) { 'foo' }
+
+ it 'does not attempt to transition' do
+ expect(WebMock).not_to have_requested(:post, transitions_url)
+ end
+ end
+ end
+
+ context 'when using multiple transition ids' do
+ before do
+ allow(jira_service).to receive_messages(jira_issue_transition_id: '1,2,3')
+ end
+
+ it 'calls the api with transition ids separated by comma' do
+ close_issue
1.upto(3) do |transition_id|
- expect(WebMock).to have_requested(:post, @transitions_url).with(
- body: /#{transition_id}/
+ expect(WebMock).to have_requested(:post, transitions_url).with(
+ body: /"id":"#{transition_id}"/
).once
end
+
+ expect(WebMock).to have_requested(:post, comment_url)
end
it 'calls the api with transition ids separated by semicolon' do
- allow(@jira_service).to receive_messages(jira_issue_transition_id: '1;2;3')
+ allow(jira_service).to receive_messages(jira_issue_transition_id: '1;2;3')
close_issue
1.upto(3) do |transition_id|
- expect(WebMock).to have_requested(:post, @transitions_url).with(
- body: /#{transition_id}/
+ expect(WebMock).to have_requested(:post, transitions_url).with(
+ body: /"id":"#{transition_id}"/
).once
end
+
+ expect(WebMock).to have_requested(:post, comment_url)
+ end
+
+ context 'when a transition fails' do
+ before do
+ WebMock.stub_request(:post, transitions_url).with(basic_auth: %w(jira-username jira-password)).to_return do |request|
+ { status: request.body.include?('"id":"2"') ? 500 : 200 }
+ end
+ end
+
+ it 'stops the sequence' do
+ close_issue
+
+ 1.upto(2) do |transition_id|
+ expect(WebMock).to have_requested(:post, transitions_url).with(
+ body: /"id":"#{transition_id}"/
+ )
+ end
+
+ expect(WebMock).not_to have_requested(:post, transitions_url).with(
+ body: /"id":"3"/
+ )
+
+ expect(WebMock).not_to have_requested(:post, comment_url)
+ end
end
end
end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index fd7975bf65d..c33c6c05c24 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Project, factory_default: :keep do
include ExternalAuthorizationServiceHelpers
using RSpec::Parameterized::TableSyntax
- let_it_be(:namespace) { create_default(:namespace) }
+ let_it_be(:namespace) { create_default(:namespace).freeze }
it_behaves_like 'having unique enum values'
@@ -1799,7 +1799,8 @@ RSpec.describe Project, factory_default: :keep do
describe '#default_branch_protected?' do
using RSpec::Parameterized::TableSyntax
- let_it_be(:project) { create(:project) }
+ let_it_be(:namespace) { create(:namespace) }
+ let_it_be(:project) { create(:project, namespace: namespace) }
subject { project.default_branch_protected? }
@@ -2802,7 +2803,8 @@ RSpec.describe Project, factory_default: :keep do
end
describe '#emails_disabled?' do
- let(:project) { build(:project, emails_disabled: false) }
+ let_it_be(:namespace) { create(:namespace) }
+ let(:project) { build(:project, namespace: namespace, emails_disabled: false) }
context 'emails disabled in group' do
it 'returns true' do
@@ -2830,7 +2832,8 @@ RSpec.describe Project, factory_default: :keep do
end
describe '#lfs_enabled?' do
- let(:project) { build(:project) }
+ let(:namespace) { create(:namespace) }
+ let(:project) { build(:project, namespace: namespace) }
shared_examples 'project overrides group' do
it 'returns true when enabled in project' do
@@ -4877,7 +4880,8 @@ RSpec.describe Project, factory_default: :keep do
end
context 'branch protection' do
- let(:project) { create(:project, :repository) }
+ let_it_be(:namespace) { create(:namespace) }
+ let(:project) { create(:project, :repository, namespace: namespace) }
before do
create(:import_state, :started, project: project)
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index 3a4de7ba279..84347ec2a51 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -1949,8 +1949,8 @@ RSpec.describe Repository do
:root_ref,
:merged_branch_names,
:has_visible_content?,
- :issue_template_names_by_category,
- :merge_request_template_names_by_category,
+ :issue_template_names_hash,
+ :merge_request_template_names_hash,
:user_defined_metrics_dashboard_paths,
:xcode_project?,
:has_ambiguous_refs?
diff --git a/spec/models/snippet_repository_spec.rb b/spec/models/snippet_repository_spec.rb
index cdbc1feefce..11196f06529 100644
--- a/spec/models/snippet_repository_spec.rb
+++ b/spec/models/snippet_repository_spec.rb
@@ -286,6 +286,7 @@ RSpec.describe SnippetRepository do
context 'with git errors' do
it_behaves_like 'snippet repository with git errors', 'invalid://path/here', described_class::InvalidPathError
+ it_behaves_like 'snippet repository with git errors', '.git/hooks/pre-commit', described_class::InvalidPathError
it_behaves_like 'snippet repository with git errors', '../../path/traversal/here', described_class::InvalidPathError
it_behaves_like 'snippet repository with git errors', 'README', described_class::CommitError
diff --git a/spec/models/snippet_spec.rb b/spec/models/snippet_spec.rb
index 623767d19e0..c194a98fdd8 100644
--- a/spec/models/snippet_spec.rb
+++ b/spec/models/snippet_spec.rb
@@ -496,6 +496,16 @@ RSpec.describe Snippet do
it 'returns array of blobs' do
expect(snippet.blobs).to all(be_a(Blob))
end
+
+ context 'when file does not exist' do
+ it 'removes nil values from the blobs array' do
+ allow(snippet).to receive(:list_files).and_return(%w(LICENSE non_existent_snippet_file))
+
+ blobs = snippet.blobs
+ expect(blobs.count).to eq 1
+ expect(blobs.first.name).to eq 'LICENSE'
+ end
+ end
end
end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 860c015e166..084cfb55de0 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -101,6 +101,7 @@ RSpec.describe User do
it { is_expected.to have_many(:reviews).inverse_of(:author) }
it { is_expected.to have_many(:merge_request_assignees).inverse_of(:assignee) }
it { is_expected.to have_many(:merge_request_reviewers).inverse_of(:reviewer) }
+ it { is_expected.to have_many(:created_custom_emoji).inverse_of(:creator) }
describe "#user_detail" do
it 'does not persist `user_detail` by default' do
diff --git a/spec/policies/project_policy_spec.rb b/spec/policies/project_policy_spec.rb
index 6ba3ab6aace..cf5a606bd8e 100644
--- a/spec/policies/project_policy_spec.rb
+++ b/spec/policies/project_policy_spec.rb
@@ -1263,4 +1263,90 @@ RSpec.describe ProjectPolicy do
end
end
end
+
+ describe 'access_security_and_compliance' do
+ context 'when the "Security & Compliance" is enabled' do
+ before do
+ project.project_feature.update!(security_and_compliance_access_level: Featurable::PRIVATE)
+ end
+
+ %w[owner maintainer developer].each do |role|
+ context "when the role is #{role}" do
+ let(:current_user) { public_send(role) }
+
+ it { is_expected.to be_allowed(:access_security_and_compliance) }
+ end
+ end
+
+ context 'with admin' do
+ let(:current_user) { admin }
+
+ context 'when admin mode enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed(:access_security_and_compliance) }
+ end
+
+ context 'when admin mode disabled' do
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+ end
+
+ %w[reporter guest].each do |role|
+ context "when the role is #{role}" do
+ let(:current_user) { public_send(role) }
+
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+ end
+
+ context 'with non member' do
+ let(:current_user) { non_member }
+
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+
+ context 'with anonymous' do
+ let(:current_user) { anonymous }
+
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+ end
+
+ context 'when the "Security & Compliance" is not enabled' do
+ before do
+ project.project_feature.update!(security_and_compliance_access_level: Featurable::DISABLED)
+ end
+
+ %w[owner maintainer developer reporter guest].each do |role|
+ context "when the role is #{role}" do
+ let(:current_user) { public_send(role) }
+
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+ end
+
+ context 'with admin' do
+ let(:current_user) { admin }
+
+ context 'when admin mode enabled', :enable_admin_mode do
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+
+ context 'when admin mode disabled' do
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+ end
+
+ context 'with non member' do
+ let(:current_user) { non_member }
+
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+
+ context 'with anonymous' do
+ let(:current_user) { anonymous }
+
+ it { is_expected.to be_disallowed(:access_security_and_compliance) }
+ end
+ end
+ end
end
diff --git a/spec/presenters/packages/composer/packages_presenter_spec.rb b/spec/presenters/packages/composer/packages_presenter_spec.rb
index 19d99a62468..0c2631f2b01 100644
--- a/spec/presenters/packages/composer/packages_presenter_spec.rb
+++ b/spec/presenters/packages/composer/packages_presenter_spec.rb
@@ -67,10 +67,14 @@ RSpec.describe ::Packages::Composer::PackagesPresenter do
{
'packages' => [],
'provider-includes' => { 'p/%hash%.json' => { 'sha256' => /^\h+$/ } },
- 'providers-url' => "/api/v4/group/#{group.id}/-/packages/composer/%package%$%hash%.json"
+ 'providers-url' => "prefix/api/v4/group/#{group.id}/-/packages/composer/%package%$%hash%.json"
}
end
+ before do
+ stub_config(gitlab: { relative_url_root: 'prefix' })
+ end
+
it 'returns the provider json' do
expect(subject).to match(expected_json)
end
diff --git a/spec/presenters/project_presenter_spec.rb b/spec/presenters/project_presenter_spec.rb
index 98bcbd8384b..f78aa61529a 100644
--- a/spec/presenters/project_presenter_spec.rb
+++ b/spec/presenters/project_presenter_spec.rb
@@ -183,6 +183,14 @@ RSpec.describe ProjectPresenter do
context 'not empty repo' do
let(:project) { create(:project, :repository) }
+ context 'if no current user' do
+ let(:user) { nil }
+
+ it 'returns false' do
+ expect(presenter.can_current_user_push_code?).to be(false)
+ end
+ end
+
it 'returns true if user can push to default branch' do
project.add_developer(user)
@@ -350,7 +358,7 @@ RSpec.describe ProjectPresenter do
is_link: false,
label: a_string_including("New file"),
link: presenter.project_new_blob_path(project, 'master'),
- class_modifier: 'dashed'
+ class_modifier: 'btn-dashed'
)
end
@@ -597,10 +605,12 @@ RSpec.describe ProjectPresenter do
context 'for a developer' do
before do
project.add_developer(user)
+ stub_experiments(empty_repo_upload: :candidate)
end
it 'orders the items correctly' do
expect(empty_repo_statistics_buttons.map(&:label)).to start_with(
+ a_string_including('Upload'),
a_string_including('New'),
a_string_including('README'),
a_string_including('LICENSE'),
@@ -609,6 +619,16 @@ RSpec.describe ProjectPresenter do
a_string_including('CI/CD')
)
end
+
+ context 'when not in the upload experiment' do
+ before do
+ stub_experiments(empty_repo_upload: :control)
+ end
+
+ it 'does not include upload button' do
+ expect(empty_repo_statistics_buttons.map(&:label)).not_to start_with(a_string_including('Upload'))
+ end
+ end
end
end
@@ -694,4 +714,20 @@ RSpec.describe ProjectPresenter do
end
end
end
+
+ describe 'empty_repo_upload_experiment?' do
+ subject { presenter.empty_repo_upload_experiment? }
+
+ it 'returns false when upload_anchor_data is nil' do
+ allow(presenter).to receive(:upload_anchor_data).and_return(nil)
+
+ expect(subject).to be false
+ end
+
+ it 'returns true when upload_anchor_data exists' do
+ allow(presenter).to receive(:upload_anchor_data).and_return(true)
+
+ expect(subject).to be true
+ end
+ end
end
diff --git a/spec/presenters/snippet_presenter_spec.rb b/spec/presenters/snippet_presenter_spec.rb
index a1d987ed78f..b0387206bd9 100644
--- a/spec/presenters/snippet_presenter_spec.rb
+++ b/spec/presenters/snippet_presenter_spec.rb
@@ -159,7 +159,7 @@ RSpec.describe SnippetPresenter do
let(:snippet) { create(:snippet, :repository, author: user) }
it 'returns repository first blob' do
- expect(subject).to eq snippet.blobs.first
+ expect(subject.name).to eq snippet.blobs.first.name
end
end
end
diff --git a/spec/requests/api/ci/runner/jobs_request_post_spec.rb b/spec/requests/api/ci/runner/jobs_request_post_spec.rb
index 74d8e3f7ae8..3cc27d0e1eb 100644
--- a/spec/requests/api/ci/runner/jobs_request_post_spec.rb
+++ b/spec/requests/api/ci/runner/jobs_request_post_spec.rb
@@ -198,7 +198,12 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
'when' => 'on_success' }]
end
- let(:expected_features) { { 'trace_sections' => true } }
+ let(:expected_features) do
+ {
+ 'trace_sections' => true,
+ 'failure_reasons' => include('script_failure')
+ }
+ end
it 'picks a job' do
request_job info: { platform: :darwin }
@@ -220,7 +225,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
expect(json_response['artifacts']).to eq(expected_artifacts)
expect(json_response['cache']).to eq(expected_cache)
expect(json_response['variables']).to include(*expected_variables)
- expect(json_response['features']).to eq(expected_features)
+ expect(json_response['features']).to match(expected_features)
end
it 'creates persistent ref' do
diff --git a/spec/requests/api/graphql/instance_statistics_measurements_spec.rb b/spec/requests/api/graphql/usage_trends_measurements_spec.rb
index eb73dc59253..69a3ed7e09c 100644
--- a/spec/requests/api/graphql/instance_statistics_measurements_spec.rb
+++ b/spec/requests/api/graphql/usage_trends_measurements_spec.rb
@@ -2,22 +2,22 @@
require 'spec_helper'
-RSpec.describe 'InstanceStatisticsMeasurements' do
+RSpec.describe 'UsageTrendsMeasurements' do
include GraphqlHelpers
let(:current_user) { create(:user, :admin) }
- let!(:instance_statistics_measurement_1) { create(:instance_statistics_measurement, :project_count, recorded_at: 20.days.ago, count: 5) }
- let!(:instance_statistics_measurement_2) { create(:instance_statistics_measurement, :project_count, recorded_at: 10.days.ago, count: 10) }
+ let!(:usage_trends_measurement_1) { create(:usage_trends_measurement, :project_count, recorded_at: 20.days.ago, count: 5) }
+ let!(:usage_trends_measurement_2) { create(:usage_trends_measurement, :project_count, recorded_at: 10.days.ago, count: 10) }
let(:arguments) { 'identifier: PROJECTS' }
- let(:query) { graphql_query_for(:instanceStatisticsMeasurements, arguments, 'nodes { count identifier }') }
+ let(:query) { graphql_query_for(:UsageTrendsMeasurements, arguments, 'nodes { count identifier }') }
before do
post_graphql(query, current_user: current_user)
end
it 'returns measurement objects' do
- expect(graphql_data.dig('instanceStatisticsMeasurements', 'nodes')).to eq([
+ expect(graphql_data.dig('usageTrendsMeasurements', 'nodes')).to eq([
{ "count" => 10, 'identifier' => 'PROJECTS' },
{ "count" => 5, 'identifier' => 'PROJECTS' }
])
@@ -27,7 +27,7 @@ RSpec.describe 'InstanceStatisticsMeasurements' do
let(:arguments) { %(identifier: PROJECTS, recordedAfter: "#{15.days.ago.to_date}", recordedBefore: "#{5.days.ago.to_date}") }
it 'returns filtered measurement objects' do
- expect(graphql_data.dig('instanceStatisticsMeasurements', 'nodes')).to eq([
+ expect(graphql_data.dig('usageTrendsMeasurements', 'nodes')).to eq([
{ "count" => 10, 'identifier' => 'PROJECTS' }
])
end
diff --git a/spec/requests/api/lint_spec.rb b/spec/requests/api/lint_spec.rb
index 2316e702c3e..b5bf697e9e3 100644
--- a/spec/requests/api/lint_spec.rb
+++ b/spec/requests/api/lint_spec.rb
@@ -5,7 +5,9 @@ require 'spec_helper'
RSpec.describe API::Lint do
describe 'POST /ci/lint' do
context 'when signup settings are disabled' do
- Gitlab::CurrentSettings.signup_enabled = false
+ before do
+ Gitlab::CurrentSettings.signup_enabled = false
+ end
context 'when unauthenticated' do
it 'returns authentication error' do
@@ -16,22 +18,25 @@ RSpec.describe API::Lint do
end
context 'when authenticated' do
- it 'returns unauthorized error' do
- post api('/ci/lint'), params: { content: 'content' }
+ let_it_be(:api_user) { create(:user) }
+ it 'returns authorized' do
+ post api('/ci/lint', api_user), params: { content: 'content' }
- expect(response).to have_gitlab_http_status(:unauthorized)
+ expect(response).to have_gitlab_http_status(:ok)
end
end
end
context 'when signup settings are enabled' do
- Gitlab::CurrentSettings.signup_enabled = true
+ before do
+ Gitlab::CurrentSettings.signup_enabled = true
+ end
context 'when unauthenticated' do
- it 'returns authentication error' do
+ it 'returns authorized success' do
post api('/ci/lint'), params: { content: 'content' }
- expect(response).to have_gitlab_http_status(:unauthorized)
+ expect(response).to have_gitlab_http_status(:ok)
end
end
diff --git a/spec/requests/api/npm_instance_packages_spec.rb b/spec/requests/api/npm_instance_packages_spec.rb
index 70c76067a6e..698885ddcf4 100644
--- a/spec/requests/api/npm_instance_packages_spec.rb
+++ b/spec/requests/api/npm_instance_packages_spec.rb
@@ -3,6 +3,11 @@
require 'spec_helper'
RSpec.describe API::NpmInstancePackages do
+ # We need to create a subgroup with the same name as the hosting group.
+ # It has to be created first to exhibit this bug: https://gitlab.com/gitlab-org/gitlab/-/issues/321958
+ let_it_be(:another_namespace) { create(:group, :public) }
+ let_it_be(:similarly_named_group) { create(:group, :public, parent: another_namespace, name: 'test-group') }
+
include_context 'npm api setup'
describe 'GET /api/v4/packages/npm/*package_name' do
diff --git a/spec/requests/api/npm_project_packages_spec.rb b/spec/requests/api/npm_project_packages_spec.rb
index 7ea238c0607..e64b5ddc374 100644
--- a/spec/requests/api/npm_project_packages_spec.rb
+++ b/spec/requests/api/npm_project_packages_spec.rb
@@ -30,7 +30,7 @@ RSpec.describe API::NpmProjectPackages do
end
describe 'GET /api/v4/projects/:id/packages/npm/*package_name/-/*file_name' do
- let_it_be(:package_file) { package.package_files.first }
+ let(:package_file) { package.package_files.first }
let(:headers) { {} }
let(:url) { api("/projects/#{project.id}/packages/npm/#{package.name}/-/#{package_file.file_name}") }
@@ -127,24 +127,6 @@ RSpec.describe API::NpmProjectPackages do
context 'when params are correct' do
context 'invalid package record' do
- context 'unscoped package' do
- let(:package_name) { 'my_unscoped_package' }
- let(:params) { upload_params(package_name: package_name) }
-
- it_behaves_like 'handling invalid record with 400 error'
-
- context 'with empty versions' do
- let(:params) { upload_params(package_name: package_name).merge!(versions: {}) }
-
- it 'throws a 400 error' do
- expect { upload_package_with_token(package_name, params) }
- .not_to change { project.packages.count }
-
- expect(response).to have_gitlab_http_status(:bad_request)
- end
- end
- end
-
context 'invalid package name' do
let(:package_name) { "@#{group.path}/my_inv@@lid_package_name" }
let(:params) { upload_params(package_name: package_name) }
@@ -175,52 +157,71 @@ RSpec.describe API::NpmProjectPackages do
end
end
- context 'scoped package' do
- let(:package_name) { "@#{group.path}/my_package_name" }
+ context 'valid package record' do
let(:params) { upload_params(package_name: package_name) }
- context 'with access token' do
- subject { upload_package_with_token(package_name, params) }
+ shared_examples 'handling upload with different authentications' do
+ context 'with access token' do
+ subject { upload_package_with_token(package_name, params) }
+
+ it_behaves_like 'a package tracking event', 'API::NpmPackages', 'push_package'
+
+ it 'creates npm package with file' do
+ expect { subject }
+ .to change { project.packages.count }.by(1)
+ .and change { Packages::PackageFile.count }.by(1)
+ .and change { Packages::Tag.count }.by(1)
- it_behaves_like 'a package tracking event', 'API::NpmPackages', 'push_package'
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
- it 'creates npm package with file' do
- expect { subject }
+ it 'creates npm package with file with job token' do
+ expect { upload_package_with_job_token(package_name, params) }
.to change { project.packages.count }.by(1)
.and change { Packages::PackageFile.count }.by(1)
- .and change { Packages::Tag.count }.by(1)
expect(response).to have_gitlab_http_status(:ok)
end
- end
- it 'creates npm package with file with job token' do
- expect { upload_package_with_job_token(package_name, params) }
- .to change { project.packages.count }.by(1)
- .and change { Packages::PackageFile.count }.by(1)
+ context 'with an authenticated job token' do
+ let!(:job) { create(:ci_build, user: user) }
- expect(response).to have_gitlab_http_status(:ok)
- end
+ before do
+ Grape::Endpoint.before_each do |endpoint|
+ expect(endpoint).to receive(:current_authenticated_job) { job }
+ end
+ end
- context 'with an authenticated job token' do
- let!(:job) { create(:ci_build, user: user) }
+ after do
+ Grape::Endpoint.before_each nil
+ end
- before do
- Grape::Endpoint.before_each do |endpoint|
- expect(endpoint).to receive(:current_authenticated_job) { job }
+ it 'creates the package metadata' do
+ upload_package_with_token(package_name, params)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(project.reload.packages.find(json_response['id']).original_build_info.pipeline).to eq job.pipeline
end
end
+ end
- after do
- Grape::Endpoint.before_each nil
- end
+ context 'with a scoped name' do
+ let(:package_name) { "@#{group.path}/my_package_name" }
- it 'creates the package metadata' do
- upload_package_with_token(package_name, params)
+ it_behaves_like 'handling upload with different authentications'
+ end
- expect(response).to have_gitlab_http_status(:ok)
- expect(project.reload.packages.find(json_response['id']).original_build_info.pipeline).to eq job.pipeline
- end
+ context 'with any scoped name' do
+ let(:package_name) { "@any_scope/my_package_name" }
+
+ it_behaves_like 'handling upload with different authentications'
+ end
+
+ context 'with an unscoped name' do
+ let(:package_name) { "my_unscoped_package_name" }
+
+ it_behaves_like 'handling upload with different authentications'
end
end
diff --git a/spec/requests/api/rubygem_packages_spec.rb b/spec/requests/api/rubygem_packages_spec.rb
index 5dd68bf9b10..c97072ee9cd 100644
--- a/spec/requests/api/rubygem_packages_spec.rb
+++ b/spec/requests/api/rubygem_packages_spec.rb
@@ -3,9 +3,11 @@
require 'spec_helper'
RSpec.describe API::RubygemPackages do
+ include PackagesManagerApiSpecHelpers
+ include WorkhorseHelpers
using RSpec::Parameterized::TableSyntax
- let_it_be(:project) { create(:project) }
+ let_it_be_with_reload(:project) { create(:project) }
let_it_be(:personal_access_token) { create(:personal_access_token) }
let_it_be(:user) { personal_access_token.user }
let_it_be(:job) { create(:ci_build, :running, user: user) }
@@ -13,6 +15,14 @@ RSpec.describe API::RubygemPackages do
let_it_be(:project_deploy_token) { create(:project_deploy_token, deploy_token: deploy_token, project: project) }
let_it_be(:headers) { {} }
+ let(:tokens) do
+ {
+ personal_access_token: personal_access_token.token,
+ deploy_token: deploy_token.token,
+ job_token: job.token
+ }
+ end
+
shared_examples 'when feature flag is disabled' do
let(:headers) do
{ 'HTTP_AUTHORIZATION' => personal_access_token.token }
@@ -42,14 +52,6 @@ RSpec.describe API::RubygemPackages do
{ 'HTTP_AUTHORIZATION' => token }
end
- let(:tokens) do
- {
- personal_access_token: personal_access_token.token,
- deploy_token: deploy_token.token,
- job_token: job.token
- }
- end
-
where(:user_role, :token_type, :valid_token, :status) do
:guest | :personal_access_token | true | :not_found
:guest | :personal_access_token | false | :unauthorized
@@ -114,19 +116,163 @@ RSpec.describe API::RubygemPackages do
end
describe 'POST /api/v4/projects/:project_id/packages/rubygems/api/v1/gems/authorize' do
+ include_context 'workhorse headers'
+
let(:url) { api("/projects/#{project.id}/packages/rubygems/api/v1/gems/authorize") }
+ let(:headers) { {} }
subject { post(url, headers: headers) }
- it_behaves_like 'an unimplemented route'
+ context 'with valid project' do
+ where(:visibility, :user_role, :member, :token_type, :valid_token, :shared_examples_name, :expected_status) do
+ :public | :developer | true | :personal_access_token | true | 'process rubygems workhorse authorization' | :success
+ :public | :guest | true | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :developer | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | false | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :guest | false | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :developer | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :anonymous | false | :personal_access_token | true | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | true | :personal_access_token | true | 'process rubygems workhorse authorization' | :success
+ :private | :guest | true | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :private | :developer | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | false | :personal_access_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :guest | false | :personal_access_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :developer | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :anonymous | false | :personal_access_token | true | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | true | :job_token | true | 'process rubygems workhorse authorization' | :success
+ :public | :guest | true | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :developer | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | false | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :guest | false | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :developer | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | true | :job_token | true | 'process rubygems workhorse authorization' | :success
+ :private | :guest | true | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :private | :developer | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | false | :job_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :guest | false | :job_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :developer | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | true | :deploy_token | true | 'process rubygems workhorse authorization' | :success
+ :public | :developer | true | :deploy_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | true | :deploy_token | true | 'process rubygems workhorse authorization' | :success
+ :private | :developer | true | :deploy_token | false | 'rejects rubygems packages access' | :unauthorized
+ end
+
+ with_them do
+ let(:token) { valid_token ? tokens[token_type] : 'invalid-token123' }
+ let(:user_headers) { user_role == :anonymous ? {} : { 'HTTP_AUTHORIZATION' => token } }
+ let(:headers) { user_headers.merge(workhorse_headers) }
+
+ before do
+ project.update!(visibility: visibility.to_s)
+ end
+
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member]
+ end
+ end
end
describe 'POST /api/v4/projects/:project_id/packages/rubygems/api/v1/gems' do
- let(:url) { api("/projects/#{project.id}/packages/rubygems/api/v1/gems") }
+ include_context 'workhorse headers'
+
+ let(:url) { "/projects/#{project.id}/packages/rubygems/api/v1/gems" }
+
+ let_it_be(:file_name) { 'package.gem' }
+ let(:headers) { {} }
+ let(:params) { { file: temp_file(file_name) } }
+ let(:file_key) { :file }
+ let(:send_rewritten_field) { true }
+
+ subject do
+ workhorse_finalize(
+ api(url),
+ method: :post,
+ file_key: file_key,
+ params: params,
+ headers: headers,
+ send_rewritten_field: send_rewritten_field
+ )
+ end
- subject { post(url, headers: headers) }
+ context 'with valid project' do
+ where(:visibility, :user_role, :member, :token_type, :valid_token, :shared_examples_name, :expected_status) do
+ :public | :developer | true | :personal_access_token | true | 'process rubygems upload' | :created
+ :public | :guest | true | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :developer | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | false | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :guest | false | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :developer | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :anonymous | false | :personal_access_token | true | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | true | :personal_access_token | true | 'process rubygems upload' | :created
+ :private | :guest | true | :personal_access_token | true | 'rejects rubygems packages access' | :forbidden
+ :private | :developer | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | true | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | false | :personal_access_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :guest | false | :personal_access_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :developer | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | false | :personal_access_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :anonymous | false | :personal_access_token | true | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | true | :job_token | true | 'process rubygems upload' | :created
+ :public | :guest | true | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :developer | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | false | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :guest | false | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :public | :developer | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :guest | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | true | :job_token | true | 'process rubygems upload' | :created
+ :private | :guest | true | :job_token | true | 'rejects rubygems packages access' | :forbidden
+ :private | :developer | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | true | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | false | :job_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :guest | false | :job_token | true | 'rejects rubygems packages access' | :not_found
+ :private | :developer | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :guest | false | :job_token | false | 'rejects rubygems packages access' | :unauthorized
+ :public | :developer | true | :deploy_token | true | 'process rubygems upload' | :created
+ :public | :developer | true | :deploy_token | false | 'rejects rubygems packages access' | :unauthorized
+ :private | :developer | true | :deploy_token | true | 'process rubygems upload' | :created
+ :private | :developer | true | :deploy_token | false | 'rejects rubygems packages access' | :unauthorized
+ end
- it_behaves_like 'an unimplemented route'
+ with_them do
+ let(:token) { valid_token ? tokens[token_type] : 'invalid-token123' }
+ let(:user_headers) { user_role == :anonymous ? {} : { 'HTTP_AUTHORIZATION' => token } }
+ let(:headers) { user_headers.merge(workhorse_headers) }
+
+ before do
+ project.update!(visibility: visibility.to_s)
+ end
+
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member]
+ end
+
+ context 'failed package file save' do
+ let(:user_headers) { { 'HTTP_AUTHORIZATION' => personal_access_token.token } }
+ let(:headers) { user_headers.merge(workhorse_headers) }
+
+ before do
+ project.add_developer(user)
+ end
+
+ it 'does not create package record', :aggregate_failures do
+ allow(Packages::CreatePackageFileService).to receive(:new).and_raise(StandardError)
+
+ expect { subject }
+ .to change { project.packages.count }.by(0)
+ .and change { Packages::PackageFile.count }.by(0)
+ expect(response).to have_gitlab_http_status(:error)
+ end
+ end
+ end
end
describe 'GET /api/v4/projects/:project_id/packages/rubygems/api/v1/dependencies' do
diff --git a/spec/requests/projects/noteable_notes_spec.rb b/spec/requests/projects/noteable_notes_spec.rb
index 5ae2aadaa84..2bf1ffb2edc 100644
--- a/spec/requests/projects/noteable_notes_spec.rb
+++ b/spec/requests/projects/noteable_notes_spec.rb
@@ -18,7 +18,9 @@ RSpec.describe 'Project noteable notes' do
login_as(user)
end
- it 'does not set a Gitlab::EtagCaching ETag' do
+ it 'does not set a Gitlab::EtagCaching ETag if there is a note' do
+ create(:note_on_merge_request, noteable: merge_request, project: merge_request.project)
+
get notes_path
expect(response).to have_gitlab_http_status(:ok)
@@ -27,5 +29,12 @@ RSpec.describe 'Project noteable notes' do
# interfere with notes pagination
expect(response_etag).not_to eq(stored_etag)
end
+
+ it 'sets a Gitlab::EtagCaching ETag if there is no note' do
+ get notes_path
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response_etag).to eq(stored_etag)
+ end
end
end
diff --git a/spec/rubocop/cop/avoid_return_from_blocks_spec.rb b/spec/rubocop/cop/avoid_return_from_blocks_spec.rb
index 71311b9df7f..526a362447f 100644
--- a/spec/rubocop/cop/avoid_return_from_blocks_spec.rb
+++ b/spec/rubocop/cop/avoid_return_from_blocks_spec.rb
@@ -5,8 +5,6 @@ require 'rubocop'
require_relative '../../../rubocop/cop/avoid_return_from_blocks'
RSpec.describe RuboCop::Cop::AvoidReturnFromBlocks do
- include CopHelper
-
subject(:cop) { described_class.new }
it 'flags violation for return inside a block' do
@@ -19,20 +17,16 @@ RSpec.describe RuboCop::Cop::AvoidReturnFromBlocks do
RUBY
end
- it "doesn't call add_offense twice for nested blocks" do
- source = <<~RUBY
+ it "doesn't create more than one offense for nested blocks" do
+ expect_offense(<<~RUBY)
call do
call do
something
return if something_else
+ ^^^^^^ Do not return from a block, use next or break instead.
end
end
RUBY
- expect_any_instance_of(described_class) do |instance|
- expect(instance).to receive(:add_offense).once
- end
-
- inspect_source(source)
end
it 'flags violation for return inside included > def > block' do
diff --git a/spec/rubocop/cop/avoid_route_redirect_leading_slash_spec.rb b/spec/rubocop/cop/avoid_route_redirect_leading_slash_spec.rb
index 9e13a5278e3..c049528523e 100644
--- a/spec/rubocop/cop/avoid_route_redirect_leading_slash_spec.rb
+++ b/spec/rubocop/cop/avoid_route_redirect_leading_slash_spec.rb
@@ -5,19 +5,21 @@ require 'rubocop'
require_relative '../../../rubocop/cop/avoid_route_redirect_leading_slash'
RSpec.describe RuboCop::Cop::AvoidRouteRedirectLeadingSlash do
- include CopHelper
-
subject(:cop) { described_class.new }
before do
allow(cop).to receive(:in_routes?).and_return(true)
end
- it 'registers an offense when redirect has a leading slash' do
+ it 'registers an offense when redirect has a leading slash and corrects', :aggregate_failures do
expect_offense(<<~PATTERN)
root to: redirect("/-/route")
^^^^^^^^^^^^^^^^^^^^ Do not use a leading "/" in route redirects
PATTERN
+
+ expect_correction(<<~PATTERN)
+ root to: redirect("-/route")
+ PATTERN
end
it 'does not register an offense when redirect does not have a leading slash' do
@@ -25,8 +27,4 @@ RSpec.describe RuboCop::Cop::AvoidRouteRedirectLeadingSlash do
root to: redirect("-/route")
PATTERN
end
-
- it 'autocorrect `/-/route` to `-/route`' do
- expect(autocorrect_source('redirect("/-/route")')).to eq('redirect("-/route")')
- end
end
diff --git a/spec/rubocop/cop/ignored_columns_spec.rb b/spec/rubocop/cop/ignored_columns_spec.rb
index 38b4ac0bc1a..37fec7cb62a 100644
--- a/spec/rubocop/cop/ignored_columns_spec.rb
+++ b/spec/rubocop/cop/ignored_columns_spec.rb
@@ -2,21 +2,17 @@
require 'fast_spec_helper'
require 'rubocop'
-require 'rubocop/rspec/support'
require_relative '../../../rubocop/cop/ignored_columns'
RSpec.describe RuboCop::Cop::IgnoredColumns do
- include CopHelper
-
subject(:cop) { described_class.new }
- it 'flags the use of destroy_all with a local variable receiver' do
- inspect_source(<<~RUBY)
+ it 'flags direct use of ignored_columns instead of the IgnoredColumns concern' do
+ expect_offense(<<~RUBY)
class Foo < ApplicationRecord
self.ignored_columns += %i[id]
+ ^^^^^^^^^^^^^^^^^^^^ Use `IgnoredColumns` concern instead of adding to `self.ignored_columns`.
end
RUBY
-
- expect(cop.offenses.size).to eq(1)
end
end
diff --git a/spec/rubocop/cop/migration/add_column_with_default_spec.rb b/spec/rubocop/cop/migration/add_column_with_default_spec.rb
index cf476ae55d6..68f219e01f9 100644
--- a/spec/rubocop/cop/migration/add_column_with_default_spec.rb
+++ b/spec/rubocop/cop/migration/add_column_with_default_spec.rb
@@ -5,11 +5,9 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/add_column_with_default'
RSpec.describe RuboCop::Cop::Migration::AddColumnWithDefault do
- include CopHelper
-
let(:cop) { described_class.new }
- context 'outside of a migration' do
+ context 'when outside of a migration' do
it 'does not register any offenses' do
expect_no_offenses(<<~RUBY)
def up
@@ -19,18 +17,16 @@ RSpec.describe RuboCop::Cop::Migration::AddColumnWithDefault do
end
end
- context 'in a migration' do
+ context 'when in a migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
- let(:offense) { '`add_column_with_default` is deprecated, use `add_column` instead' }
-
it 'registers an offense' do
expect_offense(<<~RUBY)
def up
add_column_with_default(:merge_request_diff_files, :artifacts, :boolean, default: true, allow_null: false)
- ^^^^^^^^^^^^^^^^^^^^^^^ #{offense}
+ ^^^^^^^^^^^^^^^^^^^^^^^ `add_column_with_default` is deprecated, use `add_column` instead
end
RUBY
end
diff --git a/spec/rubocop/cop/migration/add_columns_to_wide_tables_spec.rb b/spec/rubocop/cop/migration/add_columns_to_wide_tables_spec.rb
index 92863c45b1a..70d9a577728 100644
--- a/spec/rubocop/cop/migration/add_columns_to_wide_tables_spec.rb
+++ b/spec/rubocop/cop/migration/add_columns_to_wide_tables_spec.rb
@@ -5,11 +5,9 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/add_columns_to_wide_tables'
RSpec.describe RuboCop::Cop::Migration::AddColumnsToWideTables do
- include CopHelper
-
let(:cop) { described_class.new }
- context 'outside of a migration' do
+ context 'when outside of a migration' do
it 'does not register any offenses' do
expect_no_offenses(<<~RUBY)
def up
@@ -19,14 +17,14 @@ RSpec.describe RuboCop::Cop::Migration::AddColumnsToWideTables do
end
end
- context 'in a migration' do
+ context 'when in a migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
context 'with wide tables' do
it 'registers an offense when adding a column to a wide table' do
- offense = '`projects` is a wide table with several columns, addig more should be avoided unless absolutely necessary. Consider storing the column in a different table or creating a new one.'
+ offense = '`projects` is a wide table with several columns, [...]'
expect_offense(<<~RUBY)
def up
@@ -37,7 +35,7 @@ RSpec.describe RuboCop::Cop::Migration::AddColumnsToWideTables do
end
it 'registers an offense when adding a column with default to a wide table' do
- offense = '`users` is a wide table with several columns, addig more should be avoided unless absolutely necessary. Consider storing the column in a different table or creating a new one.'
+ offense = '`users` is a wide table with several columns, [...]'
expect_offense(<<~RUBY)
def up
@@ -48,7 +46,7 @@ RSpec.describe RuboCop::Cop::Migration::AddColumnsToWideTables do
end
it 'registers an offense when adding a reference' do
- offense = '`ci_builds` is a wide table with several columns, addig more should be avoided unless absolutely necessary. Consider storing the column in a different table or creating a new one.'
+ offense = '`ci_builds` is a wide table with several columns, [...]'
expect_offense(<<~RUBY)
def up
@@ -59,7 +57,7 @@ RSpec.describe RuboCop::Cop::Migration::AddColumnsToWideTables do
end
it 'registers an offense when adding timestamps' do
- offense = '`projects` is a wide table with several columns, addig more should be avoided unless absolutely necessary. Consider storing the column in a different table or creating a new one.'
+ offense = '`projects` is a wide table with several columns, [...]'
expect_offense(<<~RUBY)
def up
diff --git a/spec/rubocop/cop/migration/add_concurrent_foreign_key_spec.rb b/spec/rubocop/cop/migration/add_concurrent_foreign_key_spec.rb
index 25350ad1ecb..2da29606024 100644
--- a/spec/rubocop/cop/migration/add_concurrent_foreign_key_spec.rb
+++ b/spec/rubocop/cop/migration/add_concurrent_foreign_key_spec.rb
@@ -5,46 +5,38 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/add_concurrent_foreign_key'
RSpec.describe RuboCop::Cop::Migration::AddConcurrentForeignKey do
- include CopHelper
-
let(:cop) { described_class.new }
- context 'outside of a migration' do
+ context 'when outside of a migration' do
it 'does not register any offenses' do
- inspect_source('def up; add_foreign_key(:projects, :users, column: :user_id); end')
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses('def up; add_foreign_key(:projects, :users, column: :user_id); end')
end
end
- context 'in a migration' do
+ context 'when in a migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
it 'registers an offense when using add_foreign_key' do
- inspect_source('def up; add_foreign_key(:projects, :users, column: :user_id); end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def up
+ add_foreign_key(:projects, :users, column: :user_id)
+ ^^^^^^^^^^^^^^^ `add_foreign_key` requires downtime, use `add_concurrent_foreign_key` instead
+ end
+ RUBY
end
it 'does not register an offense when a `NOT VALID` foreign key is added' do
- inspect_source('def up; add_foreign_key(:projects, :users, column: :user_id, validate: false); end')
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses('def up; add_foreign_key(:projects, :users, column: :user_id, validate: false); end')
end
it 'does not register an offense when `add_foreign_key` is within `with_lock_retries`' do
- inspect_source <<~RUBY
+ expect_no_offenses(<<~RUBY)
with_lock_retries do
add_foreign_key :key, :projects, column: :project_id, on_delete: :cascade
end
RUBY
-
- expect(cop.offenses).to be_empty
end
end
end
diff --git a/spec/rubocop/cop/migration/add_concurrent_index_spec.rb b/spec/rubocop/cop/migration/add_concurrent_index_spec.rb
index 351283a230a..bc5fd2de4fd 100644
--- a/spec/rubocop/cop/migration/add_concurrent_index_spec.rb
+++ b/spec/rubocop/cop/migration/add_concurrent_index_spec.rb
@@ -5,36 +5,30 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/add_concurrent_index'
RSpec.describe RuboCop::Cop::Migration::AddConcurrentIndex do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
it 'registers an offense when add_concurrent_index is used inside a change method' do
- inspect_source('def change; add_concurrent_index :table, :column; end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ ^^^^^^ `add_concurrent_index` is not reversible[...]
+ add_concurrent_index :table, :column
+ end
+ RUBY
end
it 'registers no offense when add_concurrent_index is used inside an up method' do
- inspect_source('def up; add_concurrent_index :table, :column; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses('def up; add_concurrent_index :table, :column; end')
end
end
- context 'outside of migration' do
+ context 'when outside of migration' do
it 'registers no offense' do
- inspect_source('def change; add_concurrent_index :table, :column; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses('def change; add_concurrent_index :table, :column; end')
end
end
end
diff --git a/spec/rubocop/cop/migration/add_index_spec.rb b/spec/rubocop/cop/migration/add_index_spec.rb
index 1d083e9f2d2..894fbc25eb8 100644
--- a/spec/rubocop/cop/migration/add_index_spec.rb
+++ b/spec/rubocop/cop/migration/add_index_spec.rb
@@ -5,8 +5,6 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/add_index'
RSpec.describe RuboCop::Cop::Migration::AddIndex do
- include CopHelper
-
subject(:cop) { described_class.new }
context 'in migration' do
diff --git a/spec/rubocop/cop/migration/add_limit_to_text_columns_spec.rb b/spec/rubocop/cop/migration/add_limit_to_text_columns_spec.rb
index 149fb0a48eb..4f107f7600f 100644
--- a/spec/rubocop/cop/migration/add_limit_to_text_columns_spec.rb
+++ b/spec/rubocop/cop/migration/add_limit_to_text_columns_spec.rb
@@ -5,11 +5,11 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/add_limit_to_text_columns'
RSpec.describe RuboCop::Cop::Migration::AddLimitToTextColumns do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
+ let(:msg) { 'Text columns should always have a limit set (255 is suggested)[...]' }
+
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
@@ -25,31 +25,29 @@ RSpec.describe RuboCop::Cop::Migration::AddLimitToTextColumns do
create_table :test_text_limits, id: false do |t|
t.integer :test_id, null: false
t.text :name
- ^^^^ #{described_class::MSG}
+ ^^^^ #{msg}
end
create_table_with_constraints :test_text_limits_create do |t|
t.integer :test_id, null: false
t.text :title
t.text :description
- ^^^^ #{described_class::MSG}
+ ^^^^ #{msg}
t.text_limit :title, 100
end
add_column :test_text_limits, :email, :text
- ^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^ #{msg}
add_column_with_default :test_text_limits, :role, :text, default: 'default'
- ^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^^^^^^^^^^^ #{msg}
change_column_type_concurrently :test_text_limits, :test_id, :text
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg}
end
end
RUBY
-
- expect(cop.offenses.map(&:cop_name)).to all(eq('Migration/AddLimitToTextColumns'))
end
end
@@ -111,7 +109,7 @@ RSpec.describe RuboCop::Cop::Migration::AddLimitToTextColumns do
end
# Make sure that the cop is properly checking for an `add_text_limit`
- # over the same {table, attribute} as the one that triggered the offence
+ # over the same {table, attribute} as the one that triggered the offense
context 'when the limit is defined for a same name attribute but different table' do
it 'registers an offense' do
expect_offense(<<~RUBY)
@@ -123,17 +121,17 @@ RSpec.describe RuboCop::Cop::Migration::AddLimitToTextColumns do
create_table :test_text_limits, id: false do |t|
t.integer :test_id, null: false
t.text :name
- ^^^^ #{described_class::MSG}
+ ^^^^ #{msg}
end
add_column :test_text_limits, :email, :text
- ^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^ #{msg}
add_column_with_default :test_text_limits, :role, :text, default: 'default'
- ^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^^^^^^^^^^^ #{msg}
change_column_type_concurrently :test_text_limits, :test_id, :text
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg}
add_text_limit :wrong_table, :name, 255
add_text_limit :wrong_table, :email, 255
@@ -142,8 +140,6 @@ RSpec.describe RuboCop::Cop::Migration::AddLimitToTextColumns do
end
end
RUBY
-
- expect(cop.offenses.map(&:cop_name)).to all(eq('Migration/AddLimitToTextColumns'))
end
end
@@ -176,18 +172,18 @@ RSpec.describe RuboCop::Cop::Migration::AddLimitToTextColumns do
DOWNTIME = false
def up
- drop_table :no_offence_on_down
+ drop_table :no_offense_on_down
end
def down
- create_table :no_offence_on_down, id: false do |t|
+ create_table :no_offense_on_down, id: false do |t|
t.integer :test_id, null: false
t.text :name
end
- add_column :no_offence_on_down, :email, :text
+ add_column :no_offense_on_down, :email, :text
- add_column_with_default :no_offence_on_down, :role, :text, default: 'default'
+ add_column_with_default :no_offense_on_down, :role, :text, default: 'default'
end
end
RUBY
@@ -195,7 +191,7 @@ RSpec.describe RuboCop::Cop::Migration::AddLimitToTextColumns do
end
end
- context 'outside of migration' do
+ context 'when outside of migration' do
it 'registers no offense' do
expect_no_offenses(<<~RUBY)
class TestTextLimits < ActiveRecord::Migration[6.0]
diff --git a/spec/rubocop/cop/migration/add_reference_spec.rb b/spec/rubocop/cop/migration/add_reference_spec.rb
index 6e229d3eefc..35386f14e26 100644
--- a/spec/rubocop/cop/migration/add_reference_spec.rb
+++ b/spec/rubocop/cop/migration/add_reference_spec.rb
@@ -5,11 +5,9 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/add_reference'
RSpec.describe RuboCop::Cop::Migration::AddReference do
- include CopHelper
-
let(:cop) { described_class.new }
- context 'outside of a migration' do
+ context 'when outside of a migration' do
it 'does not register any offenses' do
expect_no_offenses(<<~RUBY)
def up
@@ -19,12 +17,12 @@ RSpec.describe RuboCop::Cop::Migration::AddReference do
end
end
- context 'in a migration' do
+ context 'when in a migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
- let(:offense) { '`add_reference` requires downtime for existing tables, use `add_concurrent_foreign_key` instead. When used for new tables, `index: true` or `index: { options... } is required.`' }
+ let(:offense) { '`add_reference` requires downtime for existing tables, use `add_concurrent_foreign_key`[...]' }
context 'when the table existed before' do
it 'registers an offense when using add_reference' do
diff --git a/spec/rubocop/cop/migration/add_timestamps_spec.rb b/spec/rubocop/cop/migration/add_timestamps_spec.rb
index 83570711ab9..6492c93d4e6 100644
--- a/spec/rubocop/cop/migration/add_timestamps_spec.rb
+++ b/spec/rubocop/cop/migration/add_timestamps_spec.rb
@@ -5,8 +5,6 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/add_timestamps'
RSpec.describe RuboCop::Cop::Migration::AddTimestamps do
- include CopHelper
-
subject(:cop) { described_class.new }
let(:migration_with_add_timestamps) do
@@ -47,44 +45,39 @@ RSpec.describe RuboCop::Cop::Migration::AddTimestamps do
)
end
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
it 'registers an offense when the "add_timestamps" method is used' do
- inspect_source(migration_with_add_timestamps)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([7])
- end
+ expect_offense(<<~RUBY)
+ class Users < ActiveRecord::Migration[4.2]
+ DOWNTIME = false
+
+ def change
+ add_column(:users, :username, :text)
+ add_timestamps(:users)
+ ^^^^^^^^^^^^^^ Do not use `add_timestamps`, use `add_timestamps_with_timezone` instead
+ end
+ end
+ RUBY
end
it 'does not register an offense when the "add_timestamps" method is not used' do
- inspect_source(migration_without_add_timestamps)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(0)
- end
+ expect_no_offenses(migration_without_add_timestamps)
end
it 'does not register an offense when the "add_timestamps_with_timezone" method is used' do
- inspect_source(migration_with_add_timestamps_with_timezone)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(0)
- end
+ expect_no_offenses(migration_with_add_timestamps_with_timezone)
end
end
- context 'outside of migration' do
- it 'registers no offense' do
- inspect_source(migration_with_add_timestamps)
- inspect_source(migration_without_add_timestamps)
- inspect_source(migration_with_add_timestamps_with_timezone)
-
- expect(cop.offenses.size).to eq(0)
+ context 'when outside of migration' do
+ it 'registers no offense', :aggregate_failures do
+ expect_no_offenses(migration_with_add_timestamps)
+ expect_no_offenses(migration_without_add_timestamps)
+ expect_no_offenses(migration_with_add_timestamps_with_timezone)
end
end
end
diff --git a/spec/rubocop/cop/migration/complex_indexes_require_name_spec.rb b/spec/rubocop/cop/migration/complex_indexes_require_name_spec.rb
index 38ccf546b7c..0a95bd5d78c 100644
--- a/spec/rubocop/cop/migration/complex_indexes_require_name_spec.rb
+++ b/spec/rubocop/cop/migration/complex_indexes_require_name_spec.rb
@@ -5,11 +5,11 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/complex_indexes_require_name'
RSpec.describe RuboCop::Cop::Migration::ComplexIndexesRequireName do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
+ let(:msg) { 'indexes added with custom options must be explicitly named' }
+
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
@@ -29,9 +29,9 @@ RSpec.describe RuboCop::Cop::Migration::ComplexIndexesRequireName do
t.index :column1, unique: true
t.index :column2, where: 'column1 = 0'
- ^^^^^ #{described_class::MSG}
+ ^^^^^ #{msg}
t.index :column3, using: :gin
- ^^^^^ #{described_class::MSG}
+ ^^^^^ #{msg}
end
end
@@ -40,8 +40,6 @@ RSpec.describe RuboCop::Cop::Migration::ComplexIndexesRequireName do
end
end
RUBY
-
- expect(cop.offenses.map(&:cop_name)).to all(eq("Migration/#{described_class.name.demodulize}"))
end
end
@@ -85,20 +83,18 @@ RSpec.describe RuboCop::Cop::Migration::ComplexIndexesRequireName do
add_index :test_indexes, :column1
add_index :test_indexes, :column2, where: "column2 = 'value'", order: { column4: :desc }
- ^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^ #{msg}
end
def down
add_index :test_indexes, :column4, 'unique' => true, where: 'column4 IS NOT NULL'
- ^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^ #{msg}
add_concurrent_index :test_indexes, :column6, using: :gin, opclass: :gin_trgm_ops
- ^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^^^^^^^^ #{msg}
end
end
RUBY
-
- expect(cop.offenses.map(&:cop_name)).to all(eq("Migration/#{described_class.name.demodulize}"))
end
end
@@ -132,7 +128,7 @@ RSpec.describe RuboCop::Cop::Migration::ComplexIndexesRequireName do
end
end
- context 'outside migration' do
+ context 'when outside migration' do
before do
allow(cop).to receive(:in_migration?).and_return(false)
end
diff --git a/spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb b/spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb
index 2159bad1490..d046fd913d4 100644
--- a/spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb
+++ b/spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb
@@ -5,8 +5,6 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/create_table_with_foreign_keys'
RSpec.describe RuboCop::Cop::Migration::CreateTableWithForeignKeys do
- include CopHelper
-
let(:cop) { described_class.new }
context 'outside of a migration' do
@@ -22,7 +20,7 @@ RSpec.describe RuboCop::Cop::Migration::CreateTableWithForeignKeys do
end
end
- context 'in a migration' do
+ context 'when in a migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
diff --git a/spec/rubocop/cop/migration/datetime_spec.rb b/spec/rubocop/cop/migration/datetime_spec.rb
index a3cccae21e0..24be3bea8c3 100644
--- a/spec/rubocop/cop/migration/datetime_spec.rb
+++ b/spec/rubocop/cop/migration/datetime_spec.rb
@@ -5,40 +5,8 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/datetime'
RSpec.describe RuboCop::Cop::Migration::Datetime do
- include CopHelper
-
subject(:cop) { described_class.new }
- let(:create_table_migration_with_datetime) do
- %q(
- class Users < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- create_table :users do |t|
- t.string :username, null: false
- t.datetime :last_sign_in
- end
- end
- end
- )
- end
-
- let(:create_table_migration_with_timestamp) do
- %q(
- class Users < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- def change
- create_table :users do |t|
- t.string :username, null: false
- t.timestamp :last_sign_in
- end
- end
- end
- )
- end
-
let(:create_table_migration_without_datetime) do
%q(
class Users < ActiveRecord::Migration[6.0]
@@ -120,92 +88,94 @@ RSpec.describe RuboCop::Cop::Migration::Datetime do
)
end
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
it 'registers an offense when the ":datetime" data type is used on create_table' do
- inspect_source(create_table_migration_with_datetime)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([8])
- expect(cop.offenses.first.message).to include('`datetime`')
- end
+ expect_offense(<<~RUBY)
+ class Users < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ create_table :users do |t|
+ t.string :username, null: false
+ t.datetime :last_sign_in
+ ^^^^^^^^ Do not use the `datetime` data type[...]
+ end
+ end
+ end
+ RUBY
end
it 'registers an offense when the ":timestamp" data type is used on create_table' do
- inspect_source(create_table_migration_with_timestamp)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([8])
- expect(cop.offenses.first.message).to include('timestamp')
- end
+ expect_offense(<<~RUBY)
+ class Users < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ create_table :users do |t|
+ t.string :username, null: false
+ t.timestamp :last_sign_in
+ ^^^^^^^^^ Do not use the `timestamp` data type[...]
+ end
+ end
+ end
+ RUBY
end
it 'does not register an offense when the ":datetime" data type is not used on create_table' do
- inspect_source(create_table_migration_without_datetime)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(0)
- end
+ expect_no_offenses(create_table_migration_without_datetime)
end
it 'does not register an offense when the ":datetime_with_timezone" data type is used on create_table' do
- inspect_source(create_table_migration_with_datetime_with_timezone)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(0)
- end
+ expect_no_offenses(create_table_migration_with_datetime_with_timezone)
end
it 'registers an offense when the ":datetime" data type is used on add_column' do
- inspect_source(add_column_migration_with_datetime)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([7])
- expect(cop.offenses.first.message).to include('`datetime`')
- end
+ expect_offense(<<~RUBY)
+ class Users < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ add_column(:users, :username, :text)
+ add_column(:users, :last_sign_in, :datetime)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use the `datetime` data type[...]
+ end
+ end
+ RUBY
end
it 'registers an offense when the ":timestamp" data type is used on add_column' do
- inspect_source(add_column_migration_with_timestamp)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([7])
- expect(cop.offenses.first.message).to include('timestamp')
- end
+ expect_offense(<<~RUBY)
+ class Users < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+
+ def change
+ add_column(:users, :username, :text)
+ add_column(:users, :last_sign_in, :timestamp)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use the `timestamp` data type[...]
+ end
+ end
+ RUBY
end
it 'does not register an offense when the ":datetime" data type is not used on add_column' do
- inspect_source(add_column_migration_without_datetime)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(0)
- end
+ expect_no_offenses(add_column_migration_without_datetime)
end
it 'does not register an offense when the ":datetime_with_timezone" data type is used on add_column' do
- inspect_source(add_column_migration_with_datetime_with_timezone)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(0)
- end
+ expect_no_offenses(add_column_migration_with_datetime_with_timezone)
end
end
- context 'outside of migration' do
- it 'registers no offense' do
- inspect_source(add_column_migration_with_datetime)
- inspect_source(add_column_migration_with_timestamp)
- inspect_source(add_column_migration_without_datetime)
- inspect_source(add_column_migration_with_datetime_with_timezone)
-
- expect(cop.offenses.size).to eq(0)
+ context 'when outside of migration' do
+ it 'registers no offense', :aggregate_failures do
+ expect_no_offenses(add_column_migration_with_datetime)
+ expect_no_offenses(add_column_migration_with_timestamp)
+ expect_no_offenses(add_column_migration_without_datetime)
+ expect_no_offenses(add_column_migration_with_datetime_with_timezone)
end
end
end
diff --git a/spec/rubocop/cop/migration/drop_table_spec.rb b/spec/rubocop/cop/migration/drop_table_spec.rb
index d783cb56203..7a2e7929f11 100644
--- a/spec/rubocop/cop/migration/drop_table_spec.rb
+++ b/spec/rubocop/cop/migration/drop_table_spec.rb
@@ -5,11 +5,13 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/drop_table'
RSpec.describe RuboCop::Cop::Migration::DropTable do
- include CopHelper
-
subject(:cop) { described_class.new }
context 'when in deployment migration' do
+ let(:msg) do
+ '`drop_table` in deployment migrations requires downtime. Drop tables in post-deployment migrations instead.'
+ end
+
before do
allow(cop).to receive(:in_deployment_migration?).and_return(true)
end
@@ -30,7 +32,7 @@ RSpec.describe RuboCop::Cop::Migration::DropTable do
expect_offense(<<~PATTERN)
def up
drop_table :table
- ^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^ #{msg}
end
PATTERN
end
@@ -41,7 +43,7 @@ RSpec.describe RuboCop::Cop::Migration::DropTable do
expect_offense(<<~PATTERN)
def change
drop_table :table
- ^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^ #{msg}
end
PATTERN
end
@@ -63,7 +65,7 @@ RSpec.describe RuboCop::Cop::Migration::DropTable do
expect_offense(<<~PATTERN)
def up
execute "DROP TABLE table"
- ^^^^^^^ #{described_class::MSG}
+ ^^^^^^^ #{msg}
end
PATTERN
end
@@ -74,7 +76,7 @@ RSpec.describe RuboCop::Cop::Migration::DropTable do
expect_offense(<<~PATTERN)
def change
execute "DROP TABLE table"
- ^^^^^^^ #{described_class::MSG}
+ ^^^^^^^ #{msg}
end
PATTERN
end
diff --git a/spec/rubocop/cop/migration/hash_index_spec.rb b/spec/rubocop/cop/migration/hash_index_spec.rb
index 15f68eb990f..08c803ee79e 100644
--- a/spec/rubocop/cop/migration/hash_index_spec.rb
+++ b/spec/rubocop/cop/migration/hash_index_spec.rb
@@ -5,48 +5,44 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/hash_index'
RSpec.describe RuboCop::Cop::Migration::HashIndex do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
it 'registers an offense when creating a hash index' do
- inspect_source('def change; add_index :table, :column, using: :hash; end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ add_index :table, :column, using: :hash
+ ^^^^^^^^^^^^ hash indexes should be avoided at all costs[...]
+ end
+ RUBY
end
it 'registers an offense when creating a concurrent hash index' do
- inspect_source('def change; add_concurrent_index :table, :column, using: :hash; end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ add_concurrent_index :table, :column, using: :hash
+ ^^^^^^^^^^^^ hash indexes should be avoided at all costs[...]
+ end
+ RUBY
end
it 'registers an offense when creating a hash index using t.index' do
- inspect_source('def change; t.index :table, :column, using: :hash; end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ t.index :table, :column, using: :hash
+ ^^^^^^^^^^^^ hash indexes should be avoided at all costs[...]
+ end
+ RUBY
end
end
- context 'outside of migration' do
+ context 'when outside of migration' do
it 'registers no offense' do
- inspect_source('def change; index :table, :column, using: :hash; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses('def change; index :table, :column, using: :hash; end')
end
end
end
diff --git a/spec/rubocop/cop/migration/prevent_strings_spec.rb b/spec/rubocop/cop/migration/prevent_strings_spec.rb
index 560a485017a..d8d4058363e 100644
--- a/spec/rubocop/cop/migration/prevent_strings_spec.rb
+++ b/spec/rubocop/cop/migration/prevent_strings_spec.rb
@@ -5,45 +5,41 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/prevent_strings'
RSpec.describe RuboCop::Cop::Migration::PreventStrings do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
context 'when the string data type is used' do
it 'registers an offense' do
- expect_offense(<<~RUBY)
+ expect_offense(<<~RUBY, msg: "Do not use the `string` data type, use `text` instead.[...]")
class Users < ActiveRecord::Migration[6.0]
DOWNTIME = false
def up
create_table :users do |t|
t.string :username, null: false
- ^^^^^^ #{described_class::MSG}
+ ^^^^^^ %{msg}
t.timestamps_with_timezone null: true
t.string :password
- ^^^^^^ #{described_class::MSG}
+ ^^^^^^ %{msg}
end
add_column(:users, :bio, :string)
- ^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^ %{msg}
add_column_with_default(:users, :url, :string, default: '/-/user', allow_null: false, limit: 255)
- ^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^^^^^^^^^^^ %{msg}
change_column_type_concurrently :users, :commit_id, :string
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ %{msg}
end
end
RUBY
-
- expect(cop.offenses.map(&:cop_name)).to all(eq('Migration/PreventStrings'))
end
end
@@ -109,7 +105,7 @@ RSpec.describe RuboCop::Cop::Migration::PreventStrings do
end
end
- context 'on down' do
+ context 'when using down method' do
it 'registers no offense' do
expect_no_offenses(<<~RUBY)
class Users < ActiveRecord::Migration[6.0]
@@ -138,7 +134,7 @@ RSpec.describe RuboCop::Cop::Migration::PreventStrings do
end
end
- context 'outside of migration' do
+ context 'when outside of migration' do
it 'registers no offense' do
expect_no_offenses(<<~RUBY)
class Users < ActiveRecord::Migration[6.0]
diff --git a/spec/rubocop/cop/migration/refer_to_index_by_name_spec.rb b/spec/rubocop/cop/migration/refer_to_index_by_name_spec.rb
index a25328a56a8..864d2325d53 100644
--- a/spec/rubocop/cop/migration/refer_to_index_by_name_spec.rb
+++ b/spec/rubocop/cop/migration/refer_to_index_by_name_spec.rb
@@ -5,18 +5,16 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/refer_to_index_by_name'
RSpec.describe RuboCop::Cop::Migration::ReferToIndexByName do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
context 'when existing indexes are referred to without an explicit name' do
it 'registers an offense' do
- expect_offense(<<~RUBY)
+ expect_offense(<<~RUBY, msg: 'migration methods that refer to existing indexes must do so by name')
class TestReferToIndexByName < ActiveRecord::Migration[6.0]
DOWNTIME = false
@@ -30,22 +28,22 @@ RSpec.describe RuboCop::Cop::Migration::ReferToIndexByName do
end
if index_exists? :test_indexes, :column2
- ^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^ %{msg}
remove_index :test_indexes, :column2
- ^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^ %{msg}
end
remove_index :test_indexes, column: column3
- ^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^ %{msg}
remove_index :test_indexes, name: 'index_name_4'
end
def down
if index_exists? :test_indexes, :column4, using: :gin, opclass: :gin_trgm_ops
- ^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^ %{msg}
remove_concurrent_index :test_indexes, :column4, using: :gin, opclass: :gin_trgm_ops
- ^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ ^^^^^^^^^^^^^^^^^^^^^^^ %{msg}
end
if index_exists? :test_indexes, :column3, unique: true, name: 'index_name_3', where: 'column3 = 10'
@@ -54,13 +52,11 @@ RSpec.describe RuboCop::Cop::Migration::ReferToIndexByName do
end
end
RUBY
-
- expect(cop.offenses.map(&:cop_name)).to all(eq("Migration/#{described_class.name.demodulize}"))
end
end
end
- context 'outside migration' do
+ context 'when outside migration' do
before do
allow(cop).to receive(:in_migration?).and_return(false)
end
diff --git a/spec/rubocop/cop/migration/remove_column_spec.rb b/spec/rubocop/cop/migration/remove_column_spec.rb
index 4768093b10d..a8a828bc62a 100644
--- a/spec/rubocop/cop/migration/remove_column_spec.rb
+++ b/spec/rubocop/cop/migration/remove_column_spec.rb
@@ -5,63 +5,55 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/remove_column'
RSpec.describe RuboCop::Cop::Migration::RemoveColumn do
- include CopHelper
-
subject(:cop) { described_class.new }
def source(meth = 'change')
"def #{meth}; remove_column :table, :column; end"
end
- context 'in a regular migration' do
+ context 'when in a regular migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
allow(cop).to receive(:in_post_deployment_migration?).and_return(false)
end
it 'registers an offense when remove_column is used in the change method' do
- inspect_source(source('change'))
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ remove_column :table, :column
+ ^^^^^^^^^^^^^ `remove_column` must only be used in post-deployment migrations
+ end
+ RUBY
end
it 'registers an offense when remove_column is used in the up method' do
- inspect_source(source('up'))
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def up
+ remove_column :table, :column
+ ^^^^^^^^^^^^^ `remove_column` must only be used in post-deployment migrations
+ end
+ RUBY
end
it 'registers no offense when remove_column is used in the down method' do
- inspect_source(source('down'))
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses(source('down'))
end
end
- context 'in a post-deployment migration' do
+ context 'when in a post-deployment migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
allow(cop).to receive(:in_post_deployment_migration?).and_return(true)
end
it 'registers no offense' do
- inspect_source(source)
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses(source)
end
end
- context 'outside of a migration' do
+ context 'when outside of a migration' do
it 'registers no offense' do
- inspect_source(source)
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses(source)
end
end
end
diff --git a/spec/rubocop/cop/migration/remove_concurrent_index_spec.rb b/spec/rubocop/cop/migration/remove_concurrent_index_spec.rb
index 8da368d588c..8e29e51992c 100644
--- a/spec/rubocop/cop/migration/remove_concurrent_index_spec.rb
+++ b/spec/rubocop/cop/migration/remove_concurrent_index_spec.rb
@@ -5,8 +5,6 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/remove_concurrent_index'
RSpec.describe RuboCop::Cop::Migration::RemoveConcurrentIndex do
- include CopHelper
-
subject(:cop) { described_class.new }
context 'in migration' do
@@ -15,26 +13,22 @@ RSpec.describe RuboCop::Cop::Migration::RemoveConcurrentIndex do
end
it 'registers an offense when remove_concurrent_index is used inside a change method' do
- inspect_source('def change; remove_concurrent_index :table, :column; end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ ^^^^^^ `remove_concurrent_index` is not reversible [...]
+ remove_concurrent_index :table, :column
+ end
+ RUBY
end
it 'registers no offense when remove_concurrent_index is used inside an up method' do
- inspect_source('def up; remove_concurrent_index :table, :column; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses('def up; remove_concurrent_index :table, :column; end')
end
end
context 'outside of migration' do
it 'registers no offense' do
- inspect_source('def change; remove_concurrent_index :table, :column; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses('def change; remove_concurrent_index :table, :column; end')
end
end
end
diff --git a/spec/rubocop/cop/migration/remove_index_spec.rb b/spec/rubocop/cop/migration/remove_index_spec.rb
index 274c907ac41..c9797443276 100644
--- a/spec/rubocop/cop/migration/remove_index_spec.rb
+++ b/spec/rubocop/cop/migration/remove_index_spec.rb
@@ -5,30 +5,26 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/remove_index'
RSpec.describe RuboCop::Cop::Migration::RemoveIndex do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
it 'registers an offense when remove_index is used' do
- inspect_source('def change; remove_index :table, :column; end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ remove_index :table, :column
+ ^^^^^^^^^^^^ `remove_index` requires downtime, use `remove_concurrent_index` instead
+ end
+ RUBY
end
end
- context 'outside of migration' do
+ context 'when outside of migration' do
it 'registers no offense' do
- inspect_source('def change; remove_index :table, :column; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses('def change; remove_index :table, :column; end')
end
end
end
diff --git a/spec/rubocop/cop/migration/safer_boolean_column_spec.rb b/spec/rubocop/cop/migration/safer_boolean_column_spec.rb
index aa7bb58ab45..11661be2bb6 100644
--- a/spec/rubocop/cop/migration/safer_boolean_column_spec.rb
+++ b/spec/rubocop/cop/migration/safer_boolean_column_spec.rb
@@ -5,8 +5,6 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/safer_boolean_column'
RSpec.describe RuboCop::Cop::Migration::SaferBooleanColumn do
- include CopHelper
-
subject(:cop) { described_class.new }
context 'in migration' do
@@ -31,11 +29,10 @@ RSpec.describe RuboCop::Cop::Migration::SaferBooleanColumn do
sources_and_offense.each do |source, offense|
context "given the source \"#{source}\"" do
it "registers the offense matching \"#{offense}\"" do
- inspect_source(source)
-
- aggregate_failures do
- expect(cop.offenses.first.message).to match(offense)
- end
+ expect_offense(<<~RUBY, node: source, msg: offense)
+ %{node}
+ ^{node} Boolean columns on the `#{table}` table %{msg}.[...]
+ RUBY
end
end
end
@@ -48,11 +45,7 @@ RSpec.describe RuboCop::Cop::Migration::SaferBooleanColumn do
inoffensive_sources.each do |source|
context "given the source \"#{source}\"" do
it "registers no offense" do
- inspect_source(source)
-
- aggregate_failures do
- expect(cop.offenses).to be_empty
- end
+ expect_no_offenses(source)
end
end
end
@@ -60,25 +53,19 @@ RSpec.describe RuboCop::Cop::Migration::SaferBooleanColumn do
end
it 'registers no offense for tables not listed in SMALL_TABLES' do
- inspect_source("add_column :large_table, :column, :boolean")
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses("add_column :large_table, :column, :boolean")
end
it 'registers no offense for non-boolean columns' do
table = described_class::SMALL_TABLES.sample
- inspect_source("add_column :#{table}, :column, :string")
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses("add_column :#{table}, :column, :string")
end
end
context 'outside of migration' do
it 'registers no offense' do
table = described_class::SMALL_TABLES.sample
- inspect_source("add_column :#{table}, :column, :boolean")
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses("add_column :#{table}, :column, :boolean")
end
end
end
diff --git a/spec/rubocop/cop/migration/schedule_async_spec.rb b/spec/rubocop/cop/migration/schedule_async_spec.rb
index a7246dfa73a..008a23c7b8f 100644
--- a/spec/rubocop/cop/migration/schedule_async_spec.rb
+++ b/spec/rubocop/cop/migration/schedule_async_spec.rb
@@ -3,13 +3,9 @@
require 'fast_spec_helper'
require 'rubocop'
-require 'rubocop/rspec/support'
-
require_relative '../../../../rubocop/cop/migration/schedule_async'
RSpec.describe RuboCop::Cop::Migration::ScheduleAsync do
- include CopHelper
-
let(:cop) { described_class.new }
let(:source) do
<<~SOURCE
@@ -21,9 +17,7 @@ RSpec.describe RuboCop::Cop::Migration::ScheduleAsync do
shared_examples 'a disabled cop' do
it 'does not register any offenses' do
- inspect_source(source)
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses(source)
end
end
@@ -50,101 +44,73 @@ RSpec.describe RuboCop::Cop::Migration::ScheduleAsync do
end
context 'BackgroundMigrationWorker.perform_async' do
- it 'adds an offence when calling `BackgroundMigrationWorker.peform_async`' do
- inspect_source(source)
-
- expect(cop.offenses.size).to eq(1)
- end
-
- it 'autocorrects to the right version' do
- correct_source = <<~CORRECT
- def up
- migrate_async(ClazzName, "Bar", "Baz")
- end
- CORRECT
+ it 'adds an offense when calling `BackgroundMigrationWorker.peform_async` and corrects', :aggregate_failures do
+ expect_offense(<<~RUBY)
+ def up
+ BackgroundMigrationWorker.perform_async(ClazzName, "Bar", "Baz")
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Don't call [...]
+ end
+ RUBY
- expect(autocorrect_source(source)).to eq(correct_source)
+ expect_correction(<<~RUBY)
+ def up
+ migrate_async(ClazzName, "Bar", "Baz")
+ end
+ RUBY
end
end
context 'BackgroundMigrationWorker.perform_in' do
- let(:source) do
- <<~SOURCE
+ it 'adds an offense and corrects', :aggregate_failures do
+ expect_offense(<<~RUBY)
def up
BackgroundMigrationWorker
+ ^^^^^^^^^^^^^^^^^^^^^^^^^ Don't call [...]
.perform_in(delay, ClazzName, "Bar", "Baz")
end
- SOURCE
- end
-
- it 'adds an offence' do
- inspect_source(source)
+ RUBY
- expect(cop.offenses.size).to eq(1)
- end
-
- it 'autocorrects to the right version' do
- correct_source = <<~CORRECT
+ expect_correction(<<~RUBY)
def up
migrate_in(delay, ClazzName, "Bar", "Baz")
end
- CORRECT
-
- expect(autocorrect_source(source)).to eq(correct_source)
+ RUBY
end
end
context 'BackgroundMigrationWorker.bulk_perform_async' do
- let(:source) do
- <<~SOURCE
+ it 'adds an offense and corrects', :aggregate_failures do
+ expect_offense(<<~RUBY)
def up
BackgroundMigrationWorker
+ ^^^^^^^^^^^^^^^^^^^^^^^^^ Don't call [...]
.bulk_perform_async(jobs)
end
- SOURCE
- end
-
- it 'adds an offence' do
- inspect_source(source)
-
- expect(cop.offenses.size).to eq(1)
- end
+ RUBY
- it 'autocorrects to the right version' do
- correct_source = <<~CORRECT
+ expect_correction(<<~RUBY)
def up
bulk_migrate_async(jobs)
end
- CORRECT
-
- expect(autocorrect_source(source)).to eq(correct_source)
+ RUBY
end
end
context 'BackgroundMigrationWorker.bulk_perform_in' do
- let(:source) do
- <<~SOURCE
+ it 'adds an offense and corrects', :aggregate_failures do
+ expect_offense(<<~RUBY)
def up
BackgroundMigrationWorker
+ ^^^^^^^^^^^^^^^^^^^^^^^^^ Don't call [...]
.bulk_perform_in(5.minutes, jobs)
end
- SOURCE
- end
-
- it 'adds an offence' do
- inspect_source(source)
+ RUBY
- expect(cop.offenses.size).to eq(1)
- end
-
- it 'autocorrects to the right version' do
- correct_source = <<~CORRECT
+ expect_correction(<<~RUBY)
def up
bulk_migrate_in(5.minutes, jobs)
end
- CORRECT
-
- expect(autocorrect_source(source)).to eq(correct_source)
+ RUBY
end
end
end
diff --git a/spec/rubocop/cop/migration/timestamps_spec.rb b/spec/rubocop/cop/migration/timestamps_spec.rb
index 2f4154907d2..4da3dffbfc6 100644
--- a/spec/rubocop/cop/migration/timestamps_spec.rb
+++ b/spec/rubocop/cop/migration/timestamps_spec.rb
@@ -5,8 +5,6 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/timestamps'
RSpec.describe RuboCop::Cop::Migration::Timestamps do
- include CopHelper
-
subject(:cop) { described_class.new }
let(:migration_with_timestamps) do
@@ -62,38 +60,36 @@ RSpec.describe RuboCop::Cop::Migration::Timestamps do
end
it 'registers an offense when the "timestamps" method is used' do
- inspect_source(migration_with_timestamps)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([8])
- end
+ expect_offense(<<~RUBY)
+ class Users < ActiveRecord::Migration[4.2]
+ DOWNTIME = false
+
+ def change
+ create_table :users do |t|
+ t.string :username, null: false
+ t.timestamps null: true
+ ^^^^^^^^^^ Do not use `timestamps`, use `timestamps_with_timezone` instead
+ t.string :password
+ end
+ end
+ end
+ RUBY
end
it 'does not register an offense when the "timestamps" method is not used' do
- inspect_source(migration_without_timestamps)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(0)
- end
+ expect_no_offenses(migration_without_timestamps)
end
it 'does not register an offense when the "timestamps_with_timezone" method is used' do
- inspect_source(migration_with_timestamps_with_timezone)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(0)
- end
+ expect_no_offenses(migration_with_timestamps_with_timezone)
end
end
context 'outside of migration' do
- it 'registers no offense' do
- inspect_source(migration_with_timestamps)
- inspect_source(migration_without_timestamps)
- inspect_source(migration_with_timestamps_with_timezone)
-
- expect(cop.offenses.size).to eq(0)
+ it 'registers no offense', :aggregate_failures do
+ expect_no_offenses(migration_with_timestamps)
+ expect_no_offenses(migration_without_timestamps)
+ expect_no_offenses(migration_with_timestamps_with_timezone)
end
end
end
diff --git a/spec/rubocop/cop/migration/update_column_in_batches_spec.rb b/spec/rubocop/cop/migration/update_column_in_batches_spec.rb
index 8049cba12d0..5e33e11b13f 100644
--- a/spec/rubocop/cop/migration/update_column_in_batches_spec.rb
+++ b/spec/rubocop/cop/migration/update_column_in_batches_spec.rb
@@ -3,8 +3,6 @@
require 'fast_spec_helper'
require 'rubocop'
-require 'rubocop/rspec/support'
-
require_relative '../../../../rubocop/cop/migration/update_column_in_batches'
RSpec.describe RuboCop::Cop::Migration::UpdateColumnInBatches do
@@ -31,9 +29,7 @@ RSpec.describe RuboCop::Cop::Migration::UpdateColumnInBatches do
context 'outside of a migration' do
it 'does not register any offenses' do
- inspect_source(migration_code)
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses(migration_code)
end
end
@@ -53,14 +49,14 @@ RSpec.describe RuboCop::Cop::Migration::UpdateColumnInBatches do
let(:relative_spec_filepath) { Pathname.new(spec_filepath).relative_path_from(tmp_rails_root) }
it 'registers an offense when using update_column_in_batches' do
- inspect_source(migration_code, @migration_file)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([2])
- expect(cop.offenses.first.message)
- .to include("`#{relative_spec_filepath}`")
- end
+ expect_offense(<<~RUBY, @migration_file)
+ def up
+ update_column_in_batches(:projects, :name, "foo") do |table, query|
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Migration running `update_column_in_batches` [...]
+ query.where(table[:name].eq(nil))
+ end
+ end
+ RUBY
end
end
@@ -76,20 +72,18 @@ RSpec.describe RuboCop::Cop::Migration::UpdateColumnInBatches do
end
it 'does not register any offenses' do
- inspect_source(migration_code, @migration_file)
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses(migration_code)
end
end
- context 'in a migration' do
+ context 'when in migration' do
let(:migration_filepath) { File.join(tmp_rails_root, 'db', 'migrate', '20121220064453_my_super_migration.rb') }
it_behaves_like 'a migration file with no spec file'
it_behaves_like 'a migration file with a spec file'
end
- context 'in a post migration' do
+ context 'when in a post migration' do
let(:migration_filepath) { File.join(tmp_rails_root, 'db', 'post_migrate', '20121220064453_my_super_migration.rb') }
it_behaves_like 'a migration file with no spec file'
@@ -99,14 +93,14 @@ RSpec.describe RuboCop::Cop::Migration::UpdateColumnInBatches do
context 'EE migrations' do
let(:spec_filepath) { File.join(tmp_rails_root, 'ee', 'spec', 'migrations', 'my_super_migration_spec.rb') }
- context 'in a migration' do
+ context 'when in a migration' do
let(:migration_filepath) { File.join(tmp_rails_root, 'ee', 'db', 'migrate', '20121220064453_my_super_migration.rb') }
it_behaves_like 'a migration file with no spec file'
it_behaves_like 'a migration file with a spec file'
end
- context 'in a post migration' do
+ context 'when in a post migration' do
let(:migration_filepath) { File.join(tmp_rails_root, 'ee', 'db', 'post_migrate', '20121220064453_my_super_migration.rb') }
it_behaves_like 'a migration file with no spec file'
diff --git a/spec/rubocop/cop/migration/with_lock_retries_disallowed_method_spec.rb b/spec/rubocop/cop/migration/with_lock_retries_disallowed_method_spec.rb
index 814d87ea24b..429490294be 100644
--- a/spec/rubocop/cop/migration/with_lock_retries_disallowed_method_spec.rb
+++ b/spec/rubocop/cop/migration/with_lock_retries_disallowed_method_spec.rb
@@ -5,60 +5,55 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/with_lock_retries_disallowed_method'
RSpec.describe RuboCop::Cop::Migration::WithLockRetriesDisallowedMethod do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
it 'registers an offense when `with_lock_retries` block has disallowed method' do
- inspect_source('def change; with_lock_retries { disallowed_method }; end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ with_lock_retries { disallowed_method }
+ ^^^^^^^^^^^^^^^^^ The method is not allowed [...]
+ end
+ RUBY
end
it 'registers an offense when `with_lock_retries` block has disallowed methods' do
- source = <<~HEREDOC
- def change
- with_lock_retries do
- disallowed_method
+ expect_offense(<<~RUBY)
+ def change
+ with_lock_retries do
+ disallowed_method
+ ^^^^^^^^^^^^^^^^^ The method is not allowed [...]
- create_table do |t|
- t.text :text
- end
+ create_table do |t|
+ t.text :text
+ end
- other_disallowed_method
+ other_disallowed_method
+ ^^^^^^^^^^^^^^^^^^^^^^^ The method is not allowed [...]
- add_column :users, :name
+ add_column :users, :name
+ end
end
- end
- HEREDOC
-
- inspect_source(source)
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(2)
- expect(cop.offenses.map(&:line)).to eq([3, 9])
- end
+ RUBY
end
it 'registers no offense when `with_lock_retries` has only allowed method' do
- inspect_source('def up; with_lock_retries { add_foreign_key :foo, :bar }; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses(<<~RUBY)
+ def up
+ with_lock_retries { add_foreign_key :foo, :bar }
+ end
+ RUBY
end
describe 'for `add_foreign_key`' do
it 'registers an offense when more than two FKs are added' do
message = described_class::MSG_ONLY_ONE_FK_ALLOWED
- expect_offense <<~RUBY
+ expect_offense(<<~RUBY)
with_lock_retries do
add_foreign_key :imports, :projects, column: :project_id, on_delete: :cascade
^^^^^^^^^^^^^^^ #{message}
@@ -71,11 +66,13 @@ RSpec.describe RuboCop::Cop::Migration::WithLockRetriesDisallowedMethod do
end
end
- context 'outside of migration' do
+ context 'when outside of migration' do
it 'registers no offense' do
- inspect_source('def change; with_lock_retries { disallowed_method }; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses(<<~RUBY)
+ def change
+ with_lock_retries { disallowed_method }
+ end
+ RUBY
end
end
end
diff --git a/spec/rubocop/cop/migration/with_lock_retries_with_change_spec.rb b/spec/rubocop/cop/migration/with_lock_retries_with_change_spec.rb
index f0be14c8ee9..cf2d46d52c9 100644
--- a/spec/rubocop/cop/migration/with_lock_retries_with_change_spec.rb
+++ b/spec/rubocop/cop/migration/with_lock_retries_with_change_spec.rb
@@ -5,36 +5,38 @@ require 'rubocop'
require_relative '../../../../rubocop/cop/migration/with_lock_retries_with_change'
RSpec.describe RuboCop::Cop::Migration::WithLockRetriesWithChange do
- include CopHelper
-
subject(:cop) { described_class.new }
- context 'in migration' do
+ context 'when in migration' do
before do
allow(cop).to receive(:in_migration?).and_return(true)
end
it 'registers an offense when `with_lock_retries` is used inside a `change` method' do
- inspect_source('def change; with_lock_retries {}; end')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- end
+ expect_offense(<<~RUBY)
+ def change
+ ^^^^^^ `with_lock_retries` cannot be used within `change` [...]
+ with_lock_retries {}
+ end
+ RUBY
end
it 'registers no offense when `with_lock_retries` is used inside an `up` method' do
- inspect_source('def up; with_lock_retries {}; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses(<<~RUBY)
+ def up
+ with_lock_retries {}
+ end
+ RUBY
end
end
- context 'outside of migration' do
+ context 'when outside of migration' do
it 'registers no offense' do
- inspect_source('def change; with_lock_retries {}; end')
-
- expect(cop.offenses.size).to eq(0)
+ expect_no_offenses(<<~RUBY)
+ def change
+ with_lock_retries {}
+ end
+ RUBY
end
end
end
diff --git a/spec/rubocop/cop/prefer_class_methods_over_module_spec.rb b/spec/rubocop/cop/prefer_class_methods_over_module_spec.rb
index dc665f9dd25..5a557ec26d6 100644
--- a/spec/rubocop/cop/prefer_class_methods_over_module_spec.rb
+++ b/spec/rubocop/cop/prefer_class_methods_over_module_spec.rb
@@ -2,15 +2,12 @@
require 'fast_spec_helper'
require 'rubocop'
-require 'rubocop/rspec/support'
require_relative '../../../rubocop/cop/prefer_class_methods_over_module'
RSpec.describe RuboCop::Cop::PreferClassMethodsOverModule do
- include CopHelper
-
subject(:cop) { described_class.new }
- it 'flags violation when using module ClassMethods' do
+ it 'flags violation when using module ClassMethods and corrects', :aggregate_failures do
expect_offense(<<~RUBY)
module Foo
extend ActiveSupport::Concern
@@ -22,6 +19,17 @@ RSpec.describe RuboCop::Cop::PreferClassMethodsOverModule do
end
end
RUBY
+
+ expect_correction(<<~RUBY)
+ module Foo
+ extend ActiveSupport::Concern
+
+ class_methods do
+ def a_class_method
+ end
+ end
+ end
+ RUBY
end
it "doesn't flag violation when using class_methods" do
@@ -69,30 +77,4 @@ RSpec.describe RuboCop::Cop::PreferClassMethodsOverModule do
end
RUBY
end
-
- it 'autocorrects ClassMethods into class_methods' do
- source = <<~RUBY
- module Foo
- extend ActiveSupport::Concern
-
- module ClassMethods
- def a_class_method
- end
- end
- end
- RUBY
- autocorrected = autocorrect_source(source)
-
- expected_source = <<~RUBY
- module Foo
- extend ActiveSupport::Concern
-
- class_methods do
- def a_class_method
- end
- end
- end
- RUBY
- expect(autocorrected).to eq(expected_source)
- end
end
diff --git a/spec/rubocop/cop/put_group_routes_under_scope_spec.rb b/spec/rubocop/cop/put_group_routes_under_scope_spec.rb
index 46b50d7690b..f9e64d4d68f 100644
--- a/spec/rubocop/cop/put_group_routes_under_scope_spec.rb
+++ b/spec/rubocop/cop/put_group_routes_under_scope_spec.rb
@@ -5,8 +5,6 @@ require 'rubocop'
require_relative '../../../rubocop/cop/put_group_routes_under_scope'
RSpec.describe RuboCop::Cop::PutGroupRoutesUnderScope do
- include CopHelper
-
subject(:cop) { described_class.new }
%w[resource resources get post put patch delete].each do |route_method|
@@ -15,12 +13,12 @@ RSpec.describe RuboCop::Cop::PutGroupRoutesUnderScope do
marker = '^' * offense.size
expect_offense(<<~PATTERN)
- scope(path: 'groups/*group_id/-', module: :groups) do
- resource :issues
- end
+ scope(path: 'groups/*group_id/-', module: :groups) do
+ resource :issues
+ end
- #{offense}
- #{marker} Put new group routes under /-/ scope
+ #{offense}
+ #{marker} Put new group routes under /-/ scope
PATTERN
end
end
diff --git a/spec/rubocop/cop/sidekiq_options_queue_spec.rb b/spec/rubocop/cop/sidekiq_options_queue_spec.rb
index 306cbcf62b5..e65118ca192 100644
--- a/spec/rubocop/cop/sidekiq_options_queue_spec.rb
+++ b/spec/rubocop/cop/sidekiq_options_queue_spec.rb
@@ -3,28 +3,19 @@
require 'fast_spec_helper'
require 'rubocop'
-require 'rubocop/rspec/support'
-
require_relative '../../../rubocop/cop/sidekiq_options_queue'
RSpec.describe RuboCop::Cop::SidekiqOptionsQueue do
- include CopHelper
-
subject(:cop) { described_class.new }
it 'registers an offense when `sidekiq_options` is used with the `queue` option' do
- inspect_source('sidekiq_options queue: "some_queue"')
-
- aggregate_failures do
- expect(cop.offenses.size).to eq(1)
- expect(cop.offenses.map(&:line)).to eq([1])
- expect(cop.highlights).to eq(['queue: "some_queue"'])
- end
+ expect_offense(<<~CODE)
+ sidekiq_options queue: "some_queue"
+ ^^^^^^^^^^^^^^^^^^^ Do not manually set a queue; `ApplicationWorker` sets one automatically.
+ CODE
end
it 'does not register an offense when `sidekiq_options` is used with another option' do
- inspect_source('sidekiq_options retry: false')
-
- expect(cop.offenses).to be_empty
+ expect_no_offenses('sidekiq_options retry: false')
end
end
diff --git a/spec/serializers/base_discussion_entity_spec.rb b/spec/serializers/base_discussion_entity_spec.rb
index 5f483da4113..334e71d23f4 100644
--- a/spec/serializers/base_discussion_entity_spec.rb
+++ b/spec/serializers/base_discussion_entity_spec.rb
@@ -66,4 +66,13 @@ RSpec.describe BaseDiscussionEntity do
)
end
end
+
+ context 'when issues are disabled in a project' do
+ let(:project) { create(:project, :issues_disabled) }
+ let(:note) { create(:discussion_note_on_merge_request, project: project) }
+
+ it 'does not show a new issues path' do
+ expect(entity.as_json[:resolve_with_issue_path]).to be_nil
+ end
+ end
end
diff --git a/spec/services/boards/lists/list_service_spec.rb b/spec/services/boards/lists/list_service_spec.rb
index dfe65f3d241..21619abf6aa 100644
--- a/spec/services/boards/lists/list_service_spec.rb
+++ b/spec/services/boards/lists/list_service_spec.rb
@@ -8,6 +8,26 @@ RSpec.describe Boards::Lists::ListService do
describe '#execute' do
let(:service) { described_class.new(parent, user) }
+ shared_examples 'hidden lists' do
+ let!(:list) { create(:list, board: board, label: label) }
+
+ context 'when hide_backlog_list is true' do
+ it 'hides backlog list' do
+ board.update!(hide_backlog_list: true)
+
+ expect(service.execute(board)).to match_array([board.closed_list, list])
+ end
+ end
+
+ context 'when hide_closed_list is true' do
+ it 'hides closed list' do
+ board.update!(hide_closed_list: true)
+
+ expect(service.execute(board)).to match_array([board.backlog_list, list])
+ end
+ end
+ end
+
context 'when board parent is a project' do
let(:project) { create(:project) }
let(:board) { create(:board, project: project) }
@@ -16,6 +36,7 @@ RSpec.describe Boards::Lists::ListService do
let(:parent) { project }
it_behaves_like 'lists list service'
+ it_behaves_like 'hidden lists'
end
context 'when board parent is a group' do
@@ -26,6 +47,7 @@ RSpec.describe Boards::Lists::ListService do
let(:parent) { group }
it_behaves_like 'lists list service'
+ it_behaves_like 'hidden lists'
end
end
end
diff --git a/spec/services/ci/create_pipeline_service_spec.rb b/spec/services/ci/create_pipeline_service_spec.rb
index 1005985b3e4..9fafc57a770 100644
--- a/spec/services/ci/create_pipeline_service_spec.rb
+++ b/spec/services/ci/create_pipeline_service_spec.rb
@@ -101,7 +101,7 @@ RSpec.describe Ci::CreatePipelineService do
describe 'recording a conversion event' do
it 'schedules a record conversion event worker' do
- expect(Experiments::RecordConversionEventWorker).to receive(:perform_async).with(:ci_syntax_templates, user.id)
+ expect(Experiments::RecordConversionEventWorker).to receive(:perform_async).with(:ci_syntax_templates_b, user.id)
pipeline
end
diff --git a/spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb b/spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb
index 90956e7b4ea..98963f57341 100644
--- a/spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb
+++ b/spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb
@@ -39,6 +39,8 @@ RSpec.describe Clusters::Kubernetes::CreateOrUpdateNamespaceService, '#execute'
stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_KNATIVE_SERVING_ROLE_BINDING_NAME, namespace: namespace)
stub_kubeclient_put_role(api_url, Clusters::Kubernetes::GITLAB_CROSSPLANE_DATABASE_ROLE_NAME, namespace: namespace)
stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_CROSSPLANE_DATABASE_ROLE_BINDING_NAME, namespace: namespace)
+ stub_kubeclient_put_role(api_url, Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME, namespace: namespace)
+ stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_CILIUM_ROLE_BINDING_NAME, namespace: namespace)
stub_kubeclient_get_secret(
api_url,
diff --git a/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb b/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb
index a4f018aec0c..11045dfe950 100644
--- a/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb
+++ b/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb
@@ -147,6 +147,8 @@ RSpec.describe Clusters::Kubernetes::CreateOrUpdateServiceAccountService do
stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_KNATIVE_SERVING_ROLE_BINDING_NAME, namespace: namespace)
stub_kubeclient_put_role(api_url, Clusters::Kubernetes::GITLAB_CROSSPLANE_DATABASE_ROLE_NAME, namespace: namespace)
stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_CROSSPLANE_DATABASE_ROLE_BINDING_NAME, namespace: namespace)
+ stub_kubeclient_put_role(api_url, Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME, namespace: namespace)
+ stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_CILIUM_ROLE_BINDING_NAME, namespace: namespace)
end
it 'creates a namespace object' do
@@ -243,6 +245,47 @@ RSpec.describe Clusters::Kubernetes::CreateOrUpdateServiceAccountService do
)
)
end
+
+ it 'creates a role granting cilium permissions to the service account' do
+ subject
+
+ expect(WebMock).to have_requested(:put, api_url + "/apis/rbac.authorization.k8s.io/v1/namespaces/#{namespace}/roles/#{Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME}").with(
+ body: hash_including(
+ metadata: {
+ name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME,
+ namespace: namespace
+ },
+ rules: [{
+ apiGroups: %w(cilium.io),
+ resources: %w(ciliumnetworkpolicies),
+ verbs: %w(get list create update patch)
+ }]
+ )
+ )
+ end
+
+ it 'creates a role binding granting cilium permissions to the service account' do
+ subject
+
+ expect(WebMock).to have_requested(:put, api_url + "/apis/rbac.authorization.k8s.io/v1/namespaces/#{namespace}/rolebindings/#{Clusters::Kubernetes::GITLAB_CILIUM_ROLE_BINDING_NAME}").with(
+ body: hash_including(
+ metadata: {
+ name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_BINDING_NAME,
+ namespace: namespace
+ },
+ roleRef: {
+ apiGroup: 'rbac.authorization.k8s.io',
+ kind: 'Role',
+ name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME
+ },
+ subjects: [{
+ kind: 'ServiceAccount',
+ name: service_account_name,
+ namespace: namespace
+ }]
+ )
+ )
+ end
end
end
end
diff --git a/spec/services/groups/destroy_service_spec.rb b/spec/services/groups/destroy_service_spec.rb
index 2f9bb72939a..a5fce315d91 100644
--- a/spec/services/groups/destroy_service_spec.rb
+++ b/spec/services/groups/destroy_service_spec.rb
@@ -229,10 +229,10 @@ RSpec.describe Groups::DestroyService do
# will still be executed for the nested group as they fall under the same hierarchy
# and hence we need to account for this scenario.
expect(UserProjectAccessChangedService)
- .to receive(:new).with(shared_with_group.user_ids_for_project_authorizations).and_call_original
+ .to receive(:new).with(shared_with_group.users_ids_of_direct_members).and_call_original
expect(UserProjectAccessChangedService)
- .not_to receive(:new).with(shared_group.user_ids_for_project_authorizations)
+ .not_to receive(:new).with(shared_group.users_ids_of_direct_members)
destroy_group(shared_group, user, false)
end
@@ -246,7 +246,7 @@ RSpec.describe Groups::DestroyService do
it 'makes use of a specific service to update project authorizations' do
expect(UserProjectAccessChangedService)
- .to receive(:new).with(shared_with_group.user_ids_for_project_authorizations).and_call_original
+ .to receive(:new).with(shared_with_group.users_ids_of_direct_members).and_call_original
destroy_group(shared_with_group, user, false)
end
diff --git a/spec/services/groups/group_links/create_service_spec.rb b/spec/services/groups/group_links/create_service_spec.rb
index fb88433d8f6..df994b9f2a3 100644
--- a/spec/services/groups/group_links/create_service_spec.rb
+++ b/spec/services/groups/group_links/create_service_spec.rb
@@ -74,46 +74,56 @@ RSpec.describe Groups::GroupLinks::CreateService, '#execute' do
end
end
- context 'group hierarchies' do
+ context 'project authorizations based on group hierarchies' do
before do
group_parent.add_owner(parent_group_user)
group.add_owner(group_user)
group_child.add_owner(child_group_user)
end
- context 'group user' do
- let(:user) { group_user }
+ context 'project authorizations refresh' do
+ it 'is executed only for the direct members of the group' do
+ expect(UserProjectAccessChangedService).to receive(:new).with(contain_exactly(group_user.id)).and_call_original
- it 'create proper authorizations' do
subject.execute(shared_group)
-
- expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
- expect(Ability.allowed?(user, :read_project, project)).to be_truthy
- expect(Ability.allowed?(user, :read_project, project_child)).to be_truthy
end
end
- context 'parent group user' do
- let(:user) { parent_group_user }
+ context 'project authorizations' do
+ context 'group user' do
+ let(:user) { group_user }
- it 'create proper authorizations' do
- subject.execute(shared_group)
+ it 'create proper authorizations' do
+ subject.execute(shared_group)
- expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
- expect(Ability.allowed?(user, :read_project, project)).to be_falsey
- expect(Ability.allowed?(user, :read_project, project_child)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project)).to be_truthy
+ expect(Ability.allowed?(user, :read_project, project_child)).to be_truthy
+ end
end
- end
- context 'child group user' do
- let(:user) { child_group_user }
+ context 'parent group user' do
+ let(:user) { parent_group_user }
- it 'create proper authorizations' do
- subject.execute(shared_group)
+ it 'create proper authorizations' do
+ subject.execute(shared_group)
+
+ expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project_child)).to be_falsey
+ end
+ end
+
+ context 'child group user' do
+ let(:user) { child_group_user }
+
+ it 'create proper authorizations' do
+ subject.execute(shared_group)
- expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
- expect(Ability.allowed?(user, :read_project, project)).to be_falsey
- expect(Ability.allowed?(user, :read_project, project_child)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project_child)).to be_falsey
+ end
end
end
end
diff --git a/spec/services/groups/group_links/destroy_service_spec.rb b/spec/services/groups/group_links/destroy_service_spec.rb
index 22fe8a1d58b..97fe23e9147 100644
--- a/spec/services/groups/group_links/destroy_service_spec.rb
+++ b/spec/services/groups/group_links/destroy_service_spec.rb
@@ -47,8 +47,8 @@ RSpec.describe Groups::GroupLinks::DestroyService, '#execute' do
it 'updates project authorization once per group' do
expect(GroupGroupLink).to receive(:delete).and_call_original
- expect(group).to receive(:refresh_members_authorized_projects).once
- expect(another_group).to receive(:refresh_members_authorized_projects).once
+ expect(group).to receive(:refresh_members_authorized_projects).with(direct_members_only: true).once
+ expect(another_group).to receive(:refresh_members_authorized_projects).with(direct_members_only: true).once
subject.execute(links)
end
diff --git a/spec/services/groups/group_links/update_service_spec.rb b/spec/services/groups/group_links/update_service_spec.rb
index e4ff83d7926..436cdf89a0f 100644
--- a/spec/services/groups/group_links/update_service_spec.rb
+++ b/spec/services/groups/group_links/update_service_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Groups::GroupLinks::UpdateService, '#execute' do
let_it_be(:group) { create(:group, :private) }
let_it_be(:shared_group) { create(:group, :private) }
let_it_be(:project) { create(:project, group: shared_group) }
- let(:group_member) { create(:user) }
+ let(:group_member_user) { create(:user) }
let!(:link) { create(:group_group_link, shared_group: shared_group, shared_with_group: group) }
let(:expiry_date) { 1.month.from_now.to_date }
@@ -20,7 +20,7 @@ RSpec.describe Groups::GroupLinks::UpdateService, '#execute' do
subject { described_class.new(link).execute(group_link_params) }
before do
- group.add_developer(group_member)
+ group.add_developer(group_member_user)
end
it 'updates existing link' do
@@ -36,11 +36,11 @@ RSpec.describe Groups::GroupLinks::UpdateService, '#execute' do
end
it 'updates project permissions' do
- expect { subject }.to change { group_member.can?(:create_release, project) }.from(true).to(false)
+ expect { subject }.to change { group_member_user.can?(:create_release, project) }.from(true).to(false)
end
it 'executes UserProjectAccessChangedService' do
- expect_next_instance_of(UserProjectAccessChangedService) do |service|
+ expect_next_instance_of(UserProjectAccessChangedService, [group_member_user.id]) do |service|
expect(service).to receive(:execute)
end
diff --git a/spec/services/issuable/process_assignees_spec.rb b/spec/services/issuable/process_assignees_spec.rb
new file mode 100644
index 00000000000..876c84957cc
--- /dev/null
+++ b/spec/services/issuable/process_assignees_spec.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Issuable::ProcessAssignees do
+ describe '#execute' do
+ it 'returns assignee_ids when assignee_ids are specified' do
+ process = Issuable::ProcessAssignees.new(assignee_ids: %w(5 7 9),
+ add_assignee_ids: %w(2 4 6),
+ remove_assignee_ids: %w(4 7 11),
+ existing_assignee_ids: %w(1 3 9),
+ extra_assignee_ids: %w(2 5 12))
+ result = process.execute
+
+ expect(result.sort).to eq(%w(5 7 9).sort)
+ end
+
+ it 'combines other ids when assignee_ids is empty' do
+ process = Issuable::ProcessAssignees.new(assignee_ids: [],
+ add_assignee_ids: %w(2 4 6),
+ remove_assignee_ids: %w(4 7 11),
+ existing_assignee_ids: %w(1 3 11),
+ extra_assignee_ids: %w(2 5 12))
+ result = process.execute
+
+ expect(result.sort).to eq(%w(1 2 3 5 6 12).sort)
+ end
+
+ it 'combines other ids when assignee_ids is nil' do
+ process = Issuable::ProcessAssignees.new(assignee_ids: nil,
+ add_assignee_ids: %w(2 4 6),
+ remove_assignee_ids: %w(4 7 11),
+ existing_assignee_ids: %w(1 3 11),
+ extra_assignee_ids: %w(2 5 12))
+ result = process.execute
+
+ expect(result.sort).to eq(%w(1 2 3 5 6 12).sort)
+ end
+
+ it 'combines other ids when assignee_ids and add_assignee_ids are nil' do
+ process = Issuable::ProcessAssignees.new(assignee_ids: nil,
+ add_assignee_ids: nil,
+ remove_assignee_ids: %w(4 7 11),
+ existing_assignee_ids: %w(1 3 11),
+ extra_assignee_ids: %w(2 5 12))
+ result = process.execute
+
+ expect(result.sort).to eq(%w(1 2 3 5 12).sort)
+ end
+
+ it 'combines other ids when assignee_ids and remove_assignee_ids are nil' do
+ process = Issuable::ProcessAssignees.new(assignee_ids: nil,
+ add_assignee_ids: %w(2 4 6),
+ remove_assignee_ids: nil,
+ existing_assignee_ids: %w(1 3 11),
+ extra_assignee_ids: %w(2 5 12))
+ result = process.execute
+
+ expect(result.sort).to eq(%w(1 2 4 3 5 6 11 12).sort)
+ end
+
+ it 'combines ids when only add_assignee_ids and remove_assignee_ids are passed' do
+ process = Issuable::ProcessAssignees.new(assignee_ids: nil,
+ add_assignee_ids: %w(2 4 6),
+ remove_assignee_ids: %w(4 7 11))
+ result = process.execute
+
+ expect(result.sort).to eq(%w(2 6).sort)
+ end
+ end
+end
diff --git a/spec/services/issues/export_csv_service_spec.rb b/spec/services/issues/export_csv_service_spec.rb
index fd1bcf82ccd..d199f825276 100644
--- a/spec/services/issues/export_csv_service_spec.rb
+++ b/spec/services/issues/export_csv_service_spec.rb
@@ -4,11 +4,11 @@ require 'spec_helper'
RSpec.describe Issues::ExportCsvService do
let_it_be(:user) { create(:user) }
- let(:group) { create(:group) }
- let(:project) { create(:project, :public, group: group) }
- let!(:issue) { create(:issue, project: project, author: user) }
- let!(:bad_issue) { create(:issue, project: project, author: user) }
- let(:subject) { described_class.new(Issue.all, project) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, :public, group: group) }
+ let_it_be(:issue) { create(:issue, project: project, author: user) }
+ let_it_be(:bad_issue) { create(:issue, project: project, author: user) }
+ subject { described_class.new(Issue.all, project) }
it 'renders csv to string' do
expect(subject.csv_data).to be_a String
@@ -33,11 +33,11 @@ RSpec.describe Issues::ExportCsvService do
end
context 'includes' do
- let(:milestone) { create(:milestone, title: 'v1.0', project: project) }
- let(:idea_label) { create(:label, project: project, title: 'Idea') }
- let(:feature_label) { create(:label, project: project, title: 'Feature') }
+ let_it_be(:milestone) { create(:milestone, title: 'v1.0', project: project) }
+ let_it_be(:idea_label) { create(:label, project: project, title: 'Idea') }
+ let_it_be(:feature_label) { create(:label, project: project, title: 'Feature') }
- before do
+ before_all do
# Creating a timelog touches the updated_at timestamp of issue,
# so create these first.
issue.timelogs.create!(time_spent: 360, user: user)
@@ -60,6 +60,10 @@ RSpec.describe Issues::ExportCsvService do
expect(csv.headers).to include('Title', 'Description')
end
+ it 'returns two issues' do
+ expect(csv.count).to eq(2)
+ end
+
specify 'iid' do
expect(csv[0]['Issue ID']).to eq issue.iid.to_s
end
@@ -150,7 +154,7 @@ RSpec.describe Issues::ExportCsvService do
end
context 'with issues filtered by labels and project' do
- let(:subject) do
+ subject do
described_class.new(
IssuesFinder.new(user,
project_id: project.id,
@@ -162,6 +166,27 @@ RSpec.describe Issues::ExportCsvService do
expect(csv[0]['Issue ID']).to eq issue.iid.to_s
end
end
+
+ context 'with label links' do
+ let(:labeled_issues) { create_list(:labeled_issue, 2, project: project, author: user, labels: [feature_label, idea_label]) }
+
+ it 'does not run a query for each label link' do
+ control_count = ActiveRecord::QueryRecorder.new { csv }.count
+
+ labeled_issues
+
+ expect { csv }.not_to exceed_query_limit(control_count)
+ expect(csv.count).to eq(4)
+ end
+
+ it 'returns the labels in sorted order' do
+ labeled_issues
+
+ labeled_rows = csv.select { |entry| labeled_issues.map(&:iid).include?(entry['Issue ID'].to_i) }
+ expect(labeled_rows.count).to eq(2)
+ expect(labeled_rows.map { |entry| entry['Labels'] }).to all( eq("Feature,Idea") )
+ end
+ end
end
context 'with minimal details' do
diff --git a/spec/services/merge_requests/merge_service_spec.rb b/spec/services/merge_requests/merge_service_spec.rb
index 611f12c8146..80de453cd8b 100644
--- a/spec/services/merge_requests/merge_service_spec.rb
+++ b/spec/services/merge_requests/merge_service_spec.rb
@@ -166,20 +166,6 @@ RSpec.describe MergeRequests::MergeService do
service.execute(merge_request)
end
- context 'when jira_issue_transition_id is not present' do
- before do
- allow_any_instance_of(JIRA::Resource::Issue).to receive(:resolution).and_return(nil)
- end
-
- it 'does not close issue' do
- jira_tracker.update!(jira_issue_transition_id: nil)
-
- expect_any_instance_of(JiraService).not_to receive(:transition_issue)
-
- service.execute(merge_request)
- end
- end
-
context 'wrong issue markdown' do
it 'does not close issues on Jira issue tracker' do
jira_issue = ExternalIssue.new('#JIRA-123', project)
diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb
index 747ecbf4fa4..eeb782b573e 100644
--- a/spec/services/merge_requests/refresh_service_spec.rb
+++ b/spec/services/merge_requests/refresh_service_spec.rb
@@ -72,6 +72,21 @@ RSpec.describe MergeRequests::RefreshService do
allow(NotificationService).to receive(:new) { notification_service }
end
+ context 'query count' do
+ it 'does not execute a lot of queries' do
+ # Hardcoded the query limit since the queries can also be reduced even
+ # if there are the same number of merge requests (e.g. by preloading
+ # associations). This should also fail in case additional queries are
+ # added elsewhere that affected this service.
+ #
+ # The limit is based on the number of queries executed at the current
+ # state of the service. As we reduce the number of queries executed in
+ # this service, the limit should be reduced as well.
+ expect { refresh_service.execute(@oldrev, @newrev, 'refs/heads/master') }
+ .not_to exceed_query_limit(260)
+ end
+ end
+
it 'executes hooks with update action' do
refresh_service.execute(@oldrev, @newrev, 'refs/heads/master')
reload_mrs
diff --git a/spec/services/namespaces/in_product_marketing_emails_service_spec.rb b/spec/services/namespaces/in_product_marketing_emails_service_spec.rb
index 7346a5b95ae..cb2e8aff8a1 100644
--- a/spec/services/namespaces/in_product_marketing_emails_service_spec.rb
+++ b/spec/services/namespaces/in_product_marketing_emails_service_spec.rb
@@ -35,7 +35,7 @@ RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do
end
end
- context 'for each track and series with the right conditions' do
+ context 'for each track and series with the right conditions', :quarantine do # https://gitlab.com/gitlab-org/gitlab/-/issues/322092
using RSpec::Parameterized::TableSyntax
where(:track, :interval, :actions_completed) do
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index b67c37ba02d..ed9ff45ef1a 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -2159,8 +2159,38 @@ RSpec.describe NotificationService, :mailer do
end
describe '#merge_when_pipeline_succeeds' do
+ before do
+ update_custom_notification(:merge_when_pipeline_succeeds, @u_guest_custom, resource: project)
+ update_custom_notification(:merge_when_pipeline_succeeds, @u_custom_global)
+ end
+
it 'send notification that merge will happen when pipeline succeeds' do
notification.merge_when_pipeline_succeeds(merge_request, assignee)
+
+ should_email(merge_request.author)
+ should_email(@u_watcher)
+ should_email(@subscriber)
+ should_email(@u_guest_custom)
+ should_email(@u_custom_global)
+ should_not_email(@unsubscriber)
+ should_not_email(@u_disabled)
+ end
+
+ it 'does not send notification if the custom event is disabled' do
+ update_custom_notification(:merge_when_pipeline_succeeds, @u_guest_custom, resource: project, value: false)
+ update_custom_notification(:merge_when_pipeline_succeeds, @u_custom_global, resource: nil, value: false)
+ notification.merge_when_pipeline_succeeds(merge_request, assignee)
+
+ should_not_email(@u_guest_custom)
+ should_not_email(@u_custom_global)
+ end
+
+ it 'sends notification to participants even if the custom event is disabled' do
+ update_custom_notification(:merge_when_pipeline_succeeds, merge_request.author, resource: project, value: false)
+ update_custom_notification(:merge_when_pipeline_succeeds, @u_watcher, resource: project, value: false)
+ update_custom_notification(:merge_when_pipeline_succeeds, @subscriber, resource: project, value: false)
+ notification.merge_when_pipeline_succeeds(merge_request, assignee)
+
should_email(merge_request.author)
should_email(@u_watcher)
should_email(@subscriber)
diff --git a/spec/services/packages/create_temporary_package_service_spec.rb b/spec/services/packages/create_temporary_package_service_spec.rb
new file mode 100644
index 00000000000..4b8d37401d8
--- /dev/null
+++ b/spec/services/packages/create_temporary_package_service_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Packages::CreateTemporaryPackageService do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:params) { {} }
+ let_it_be(:package_name) { 'my-package' }
+ let_it_be(:package_type) { 'rubygems' }
+
+ describe '#execute' do
+ subject { described_class.new(project, user, params).execute(package_type, name: package_name) }
+
+ let(:package) { Packages::Package.last }
+
+ it 'creates the package', :aggregate_failures do
+ expect { subject }.to change { Packages::Package.count }.by(1)
+
+ expect(package).to be_valid
+ expect(package).to be_processing
+ expect(package.name).to eq(package_name)
+ expect(package.version).to start_with(described_class::PACKAGE_VERSION)
+ expect(package.package_type).to eq(package_type)
+ end
+
+ it 'can create two packages in a row', :aggregate_failures do
+ expect { subject }.to change { Packages::Package.count }.by(1)
+
+ expect do
+ described_class.new(project, user, params).execute(package_type, name: package_name)
+ end.to change { Packages::Package.count }.by(1)
+
+ expect(package).to be_valid
+ expect(package).to be_processing
+ expect(package.name).to eq(package_name)
+ expect(package.version).to start_with(described_class::PACKAGE_VERSION)
+ expect(package.package_type).to eq(package_type)
+ end
+
+ it_behaves_like 'assigns the package creator'
+ it_behaves_like 'assigns build to package'
+ end
+end
diff --git a/spec/services/packages/npm/create_package_service_spec.rb b/spec/services/packages/npm/create_package_service_spec.rb
index 10fce6c1651..ba5729eaf59 100644
--- a/spec/services/packages/npm/create_package_service_spec.rb
+++ b/spec/services/packages/npm/create_package_service_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe Packages::Npm::CreatePackageService do
end
let(:override) { {} }
- let(:package_name) { "@#{namespace.path}/my-app".freeze }
+ let(:package_name) { "@#{namespace.path}/my-app" }
subject { described_class.new(project, user, params).execute }
@@ -42,29 +42,35 @@ RSpec.describe Packages::Npm::CreatePackageService do
it { expect(subject.name).to eq(package_name) }
it { expect(subject.version).to eq(version) }
+
+ context 'with build info' do
+ let(:job) { create(:ci_build, user: user) }
+ let(:params) { super().merge(build: job) }
+
+ it_behaves_like 'assigns build to package'
+ it_behaves_like 'assigns status to package'
+
+ it 'creates a package file build info' do
+ expect { subject }.to change { Packages::PackageFileBuildInfo.count }.by(1)
+ end
+ end
end
describe '#execute' do
context 'scoped package' do
it_behaves_like 'valid package'
+ end
- context 'with build info' do
- let(:job) { create(:ci_build, user: user) }
- let(:params) { super().merge(build: job) }
-
- it_behaves_like 'assigns build to package'
- it_behaves_like 'assigns status to package'
+ context 'scoped package not following the naming convention' do
+ let(:package_name) { '@any-scope/package' }
- it 'creates a package file build info' do
- expect { subject }.to change { Packages::PackageFileBuildInfo.count }.by(1)
- end
- end
+ it_behaves_like 'valid package'
end
- context 'invalid package name' do
- let(:package_name) { "@#{namespace.path}/my-group/my-app".freeze }
+ context 'unscoped package' do
+ let(:package_name) { 'unscoped-package' }
- it { expect { subject }.to raise_error(ActiveRecord::RecordInvalid) }
+ it_behaves_like 'valid package'
end
context 'package already exists' do
@@ -84,11 +90,18 @@ RSpec.describe Packages::Npm::CreatePackageService do
it { expect(subject[:message]).to be 'File is too large.' }
end
- context 'with incorrect namespace' do
- let(:package_name) { '@my_other_namespace/my-app' }
-
- it 'raises a RecordInvalid error' do
- expect { subject }.to raise_error(ActiveRecord::RecordInvalid)
+ [
+ '@inv@lid_scope/package',
+ '@scope/sub/group',
+ '@scope/../../package',
+ '@scope%2e%2e%2fpackage'
+ ].each do |invalid_package_name|
+ context "with invalid name #{invalid_package_name}" do
+ let(:package_name) { invalid_package_name }
+
+ it 'raises a RecordInvalid error' do
+ expect { subject }.to raise_error(ActiveRecord::RecordInvalid)
+ end
end
end
diff --git a/spec/services/packages/nuget/create_package_service_spec.rb b/spec/services/packages/nuget/create_package_service_spec.rb
deleted file mode 100644
index e338ac36fc3..00000000000
--- a/spec/services/packages/nuget/create_package_service_spec.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-# frozen_string_literal: true
-require 'spec_helper'
-
-RSpec.describe Packages::Nuget::CreatePackageService do
- let_it_be(:project) { create(:project) }
- let_it_be(:user) { create(:user) }
- let_it_be(:params) { {} }
-
- describe '#execute' do
- subject { described_class.new(project, user, params).execute }
-
- let(:package) { Packages::Package.last }
-
- it 'creates the package' do
- expect { subject }.to change { Packages::Package.count }.by(1)
-
- expect(package).to be_valid
- expect(package.name).to eq(Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME)
- expect(package.version).to start_with(Packages::Nuget::CreatePackageService::PACKAGE_VERSION)
- expect(package.package_type).to eq('nuget')
- end
-
- it 'can create two packages in a row' do
- expect { subject }.to change { Packages::Package.count }.by(1)
- expect { described_class.new(project, user, params).execute }.to change { Packages::Package.count }.by(1)
-
- expect(package).to be_valid
- expect(package.name).to eq(Packages::Nuget::CreatePackageService::TEMPORARY_PACKAGE_NAME)
- expect(package.version).to start_with(Packages::Nuget::CreatePackageService::PACKAGE_VERSION)
- expect(package.package_type).to eq('nuget')
- end
-
- it_behaves_like 'assigns the package creator'
- it_behaves_like 'assigns build to package'
- it_behaves_like 'assigns status to package'
- end
-end
diff --git a/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb b/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb
index 92b493ed376..c1cce46a54c 100644
--- a/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb
+++ b/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_redis_shared_state do
include ExclusiveLeaseHelpers
- let(:package) { create(:nuget_package) }
+ let(:package) { create(:nuget_package, :processing) }
let(:package_file) { package.package_files.first }
let(:service) { described_class.new(package_file) }
let(:package_name) { 'DummyProject.DummyPackage' }
@@ -60,6 +60,7 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_
.to change { ::Packages::Package.count }.by(0)
.and change { Packages::DependencyLink.count }.by(0)
expect(package_file.reload.file_name).not_to eq(package_file_name)
+ expect(package_file.package).to be_processing
expect(package_file.package.reload.name).not_to eq(package_name)
expect(package_file.package.version).not_to eq(package_version)
end
@@ -78,6 +79,7 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_
expect(package.reload.name).to eq(package_name)
expect(package.version).to eq(package_version)
+ expect(package).to be_default
expect(package_file.reload.file_name).to eq(package_file_name)
# hard reset needed to properly reload package_file.file
expect(Packages::PackageFile.find(package_file.id).file.size).not_to eq 0
@@ -184,6 +186,7 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_
expect(package.reload.name).to eq(package_name)
expect(package.version).to eq(package_version)
+ expect(package).to be_default
expect(package_file.reload.file_name).to eq(package_file_name)
# hard reset needed to properly reload package_file.file
expect(Packages::PackageFile.find(package_file.id).file.size).not_to eq 0
diff --git a/spec/services/pages/legacy_storage_lease_spec.rb b/spec/services/pages/legacy_storage_lease_spec.rb
index c022da6f47f..092dce093ff 100644
--- a/spec/services/pages/legacy_storage_lease_spec.rb
+++ b/spec/services/pages/legacy_storage_lease_spec.rb
@@ -47,14 +47,6 @@ RSpec.describe ::Pages::LegacyStorageLease do
expect(service.execute).to eq(nil)
end
-
- it 'runs guarded method if feature flag is disabled' do
- stub_feature_flags(pages_use_legacy_storage_lease: false)
-
- expect(service).to receive(:execute_unsafe).and_call_original
-
- expect(service.execute).to eq(true)
- end
end
context 'when another service holds the lease for the different project' do
diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb
index f7da6f75141..306d87eefb8 100644
--- a/spec/services/projects/create_service_spec.rb
+++ b/spec/services/projects/create_service_spec.rb
@@ -349,27 +349,38 @@ RSpec.describe Projects::CreateService, '#execute' do
context 'default visibility level' do
let(:group) { create(:group, :private) }
- before do
- stub_application_setting(default_project_visibility: Gitlab::VisibilityLevel::INTERNAL)
- group.add_developer(user)
+ using RSpec::Parameterized::TableSyntax
- opts.merge!(
- visibility: 'private',
- name: 'test',
- namespace: group,
- path: 'foo'
- )
+ where(:case_name, :group_level, :project_level) do
+ [
+ ['in public group', Gitlab::VisibilityLevel::PUBLIC, Gitlab::VisibilityLevel::INTERNAL],
+ ['in internal group', Gitlab::VisibilityLevel::INTERNAL, Gitlab::VisibilityLevel::INTERNAL],
+ ['in private group', Gitlab::VisibilityLevel::PRIVATE, Gitlab::VisibilityLevel::PRIVATE]
+ ]
end
- it 'creates a private project' do
- project = create_project(user, opts)
+ with_them do
+ before do
+ stub_application_setting(default_project_visibility: Gitlab::VisibilityLevel::INTERNAL)
+ group.add_developer(user)
+ group.update!(visibility_level: group_level)
- expect(project).to respond_to(:errors)
+ opts.merge!(
+ name: 'test',
+ namespace: group,
+ path: 'foo'
+ )
+ end
- expect(project.errors.any?).to be(false)
- expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE)
- expect(project.saved?).to be(true)
- expect(project.valid?).to be(true)
+ it 'creates project with correct visibility level', :aggregate_failures do
+ project = create_project(user, opts)
+
+ expect(project).to respond_to(:errors)
+ expect(project.errors).to be_blank
+ expect(project.visibility_level).to eq(project_level)
+ expect(project).to be_saved
+ expect(project).to be_valid
+ end
end
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 64c1479a412..2c745a0a70c 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -249,9 +249,6 @@ RSpec.configure do |config|
unstub_all_feature_flags
end
- # Enable Marginalia feature for all specs in the test suite.
- Gitlab::Marginalia.enabled = true
-
# Stub these calls due to being expensive operations
# It can be reenabled for specific tests via:
#
diff --git a/spec/support/shared_contexts/project_service_jira_context.rb b/spec/support/shared_contexts/project_service_jira_context.rb
index 8e01de70846..54bb9fd108e 100644
--- a/spec/support/shared_contexts/project_service_jira_context.rb
+++ b/spec/support/shared_contexts/project_service_jira_context.rb
@@ -1,8 +1,8 @@
# frozen_string_literal: true
RSpec.shared_context 'project service Jira context' do
- let(:url) { 'http://jira.example.com' }
- let(:test_url) { 'http://jira.example.com/rest/api/2/serverInfo' }
+ let(:url) { 'https://jira.example.com' }
+ let(:test_url) { 'https://jira.example.com/rest/api/2/serverInfo' }
def fill_form(disable: false)
click_active_checkbox if disable
@@ -10,6 +10,5 @@ RSpec.shared_context 'project service Jira context' do
fill_in 'service_url', with: url
fill_in 'service_username', with: 'username'
fill_in 'service_password', with: 'password'
- fill_in 'service_jira_issue_transition_id', with: '25'
end
end
diff --git a/spec/support/shared_contexts/project_service_shared_context.rb b/spec/support/shared_contexts/project_service_shared_context.rb
index b4b9ab456e0..a8e75c624e8 100644
--- a/spec/support/shared_contexts/project_service_shared_context.rb
+++ b/spec/support/shared_contexts/project_service_shared_context.rb
@@ -15,7 +15,10 @@ RSpec.shared_context 'project service activation' do
def visit_project_integration(name)
visit_project_integrations
- click_link(name)
+
+ within('#content-body') do
+ click_link(name)
+ end
end
def click_active_checkbox
diff --git a/spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb b/spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb
index 60a29d78084..815108be447 100644
--- a/spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb
+++ b/spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb
@@ -5,8 +5,9 @@ RSpec.shared_context 'npm api setup' do
include HttpBasicAuthHelpers
let_it_be(:user, reload: true) { create(:user) }
- let_it_be(:group) { create(:group) }
- let_it_be(:project, reload: true) { create(:project, :public, namespace: group) }
+ let_it_be(:group) { create(:group, name: 'test-group') }
+ let_it_be(:namespace) { group }
+ let_it_be(:project, reload: true) { create(:project, :public, namespace: namespace) }
let_it_be(:package, reload: true) { create(:npm_package, project: project, name: "@#{group.path}/scoped_package") }
let_it_be(:token) { create(:oauth_access_token, scopes: 'api', resource_owner: user) }
let_it_be(:personal_access_token) { create(:personal_access_token, user: user) }
@@ -22,6 +23,10 @@ RSpec.shared_context 'set package name from package name type' do
case package_name_type
when :scoped_naming_convention
"@#{group.path}/scoped-package"
+ when :scoped_no_naming_convention
+ '@any-scope/scoped-package'
+ when :unscoped
+ 'unscoped-package'
when :non_existing
'non-existing-package'
end
diff --git a/spec/support/shared_contexts/security_and_compliance_permissions_shared_context.rb b/spec/support/shared_contexts/security_and_compliance_permissions_shared_context.rb
new file mode 100644
index 00000000000..dc5195e4b01
--- /dev/null
+++ b/spec/support/shared_contexts/security_and_compliance_permissions_shared_context.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+RSpec.shared_context '"Security & Compliance" permissions' do
+ let(:project_instance) { an_instance_of(Project) }
+ let(:user_instance) { an_instance_of(User) }
+ let(:before_request_defined) { false }
+ let(:valid_request) {}
+
+ def self.before_request(&block)
+ return unless block
+
+ let(:before_request_call) { instance_exec(&block) }
+ let(:before_request_defined) { true }
+ end
+
+ before do
+ allow(Ability).to receive(:allowed?).and_call_original
+ allow(Ability).to receive(:allowed?).with(user_instance, :access_security_and_compliance, project_instance).and_return(true)
+ end
+
+ context 'when the "Security & Compliance" feature is disabled' do
+ subject { response }
+
+ before do
+ before_request_call if before_request_defined
+
+ allow(Ability).to receive(:allowed?).with(user_instance, :access_security_and_compliance, project_instance).and_return(false)
+ valid_request
+ end
+
+ it { is_expected.to have_gitlab_http_status(:not_found) }
+ end
+end
diff --git a/spec/support/shared_examples/controllers/create_notes_rate_limit_shared_examples.rb b/spec/support/shared_examples/controllers/create_notes_rate_limit_shared_examples.rb
new file mode 100644
index 00000000000..74a98c20383
--- /dev/null
+++ b/spec/support/shared_examples/controllers/create_notes_rate_limit_shared_examples.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+#
+# Requires a context containing:
+# - user
+# - params
+# - request_full_path
+
+RSpec.shared_examples 'request exceeding rate limit' do
+ before do
+ stub_application_setting(notes_create_limit: 2)
+ 2.times { post :create, params: params }
+ end
+
+ it 'prevents from creating more notes', :request_store do
+ expect { post :create, params: params }
+ .to change { Note.count }.by(0)
+
+ expect(response).to have_gitlab_http_status(:too_many_requests)
+ expect(response.body).to eq(_('This endpoint has been requested too many times. Try again later.'))
+ end
+
+ it 'logs the event in auth.log' do
+ attributes = {
+ message: 'Application_Rate_Limiter_Request',
+ env: :notes_create_request_limit,
+ remote_ip: '0.0.0.0',
+ request_method: 'POST',
+ path: request_full_path,
+ user_id: user.id,
+ username: user.username
+ }
+
+ expect(Gitlab::AuthLogger).to receive(:error).with(attributes).once
+ post :create, params: params
+ end
+
+ it 'allows user in allow-list to create notes, even if the case is different' do
+ user.update_attribute(:username, user.username.titleize)
+ stub_application_setting(notes_create_limit_allowlist: ["#{user.username.downcase}"])
+
+ post :create, params: params
+ expect(response).to have_gitlab_http_status(:found)
+ end
+end
diff --git a/spec/support/shared_examples/features/project_upload_files_shared_examples.rb b/spec/support/shared_examples/features/project_upload_files_shared_examples.rb
index 25203fa3182..4411c91d479 100644
--- a/spec/support/shared_examples/features/project_upload_files_shared_examples.rb
+++ b/spec/support/shared_examples/features/project_upload_files_shared_examples.rb
@@ -3,7 +3,13 @@
RSpec.shared_examples 'it uploads and commit a new text file' do
it 'uploads and commit a new text file', :js do
find('.add-to-tree').click
- click_link('Upload file')
+
+ page.within('.dropdown-menu') do
+ click_link('Upload file')
+
+ wait_for_requests
+ end
+
drop_in_dropzone(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'))
page.within('#modal-upload-blob') do
@@ -29,7 +35,13 @@ end
RSpec.shared_examples 'it uploads and commit a new image file' do
it 'uploads and commit a new image file', :js do
find('.add-to-tree').click
- click_link('Upload file')
+
+ page.within('.dropdown-menu') do
+ click_link('Upload file')
+
+ wait_for_requests
+ end
+
drop_in_dropzone(File.join(Rails.root, 'spec', 'fixtures', 'logo_sample.svg'))
page.within('#modal-upload-blob') do
diff --git a/spec/support/shared_examples/helpers/issuable_description_templates_shared_examples.rb b/spec/support/shared_examples/helpers/issuable_description_templates_shared_examples.rb
index 9e8c96d576a..47e34b21036 100644
--- a/spec/support/shared_examples/helpers/issuable_description_templates_shared_examples.rb
+++ b/spec/support/shared_examples/helpers/issuable_description_templates_shared_examples.rb
@@ -23,11 +23,11 @@ RSpec.shared_examples 'project issuable templates' do
end
it 'returns only md files as issue templates' do
- expect(helper.issuable_templates(project, 'issue')).to eq(templates('issue', project))
+ expect(helper.issuable_templates(project, 'issue')).to eq(expected_templates('issue'))
end
it 'returns only md files as merge_request templates' do
- expect(helper.issuable_templates(project, 'merge_request')).to eq(templates('merge_request', project))
+ expect(helper.issuable_templates(project, 'merge_request')).to eq(expected_templates('merge_request'))
end
end
diff --git a/spec/support/shared_examples/models/slack_mattermost_notifications_shared_examples.rb b/spec/support/shared_examples/models/slack_mattermost_notifications_shared_examples.rb
index a1867e1ce39..e31c39d7e1b 100644
--- a/spec/support/shared_examples/models/slack_mattermost_notifications_shared_examples.rb
+++ b/spec/support/shared_examples/models/slack_mattermost_notifications_shared_examples.rb
@@ -7,7 +7,7 @@ RSpec.shared_examples 'slack or mattermost notifications' do |service_name|
let(:webhook_url) { 'https://example.gitlab.com' }
def execute_with_options(options)
- receive(:new).with(webhook_url, options.merge(http_client: SlackService::Notifier::HTTPClient))
+ receive(:new).with(webhook_url, options.merge(http_client: SlackMattermost::Notifier::HTTPClient))
.and_return(double(:slack_service).as_null_object)
end
diff --git a/spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb
index be051dcbb7b..c15c59e1a1d 100644
--- a/spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb
@@ -45,136 +45,234 @@ RSpec.shared_examples 'handling get metadata requests' do |scope: :project|
end
end
- where(:auth, :package_name_type, :request_forward, :visibility, :user_role, :expected_result, :expected_status) do
- nil | :scoped_naming_convention | true | 'PUBLIC' | nil | :accept | :ok
- nil | :scoped_naming_convention | false | 'PUBLIC' | nil | :accept | :ok
- nil | :non_existing | true | 'PUBLIC' | nil | :redirect | :redirected
- nil | :non_existing | false | 'PUBLIC' | nil | :reject | :not_found
- nil | :scoped_naming_convention | true | 'PRIVATE' | nil | :reject | :not_found
- nil | :scoped_naming_convention | false | 'PRIVATE' | nil | :reject | :not_found
- nil | :non_existing | true | 'PRIVATE' | nil | :redirect | :redirected
- nil | :non_existing | false | 'PRIVATE' | nil | :reject | :not_found
- nil | :scoped_naming_convention | true | 'INTERNAL' | nil | :reject | :not_found
- nil | :scoped_naming_convention | false | 'INTERNAL' | nil | :reject | :not_found
- nil | :non_existing | true | 'INTERNAL' | nil | :redirect | :redirected
- nil | :non_existing | false | 'INTERNAL' | nil | :reject | :not_found
-
- :oauth | :scoped_naming_convention | true | 'PUBLIC' | :guest | :accept | :ok
- :oauth | :scoped_naming_convention | true | 'PUBLIC' | :reporter | :accept | :ok
- :oauth | :scoped_naming_convention | false | 'PUBLIC' | :guest | :accept | :ok
- :oauth | :scoped_naming_convention | false | 'PUBLIC' | :reporter | :accept | :ok
- :oauth | :non_existing | true | 'PUBLIC' | :guest | :redirect | :redirected
- :oauth | :non_existing | true | 'PUBLIC' | :reporter | :redirect | :redirected
- :oauth | :non_existing | false | 'PUBLIC' | :guest | :reject | :not_found
- :oauth | :non_existing | false | 'PUBLIC' | :reporter | :reject | :not_found
- :oauth | :scoped_naming_convention | true | 'PRIVATE' | :guest | :reject | :forbidden
- :oauth | :scoped_naming_convention | true | 'PRIVATE' | :reporter | :accept | :ok
- :oauth | :scoped_naming_convention | false | 'PRIVATE' | :guest | :reject | :forbidden
- :oauth | :scoped_naming_convention | false | 'PRIVATE' | :reporter | :accept | :ok
- :oauth | :non_existing | true | 'PRIVATE' | :guest | :redirect | :redirected
- :oauth | :non_existing | true | 'PRIVATE' | :reporter | :redirect | :redirected
- :oauth | :non_existing | false | 'PRIVATE' | :guest | :reject | :forbidden
- :oauth | :non_existing | false | 'PRIVATE' | :reporter | :reject | :not_found
- :oauth | :scoped_naming_convention | true | 'INTERNAL' | :guest | :accept | :ok
- :oauth | :scoped_naming_convention | true | 'INTERNAL' | :reporter | :accept | :ok
- :oauth | :scoped_naming_convention | false | 'INTERNAL' | :guest | :accept | :ok
- :oauth | :scoped_naming_convention | false | 'INTERNAL' | :reporter | :accept | :ok
- :oauth | :non_existing | true | 'INTERNAL' | :guest | :redirect | :redirected
- :oauth | :non_existing | true | 'INTERNAL' | :reporter | :redirect | :redirected
- :oauth | :non_existing | false | 'INTERNAL' | :guest | :reject | :not_found
- :oauth | :non_existing | false | 'INTERNAL' | :reporter | :reject | :not_found
-
- :personal_access_token | :scoped_naming_convention | true | 'PUBLIC' | :guest | :accept | :ok
- :personal_access_token | :scoped_naming_convention | true | 'PUBLIC' | :reporter | :accept | :ok
- :personal_access_token | :scoped_naming_convention | false | 'PUBLIC' | :guest | :accept | :ok
- :personal_access_token | :scoped_naming_convention | false | 'PUBLIC' | :reporter | :accept | :ok
- :personal_access_token | :non_existing | true | 'PUBLIC' | :guest | :redirect | :redirected
- :personal_access_token | :non_existing | true | 'PUBLIC' | :reporter | :redirect | :redirected
- :personal_access_token | :non_existing | false | 'PUBLIC' | :guest | :reject | :not_found
- :personal_access_token | :non_existing | false | 'PUBLIC' | :reporter | :reject | :not_found
- :personal_access_token | :scoped_naming_convention | true | 'PRIVATE' | :guest | :reject | :forbidden
- :personal_access_token | :scoped_naming_convention | true | 'PRIVATE' | :reporter | :accept | :ok
- :personal_access_token | :scoped_naming_convention | false | 'PRIVATE' | :guest | :reject | :forbidden
- :personal_access_token | :scoped_naming_convention | false | 'PRIVATE' | :reporter | :accept | :ok
- :personal_access_token | :non_existing | true | 'PRIVATE' | :guest | :redirect | :redirected
- :personal_access_token | :non_existing | true | 'PRIVATE' | :reporter | :redirect | :redirected
- :personal_access_token | :non_existing | false | 'PRIVATE' | :guest | :reject | :forbidden
- :personal_access_token | :non_existing | false | 'PRIVATE' | :reporter | :reject | :not_found
- :personal_access_token | :scoped_naming_convention | true | 'INTERNAL' | :guest | :accept | :ok
- :personal_access_token | :scoped_naming_convention | true | 'INTERNAL' | :reporter | :accept | :ok
- :personal_access_token | :scoped_naming_convention | false | 'INTERNAL' | :guest | :accept | :ok
- :personal_access_token | :scoped_naming_convention | false | 'INTERNAL' | :reporter | :accept | :ok
- :personal_access_token | :non_existing | true | 'INTERNAL' | :guest | :redirect | :redirected
- :personal_access_token | :non_existing | true | 'INTERNAL' | :reporter | :redirect | :redirected
- :personal_access_token | :non_existing | false | 'INTERNAL' | :guest | :reject | :not_found
- :personal_access_token | :non_existing | false | 'INTERNAL' | :reporter | :reject | :not_found
-
- :job_token | :scoped_naming_convention | true | 'PUBLIC' | :developer | :accept | :ok
- :job_token | :scoped_naming_convention | false | 'PUBLIC' | :developer | :accept | :ok
- :job_token | :non_existing | true | 'PUBLIC' | :developer | :redirect | :redirected
- :job_token | :non_existing | false | 'PUBLIC' | :developer | :reject | :not_found
- :job_token | :scoped_naming_convention | true | 'PRIVATE' | :developer | :accept | :ok
- :job_token | :scoped_naming_convention | false | 'PRIVATE' | :developer | :accept | :ok
- :job_token | :non_existing | true | 'PRIVATE' | :developer | :redirect | :redirected
- :job_token | :non_existing | false | 'PRIVATE' | :developer | :reject | :not_found
- :job_token | :scoped_naming_convention | true | 'INTERNAL' | :developer | :accept | :ok
- :job_token | :scoped_naming_convention | false | 'INTERNAL' | :developer | :accept | :ok
- :job_token | :non_existing | true | 'INTERNAL' | :developer | :redirect | :redirected
- :job_token | :non_existing | false | 'INTERNAL' | :developer | :reject | :not_found
-
- :deploy_token | :scoped_naming_convention | true | 'PUBLIC' | nil | :accept | :ok
- :deploy_token | :scoped_naming_convention | false | 'PUBLIC' | nil | :accept | :ok
- :deploy_token | :non_existing | true | 'PUBLIC' | nil | :redirect | :redirected
- :deploy_token | :non_existing | false | 'PUBLIC' | nil | :reject | :not_found
- :deploy_token | :scoped_naming_convention | true | 'PRIVATE' | nil | :accept | :ok
- :deploy_token | :scoped_naming_convention | false | 'PRIVATE' | nil | :accept | :ok
- :deploy_token | :non_existing | true | 'PRIVATE' | nil | :redirect | :redirected
- :deploy_token | :non_existing | false | 'PRIVATE' | nil | :reject | :not_found
- :deploy_token | :scoped_naming_convention | true | 'INTERNAL' | nil | :accept | :ok
- :deploy_token | :scoped_naming_convention | false | 'INTERNAL' | nil | :accept | :ok
- :deploy_token | :non_existing | true | 'INTERNAL' | nil | :redirect | :redirected
- :deploy_token | :non_existing | false | 'INTERNAL' | nil | :reject | :not_found
- end
+ shared_examples 'handling all conditions' do
+ where(:auth, :package_name_type, :request_forward, :visibility, :user_role, :expected_result, :expected_status) do
+ nil | :scoped_naming_convention | true | :public | nil | :accept | :ok
+ nil | :scoped_naming_convention | false | :public | nil | :accept | :ok
+ nil | :scoped_no_naming_convention | true | :public | nil | :accept | :ok
+ nil | :scoped_no_naming_convention | false | :public | nil | :accept | :ok
+ nil | :unscoped | true | :public | nil | :accept | :ok
+ nil | :unscoped | false | :public | nil | :accept | :ok
+ nil | :non_existing | true | :public | nil | :redirect | :redirected
+ nil | :non_existing | false | :public | nil | :reject | :not_found
+ nil | :scoped_naming_convention | true | :private | nil | :reject | :not_found
+ nil | :scoped_naming_convention | false | :private | nil | :reject | :not_found
+ nil | :scoped_no_naming_convention | true | :private | nil | :reject | :not_found
+ nil | :scoped_no_naming_convention | false | :private | nil | :reject | :not_found
+ nil | :unscoped | true | :private | nil | :reject | :not_found
+ nil | :unscoped | false | :private | nil | :reject | :not_found
+ nil | :non_existing | true | :private | nil | :redirect | :redirected
+ nil | :non_existing | false | :private | nil | :reject | :not_found
+ nil | :scoped_naming_convention | true | :internal | nil | :reject | :not_found
+ nil | :scoped_naming_convention | false | :internal | nil | :reject | :not_found
+ nil | :scoped_no_naming_convention | true | :internal | nil | :reject | :not_found
+ nil | :scoped_no_naming_convention | false | :internal | nil | :reject | :not_found
+ nil | :unscoped | true | :internal | nil | :reject | :not_found
+ nil | :unscoped | false | :internal | nil | :reject | :not_found
+ nil | :non_existing | true | :internal | nil | :redirect | :redirected
+ nil | :non_existing | false | :internal | nil | :reject | :not_found
+
+ :oauth | :scoped_naming_convention | true | :public | :guest | :accept | :ok
+ :oauth | :scoped_naming_convention | true | :public | :reporter | :accept | :ok
+ :oauth | :scoped_naming_convention | false | :public | :guest | :accept | :ok
+ :oauth | :scoped_naming_convention | false | :public | :reporter | :accept | :ok
+ :oauth | :scoped_no_naming_convention | true | :public | :guest | :accept | :ok
+ :oauth | :scoped_no_naming_convention | true | :public | :reporter | :accept | :ok
+ :oauth | :scoped_no_naming_convention | false | :public | :guest | :accept | :ok
+ :oauth | :scoped_no_naming_convention | false | :public | :reporter | :accept | :ok
+ :oauth | :unscoped | true | :public | :guest | :accept | :ok
+ :oauth | :unscoped | true | :public | :reporter | :accept | :ok
+ :oauth | :unscoped | false | :public | :guest | :accept | :ok
+ :oauth | :unscoped | false | :public | :reporter | :accept | :ok
+ :oauth | :non_existing | true | :public | :guest | :redirect | :redirected
+ :oauth | :non_existing | true | :public | :reporter | :redirect | :redirected
+ :oauth | :non_existing | false | :public | :guest | :reject | :not_found
+ :oauth | :non_existing | false | :public | :reporter | :reject | :not_found
+ :oauth | :scoped_naming_convention | true | :private | :guest | :reject | :forbidden
+ :oauth | :scoped_naming_convention | true | :private | :reporter | :accept | :ok
+ :oauth | :scoped_naming_convention | false | :private | :guest | :reject | :forbidden
+ :oauth | :scoped_naming_convention | false | :private | :reporter | :accept | :ok
+ :oauth | :scoped_no_naming_convention | true | :private | :guest | :reject | :forbidden
+ :oauth | :scoped_no_naming_convention | true | :private | :reporter | :accept | :ok
+ :oauth | :scoped_no_naming_convention | false | :private | :guest | :reject | :forbidden
+ :oauth | :scoped_no_naming_convention | false | :private | :reporter | :accept | :ok
+ :oauth | :unscoped | true | :private | :guest | :reject | :forbidden
+ :oauth | :unscoped | true | :private | :reporter | :accept | :ok
+ :oauth | :unscoped | false | :private | :guest | :reject | :forbidden
+ :oauth | :unscoped | false | :private | :reporter | :accept | :ok
+ :oauth | :non_existing | true | :private | :guest | :redirect | :redirected
+ :oauth | :non_existing | true | :private | :reporter | :redirect | :redirected
+ :oauth | :non_existing | false | :private | :guest | :reject | :forbidden
+ :oauth | :non_existing | false | :private | :reporter | :reject | :not_found
+ :oauth | :scoped_naming_convention | true | :internal | :guest | :accept | :ok
+ :oauth | :scoped_naming_convention | true | :internal | :reporter | :accept | :ok
+ :oauth | :scoped_naming_convention | false | :internal | :guest | :accept | :ok
+ :oauth | :scoped_naming_convention | false | :internal | :reporter | :accept | :ok
+ :oauth | :scoped_no_naming_convention | true | :internal | :guest | :accept | :ok
+ :oauth | :scoped_no_naming_convention | true | :internal | :reporter | :accept | :ok
+ :oauth | :scoped_no_naming_convention | false | :internal | :guest | :accept | :ok
+ :oauth | :scoped_no_naming_convention | false | :internal | :reporter | :accept | :ok
+ :oauth | :unscoped | true | :internal | :guest | :accept | :ok
+ :oauth | :unscoped | true | :internal | :reporter | :accept | :ok
+ :oauth | :unscoped | false | :internal | :guest | :accept | :ok
+ :oauth | :unscoped | false | :internal | :reporter | :accept | :ok
+ :oauth | :non_existing | true | :internal | :guest | :redirect | :redirected
+ :oauth | :non_existing | true | :internal | :reporter | :redirect | :redirected
+ :oauth | :non_existing | false | :internal | :guest | :reject | :not_found
+ :oauth | :non_existing | false | :internal | :reporter | :reject | :not_found
+
+ :personal_access_token | :scoped_naming_convention | true | :public | :guest | :accept | :ok
+ :personal_access_token | :scoped_naming_convention | true | :public | :reporter | :accept | :ok
+ :personal_access_token | :scoped_naming_convention | false | :public | :guest | :accept | :ok
+ :personal_access_token | :scoped_naming_convention | false | :public | :reporter | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | true | :public | :guest | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | true | :public | :reporter | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | false | :public | :guest | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | false | :public | :reporter | :accept | :ok
+ :personal_access_token | :unscoped | true | :public | :guest | :accept | :ok
+ :personal_access_token | :unscoped | true | :public | :reporter | :accept | :ok
+ :personal_access_token | :unscoped | false | :public | :guest | :accept | :ok
+ :personal_access_token | :unscoped | false | :public | :reporter | :accept | :ok
+ :personal_access_token | :non_existing | true | :public | :guest | :redirect | :redirected
+ :personal_access_token | :non_existing | true | :public | :reporter | :redirect | :redirected
+ :personal_access_token | :non_existing | false | :public | :guest | :reject | :not_found
+ :personal_access_token | :non_existing | false | :public | :reporter | :reject | :not_found
+ :personal_access_token | :scoped_naming_convention | true | :private | :guest | :reject | :forbidden
+ :personal_access_token | :scoped_naming_convention | true | :private | :reporter | :accept | :ok
+ :personal_access_token | :scoped_naming_convention | false | :private | :guest | :reject | :forbidden
+ :personal_access_token | :scoped_naming_convention | false | :private | :reporter | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | true | :private | :guest | :reject | :forbidden
+ :personal_access_token | :scoped_no_naming_convention | true | :private | :reporter | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | false | :private | :guest | :reject | :forbidden
+ :personal_access_token | :scoped_no_naming_convention | false | :private | :reporter | :accept | :ok
+ :personal_access_token | :unscoped | true | :private | :guest | :reject | :forbidden
+ :personal_access_token | :unscoped | true | :private | :reporter | :accept | :ok
+ :personal_access_token | :unscoped | false | :private | :guest | :reject | :forbidden
+ :personal_access_token | :unscoped | false | :private | :reporter | :accept | :ok
+ :personal_access_token | :non_existing | true | :private | :guest | :redirect | :redirected
+ :personal_access_token | :non_existing | true | :private | :reporter | :redirect | :redirected
+ :personal_access_token | :non_existing | false | :private | :guest | :reject | :forbidden
+ :personal_access_token | :non_existing | false | :private | :reporter | :reject | :not_found
+ :personal_access_token | :scoped_naming_convention | true | :internal | :guest | :accept | :ok
+ :personal_access_token | :scoped_naming_convention | true | :internal | :reporter | :accept | :ok
+ :personal_access_token | :scoped_naming_convention | false | :internal | :guest | :accept | :ok
+ :personal_access_token | :scoped_naming_convention | false | :internal | :reporter | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | true | :internal | :guest | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | true | :internal | :reporter | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | false | :internal | :guest | :accept | :ok
+ :personal_access_token | :scoped_no_naming_convention | false | :internal | :reporter | :accept | :ok
+ :personal_access_token | :unscoped | true | :internal | :guest | :accept | :ok
+ :personal_access_token | :unscoped | true | :internal | :reporter | :accept | :ok
+ :personal_access_token | :unscoped | false | :internal | :guest | :accept | :ok
+ :personal_access_token | :unscoped | false | :internal | :reporter | :accept | :ok
+ :personal_access_token | :non_existing | true | :internal | :guest | :redirect | :redirected
+ :personal_access_token | :non_existing | true | :internal | :reporter | :redirect | :redirected
+ :personal_access_token | :non_existing | false | :internal | :guest | :reject | :not_found
+ :personal_access_token | :non_existing | false | :internal | :reporter | :reject | :not_found
+
+ :job_token | :scoped_naming_convention | true | :public | :developer | :accept | :ok
+ :job_token | :scoped_naming_convention | false | :public | :developer | :accept | :ok
+ :job_token | :scoped_no_naming_convention | true | :public | :developer | :accept | :ok
+ :job_token | :scoped_no_naming_convention | false | :public | :developer | :accept | :ok
+ :job_token | :unscoped | true | :public | :developer | :accept | :ok
+ :job_token | :unscoped | false | :public | :developer | :accept | :ok
+ :job_token | :non_existing | true | :public | :developer | :redirect | :redirected
+ :job_token | :non_existing | false | :public | :developer | :reject | :not_found
+ :job_token | :scoped_naming_convention | true | :private | :developer | :accept | :ok
+ :job_token | :scoped_naming_convention | false | :private | :developer | :accept | :ok
+ :job_token | :scoped_no_naming_convention | true | :private | :developer | :accept | :ok
+ :job_token | :scoped_no_naming_convention | false | :private | :developer | :accept | :ok
+ :job_token | :unscoped | true | :private | :developer | :accept | :ok
+ :job_token | :unscoped | false | :private | :developer | :accept | :ok
+ :job_token | :non_existing | true | :private | :developer | :redirect | :redirected
+ :job_token | :non_existing | false | :private | :developer | :reject | :not_found
+ :job_token | :scoped_naming_convention | true | :internal | :developer | :accept | :ok
+ :job_token | :scoped_naming_convention | false | :internal | :developer | :accept | :ok
+ :job_token | :scoped_no_naming_convention | true | :internal | :developer | :accept | :ok
+ :job_token | :scoped_no_naming_convention | false | :internal | :developer | :accept | :ok
+ :job_token | :unscoped | true | :internal | :developer | :accept | :ok
+ :job_token | :unscoped | false | :internal | :developer | :accept | :ok
+ :job_token | :non_existing | true | :internal | :developer | :redirect | :redirected
+ :job_token | :non_existing | false | :internal | :developer | :reject | :not_found
+
+ :deploy_token | :scoped_naming_convention | true | :public | nil | :accept | :ok
+ :deploy_token | :scoped_naming_convention | false | :public | nil | :accept | :ok
+ :deploy_token | :scoped_no_naming_convention | true | :public | nil | :accept | :ok
+ :deploy_token | :scoped_no_naming_convention | false | :public | nil | :accept | :ok
+ :deploy_token | :unscoped | true | :public | nil | :accept | :ok
+ :deploy_token | :unscoped | false | :public | nil | :accept | :ok
+ :deploy_token | :non_existing | true | :public | nil | :redirect | :redirected
+ :deploy_token | :non_existing | false | :public | nil | :reject | :not_found
+ :deploy_token | :scoped_naming_convention | true | :private | nil | :accept | :ok
+ :deploy_token | :scoped_naming_convention | false | :private | nil | :accept | :ok
+ :deploy_token | :scoped_no_naming_convention | true | :private | nil | :accept | :ok
+ :deploy_token | :scoped_no_naming_convention | false | :private | nil | :accept | :ok
+ :deploy_token | :unscoped | true | :private | nil | :accept | :ok
+ :deploy_token | :unscoped | false | :private | nil | :accept | :ok
+ :deploy_token | :non_existing | true | :private | nil | :redirect | :redirected
+ :deploy_token | :non_existing | false | :private | nil | :reject | :not_found
+ :deploy_token | :scoped_naming_convention | true | :internal | nil | :accept | :ok
+ :deploy_token | :scoped_naming_convention | false | :internal | nil | :accept | :ok
+ :deploy_token | :scoped_no_naming_convention | true | :internal | nil | :accept | :ok
+ :deploy_token | :scoped_no_naming_convention | false | :internal | nil | :accept | :ok
+ :deploy_token | :unscoped | true | :internal | nil | :accept | :ok
+ :deploy_token | :unscoped | false | :internal | nil | :accept | :ok
+ :deploy_token | :non_existing | true | :internal | nil | :redirect | :redirected
+ :deploy_token | :non_existing | false | :internal | nil | :reject | :not_found
+ end
- with_them do
- include_context 'set package name from package name type'
-
- let(:headers) do
- case auth
- when :oauth
- build_token_auth_header(token.token)
- when :personal_access_token
- build_token_auth_header(personal_access_token.token)
- when :job_token
- build_token_auth_header(job.token)
- when :deploy_token
- build_token_auth_header(deploy_token.token)
- else
- {}
+ with_them do
+ include_context 'set package name from package name type'
+
+ let(:headers) do
+ case auth
+ when :oauth
+ build_token_auth_header(token.token)
+ when :personal_access_token
+ build_token_auth_header(personal_access_token.token)
+ when :job_token
+ build_token_auth_header(job.token)
+ when :deploy_token
+ build_token_auth_header(deploy_token.token)
+ else
+ {}
+ end
end
- end
- before do
- project.send("add_#{user_role}", user) if user_role
- project.update!(visibility: Gitlab::VisibilityLevel.const_get(visibility, false))
- package.update!(name: package_name) unless package_name == 'non-existing-package'
- stub_application_setting(npm_package_requests_forwarding: request_forward)
- end
+ before do
+ project.send("add_#{user_role}", user) if user_role
+ project.update!(visibility: visibility.to_s)
+ package.update!(name: package_name) unless package_name == 'non-existing-package'
+ stub_application_setting(npm_package_requests_forwarding: request_forward)
+ end
- example_name = "#{params[:expected_result]} metadata request"
- status = params[:expected_status]
+ example_name = "#{params[:expected_result]} metadata request"
+ status = params[:expected_status]
- if scope == :instance && params[:package_name_type] != :scoped_naming_convention
- if params[:request_forward]
- example_name = 'redirect metadata request'
- status = :redirected
- else
- example_name = 'reject metadata request'
- status = :not_found
+ if scope == :instance && params[:package_name_type] != :scoped_naming_convention
+ if params[:request_forward]
+ example_name = 'redirect metadata request'
+ status = :redirected
+ else
+ example_name = 'reject metadata request'
+ status = :not_found
+ end
end
+
+ it_behaves_like example_name, status: status
end
+ end
- it_behaves_like example_name, status: status
+ context 'with a group namespace' do
+ it_behaves_like 'handling all conditions'
+ end
+
+ if scope != :project
+ context 'with a user namespace' do
+ let_it_be(:namespace) { user.namespace }
+
+ it_behaves_like 'handling all conditions'
+ end
end
context 'with a developer' do
@@ -225,26 +323,44 @@ RSpec.shared_examples 'handling get dist tags requests' do |scope: :project|
shared_examples 'handling different package names, visibilities and user roles' do
where(:package_name_type, :visibility, :user_role, :expected_result, :expected_status) do
- :scoped_naming_convention | 'PUBLIC' | :anonymous | :accept | :ok
- :scoped_naming_convention | 'PUBLIC' | :guest | :accept | :ok
- :scoped_naming_convention | 'PUBLIC' | :reporter | :accept | :ok
- :non_existing | 'PUBLIC' | :anonymous | :reject | :not_found
- :non_existing | 'PUBLIC' | :guest | :reject | :not_found
- :non_existing | 'PUBLIC' | :reporter | :reject | :not_found
-
- :scoped_naming_convention | 'PRIVATE' | :anonymous | :reject | :not_found
- :scoped_naming_convention | 'PRIVATE' | :guest | :reject | :forbidden
- :scoped_naming_convention | 'PRIVATE' | :reporter | :accept | :ok
- :non_existing | 'PRIVATE' | :anonymous | :reject | :not_found
- :non_existing | 'PRIVATE' | :guest | :reject | :forbidden
- :non_existing | 'PRIVATE' | :reporter | :reject | :not_found
-
- :scoped_naming_convention | 'INTERNAL' | :anonymous | :reject | :not_found
- :scoped_naming_convention | 'INTERNAL' | :guest | :accept | :ok
- :scoped_naming_convention | 'INTERNAL' | :reporter | :accept | :ok
- :non_existing | 'INTERNAL' | :anonymous | :reject | :not_found
- :non_existing | 'INTERNAL' | :guest | :reject | :not_found
- :non_existing | 'INTERNAL' | :reporter | :reject | :not_found
+ :scoped_naming_convention | :public | :anonymous | :accept | :ok
+ :scoped_naming_convention | :public | :guest | :accept | :ok
+ :scoped_naming_convention | :public | :reporter | :accept | :ok
+ :scoped_no_naming_convention | :public | :anonymous | :accept | :ok
+ :scoped_no_naming_convention | :public | :guest | :accept | :ok
+ :scoped_no_naming_convention | :public | :reporter | :accept | :ok
+ :unscoped | :public | :anonymous | :accept | :ok
+ :unscoped | :public | :guest | :accept | :ok
+ :unscoped | :public | :reporter | :accept | :ok
+ :non_existing | :public | :anonymous | :reject | :not_found
+ :non_existing | :public | :guest | :reject | :not_found
+ :non_existing | :public | :reporter | :reject | :not_found
+
+ :scoped_naming_convention | :private | :anonymous | :reject | :not_found
+ :scoped_naming_convention | :private | :guest | :reject | :forbidden
+ :scoped_naming_convention | :private | :reporter | :accept | :ok
+ :scoped_no_naming_convention | :private | :anonymous | :reject | :not_found
+ :scoped_no_naming_convention | :private | :guest | :reject | :forbidden
+ :scoped_no_naming_convention | :private | :reporter | :accept | :ok
+ :unscoped | :private | :anonymous | :reject | :not_found
+ :unscoped | :private | :guest | :reject | :forbidden
+ :unscoped | :private | :reporter | :accept | :ok
+ :non_existing | :private | :anonymous | :reject | :not_found
+ :non_existing | :private | :guest | :reject | :forbidden
+ :non_existing | :private | :reporter | :reject | :not_found
+
+ :scoped_naming_convention | :internal | :anonymous | :reject | :not_found
+ :scoped_naming_convention | :internal | :guest | :accept | :ok
+ :scoped_naming_convention | :internal | :reporter | :accept | :ok
+ :scoped_no_naming_convention | :internal | :anonymous | :reject | :not_found
+ :scoped_no_naming_convention | :internal | :guest | :accept | :ok
+ :scoped_no_naming_convention | :internal | :reporter | :accept | :ok
+ :unscoped | :internal | :anonymous | :reject | :not_found
+ :unscoped | :internal | :guest | :accept | :ok
+ :unscoped | :internal | :reporter | :accept | :ok
+ :non_existing | :internal | :anonymous | :reject | :not_found
+ :non_existing | :internal | :guest | :reject | :not_found
+ :non_existing | :internal | :reporter | :reject | :not_found
end
with_them do
@@ -254,7 +370,7 @@ RSpec.shared_examples 'handling get dist tags requests' do |scope: :project|
before do
project.send("add_#{user_role}", user) unless anonymous
- project.update!(visibility: Gitlab::VisibilityLevel.const_get(visibility, false))
+ project.update!(visibility: visibility.to_s)
end
example_name = "#{params[:expected_result]} package tags request"
@@ -269,16 +385,30 @@ RSpec.shared_examples 'handling get dist tags requests' do |scope: :project|
end
end
- context 'with oauth token' do
- let(:headers) { build_token_auth_header(token.token) }
+ shared_examples 'handling all conditions' do
+ context 'with oauth token' do
+ let(:headers) { build_token_auth_header(token.token) }
+
+ it_behaves_like 'handling different package names, visibilities and user roles'
+ end
+
+ context 'with personal access token' do
+ let(:headers) { build_token_auth_header(personal_access_token.token) }
- it_behaves_like 'handling different package names, visibilities and user roles'
+ it_behaves_like 'handling different package names, visibilities and user roles'
+ end
end
- context 'with personal access token' do
- let(:headers) { build_token_auth_header(personal_access_token.token) }
+ context 'with a group namespace' do
+ it_behaves_like 'handling all conditions'
+ end
- it_behaves_like 'handling different package names, visibilities and user roles'
+ if scope != :project
+ context 'with a user namespace' do
+ let_it_be(:namespace) { user.namespace }
+
+ it_behaves_like 'handling all conditions'
+ end
end
end
@@ -303,26 +433,44 @@ RSpec.shared_examples 'handling create dist tag requests' do |scope: :project|
shared_examples 'handling different package names, visibilities and user roles' do
where(:package_name_type, :visibility, :user_role, :expected_result, :expected_status) do
- :scoped_naming_convention | 'PUBLIC' | :anonymous | :reject | :forbidden
- :scoped_naming_convention | 'PUBLIC' | :guest | :reject | :forbidden
- :scoped_naming_convention | 'PUBLIC' | :developer | :accept | :ok
- :non_existing | 'PUBLIC' | :anonymous | :reject | :forbidden
- :non_existing | 'PUBLIC' | :guest | :reject | :forbidden
- :non_existing | 'PUBLIC' | :developer | :reject | :not_found
-
- :scoped_naming_convention | 'PRIVATE' | :anonymous | :reject | :not_found
- :scoped_naming_convention | 'PRIVATE' | :guest | :reject | :forbidden
- :scoped_naming_convention | 'PRIVATE' | :developer | :accept | :ok
- :non_existing | 'PRIVATE' | :anonymous | :reject | :not_found
- :non_existing | 'PRIVATE' | :guest | :reject | :forbidden
- :non_existing | 'PRIVATE' | :developer | :reject | :not_found
-
- :scoped_naming_convention | 'INTERNAL' | :anonymous | :reject | :forbidden
- :scoped_naming_convention | 'INTERNAL' | :guest | :reject | :forbidden
- :scoped_naming_convention | 'INTERNAL' | :developer | :accept | :ok
- :non_existing | 'INTERNAL' | :anonymous | :reject | :forbidden
- :non_existing | 'INTERNAL' | :guest | :reject | :forbidden
- :non_existing | 'INTERNAL' | :developer | :reject | :not_found
+ :scoped_naming_convention | :public | :anonymous | :reject | :forbidden
+ :scoped_naming_convention | :public | :guest | :reject | :forbidden
+ :scoped_naming_convention | :public | :developer | :accept | :ok
+ :scoped_no_naming_convention | :public | :anonymous | :reject | :forbidden
+ :scoped_no_naming_convention | :public | :guest | :reject | :forbidden
+ :scoped_no_naming_convention | :public | :developer | :accept | :ok
+ :unscoped | :public | :anonymous | :reject | :forbidden
+ :unscoped | :public | :guest | :reject | :forbidden
+ :unscoped | :public | :developer | :accept | :ok
+ :non_existing | :public | :anonymous | :reject | :forbidden
+ :non_existing | :public | :guest | :reject | :forbidden
+ :non_existing | :public | :developer | :reject | :not_found
+
+ :scoped_naming_convention | :private | :anonymous | :reject | :not_found
+ :scoped_naming_convention | :private | :guest | :reject | :forbidden
+ :scoped_naming_convention | :private | :developer | :accept | :ok
+ :scoped_no_naming_convention | :private | :anonymous | :reject | :not_found
+ :scoped_no_naming_convention | :private | :guest | :reject | :forbidden
+ :scoped_no_naming_convention | :private | :developer | :accept | :ok
+ :unscoped | :private | :anonymous | :reject | :not_found
+ :unscoped | :private | :guest | :reject | :forbidden
+ :unscoped | :private | :developer | :accept | :ok
+ :non_existing | :private | :anonymous | :reject | :not_found
+ :non_existing | :private | :guest | :reject | :forbidden
+ :non_existing | :private | :developer | :reject | :not_found
+
+ :scoped_naming_convention | :internal | :anonymous | :reject | :forbidden
+ :scoped_naming_convention | :internal | :guest | :reject | :forbidden
+ :scoped_naming_convention | :internal | :developer | :accept | :ok
+ :scoped_no_naming_convention | :internal | :anonymous | :reject | :forbidden
+ :scoped_no_naming_convention | :internal | :guest | :reject | :forbidden
+ :scoped_no_naming_convention | :internal | :developer | :accept | :ok
+ :unscoped | :internal | :anonymous | :reject | :forbidden
+ :unscoped | :internal | :guest | :reject | :forbidden
+ :unscoped | :internal | :developer | :accept | :ok
+ :non_existing | :internal | :anonymous | :reject | :forbidden
+ :non_existing | :internal | :guest | :reject | :forbidden
+ :non_existing | :internal | :developer | :reject | :not_found
end
with_them do
@@ -332,7 +480,7 @@ RSpec.shared_examples 'handling create dist tag requests' do |scope: :project|
before do
project.send("add_#{user_role}", user) unless anonymous
- project.update!(visibility: Gitlab::VisibilityLevel.const_get(visibility, false))
+ project.update!(visibility: visibility.to_s)
end
example_name = "#{params[:expected_result]} create package tag request"
@@ -347,16 +495,30 @@ RSpec.shared_examples 'handling create dist tag requests' do |scope: :project|
end
end
- context 'with oauth token' do
- let(:headers) { build_token_auth_header(token.token) }
+ shared_examples 'handling all conditions' do
+ context 'with oauth token' do
+ let(:headers) { build_token_auth_header(token.token) }
- it_behaves_like 'handling different package names, visibilities and user roles'
+ it_behaves_like 'handling different package names, visibilities and user roles'
+ end
+
+ context 'with personal access token' do
+ let(:headers) { build_token_auth_header(personal_access_token.token) }
+
+ it_behaves_like 'handling different package names, visibilities and user roles'
+ end
end
- context 'with personal access token' do
- let(:headers) { build_token_auth_header(personal_access_token.token) }
+ context 'with a group namespace' do
+ it_behaves_like 'handling all conditions'
+ end
- it_behaves_like 'handling different package names, visibilities and user roles'
+ if scope != :project
+ context 'with a user namespace' do
+ let_it_be(:namespace) { user.namespace }
+
+ it_behaves_like 'handling all conditions'
+ end
end
end
@@ -379,19 +541,44 @@ RSpec.shared_examples 'handling delete dist tag requests' do |scope: :project|
shared_examples 'handling different package names, visibilities and user roles' do
where(:package_name_type, :visibility, :user_role, :expected_result, :expected_status) do
- :scoped_naming_convention | 'PUBLIC' | :anonymous | :reject | :forbidden
- :scoped_naming_convention | 'PUBLIC' | :guest | :reject | :forbidden
- :scoped_naming_convention | 'PUBLIC' | :maintainer | :accept | :ok
- :non_existing | 'PUBLIC' | :anonymous | :reject | :forbidden
- :non_existing | 'PUBLIC' | :guest | :reject | :forbidden
- :non_existing | 'PUBLIC' | :maintainer | :reject | :not_found
-
- :scoped_naming_convention | 'PRIVATE' | :anonymous | :reject | :not_found
- :scoped_naming_convention | 'PRIVATE' | :guest | :reject | :forbidden
- :scoped_naming_convention | 'PRIVATE' | :maintainer | :accept | :ok
- :non_existing | 'INTERNAL' | :anonymous | :reject | :forbidden
- :non_existing | 'INTERNAL' | :guest | :reject | :forbidden
- :non_existing | 'INTERNAL' | :maintainer | :reject | :not_found
+ :scoped_naming_convention | :public | :anonymous | :reject | :forbidden
+ :scoped_naming_convention | :public | :guest | :reject | :forbidden
+ :scoped_naming_convention | :public | :maintainer | :accept | :ok
+ :scoped_no_naming_convention | :public | :anonymous | :reject | :forbidden
+ :scoped_no_naming_convention | :public | :guest | :reject | :forbidden
+ :scoped_no_naming_convention | :public | :maintainer | :accept | :ok
+ :unscoped | :public | :anonymous | :reject | :forbidden
+ :unscoped | :public | :guest | :reject | :forbidden
+ :unscoped | :public | :maintainer | :accept | :ok
+ :non_existing | :public | :anonymous | :reject | :forbidden
+ :non_existing | :public | :guest | :reject | :forbidden
+ :non_existing | :public | :maintainer | :reject | :not_found
+
+ :scoped_naming_convention | :private | :anonymous | :reject | :not_found
+ :scoped_naming_convention | :private | :guest | :reject | :forbidden
+ :scoped_naming_convention | :private | :maintainer | :accept | :ok
+ :scoped_no_naming_convention | :private | :anonymous | :reject | :not_found
+ :scoped_no_naming_convention | :private | :guest | :reject | :forbidden
+ :scoped_no_naming_convention | :private | :maintainer | :accept | :ok
+ :unscoped | :private | :anonymous | :reject | :not_found
+ :unscoped | :private | :guest | :reject | :forbidden
+ :unscoped | :private | :maintainer | :accept | :ok
+ :non_existing | :private | :anonymous | :reject | :not_found
+ :non_existing | :private | :guest | :reject | :forbidden
+ :non_existing | :private | :maintainer | :reject | :not_found
+
+ :scoped_naming_convention | :internal | :anonymous | :reject | :forbidden
+ :scoped_naming_convention | :internal | :guest | :reject | :forbidden
+ :scoped_naming_convention | :internal | :maintainer | :accept | :ok
+ :scoped_no_naming_convention | :internal | :anonymous | :reject | :forbidden
+ :scoped_no_naming_convention | :internal | :guest | :reject | :forbidden
+ :scoped_no_naming_convention | :internal | :maintainer | :accept | :ok
+ :unscoped | :internal | :anonymous | :reject | :forbidden
+ :unscoped | :internal | :guest | :reject | :forbidden
+ :unscoped | :internal | :maintainer | :accept | :ok
+ :non_existing | :internal | :anonymous | :reject | :forbidden
+ :non_existing | :internal | :guest | :reject | :forbidden
+ :non_existing | :internal | :maintainer | :reject | :not_found
end
with_them do
@@ -401,7 +588,7 @@ RSpec.shared_examples 'handling delete dist tag requests' do |scope: :project|
before do
project.send("add_#{user_role}", user) unless anonymous
- project.update!(visibility: Gitlab::VisibilityLevel.const_get(visibility, false))
+ project.update!(visibility: visibility.to_s)
end
example_name = "#{params[:expected_result]} delete package tag request"
@@ -416,15 +603,29 @@ RSpec.shared_examples 'handling delete dist tag requests' do |scope: :project|
end
end
- context 'with oauth token' do
- let(:headers) { build_token_auth_header(token.token) }
+ shared_examples 'handling all conditions' do
+ context 'with oauth token' do
+ let(:headers) { build_token_auth_header(token.token) }
+
+ it_behaves_like 'handling different package names, visibilities and user roles'
+ end
+
+ context 'with personal access token' do
+ let(:headers) { build_token_auth_header(personal_access_token.token) }
- it_behaves_like 'handling different package names, visibilities and user roles'
+ it_behaves_like 'handling different package names, visibilities and user roles'
+ end
end
- context 'with personal access token' do
- let(:headers) { build_token_auth_header(personal_access_token.token) }
+ context 'with a group namespace' do
+ it_behaves_like 'handling all conditions'
+ end
- it_behaves_like 'handling different package names, visibilities and user roles'
+ if scope != :project
+ context 'with a user namespace' do
+ let_it_be(:namespace) { user.namespace }
+
+ it_behaves_like 'handling all conditions'
+ end
end
end
diff --git a/spec/support/shared_examples/requests/api/rubygems_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/rubygems_packages_shared_examples.rb
new file mode 100644
index 00000000000..2e8e970a019
--- /dev/null
+++ b/spec/support/shared_examples/requests/api/rubygems_packages_shared_examples.rb
@@ -0,0 +1,130 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'rejects rubygems packages access' do |user_type, status, add_member = true|
+ context "for user type #{user_type}" do
+ before do
+ project.send("add_#{user_type}", user) if add_member && user_type != :anonymous
+ end
+
+ it_behaves_like 'returning response status', status
+ end
+end
+
+RSpec.shared_examples 'process rubygems workhorse authorization' do |user_type, status, add_member = true|
+ context "for user type #{user_type}" do
+ before do
+ project.send("add_#{user_type}", user) if add_member && user_type != :anonymous
+ end
+
+ it_behaves_like 'returning response status', status
+
+ it 'has the proper content type' do
+ subject
+
+ expect(response.media_type).to eq(Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE)
+ end
+
+ context 'with a request that bypassed gitlab-workhorse' do
+ let(:headers) do
+ { 'HTTP_AUTHORIZATION' => personal_access_token.token }
+ .merge(workhorse_headers)
+ .tap { |h| h.delete(Gitlab::Workhorse::INTERNAL_API_REQUEST_HEADER) }
+ end
+
+ before do
+ project.add_maintainer(user)
+ end
+
+ it_behaves_like 'returning response status', :forbidden
+ end
+ end
+end
+
+RSpec.shared_examples 'process rubygems upload' do |user_type, status, add_member = true|
+ RSpec.shared_examples 'creates rubygems package files' do
+ it 'creates package files', :aggregate_failures do
+ expect { subject }
+ .to change { project.packages.count }.by(1)
+ .and change { Packages::PackageFile.count }.by(1)
+ expect(response).to have_gitlab_http_status(status)
+
+ package_file = project.packages.last.package_files.reload.last
+ expect(package_file.file_name).to eq('package.gem')
+ end
+ end
+
+ context "for user type #{user_type}" do
+ before do
+ project.send("add_#{user_type}", user) if add_member && user_type != :anonymous
+ end
+
+ context 'with object storage disabled' do
+ before do
+ stub_package_file_object_storage(enabled: false)
+ end
+
+ context 'without a file from workhorse' do
+ let(:send_rewritten_field) { false }
+
+ it_behaves_like 'returning response status', :bad_request
+ end
+
+ context 'with correct params' do
+ it_behaves_like 'package workhorse uploads'
+ it_behaves_like 'creates rubygems package files'
+ it_behaves_like 'a package tracking event', 'API::RubygemPackages', 'push_package'
+ end
+ end
+
+ context 'with object storage enabled' do
+ let(:tmp_object) do
+ fog_connection.directories.new(key: 'packages').files.create( # rubocop:disable Rails/SaveBang
+ key: "tmp/uploads/#{file_name}",
+ body: 'content'
+ )
+ end
+
+ let(:fog_file) { fog_to_uploaded_file(tmp_object) }
+ let(:params) { { file: fog_file, 'file.remote_id' => file_name } }
+
+ context 'and direct upload enabled' do
+ let(:fog_connection) do
+ stub_package_file_object_storage(direct_upload: true)
+ end
+
+ it_behaves_like 'creates rubygems package files'
+
+ ['123123', '../../123123'].each do |remote_id|
+ context "with invalid remote_id: #{remote_id}" do
+ let(:params) do
+ {
+ file: fog_file,
+ 'file.remote_id' => remote_id
+ }
+ end
+
+ it_behaves_like 'returning response status', :forbidden
+ end
+ end
+ end
+
+ context 'and direct upload disabled' do
+ context 'and background upload disabled' do
+ let(:fog_connection) do
+ stub_package_file_object_storage(direct_upload: false, background_upload: false)
+ end
+
+ it_behaves_like 'creates rubygems package files'
+ end
+
+ context 'and background upload enabled' do
+ let(:fog_connection) do
+ stub_package_file_object_storage(direct_upload: false, background_upload: true)
+ end
+
+ it_behaves_like 'creates rubygems package files'
+ end
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/service_desk_issue_templates_examples.rb b/spec/support/shared_examples/service_desk_issue_templates_examples.rb
new file mode 100644
index 00000000000..fd9645df7a3
--- /dev/null
+++ b/spec/support/shared_examples/service_desk_issue_templates_examples.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'issue description templates from current project only' do
+ it 'loads issue description templates from the project only' do
+ within('#service-desk-template-select') do
+ expect(page).to have_content('project-issue-bar')
+ expect(page).to have_content('project-issue-foo')
+ expect(page).not_to have_content('group-issue-bar')
+ expect(page).not_to have_content('group-issue-foo')
+ end
+ end
+end
diff --git a/spec/tooling/danger/helper_spec.rb b/spec/tooling/danger/helper_spec.rb
index c338d138352..59af3ecd145 100644
--- a/spec/tooling/danger/helper_spec.rb
+++ b/spec/tooling/danger/helper_spec.rb
@@ -325,8 +325,6 @@ RSpec.describe Tooling::Danger::Helper do
'db/fixtures/foo.rb' | [:backend]
'ee/db/fixtures/foo.rb' | [:backend]
- 'doc/api/graphql/reference/gitlab_schema.graphql' | [:backend]
- 'doc/api/graphql/reference/gitlab_schema.json' | [:backend]
'qa/foo' | [:qa]
'ee/qa/foo' | [:qa]
diff --git a/spec/views/admin/application_settings/_package_registry.html.haml_spec.rb b/spec/views/admin/application_settings/_package_registry.html.haml_spec.rb
index ef40829c29b..405e86ee89f 100644
--- a/spec/views/admin/application_settings/_package_registry.html.haml_spec.rb
+++ b/spec/views/admin/application_settings/_package_registry.html.haml_spec.rb
@@ -30,8 +30,8 @@ RSpec.describe 'admin/application_settings/_package_registry' do
expect(rendered).to have_field('Maximum Maven package file size in bytes', type: 'number')
expect(page.find_field('Maximum Maven package file size in bytes').value).to eq(default_plan_limits.maven_max_file_size.to_s)
- expect(rendered).to have_field('Maximum NPM package file size in bytes', type: 'number')
- expect(page.find_field('Maximum NPM package file size in bytes').value).to eq(default_plan_limits.npm_max_file_size.to_s)
+ expect(rendered).to have_field('Maximum npm package file size in bytes', type: 'number')
+ expect(page.find_field('Maximum npm package file size in bytes').value).to eq(default_plan_limits.npm_max_file_size.to_s)
expect(rendered).to have_field('Maximum NuGet package file size in bytes', type: 'number')
expect(page.find_field('Maximum NuGet package file size in bytes').value).to eq(default_plan_limits.nuget_max_file_size.to_s)
diff --git a/spec/workers/analytics/instance_statistics/count_job_trigger_worker_spec.rb b/spec/workers/analytics/instance_statistics/count_job_trigger_worker_spec.rb
index c7de8553d86..da0cbe37400 100644
--- a/spec/workers/analytics/instance_statistics/count_job_trigger_worker_spec.rb
+++ b/spec/workers/analytics/instance_statistics/count_job_trigger_worker_spec.rb
@@ -6,12 +6,12 @@ RSpec.describe Analytics::InstanceStatistics::CountJobTriggerWorker do
it_behaves_like 'an idempotent worker'
context 'triggers a job for each measurement identifiers' do
- let(:expected_count) { Analytics::InstanceStatistics::Measurement.identifier_query_mapping.keys.size }
+ let(:expected_count) { Analytics::UsageTrends::Measurement.identifier_query_mapping.keys.size }
it 'triggers CounterJobWorker jobs' do
subject.perform
- expect(Analytics::InstanceStatistics::CounterJobWorker.jobs.count).to eq(expected_count)
+ expect(Analytics::UsageTrends::CounterJobWorker.jobs.count).to eq(expected_count)
end
end
end
diff --git a/spec/workers/analytics/instance_statistics/counter_job_worker_spec.rb b/spec/workers/analytics/instance_statistics/counter_job_worker_spec.rb
index 667ec0bcb75..4994fec44ab 100644
--- a/spec/workers/analytics/instance_statistics/counter_job_worker_spec.rb
+++ b/spec/workers/analytics/instance_statistics/counter_job_worker_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Analytics::InstanceStatistics::CounterJobWorker do
let_it_be(:user_1) { create(:user) }
let_it_be(:user_2) { create(:user) }
- let(:users_measurement_identifier) { ::Analytics::InstanceStatistics::Measurement.identifiers.fetch(:users) }
+ let(:users_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:users) }
let(:recorded_at) { Time.zone.now }
let(:job_args) { [users_measurement_identifier, user_1.id, user_2.id, recorded_at] }
@@ -18,7 +18,7 @@ RSpec.describe Analytics::InstanceStatistics::CounterJobWorker do
it 'counts a scope and stores the result' do
subject
- measurement = Analytics::InstanceStatistics::Measurement.users.first
+ measurement = Analytics::UsageTrends::Measurement.users.first
expect(measurement.recorded_at).to be_like_time(recorded_at)
expect(measurement.identifier).to eq('users')
expect(measurement.count).to eq(2)
@@ -26,14 +26,14 @@ RSpec.describe Analytics::InstanceStatistics::CounterJobWorker do
end
context 'when no records are in the database' do
- let(:users_measurement_identifier) { ::Analytics::InstanceStatistics::Measurement.identifiers.fetch(:groups) }
+ let(:users_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:groups) }
subject { described_class.new.perform(users_measurement_identifier, nil, nil, recorded_at) }
it 'sets 0 as the count' do
subject
- measurement = Analytics::InstanceStatistics::Measurement.groups.first
+ measurement = Analytics::UsageTrends::Measurement.groups.first
expect(measurement.recorded_at).to be_like_time(recorded_at)
expect(measurement.identifier).to eq('groups')
expect(measurement.count).to eq(0)
@@ -49,19 +49,19 @@ RSpec.describe Analytics::InstanceStatistics::CounterJobWorker do
it 'does not insert anything when BatchCount returns error' do
allow(Gitlab::Database::BatchCount).to receive(:batch_count).and_return(Gitlab::Database::BatchCounter::FALLBACK)
- expect { subject }.not_to change { Analytics::InstanceStatistics::Measurement.count }
+ expect { subject }.not_to change { Analytics::UsageTrends::Measurement.count }
end
context 'when pipelines_succeeded identifier is passed' do
let_it_be(:pipeline) { create(:ci_pipeline, :success) }
- let(:successful_pipelines_measurement_identifier) { ::Analytics::InstanceStatistics::Measurement.identifiers.fetch(:pipelines_succeeded) }
+ let(:successful_pipelines_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:pipelines_succeeded) }
let(:job_args) { [successful_pipelines_measurement_identifier, pipeline.id, pipeline.id, recorded_at] }
it 'counts successful pipelines' do
subject
- measurement = Analytics::InstanceStatistics::Measurement.pipelines_succeeded.first
+ measurement = Analytics::UsageTrends::Measurement.pipelines_succeeded.first
expect(measurement.recorded_at).to be_like_time(recorded_at)
expect(measurement.identifier).to eq('pipelines_succeeded')
expect(measurement.count).to eq(1)
diff --git a/spec/workers/analytics/usage_trends/count_job_trigger_worker_spec.rb b/spec/workers/analytics/usage_trends/count_job_trigger_worker_spec.rb
new file mode 100644
index 00000000000..735e4a214a9
--- /dev/null
+++ b/spec/workers/analytics/usage_trends/count_job_trigger_worker_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Analytics::UsageTrends::CountJobTriggerWorker do
+ it_behaves_like 'an idempotent worker'
+
+ context 'triggers a job for each measurement identifiers' do
+ let(:expected_count) { Analytics::UsageTrends::Measurement.identifier_query_mapping.keys.size }
+
+ it 'triggers CounterJobWorker jobs' do
+ subject.perform
+
+ expect(Analytics::UsageTrends::CounterJobWorker.jobs.count).to eq(expected_count)
+ end
+ end
+end
diff --git a/spec/workers/analytics/usage_trends/counter_job_worker_spec.rb b/spec/workers/analytics/usage_trends/counter_job_worker_spec.rb
new file mode 100644
index 00000000000..9e4c82ee981
--- /dev/null
+++ b/spec/workers/analytics/usage_trends/counter_job_worker_spec.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Analytics::UsageTrends::CounterJobWorker do
+ let_it_be(:user_1) { create(:user) }
+ let_it_be(:user_2) { create(:user) }
+
+ let(:users_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:users) }
+ let(:recorded_at) { Time.zone.now }
+ let(:job_args) { [users_measurement_identifier, user_1.id, user_2.id, recorded_at] }
+
+ before do
+ allow(ActiveRecord::Base.connection).to receive(:transaction_open?).and_return(false)
+ end
+
+ include_examples 'an idempotent worker' do
+ it 'counts a scope and stores the result' do
+ subject
+
+ measurement = Analytics::UsageTrends::Measurement.users.first
+ expect(measurement.recorded_at).to be_like_time(recorded_at)
+ expect(measurement.identifier).to eq('users')
+ expect(measurement.count).to eq(2)
+ end
+ end
+
+ context 'when no records are in the database' do
+ let(:users_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:groups) }
+
+ subject { described_class.new.perform(users_measurement_identifier, nil, nil, recorded_at) }
+
+ it 'sets 0 as the count' do
+ subject
+
+ measurement = Analytics::UsageTrends::Measurement.groups.first
+ expect(measurement.recorded_at).to be_like_time(recorded_at)
+ expect(measurement.identifier).to eq('groups')
+ expect(measurement.count).to eq(0)
+ end
+ end
+
+ it 'does not raise error when inserting duplicated measurement' do
+ subject
+
+ expect { subject }.not_to raise_error
+ end
+
+ it 'does not insert anything when BatchCount returns error' do
+ allow(Gitlab::Database::BatchCount).to receive(:batch_count).and_return(Gitlab::Database::BatchCounter::FALLBACK)
+
+ expect { subject }.not_to change { Analytics::UsageTrends::Measurement.count }
+ end
+
+ context 'when pipelines_succeeded identifier is passed' do
+ let_it_be(:pipeline) { create(:ci_pipeline, :success) }
+
+ let(:successful_pipelines_measurement_identifier) { ::Analytics::UsageTrends::Measurement.identifiers.fetch(:pipelines_succeeded) }
+ let(:job_args) { [successful_pipelines_measurement_identifier, pipeline.id, pipeline.id, recorded_at] }
+
+ it 'counts successful pipelines' do
+ subject
+
+ measurement = Analytics::UsageTrends::Measurement.pipelines_succeeded.first
+ expect(measurement.recorded_at).to be_like_time(recorded_at)
+ expect(measurement.identifier).to eq('pipelines_succeeded')
+ expect(measurement.count).to eq(1)
+ end
+ end
+end
diff --git a/spec/workers/jira_connect/sync_project_worker_spec.rb b/spec/workers/jira_connect/sync_project_worker_spec.rb
index f7fa565d534..04cc3bec3af 100644
--- a/spec/workers/jira_connect/sync_project_worker_spec.rb
+++ b/spec/workers/jira_connect/sync_project_worker_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe JiraConnect::SyncProjectWorker, factory_default: :keep do
describe '#perform' do
- let_it_be(:project) { create_default(:project) }
+ let_it_be(:project) { create_default(:project).freeze }
let!(:mr_with_jira_title) { create(:merge_request, :unique_branches, title: 'TEST-123') }
let!(:mr_with_jira_description) { create(:merge_request, :unique_branches, description: 'TEST-323') }
let!(:mr_with_other_title) { create(:merge_request, :unique_branches) }
diff --git a/spec/workers/post_receive_spec.rb b/spec/workers/post_receive_spec.rb
index aaae0988602..be501318920 100644
--- a/spec/workers/post_receive_spec.rb
+++ b/spec/workers/post_receive_spec.rb
@@ -93,6 +93,29 @@ RSpec.describe PostReceive do
perform
end
+
+ it 'tracks an event for the empty_repo_upload experiment', :snowplow do
+ allow_next_instance_of(ApplicationExperiment) do |e|
+ allow(e).to receive(:should_track?).and_return(true)
+ allow(e).to receive(:track_initial_writes)
+ end
+
+ perform
+
+ expect_snowplow_event(category: 'empty_repo_upload', action: 'initial_write', context: [{ schema: 'iglu:com.gitlab/gitlab_experiment/jsonschema/0-3-0', data: anything }])
+ end
+
+ it 'does not track an event for the empty_repo_upload experiment when project is not empty', :snowplow do
+ allow(empty_project).to receive(:empty_repo?).and_return(false)
+ allow_next_instance_of(ApplicationExperiment) do |e|
+ allow(e).to receive(:should_track?).and_return(true)
+ allow(e).to receive(:track_initial_writes)
+ end
+
+ perform
+
+ expect_no_snowplow_event
+ end
end
shared_examples 'not updating remote mirrors' do
@@ -159,7 +182,7 @@ RSpec.describe PostReceive do
end
it 'expires the status cache' do
- expect(project.repository).to receive(:empty?).and_return(true)
+ expect(project.repository).to receive(:empty?).at_least(:once).and_return(true)
expect(project.repository).to receive(:expire_status_cache)
perform
diff --git a/tooling/danger/helper.rb b/tooling/danger/helper.rb
index 60026ee9c70..2ffd1cf2d0b 100644
--- a/tooling/danger/helper.rb
+++ b/tooling/danger/helper.rb
@@ -145,7 +145,6 @@ module Tooling
\.nvmrc |
\.prettierignore |
\.prettierrc |
- \.scss-lint.yml |
\.stylelintrc |
\.haml-lint.yml |
\.haml-lint_todo.yml |
diff --git a/tooling/overcommit/Gemfile b/tooling/overcommit/Gemfile
index 6d2c5bce29a..26dad738bab 100644
--- a/tooling/overcommit/Gemfile
+++ b/tooling/overcommit/Gemfile
@@ -5,5 +5,4 @@ source 'https://rubygems.org'
gem 'overcommit'
gem 'gitlab-styles', '~> 5.4.0', require: false
-gem 'scss_lint', '~> 0.56.0', require: false
gem 'haml_lint', '~> 0.34.0', require: false
diff --git a/tooling/overcommit/Gemfile.lock b/tooling/overcommit/Gemfile.lock
index f1d701b3e4b..13c611439b6 100644
--- a/tooling/overcommit/Gemfile.lock
+++ b/tooling/overcommit/Gemfile.lock
@@ -10,7 +10,6 @@ GEM
ast (2.4.1)
childprocess (3.0.0)
concurrent-ruby (1.1.7)
- ffi (1.12.2)
gitlab-styles (5.4.0)
rubocop (~> 0.89.1)
rubocop-gitlab-security (~> 0.1.0)
@@ -37,10 +36,6 @@ GEM
ast (~> 2.4.1)
rack (2.2.3)
rainbow (3.0.0)
- rake (12.3.3)
- rb-fsevent (0.10.2)
- rb-inotify (0.9.10)
- ffi (>= 0.5.0, < 2)
regexp_parser (1.8.2)
rexml (3.2.4)
rubocop (0.89.1)
@@ -67,14 +62,6 @@ GEM
rubocop (~> 0.87)
rubocop-ast (>= 0.7.1)
ruby-progressbar (1.10.1)
- sass (3.5.5)
- sass-listen (~> 4.0.0)
- sass-listen (4.0.0)
- rb-fsevent (~> 0.9, >= 0.9.4)
- rb-inotify (~> 0.9, >= 0.9.7)
- scss_lint (0.56.0)
- rake (>= 0.9, < 13)
- sass (~> 3.5.3)
sysexits (1.2.0)
temple (0.8.2)
thread_safe (0.3.6)
@@ -91,7 +78,6 @@ DEPENDENCIES
gitlab-styles (~> 5.4.0)
haml_lint (~> 0.34.0)
overcommit
- scss_lint (~> 0.56.0)
BUNDLED WITH
2.1.4
diff --git a/vendor/aws/cloudformation/eks_cluster.yaml b/vendor/aws/cloudformation/eks_cluster.yaml
index c3f9c73cd1f..5ad25dcd533 100644
--- a/vendor/aws/cloudformation/eks_cluster.yaml
+++ b/vendor/aws/cloudformation/eks_cluster.yaml
@@ -7,12 +7,13 @@ Parameters:
KubernetesVersion:
Description: The Kubernetes version to install
Type: String
- Default: 1.16
+ Default: 1.19
AllowedValues:
- - 1.14
- 1.15
- 1.16
- 1.17
+ - 1.18
+ - 1.19
KeyName:
Description: The EC2 Key Pair to allow SSH access to the node instances
@@ -20,7 +21,7 @@ Parameters:
NodeImageIdSSMParam:
Type: "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>"
- Default: /aws/service/eks/optimized-ami/1.14/amazon-linux-2/recommended/image_id
+ Default: /aws/service/eks/optimized-ami/1.15/amazon-linux-2/recommended/image_id
Description: AWS Systems Manager Parameter Store parameter of the AMI ID for the worker node instances.
NodeInstanceType:
diff --git a/vendor/gitignore/C++.gitignore b/vendor/gitignore/C++.gitignore
index 259148fa18f..259148fa18f 100755..100644
--- a/vendor/gitignore/C++.gitignore
+++ b/vendor/gitignore/C++.gitignore
diff --git a/vendor/gitignore/Java.gitignore b/vendor/gitignore/Java.gitignore
index a1c2a238a96..a1c2a238a96 100755..100644
--- a/vendor/gitignore/Java.gitignore
+++ b/vendor/gitignore/Java.gitignore
diff --git a/vendor/project_templates/dotnetcore.tar.gz b/vendor/project_templates/dotnetcore.tar.gz
index 402153aa88d..7e4406dbb23 100644
--- a/vendor/project_templates/dotnetcore.tar.gz
+++ b/vendor/project_templates/dotnetcore.tar.gz
Binary files differ
diff --git a/vendor/project_templates/express.tar.gz b/vendor/project_templates/express.tar.gz
index f9a52fde41b..bd746dbfb5b 100644
--- a/vendor/project_templates/express.tar.gz
+++ b/vendor/project_templates/express.tar.gz
Binary files differ
diff --git a/workhorse/CHANGELOG b/workhorse/CHANGELOG
index 3142f2601b7..21d5bc727c0 100644
--- a/workhorse/CHANGELOG
+++ b/workhorse/CHANGELOG
@@ -1,5 +1,11 @@
# Changelog for gitlab-workhorse
+## v8.64.0
+
+### Other
+- Revert "Migrate to labkit error tracking"
+ https://gitlab.com/gitlab-org/gitlab-workhorse/-/merge_requests/685
+
## v8.63.0
### Added
diff --git a/workhorse/VERSION b/workhorse/VERSION
index 661bb99fdf9..ca1596d1a61 100644
--- a/workhorse/VERSION
+++ b/workhorse/VERSION
@@ -1 +1 @@
-8.63.0
+8.64.0
diff --git a/workhorse/go.mod b/workhorse/go.mod
index 20344f0081d..6396e419487 100644
--- a/workhorse/go.mod
+++ b/workhorse/go.mod
@@ -8,8 +8,10 @@ require (
github.com/FZambia/sentinel v1.0.0
github.com/alecthomas/chroma v0.7.3
github.com/aws/aws-sdk-go v1.36.1
+ github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 // indirect
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/disintegration/imaging v1.6.2
+ github.com/getsentry/raven-go v0.2.0
github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721
github.com/golang/protobuf v1.4.3
github.com/gomodule/redigo v2.0.0+incompatible
diff --git a/workhorse/go.sum b/workhorse/go.sum
index ddb08a1e846..4796d40638b 100644
--- a/workhorse/go.sum
+++ b/workhorse/go.sum
@@ -145,6 +145,8 @@ github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QH
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/certifi/gocertifi v0.0.0-20180905225744-ee1a9a0726d2/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4=
+github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 h1:uH66TXeswKn5PW5zdZ39xEwfS9an067BirqA+P4QaLI=
+github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
diff --git a/workhorse/internal/errortracker/sentry.go b/workhorse/internal/errortracker/sentry.go
deleted file mode 100644
index 72a32c8d349..00000000000
--- a/workhorse/internal/errortracker/sentry.go
+++ /dev/null
@@ -1,60 +0,0 @@
-package errortracker
-
-import (
- "fmt"
- "net/http"
- "os"
- "runtime/debug"
-
- "gitlab.com/gitlab-org/labkit/errortracking"
-
- "gitlab.com/gitlab-org/labkit/log"
-)
-
-// NewHandler allows us to handle panics in upstreams gracefully, by logging them
-// using structured logging and reporting them into Sentry as `error`s with a
-// proper correlation ID attached.
-func NewHandler(next http.Handler) http.Handler {
- return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- defer func() {
- if p := recover(); p != nil {
- fields := log.ContextFields(r.Context())
- log.WithFields(fields).Error(p)
- debug.PrintStack()
- // A panic isn't always an `error`, so we may have to convert it into one.
- e, ok := p.(error)
- if !ok {
- e = fmt.Errorf("%v", p)
- }
- TrackFailedRequest(r, e, fields)
- }
- }()
-
- next.ServeHTTP(w, r)
- })
-}
-
-func TrackFailedRequest(r *http.Request, err error, fields log.Fields) {
- captureOpts := []errortracking.CaptureOption{
- errortracking.WithContext(r.Context()),
- errortracking.WithRequest(r),
- }
- for k, v := range fields {
- captureOpts = append(captureOpts, errortracking.WithField(k, fmt.Sprintf("%v", v)))
- }
-
- errortracking.Capture(err, captureOpts...)
-}
-
-func Initialize(version string) error {
- // Use a custom environment variable (not SENTRY_DSN) to prevent
- // clashes with gitlab-rails.
- sentryDSN := os.Getenv("GITLAB_WORKHORSE_SENTRY_DSN")
- sentryEnvironment := os.Getenv("GITLAB_WORKHORSE_SENTRY_ENVIRONMENT")
-
- return errortracking.Initialize(
- errortracking.WithSentryDSN(sentryDSN),
- errortracking.WithSentryEnvironment(sentryEnvironment),
- errortracking.WithVersion(version),
- )
-}
diff --git a/workhorse/internal/helper/helpers.go b/workhorse/internal/helper/helpers.go
index 2e23f50b913..f9b46181579 100644
--- a/workhorse/internal/helper/helpers.go
+++ b/workhorse/internal/helper/helpers.go
@@ -14,31 +14,50 @@ import (
"syscall"
"github.com/sebest/xff"
-
- "gitlab.com/gitlab-org/gitlab-workhorse/internal/log"
+ "gitlab.com/gitlab-org/labkit/log"
+ "gitlab.com/gitlab-org/labkit/mask"
)
const NginxResponseBufferHeader = "X-Accel-Buffering"
-func CaptureAndFail(w http.ResponseWriter, r *http.Request, err error, msg string, code int, loggerCallbacks ...log.ConfigureLogger) {
- http.Error(w, msg, code)
- logger := log.WithRequest(r).WithError(err)
-
- for _, cb := range loggerCallbacks {
- logger = cb(logger)
+func logErrorWithFields(r *http.Request, err error, fields log.Fields) {
+ if err != nil {
+ CaptureRavenError(r, err, fields)
}
- logger.Error(msg)
+ printError(r, err, fields)
+}
+
+func CaptureAndFail(w http.ResponseWriter, r *http.Request, err error, msg string, code int) {
+ http.Error(w, msg, code)
+ logErrorWithFields(r, err, nil)
+}
+
+func Fail500(w http.ResponseWriter, r *http.Request, err error) {
+ CaptureAndFail(w, r, err, "Internal server error", http.StatusInternalServerError)
}
-func Fail500(w http.ResponseWriter, r *http.Request, err error, loggerCallbacks ...log.ConfigureLogger) {
- CaptureAndFail(w, r, err, "Internal server error", http.StatusInternalServerError, loggerCallbacks...)
+func Fail500WithFields(w http.ResponseWriter, r *http.Request, err error, fields log.Fields) {
+ http.Error(w, "Internal server error", http.StatusInternalServerError)
+ logErrorWithFields(r, err, fields)
}
func RequestEntityTooLarge(w http.ResponseWriter, r *http.Request, err error) {
CaptureAndFail(w, r, err, "Request Entity Too Large", http.StatusRequestEntityTooLarge)
}
+func printError(r *http.Request, err error, fields log.Fields) {
+ if r != nil {
+ entry := log.WithContextFields(r.Context(), log.Fields{
+ "method": r.Method,
+ "uri": mask.URL(r.RequestURI),
+ })
+ entry.WithFields(fields).WithError(err).Error()
+ } else {
+ log.WithFields(fields).WithError(err).Error("unknown error")
+ }
+}
+
func SetNoCacheHeaders(header http.Header) {
header.Set("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate")
header.Set("Pragma", "no-cache")
@@ -78,7 +97,7 @@ func OpenFile(path string) (file *os.File, fi os.FileInfo, err error) {
func URLMustParse(s string) *url.URL {
u, err := url.Parse(s)
if err != nil {
- log.WithError(err).WithFields(log.Fields{"url": s}).Error("urlMustParse")
+ log.WithError(err).WithField("url", s).Fatal("urlMustParse")
}
return u
}
diff --git a/workhorse/internal/helper/raven.go b/workhorse/internal/helper/raven.go
new file mode 100644
index 00000000000..898e8ec85f8
--- /dev/null
+++ b/workhorse/internal/helper/raven.go
@@ -0,0 +1,58 @@
+package helper
+
+import (
+ "net/http"
+ "reflect"
+
+ raven "github.com/getsentry/raven-go"
+
+ //lint:ignore SA1019 this was recently deprecated. Update workhorse to use labkit errortracking package.
+ correlation "gitlab.com/gitlab-org/labkit/correlation/raven"
+
+ "gitlab.com/gitlab-org/labkit/log"
+)
+
+var ravenHeaderBlacklist = []string{
+ "Authorization",
+ "Private-Token",
+}
+
+func CaptureRavenError(r *http.Request, err error, fields log.Fields) {
+ client := raven.DefaultClient
+ extra := raven.Extra{}
+
+ for k, v := range fields {
+ extra[k] = v
+ }
+
+ interfaces := []raven.Interface{}
+ if r != nil {
+ CleanHeadersForRaven(r)
+ interfaces = append(interfaces, raven.NewHttp(r))
+
+ //lint:ignore SA1019 this was recently deprecated. Update workhorse to use labkit errortracking package.
+ extra = correlation.SetExtra(r.Context(), extra)
+ }
+
+ exception := &raven.Exception{
+ Stacktrace: raven.NewStacktrace(2, 3, nil),
+ Value: err.Error(),
+ Type: reflect.TypeOf(err).String(),
+ }
+ interfaces = append(interfaces, exception)
+
+ packet := raven.NewPacketWithExtra(err.Error(), extra, interfaces...)
+ client.Capture(packet, nil)
+}
+
+func CleanHeadersForRaven(r *http.Request) {
+ if r == nil {
+ return
+ }
+
+ for _, key := range ravenHeaderBlacklist {
+ if r.Header.Get(key) != "" {
+ r.Header.Set(key, "[redacted]")
+ }
+ }
+}
diff --git a/workhorse/internal/imageresizer/image_resizer.go b/workhorse/internal/imageresizer/image_resizer.go
index 7d423b80067..69e9496aec2 100644
--- a/workhorse/internal/imageresizer/image_resizer.go
+++ b/workhorse/internal/imageresizer/image_resizer.go
@@ -428,18 +428,16 @@ func logFields(startTime time.Time, params *resizeParams, outcome *resizeOutcome
func handleOutcome(w http.ResponseWriter, req *http.Request, startTime time.Time, params *resizeParams, outcome *resizeOutcome) {
fields := logFields(startTime, params, outcome)
- logger := log.WithRequest(req).WithFields(fields)
+ log := log.WithRequest(req).WithFields(fields)
switch outcome.status {
case statusRequestFailure:
if outcome.bytesWritten <= 0 {
- helper.Fail500(w, req, outcome.err, func(b *log.Builder) *log.Builder {
- return b.WithFields(fields)
- })
+ helper.Fail500WithFields(w, req, outcome.err, fields)
} else {
- logger.WithError(outcome.err).Error(outcome.status)
+ log.WithError(outcome.err).Error(outcome.status)
}
default:
- logger.Info(outcome.status)
+ log.Info(outcome.status)
}
}
diff --git a/workhorse/internal/log/logging.go b/workhorse/internal/log/logging.go
index 9c19cde1395..c65ec07743a 100644
--- a/workhorse/internal/log/logging.go
+++ b/workhorse/internal/log/logging.go
@@ -8,13 +8,11 @@ import (
"gitlab.com/gitlab-org/labkit/mask"
"golang.org/x/net/context"
- "gitlab.com/gitlab-org/gitlab-workhorse/internal/errortracker"
+ "gitlab.com/gitlab-org/gitlab-workhorse/internal/helper"
)
type Fields = log.Fields
-type ConfigureLogger func(*Builder) *Builder
-
type Builder struct {
entry *logrus.Entry
fields log.Fields
@@ -85,6 +83,6 @@ func (b *Builder) Error(args ...interface{}) {
b.entry.Error(args...)
if b.req != nil && b.err != nil {
- errortracker.TrackFailedRequest(b.req, b.err, b.fields)
+ helper.CaptureRavenError(b.req, b.err, b.fields)
}
}
diff --git a/workhorse/internal/upstream/upstream.go b/workhorse/internal/upstream/upstream.go
index fd655a07679..c81a21c0ecd 100644
--- a/workhorse/internal/upstream/upstream.go
+++ b/workhorse/internal/upstream/upstream.go
@@ -16,7 +16,6 @@ import (
"gitlab.com/gitlab-org/labkit/correlation"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/config"
- "gitlab.com/gitlab-org/gitlab-workhorse/internal/errortracker"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/helper"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/rejectmethods"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/upload"
@@ -64,7 +63,7 @@ func NewUpstream(cfg config.Config, accessLogger *logrus.Logger) http.Handler {
correlationOpts = append(correlationOpts, correlation.WithPropagation())
}
- handler := correlation.InjectCorrelationID(errortracker.NewHandler(&up), correlationOpts...)
+ handler := correlation.InjectCorrelationID(&up, correlationOpts...)
// TODO: move to LabKit https://gitlab.com/gitlab-org/gitlab-workhorse/-/issues/339
handler = rejectmethods.NewMiddleware(handler)
return handler
diff --git a/workhorse/main.go b/workhorse/main.go
index c43ec45240f..47ab63a875a 100644
--- a/workhorse/main.go
+++ b/workhorse/main.go
@@ -16,7 +16,6 @@ import (
"gitlab.com/gitlab-org/labkit/tracing"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/config"
- "gitlab.com/gitlab-org/gitlab-workhorse/internal/errortracker"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/queueing"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/redis"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/secret"
@@ -157,8 +156,6 @@ func run(boot bootConfig, cfg config.Config) error {
}
defer closer.Close()
- errortracker.Initialize(cfg.Version)
-
tracing.Initialize(tracing.WithServiceName("gitlab-workhorse"))
log.WithField("version", Version).WithField("build_time", BuildTime).Print("Starting")
@@ -226,7 +223,7 @@ func run(boot bootConfig, cfg config.Config) error {
}
defer accessCloser.Close()
- up := upstream.NewUpstream(cfg, accessLogger)
+ up := wrapRaven(upstream.NewUpstream(cfg, accessLogger))
go func() { finalErrors <- http.Serve(listener, up) }()
diff --git a/workhorse/raven.go b/workhorse/raven.go
new file mode 100644
index 00000000000..f641203f142
--- /dev/null
+++ b/workhorse/raven.go
@@ -0,0 +1,40 @@
+package main
+
+import (
+ "net/http"
+ "os"
+
+ raven "github.com/getsentry/raven-go"
+
+ "gitlab.com/gitlab-org/gitlab-workhorse/internal/helper"
+)
+
+func wrapRaven(h http.Handler) http.Handler {
+ // Use a custom environment variable (not SENTRY_DSN) to prevent
+ // clashes with gitlab-rails.
+ sentryDSN := os.Getenv("GITLAB_WORKHORSE_SENTRY_DSN")
+ sentryEnvironment := os.Getenv("GITLAB_WORKHORSE_SENTRY_ENVIRONMENT")
+ raven.SetDSN(sentryDSN) // sentryDSN may be empty
+
+ if sentryEnvironment != "" {
+ raven.SetEnvironment(sentryEnvironment)
+ }
+
+ if sentryDSN == "" {
+ return h
+ }
+
+ raven.DefaultClient.SetRelease(Version)
+
+ return http.HandlerFunc(raven.RecoveryHandler(
+ func(w http.ResponseWriter, r *http.Request) {
+ defer func() {
+ if p := recover(); p != nil {
+ helper.CleanHeadersForRaven(r)
+ panic(p)
+ }
+ }()
+
+ h.ServeHTTP(w, r)
+ }))
+}
diff --git a/yarn.lock b/yarn.lock
index 3d8f9242f54..2d08a5bdbce 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,13 +2,20 @@
# yarn lockfile v1
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.1", "@babel/code-frame@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
- integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
+"@babel/code-frame@7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
+ integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==
dependencies:
"@babel/highlight" "^7.10.4"
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658"
+ integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==
+ dependencies:
+ "@babel/highlight" "^7.12.13"
+
"@babel/compat-data@^7.10.1":
version "7.10.1"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.1.tgz#b1085ffe72cd17bf2c0ee790fc09f9626011b2db"
@@ -18,34 +25,33 @@
invariant "^2.2.4"
semver "^5.5.0"
-"@babel/core@>=7.2.2", "@babel/core@^7.1.0", "@babel/core@^7.10.1", "@babel/core@^7.7.5":
- version "7.10.2"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.2.tgz#bd6786046668a925ac2bd2fd95b579b92a23b36a"
- integrity sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==
- dependencies:
- "@babel/code-frame" "^7.10.1"
- "@babel/generator" "^7.10.2"
- "@babel/helper-module-transforms" "^7.10.1"
- "@babel/helpers" "^7.10.1"
- "@babel/parser" "^7.10.2"
- "@babel/template" "^7.10.1"
- "@babel/traverse" "^7.10.1"
- "@babel/types" "^7.10.2"
+"@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.10.1", "@babel/core@^7.7.5":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.13.tgz#b73a87a3a3e7d142a66248bf6ad88b9ceb093425"
+ integrity sha512-BQKE9kXkPlXHPeqissfxo0lySWJcYdEP0hdtJOH/iJfDdhOCcgtNCjftCJg3qqauB4h+lz2N6ixM++b9DN1Tcw==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@babel/generator" "^7.12.13"
+ "@babel/helper-module-transforms" "^7.12.13"
+ "@babel/helpers" "^7.12.13"
+ "@babel/parser" "^7.12.13"
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.12.13"
+ "@babel/types" "^7.12.13"
convert-source-map "^1.7.0"
debug "^4.1.0"
gensync "^1.0.0-beta.1"
json5 "^2.1.2"
- lodash "^4.17.13"
- resolve "^1.3.2"
+ lodash "^4.17.19"
semver "^5.4.1"
source-map "^0.5.0"
-"@babel/generator@^7.10.2", "@babel/generator@^7.11.5", "@babel/generator@^7.4.0":
- version "7.11.6"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620"
- integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==
+"@babel/generator@^7.12.13", "@babel/generator@^7.4.0":
+ version "7.12.15"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.15.tgz#4617b5d0b25cc572474cc1aafee1edeaf9b5368f"
+ integrity sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==
dependencies:
- "@babel/types" "^7.11.5"
+ "@babel/types" "^7.12.13"
jsesc "^2.5.1"
source-map "^0.5.0"
@@ -113,21 +119,21 @@
"@babel/traverse" "^7.10.1"
"@babel/types" "^7.10.1"
-"@babel/helper-function-name@^7.10.1", "@babel/helper-function-name@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a"
- integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==
+"@babel/helper-function-name@^7.10.1", "@babel/helper-function-name@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a"
+ integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==
dependencies:
- "@babel/helper-get-function-arity" "^7.10.4"
- "@babel/template" "^7.10.4"
- "@babel/types" "^7.10.4"
+ "@babel/helper-get-function-arity" "^7.12.13"
+ "@babel/template" "^7.12.13"
+ "@babel/types" "^7.12.13"
-"@babel/helper-get-function-arity@^7.10.1", "@babel/helper-get-function-arity@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2"
- integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==
+"@babel/helper-get-function-arity@^7.10.1", "@babel/helper-get-function-arity@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583"
+ integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==
dependencies:
- "@babel/types" "^7.10.4"
+ "@babel/types" "^7.12.13"
"@babel/helper-hoist-variables@^7.10.1":
version "7.10.1"
@@ -136,39 +142,41 @@
dependencies:
"@babel/types" "^7.10.1"
-"@babel/helper-member-expression-to-functions@^7.10.1", "@babel/helper-member-expression-to-functions@^7.10.4":
- version "7.11.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df"
- integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==
- dependencies:
- "@babel/types" "^7.11.0"
-
-"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.1", "@babel/helper-module-imports@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620"
- integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==
- dependencies:
- "@babel/types" "^7.10.4"
-
-"@babel/helper-module-transforms@^7.10.1", "@babel/helper-module-transforms@^7.10.4":
- version "7.11.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359"
- integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==
- dependencies:
- "@babel/helper-module-imports" "^7.10.4"
- "@babel/helper-replace-supers" "^7.10.4"
- "@babel/helper-simple-access" "^7.10.4"
- "@babel/helper-split-export-declaration" "^7.11.0"
- "@babel/template" "^7.10.4"
- "@babel/types" "^7.11.0"
+"@babel/helper-member-expression-to-functions@^7.10.1", "@babel/helper-member-expression-to-functions@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz#c5715695b4f8bab32660dbdcdc2341dec7e3df40"
+ integrity sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ==
+ dependencies:
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.1", "@babel/helper-module-imports@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0"
+ integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==
+ dependencies:
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-module-transforms@^7.10.1", "@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz#01afb052dcad2044289b7b20beb3fa8bd0265bea"
+ integrity sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.12.13"
+ "@babel/helper-replace-supers" "^7.12.13"
+ "@babel/helper-simple-access" "^7.12.13"
+ "@babel/helper-split-export-declaration" "^7.12.13"
+ "@babel/helper-validator-identifier" "^7.12.11"
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.12.13"
+ "@babel/types" "^7.12.13"
lodash "^4.17.19"
-"@babel/helper-optimise-call-expression@^7.10.1", "@babel/helper-optimise-call-expression@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673"
- integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==
+"@babel/helper-optimise-call-expression@^7.10.1", "@babel/helper-optimise-call-expression@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea"
+ integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==
dependencies:
- "@babel/types" "^7.10.4"
+ "@babel/types" "^7.12.13"
"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0":
version "7.10.4"
@@ -193,35 +201,34 @@
"@babel/traverse" "^7.10.1"
"@babel/types" "^7.10.1"
-"@babel/helper-replace-supers@^7.10.1", "@babel/helper-replace-supers@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf"
- integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==
+"@babel/helper-replace-supers@^7.10.1", "@babel/helper-replace-supers@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz#00ec4fb6862546bd3d0aff9aac56074277173121"
+ integrity sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==
dependencies:
- "@babel/helper-member-expression-to-functions" "^7.10.4"
- "@babel/helper-optimise-call-expression" "^7.10.4"
- "@babel/traverse" "^7.10.4"
- "@babel/types" "^7.10.4"
+ "@babel/helper-member-expression-to-functions" "^7.12.13"
+ "@babel/helper-optimise-call-expression" "^7.12.13"
+ "@babel/traverse" "^7.12.13"
+ "@babel/types" "^7.12.13"
-"@babel/helper-simple-access@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461"
- integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==
+"@babel/helper-simple-access@^7.10.4", "@babel/helper-simple-access@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4"
+ integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==
dependencies:
- "@babel/template" "^7.10.4"
- "@babel/types" "^7.10.4"
+ "@babel/types" "^7.12.13"
-"@babel/helper-split-export-declaration@^7.10.1", "@babel/helper-split-export-declaration@^7.11.0":
- version "7.11.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f"
- integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==
+"@babel/helper-split-export-declaration@^7.10.1", "@babel/helper-split-export-declaration@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05"
+ integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==
dependencies:
- "@babel/types" "^7.11.0"
+ "@babel/types" "^7.12.13"
-"@babel/helper-validator-identifier@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
- integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==
+"@babel/helper-validator-identifier@^7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed"
+ integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
"@babel/helper-wrap-function@^7.10.1":
version "7.10.1"
@@ -233,28 +240,28 @@
"@babel/traverse" "^7.10.1"
"@babel/types" "^7.10.1"
-"@babel/helpers@^7.10.1":
- version "7.10.1"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973"
- integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==
+"@babel/helpers@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.13.tgz#3c75e993632e4dadc0274eae219c73eb7645ba47"
+ integrity sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ==
dependencies:
- "@babel/template" "^7.10.1"
- "@babel/traverse" "^7.10.1"
- "@babel/types" "^7.10.1"
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.12.13"
+ "@babel/types" "^7.12.13"
-"@babel/highlight@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143"
- integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==
+"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c"
+ integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==
dependencies:
- "@babel/helper-validator-identifier" "^7.10.4"
+ "@babel/helper-validator-identifier" "^7.12.11"
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.10.2", "@babel/parser@^7.10.4", "@babel/parser@^7.11.5", "@babel/parser@^7.4.3":
- version "7.11.5"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037"
- integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==
+"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.4.3":
+ version "7.12.15"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.15.tgz#2b20de7f0b4b332d9b119dd9c33409c538b8aacf"
+ integrity sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==
"@babel/plugin-proposal-async-generator-functions@^7.10.1":
version "7.10.1"
@@ -789,36 +796,36 @@
resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.10.2.tgz#49dbbadcbc4b199df064d7d8b3e21c915b84abdb"
integrity sha512-PNQuj9oQH6BL/3l9iiL8hJLQwX14woA2/FHcPtNIZAc7IgFZYJdtMBMXiy4xcefADHTSvoBnmc2AybrHRW1IKQ==
-"@babel/template@^7.10.1", "@babel/template@^7.10.4", "@babel/template@^7.3.3", "@babel/template@^7.4.0":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278"
- integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==
- dependencies:
- "@babel/code-frame" "^7.10.4"
- "@babel/parser" "^7.10.4"
- "@babel/types" "^7.10.4"
-
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.10.4", "@babel/traverse@^7.4.3":
- version "7.11.5"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3"
- integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==
- dependencies:
- "@babel/code-frame" "^7.10.4"
- "@babel/generator" "^7.11.5"
- "@babel/helper-function-name" "^7.10.4"
- "@babel/helper-split-export-declaration" "^7.11.0"
- "@babel/parser" "^7.11.5"
- "@babel/types" "^7.11.5"
+"@babel/template@^7.10.1", "@babel/template@^7.12.13", "@babel/template@^7.3.3", "@babel/template@^7.4.0":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327"
+ integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@babel/parser" "^7.12.13"
+ "@babel/types" "^7.12.13"
+
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.12.13", "@babel/traverse@^7.4.3":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.13.tgz#689f0e4b4c08587ad26622832632735fb8c4e0c0"
+ integrity sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@babel/generator" "^7.12.13"
+ "@babel/helper-function-name" "^7.12.13"
+ "@babel/helper-split-export-declaration" "^7.12.13"
+ "@babel/parser" "^7.12.13"
+ "@babel/types" "^7.12.13"
debug "^4.1.0"
globals "^11.1.0"
lodash "^4.17.19"
-"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4":
- version "7.11.5"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d"
- integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==
+"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.12.13", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.13.tgz#8be1aa8f2c876da11a9cf650c0ecf656913ad611"
+ integrity sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==
dependencies:
- "@babel/helper-validator-identifier" "^7.10.4"
+ "@babel/helper-validator-identifier" "^7.12.11"
lodash "^4.17.19"
to-fast-properties "^2.0.0"
@@ -861,10 +868,10 @@
resolved "https://registry.yarnpkg.com/@gitlab/at.js/-/at.js-1.5.7.tgz#1ee6f838cc4410a1d797770934df91d90df8179e"
integrity sha512-c6ySRK/Ma7lxwpIVbSAF3P+xiTLrNTGTLRx4/pHK111AdFxwgUwrYF6aVZFXvmG65jHOJHoa0eQQ21RW6rm0Rg==
-"@gitlab/eslint-plugin@8.0.0":
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-8.0.0.tgz#e8d30fd98e2102f417617d0c60ef1810520a8ac6"
- integrity sha512-hTTdcyxN3Ead2FaNwaiPg9sv2YbCDrlyAgKAPV7dit2uPqR0nkIlng9JPNMIixTXBrJ/Y+VvjIRrKKNYBubocw==
+"@gitlab/eslint-plugin@8.1.0":
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-8.1.0.tgz#a98ac4219da3316d30ee717ef0603c8fa0c4d5d8"
+ integrity sha512-PU2ldrF59dhunMcEMzSqwG9RfTZRPmW8/pXwcXhJNi61g9lkdHQn8CiQGazepDlBwjEHl5habv/cs52gUc06+w==
dependencies:
babel-eslint "^10.0.3"
eslint-config-airbnb-base "^14.2.1"
@@ -882,6 +889,15 @@
resolved "https://registry.yarnpkg.com/@gitlab/favicon-overlay/-/favicon-overlay-2.0.0.tgz#2f32d0b6a4d5b8ac44e2927083d9ab478a78c984"
integrity sha512-GNcORxXJ98LVGzOT9dDYKfbheqH6lNgPDD72lyXRnQIH7CjgGyos8i17aSBPq1f4s3zF3PyedFiAR4YEZbva2Q==
+"@gitlab/stylelint-config@^2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/stylelint-config/-/stylelint-config-2.2.0.tgz#f0139c8bd29525b51ee9f16d26b66283bd2be5bb"
+ integrity sha512-yLBwRu/geN7nGzoOtF6VV2Fbjhcu2w3PwVnJ5/6wX3MILLO7Wh8zzurIjjSnls8124WUoD7n51Catrjl0hyqDw==
+ dependencies:
+ stylelint "^13.2.1"
+ stylelint-declaration-strict-value "^1.7.7"
+ stylelint-scss "^3.18.0"
+
"@gitlab/svgs@1.182.0":
version "1.182.0"
resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-1.182.0.tgz#600cb577c598ff63325c3f6f049e3254abdbb580"
@@ -892,10 +908,10 @@
resolved "https://registry.yarnpkg.com/@gitlab/tributejs/-/tributejs-1.0.0.tgz#672befa222aeffc83e7d799b0500a7a4418e59b8"
integrity sha512-nmKw1+hB6MHvlmPz63yPwVs1qQkycHwsKgxpEbzmky16Y6mL4EJMk3w1b8QlOAF/AIAzjCERPhe/R4MJiohbZw==
-"@gitlab/ui@27.4.6":
- version "27.4.6"
- resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-27.4.6.tgz#2364c2ba981024cdce32b4657c5f0eb2ae781a4d"
- integrity sha512-0fUNgu0tjk/BBq9NmuZg7THcEsUvfhz/mhUwnLWB5hjrfa7Nnu+TRBgeVfs08vDyK7h6uualgITTH+eTGo6tyw==
+"@gitlab/ui@27.7.1":
+ version "27.7.1"
+ resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-27.7.1.tgz#e62a9a8d96a5f0e61f09fdbbe1771027caaa7aa4"
+ integrity sha512-LRmP2SD73NT9ntvKw1pJShPP6DmjCBmu+mBSZiAj535AGpA+GoQcyi+PTXY12nUjnsPwulaFOOhvFPo8IeFm2Q==
dependencies:
"@babel/standalone" "^7.0.0"
"@gitlab/vue-toasted" "^1.3.0"
@@ -1123,18 +1139,26 @@
resolved "https://registry.yarnpkg.com/@miragejs/pretender-node-polyfill/-/pretender-node-polyfill-0.1.2.tgz#d26b6b7483fb70cd62189d05c95d2f67153e43f2"
integrity sha512-M/BexG/p05C5lFfMunxo/QcgIJnMT2vDVCd00wNqK2ImZONIlEETZwWJu1QtLxtmYlSHlCFl3JNzp0tLe7OJ5g==
-"@mrmlnc/readdir-enhanced@^2.2.1":
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
- integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==
+"@nodelib/fs.scandir@2.1.4":
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69"
+ integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==
dependencies:
- call-me-maybe "^1.0.1"
- glob-to-regexp "^0.3.0"
+ "@nodelib/fs.stat" "2.0.4"
+ run-parallel "^1.1.9"
-"@nodelib/fs.stat@^1.1.2":
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
- integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
+"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655"
+ integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063"
+ integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.4"
+ fastq "^1.6.0"
"@npmcli/move-file@^1.0.1":
version "1.0.1"
@@ -1162,6 +1186,58 @@
resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.0.tgz#9a48df6511cb2b472c9f596c1f37dc0af022e751"
integrity sha512-kQNKyM4ePAc4u9eR1c4OqrbAHH+3SJXt++8izIjeaZeg+P7yBtgoF/dogMD/JPPowNC74ACFpM/4op0Ggp/fPw==
+"@sentry/browser@^5.22.3":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.30.0.tgz#c28f49d551db3172080caef9f18791a7fd39e3b3"
+ integrity sha512-rOb58ZNVJWh1VuMuBG1mL9r54nZqKeaIlwSlvzJfc89vyfd7n6tQ1UXMN383QBz/MS5H5z44Hy5eE+7pCrYAfw==
+ dependencies:
+ "@sentry/core" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/core@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3"
+ integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/hub@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100"
+ integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/minimal@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b"
+ integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/types@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402"
+ integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==
+
+"@sentry/utils@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980"
+ integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
"@sindresorhus/is@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
@@ -1186,6 +1262,21 @@
resolved "https://registry.yarnpkg.com/@sourcegraph/code-host-integration/-/code-host-integration-0.0.52.tgz#3668364647b9248a0c43d738f7b046c551311338"
integrity sha512-HYmiGuQ3XOQHJIQaRv63Wcdl6y1rgryBrCLzJd/mG5gkkhydTqBuf3wWFKgfL3PCm026OrjXu4PvOYU1fCTZJQ==
+"@stylelint/postcss-css-in-js@^0.37.2":
+ version "0.37.2"
+ resolved "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz#7e5a84ad181f4234a2480803422a47b8749af3d2"
+ integrity sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==
+ dependencies:
+ "@babel/core" ">=7.9.0"
+
+"@stylelint/postcss-markdown@^0.36.2":
+ version "0.36.2"
+ resolved "https://registry.yarnpkg.com/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz#0a540c4692f8dcdfc13c8e352c17e7bfee2bb391"
+ integrity sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==
+ dependencies:
+ remark "^13.0.0"
+ unist-util-find-all-after "^3.0.2"
+
"@szmarczak/http-timer@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
@@ -1342,11 +1433,23 @@
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
+"@types/mdast@^3.0.0":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb"
+ integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==
+ dependencies:
+ "@types/unist" "*"
+
"@types/minimatch@*":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
+"@types/minimist@^1.2.0":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256"
+ integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==
+
"@types/node@*", "@types/node@>=6":
version "10.12.9"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.9.tgz#a07bfa74331471e1dc22a47eb72026843f7b95c8"
@@ -1357,6 +1460,11 @@
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
+"@types/parse-json@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
"@types/parse5@^5":
version "5.0.0"
resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.0.tgz#9ae2106efc443d7c1e26570aa8247828c9c80f11"
@@ -1379,28 +1487,11 @@
dependencies:
"@types/estree" "*"
-"@types/unist@*", "@types/unist@^2.0.0":
+"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2":
version "2.0.3"
resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e"
integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==
-"@types/vfile-message@*":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@types/vfile-message/-/vfile-message-1.0.1.tgz#e1e9895cc6b36c462d4244e64e6d0b6eaf65355a"
- integrity sha512-mlGER3Aqmq7bqR1tTTIVHq8KSAFFRyGbrxuM8C/H82g6k7r2fS+IMEkIu3D7JHzG10NvPdR8DNx0jr0pwpp4dA==
- dependencies:
- "@types/node" "*"
- "@types/unist" "*"
-
-"@types/vfile@^3.0.0":
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/@types/vfile/-/vfile-3.0.2.tgz#19c18cd232df11ce6fa6ad80259bc86c366b09b9"
- integrity sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==
- dependencies:
- "@types/node" "*"
- "@types/unist" "*"
- "@types/vfile-message" "*"
-
"@types/yargs-parser@*":
version "15.0.0"
resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d"
@@ -1997,13 +2088,18 @@ array-includes@^3.1.1:
get-intrinsic "^1.0.1"
is-string "^1.0.5"
-array-union@^1.0.1, array-union@^1.0.2:
+array-union@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
dependencies:
array-uniq "^1.0.1"
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
array-uniq@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
@@ -2066,11 +2162,6 @@ assign-symbols@^1.0.0:
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
-astral-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
- integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
-
astral-regex@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
@@ -2103,18 +2194,18 @@ atob@^2.1.2:
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
-autoprefixer@^9.5.1:
- version "9.6.1"
- resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.1.tgz#51967a02d2d2300bb01866c1611ec8348d355a47"
- integrity sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==
+autoprefixer@^9.8.6:
+ version "9.8.6"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f"
+ integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==
dependencies:
- browserslist "^4.6.3"
- caniuse-lite "^1.0.30000980"
- chalk "^2.4.2"
+ browserslist "^4.12.0"
+ caniuse-lite "^1.0.30001109"
+ colorette "^1.2.1"
normalize-range "^0.1.2"
num2fraction "^1.2.2"
- postcss "^7.0.17"
- postcss-value-parser "^4.0.0"
+ postcss "^7.0.32"
+ postcss-value-parser "^4.1.0"
autosize@^4.0.2:
version "4.0.2"
@@ -2271,9 +2362,9 @@ backo2@1.0.2:
integrity sha1-MasayLEpNjRj41s+u2n038+6eUc=
bail@^1.0.0:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.3.tgz#63cfb9ddbac829b02a3128cd53224be78e6c21a3"
- integrity sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776"
+ integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==
balanced-match@^1.0.0:
version "1.0.0"
@@ -2531,7 +2622,7 @@ browserify-zlib@^0.2.0:
dependencies:
pako "~1.0.5"
-browserslist@^4.12.0, browserslist@^4.6.3, browserslist@^4.8.3:
+browserslist@^4.12.0, browserslist@^4.8.3:
version "4.16.1"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.1.tgz#bf757a2da376b3447b800a16f0f1c96358138766"
integrity sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==
@@ -2697,30 +2788,11 @@ call-me-maybe@^1.0.1:
resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
integrity sha1-JtII6onje1y95gJQoV8DHBak1ms=
-caller-callsite@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
- integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
- dependencies:
- callsites "^2.0.0"
-
-caller-path@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
- integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
- dependencies:
- caller-callsite "^2.0.0"
-
callsite@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA=
-callsites@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
- integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
-
callsites@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3"
@@ -2742,25 +2814,20 @@ camelcase-keys@^2.0.0:
camelcase "^2.0.0"
map-obj "^1.0.0"
-camelcase-keys@^4.0.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77"
- integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=
+camelcase-keys@^6.2.2:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"
+ integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==
dependencies:
- camelcase "^4.1.0"
- map-obj "^2.0.0"
- quick-lru "^1.0.0"
+ camelcase "^5.3.1"
+ map-obj "^4.0.0"
+ quick-lru "^4.0.1"
camelcase@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
-camelcase@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
- integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
-
camelcase@^5.0.0, camelcase@^5.2.0, camelcase@^5.3.1:
version "5.3.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
@@ -2771,10 +2838,10 @@ camelcase@^6.0.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e"
integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==
-caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30001173:
- version "1.0.30001178"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001178.tgz#3ad813b2b2c7d585b0be0a2440e1e233c6eabdbc"
- integrity sha512-VtdZLC0vsXykKni8Uztx45xynytOi71Ufx9T8kHptSw9AL4dpqailUJJHavttuzUe1KYuBYtChiWv+BAb7mPmQ==
+caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001173:
+ version "1.0.30001185"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001185.tgz#3482a407d261da04393e2f0d61eefbc53be43b95"
+ integrity sha512-Fpi4kVNtNvJ15H0F6vwmXtb3tukv3Zg3qhKkOGUq7KJ1J6b9kf4dnNgtEAFXhRsJo0gNj9W60+wBvn0JcTvdTg==
capture-exit@^2.0.0:
version "2.0.0"
@@ -2795,11 +2862,6 @@ catharsis@~0.8.9:
dependencies:
underscore-contrib "~0.3.0"
-ccount@^1.0.0:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.3.tgz#f1cec43f332e2ea5a569fd46f9f5bde4e6102aff"
- integrity sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==
-
chalk@^1.1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
@@ -2841,25 +2903,20 @@ char-regex@^1.0.2:
resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
-character-entities-html4@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.2.tgz#c44fdde3ce66b52e8d321d6c1bf46101f0150610"
- integrity sha512-sIrXwyna2+5b0eB9W149izTPJk/KkJTg6mEzDGibwBUkyH1SbDa+nf515Ppdi3MaH35lW0JFJDWeq9Luzes1Iw==
-
character-entities-legacy@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz#7c6defb81648498222c9855309953d05f4d63a9c"
- integrity sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1"
+ integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==
character-entities@^1.0.0:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.2.tgz#58c8f371c0774ef0ba9b2aca5f00d8f100e6e363"
- integrity sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b"
+ integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==
character-reference-invalid@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz#21e421ad3d84055952dab4a43a04e73cd425d3ed"
- integrity sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
+ integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
charenc@~0.0.1:
version "0.0.2"
@@ -3036,11 +3093,6 @@ codesandbox-import-utils@^1.2.3:
istextorbinary "^2.2.1"
lz-string "^1.4.4"
-collapse-white-space@^1.0.2:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.5.tgz#c2495b699ab1ed380d29a1091e01063e75dbbe3a"
- integrity sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ==
-
collect-v8-coverage@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59"
@@ -3370,15 +3422,16 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
-cosmiconfig@^5.2.0:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
- integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
+cosmiconfig@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3"
+ integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==
dependencies:
- import-fresh "^2.0.0"
- is-directory "^0.3.1"
- js-yaml "^3.13.1"
- parse-json "^4.0.0"
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.2.1"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.10.0"
create-ecdh@^4.0.0:
version "4.0.0"
@@ -3482,6 +3535,11 @@ css-b64-images@~0.2.5:
resolved "https://registry.yarnpkg.com/css-b64-images/-/css-b64-images-0.2.5.tgz#42005d83204b2b4a5d93b6b1a5644133b5927a02"
integrity sha1-QgBdgyBLK0pdk7axpWRBM7WSegI=
+css-color-names@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+ integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
+
css-loader@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.1.tgz#d8254f72e412bb2238bb44dd674ffbef497333ea"
@@ -3504,6 +3562,20 @@ css-selector-parser@^1.3:
resolved "https://registry.yarnpkg.com/css-selector-parser/-/css-selector-parser-1.3.0.tgz#5f1ad43e2d8eefbfdc304fcd39a521664943e3eb"
integrity sha1-XxrUPi2O77/cME/NOaUhZklD4+s=
+css-shorthand-properties@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz#1c808e63553c283f289f2dd56fcee8f3337bd935"
+ integrity sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==
+
+css-values@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/css-values/-/css-values-0.1.0.tgz#128b7ce103d4dc027a814a5d5995c54781d7b4c6"
+ integrity sha1-Eot84QPU3AJ6gUpdWZXFR4HXtMY=
+ dependencies:
+ css-color-names "0.0.4"
+ ends-with "^0.2.0"
+ postcss-value-parser "^3.3.0"
+
css@^2.1.0:
version "2.2.4"
resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
@@ -3894,14 +3966,14 @@ debug@^3.1.0, debug@^3.1.1, debug@^3.2.6:
dependencies:
ms "^2.1.1"
-debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
- integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
dependencies:
- ms "^2.1.1"
+ ms "2.1.2"
-decamelize-keys@^1.0.0:
+decamelize-keys@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=
@@ -4105,13 +4177,20 @@ diffie-hellman@^5.0.0:
miller-rabin "^4.0.0"
randombytes "^2.0.0"
-dir-glob@^2.0.0, dir-glob@^2.2.2:
+dir-glob@^2.0.0:
version "2.2.2"
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4"
integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==
dependencies:
path-type "^3.0.0"
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
dns-equal@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
@@ -4197,15 +4276,15 @@ domain-browser@^1.1.1:
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
integrity sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=
-domelementtype@1, domelementtype@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
- integrity sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=
+domelementtype@1, domelementtype@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+ integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
domelementtype@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
- integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e"
+ integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==
domexception@^2.0.1:
version "2.0.1"
@@ -4215,9 +4294,9 @@ domexception@^2.0.1:
webidl-conversions "^5.0.0"
domhandler@^2.3.0:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259"
- integrity sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+ integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
dependencies:
domelementtype "1"
@@ -4227,20 +4306,13 @@ dompurify@^2.2.6:
integrity sha512-7b7ZArhhH0SP6W2R9cqK6RjaU82FZ2UPM7RO8qN1b1wyvC/NY1FNWcX1Pu00fFOAnzEORtwXe4bPaClg6pUybQ==
domutils@^1.5.1:
- version "1.6.2"
- resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.6.2.tgz#1958cc0b4c9426e9ed367fb1c8e854891b0fa3ff"
- integrity sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+ integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
dependencies:
dom-serializer "0"
domelementtype "1"
-dot-prop@^4.1.1:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4"
- integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==
- dependencies:
- is-obj "^1.0.0"
-
dot-prop@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb"
@@ -4368,6 +4440,11 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0:
dependencies:
once "^1.4.0"
+ends-with@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/ends-with/-/ends-with-0.2.0.tgz#2f9da98d57a50cfda4571ce4339000500f4e6b8a"
+ integrity sha1-L52pjVelDP2kVxzkM5AAUA9Oa4o=
+
engine.io-client@~3.2.0:
version "3.2.1"
resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36"
@@ -4439,9 +4516,9 @@ ent@~2.2.0:
integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0=
entities@^1.1.1, entities@~1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
- integrity sha1-blwtClYhtdra7O+AuQ7ftc13cvA=
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+ integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
entities@^2.0.0, entities@~2.0.0:
version "2.0.3"
@@ -4714,12 +4791,12 @@ eslint-visitor-keys@^2.0.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
-eslint@7.19.0:
- version "7.19.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.19.0.tgz#6719621b196b5fad72e43387981314e5d0dc3f41"
- integrity sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg==
+eslint@7.20.0:
+ version "7.20.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.20.0.tgz#db07c4ca4eda2e2316e7aa57ac7fc91ec550bdc7"
+ integrity sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==
dependencies:
- "@babel/code-frame" "^7.0.0"
+ "@babel/code-frame" "7.12.11"
"@eslint/eslintrc" "^0.3.0"
ajv "^6.10.0"
chalk "^4.0.0"
@@ -4731,7 +4808,7 @@ eslint@7.19.0:
eslint-utils "^2.1.0"
eslint-visitor-keys "^2.0.0"
espree "^7.3.1"
- esquery "^1.2.0"
+ esquery "^1.4.0"
esutils "^2.0.2"
file-entry-cache "^6.0.0"
functional-red-black-tree "^1.0.1"
@@ -4780,10 +4857,10 @@ esprima@^4.0.0, esprima@^4.0.1:
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-esquery@^1.0.1, esquery@^1.2.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
- integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
+esquery@^1.0.1, esquery@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
+ integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
dependencies:
estraverse "^5.1.0"
@@ -5031,17 +5108,17 @@ fast-deep-equal@^3.1.1:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-fast-glob@^2.2.6:
- version "2.2.6"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295"
- integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==
+fast-glob@^3.1.1, fast-glob@^3.2.5:
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661"
+ integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==
dependencies:
- "@mrmlnc/readdir-enhanced" "^2.2.1"
- "@nodelib/fs.stat" "^1.1.2"
- glob-parent "^3.1.0"
- is-glob "^4.0.0"
- merge2 "^1.2.3"
- micromatch "^3.1.10"
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.0"
+ merge2 "^1.3.0"
+ micromatch "^4.0.2"
+ picomatch "^2.2.1"
fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0:
version "2.1.0"
@@ -5058,6 +5135,18 @@ fast-mersenne-twister@1.0.2:
resolved "https://registry.yarnpkg.com/fast-mersenne-twister/-/fast-mersenne-twister-1.0.2.tgz#5ead7caf3ace592a5789d11767732bd81cbaaa56"
integrity sha512-IaClPxsoBu3MxGpcURyjV8otT5Bj4ARoK0KBCJGnEVnD1A/qclL5eIeYiUuwG/WWJPxL1jlK61HTm2T6SBmvBQ==
+fastest-levenshtein@^1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2"
+ integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==
+
+fastq@^1.6.0:
+ version "1.10.1"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.1.tgz#8b8f2ac8bf3632d67afcd65dac248d5fdc45385e"
+ integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==
+ dependencies:
+ reusify "^1.0.4"
+
fault@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.2.tgz#c3d0fec202f172a3a4d414042ad2bb5e2a3ffbaa"
@@ -5084,13 +5173,6 @@ figgy-pudding@^3.5.1:
resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==
-file-entry-cache@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
- integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
- dependencies:
- flat-cache "^2.0.1"
-
file-entry-cache@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a"
@@ -5225,15 +5307,6 @@ findup-sync@^3.0.0:
micromatch "^3.0.4"
resolve-dir "^1.0.1"
-flat-cache@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
- integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
- dependencies:
- flatted "^2.0.0"
- rimraf "2.6.3"
- write "1.0.3"
-
flat-cache@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
@@ -5430,10 +5503,10 @@ get-stdin@^6.0.0:
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b"
integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==
-get-stdin@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6"
- integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==
+get-stdin@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53"
+ integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==
get-stdin@~5.0.1:
version "5.0.1"
@@ -5494,18 +5567,13 @@ glob-parent@^3.1.0:
is-glob "^3.1.0"
path-dirname "^1.0.0"
-glob-parent@^5.0.0, glob-parent@~5.1.0:
+glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
dependencies:
is-glob "^4.0.1"
-glob-to-regexp@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
- integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
-
glob-to-regexp@^0.4.0:
version "0.4.1"
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
@@ -5586,6 +5654,18 @@ globals@^12.1.0:
dependencies:
type-fest "^0.8.1"
+globby@^11.0.2:
+ version "11.0.2"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83"
+ integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.1.1"
+ ignore "^5.1.4"
+ merge2 "^1.3.0"
+ slash "^3.0.0"
+
globby@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
@@ -5609,20 +5689,6 @@ globby@^7.1.1:
pify "^3.0.0"
slash "^1.0.0"
-globby@^9.2.0:
- version "9.2.0"
- resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d"
- integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==
- dependencies:
- "@types/glob" "^7.1.1"
- array-union "^1.0.2"
- dir-glob "^2.2.2"
- fast-glob "^2.2.6"
- glob "^7.1.3"
- ignore "^4.0.3"
- pify "^4.0.1"
- slash "^2.0.0"
-
globjoin@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43"
@@ -5637,12 +5703,12 @@ globule@^1.0.0:
lodash "~4.17.10"
minimatch "~3.0.2"
-gonzales-pe@^4.2.3:
- version "4.2.3"
- resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.2.3.tgz#41091703625433285e0aee3aa47829fc1fbeb6f2"
- integrity sha512-Kjhohco0esHQnOiqqdJeNz/5fyPkOMD/d6XVjwTAoPGUFh0mCollPUTUTa2OZy4dYNAqlPIQdTiNzJTWdd9Htw==
+gonzales-pe@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3"
+ integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==
dependencies:
- minimist "1.1.x"
+ minimist "^1.2.5"
good-listener@^1.2.2:
version "1.2.2"
@@ -5737,6 +5803,11 @@ har-validator@~5.1.3:
ajv "^6.12.3"
har-schema "^2.0.0"
+hard-rejection@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
+ integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==
+
has-ansi@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
@@ -5883,6 +5954,13 @@ hosted-git-info@^2.1.4:
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
+hosted-git-info@^3.0.6:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.8.tgz#6e35d4cc87af2c5f816e4cb9ce350ba87a3f370d"
+ integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==
+ dependencies:
+ lru-cache "^6.0.0"
+
hpack.js@^2.1.6:
version "2.1.6"
resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
@@ -5923,22 +6001,22 @@ html-minifier@^4.0.0:
relateurl "^0.2.7"
uglify-js "^3.5.1"
-html-tags@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.0.0.tgz#41f57708c9e6b7b46a00a22317d614c4a2bab166"
- integrity sha512-xiXEBjihaNI+VZ2mKEoI5ZPxqUsevTKM+aeeJ/W4KAg2deGE35minmCJMn51BvwJZmiHaeAxrb2LAS0yZJxuuA==
+html-tags@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140"
+ integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==
htmlparser2@^3.10.0:
- version "3.10.0"
- resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464"
- integrity sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
+ integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
dependencies:
- domelementtype "^1.3.0"
+ domelementtype "^1.3.1"
domhandler "^2.3.0"
domutils "^1.5.1"
entities "^1.1.1"
inherits "^2.0.1"
- readable-stream "^3.0.6"
+ readable-stream "^3.1.1"
http-cache-semantics@^4.0.0:
version "4.1.0"
@@ -6069,12 +6147,12 @@ ignore@^3.3.5:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
-ignore@^4.0.3, ignore@^4.0.6:
+ignore@^4.0.6:
version "4.0.6"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
-ignore@^5.0.6, ignore@~5.1.4:
+ignore@^5.1.4, ignore@^5.1.8, ignore@~5.1.4:
version "5.1.8"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
@@ -6089,14 +6167,6 @@ immer@^7.0.7:
resolved "https://registry.yarnpkg.com/immer/-/immer-7.0.7.tgz#9dfe713d49bf871cc59aedfce59b1992fa37a977"
integrity sha512-Q8yYwVADJXrNfp1ZUAh4XDHkcoE3wpdpb4mC5abDSajs2EbW8+cGdPyAnglMyLnm7EF6ojD2xBFX7L5i4TIytw==
-import-fresh@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
- integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
- dependencies:
- caller-path "^2.0.0"
- resolve-from "^3.0.0"
-
import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
@@ -6148,11 +6218,6 @@ indent-string@^2.1.0:
dependencies:
repeating "^2.0.0"
-indent-string@^3.0.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
- integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=
-
indent-string@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
@@ -6266,19 +6331,14 @@ is-accessor-descriptor@^1.0.0:
kind-of "^6.0.0"
is-alphabetical@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.2.tgz#1fa6e49213cb7885b75d15862fb3f3d96c884f41"
- integrity sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg==
-
-is-alphanumeric@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4"
- integrity sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d"
+ integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==
is-alphanumerical@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz#1138e9ae5040158dc6ff76b820acd6b7a181fd40"
- integrity sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf"
+ integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==
dependencies:
is-alphabetical "^1.0.0"
is-decimal "^1.0.0"
@@ -6301,9 +6361,9 @@ is-buffer@^1.1.5, is-buffer@~1.1.1:
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
is-buffer@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725"
- integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+ integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
is-callable@^1.1.4, is-callable@^1.2.2:
version "1.2.3"
@@ -6337,9 +6397,9 @@ is-date-object@^1.0.1:
integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=
is-decimal@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.2.tgz#894662d6a8709d307f3a276ca4339c8fa5dff0ff"
- integrity sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5"
+ integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==
is-descriptor@^0.1.0:
version "0.1.6"
@@ -6359,11 +6419,6 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2:
is-data-descriptor "^1.0.0"
kind-of "^6.0.2"
-is-directory@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
- integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
-
is-docker@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156"
@@ -6428,9 +6483,9 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
is-extglob "^2.1.1"
is-hexadecimal@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz#b6e710d7d07bb66b98cb8cece5c9b4921deeb835"
- integrity sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
+ integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
is-installed-globally@^0.3.1:
version "0.3.2"
@@ -6462,11 +6517,6 @@ is-number@^7.0.0:
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
-is-obj@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
- integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
-
is-obj@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
@@ -6501,6 +6551,11 @@ is-plain-obj@^1.1.0:
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+is-plain-obj@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
is-plain-object@^2.0.3, is-plain-object@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
@@ -6558,11 +6613,6 @@ is-utf8@^0.2.0:
resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
-is-whitespace-character@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz#ede53b4c6f6fb3874533751ec9280d01928d03ed"
- integrity sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==
-
is-whitespace@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f"
@@ -6573,11 +6623,6 @@ is-windows@^1.0.1, is-windows@^1.0.2:
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
-is-word-character@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.2.tgz#46a5dac3f2a1840898b91e576cd40d493f3ae553"
- integrity sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==
-
is-wsl@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
@@ -7325,7 +7370,7 @@ json-buffer@3.0.0:
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
-json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
+json-parse-better-errors@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
@@ -7554,7 +7599,7 @@ kind-of@^5.0.0:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
-kind-of@^6.0.0, kind-of@^6.0.2:
+kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
@@ -7571,10 +7616,10 @@ kleur@^3.0.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
-known-css-properties@^0.14.0:
- version "0.14.0"
- resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.14.0.tgz#d7032b4334a32dc22e6e46b081ec789daf18756c"
- integrity sha512-P+0a/gBzLgVlCnK8I7VcD0yuYJscmWn66wH9tlKsQnmVdg689tLEmziwB9PuazZYLkcm07fvWOKCJJqI55sD5Q==
+known-css-properties@^0.20.0:
+ version "0.20.0"
+ resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.20.0.tgz#0570831661b47dd835293218381166090ff60e96"
+ integrity sha512-URvsjaA9ypfreqJ2/ylDr5MUERhJZ+DhguoWRr2xgS5C7aGCalXo+ewL+GixgKBfhT2vuL02nbIgNGqVWgTOYw==
latest-version@^5.0.0:
version "5.1.0"
@@ -7663,16 +7708,6 @@ load-json-file@^2.0.0:
pify "^2.0.0"
strip-bom "^3.0.0"
-load-json-file@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
- integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs=
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^4.0.0"
- pify "^3.0.0"
- strip-bom "^3.0.0"
-
loader-runner@^2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
@@ -7864,19 +7899,19 @@ lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.1
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
-log-symbols@^2.1.0, log-symbols@^2.2.0:
+log-symbols@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
dependencies:
chalk "^2.0.1"
-log-symbols@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4"
- integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
+log-symbols@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
+ integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
dependencies:
- chalk "^2.4.2"
+ chalk "^4.0.0"
log4js@^4.0.0:
version "4.5.1"
@@ -7894,10 +7929,10 @@ loglevel@^1.6.8:
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197"
integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==
-longest-streak@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.2.tgz#2421b6ba939a443bb9ffebf596585a50b4c38e2e"
- integrity sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==
+longest-streak@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4"
+ integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==
loose-envify@^1.0.0:
version "1.4.0"
@@ -8001,10 +8036,10 @@ map-obj@^1.0.0, map-obj@^1.0.1:
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
-map-obj@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9"
- integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk=
+map-obj@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5"
+ integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==
map-visit@^1.0.0:
version "1.0.0"
@@ -8013,11 +8048,6 @@ map-visit@^1.0.0:
dependencies:
object-visit "^1.0.0"
-markdown-escapes@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.2.tgz#e639cbde7b99c841c0bacc8a07982873b46d2122"
- integrity sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==
-
markdown-it@11.0.0:
version "11.0.0"
resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-11.0.0.tgz#dbfc30363e43d756ebc52c38586b91b90046b876"
@@ -8040,11 +8070,6 @@ markdown-it@^8.4.2:
mdurl "^1.0.1"
uc.micro "^1.0.5"
-markdown-table@^1.1.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.2.tgz#c78db948fa879903a41bce522e3b96f801c63786"
- integrity sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==
-
markdownlint-cli@0.24.0:
version "0.24.0"
resolved "https://registry.yarnpkg.com/markdownlint-cli/-/markdownlint-cli-0.24.0.tgz#d1c1d43cd53b87aaec93035b3234eef7097139a8"
@@ -8087,10 +8112,10 @@ mathjax@3:
resolved "https://registry.yarnpkg.com/mathjax/-/mathjax-3.1.2.tgz#95c0d45ce2330ef7b6a815cebe7d61ecc26bbabd"
integrity sha512-BojKspBv4nNWzO1wC6VEI+g9gHDOhkaGHGgLxXkasdU4pwjdO5AXD5M/wcLPkXYPjZ/N+6sU8rjQTlyvN2cWiQ==
-mathml-tag-names@^2.1.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.1.tgz#6dff66c99d55ecf739ca53c492e626f1d12a33cc"
- integrity sha512-pWB896KPGSGkp1XtyzRBftpTzwSOL0Gfk0wLvxt4f2mgzjY19o0LxJ3U25vNWTzsh7da+KTbuXQoQ3lOJZ8WHw==
+mathml-tag-names@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3"
+ integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
md5.js@^1.3.4:
version "1.3.4"
@@ -8109,12 +8134,33 @@ md5@^2.2.1:
crypt "~0.0.1"
is-buffer "~1.1.1"
-mdast-util-compact@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-1.0.2.tgz#c12ebe16fffc84573d3e19767726de226e95f649"
- integrity sha512-d2WS98JSDVbpSsBfVvD9TaDMlqPRz7ohM/11G0rp5jOBb5q96RJ6YLszQ/09AAixyzh23FeIpCGqfaamEADtWg==
+mdast-util-from-markdown@^0.8.0:
+ version "0.8.5"
+ resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c"
+ integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ mdast-util-to-string "^2.0.0"
+ micromark "~2.11.0"
+ parse-entities "^2.0.0"
+ unist-util-stringify-position "^2.0.0"
+
+mdast-util-to-markdown@^0.6.0:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe"
+ integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==
dependencies:
- unist-util-visit "^1.1.0"
+ "@types/unist" "^2.0.0"
+ longest-streak "^2.0.0"
+ mdast-util-to-string "^2.0.0"
+ parse-entities "^2.0.0"
+ repeat-string "^1.0.0"
+ zwitch "^1.0.0"
+
+mdast-util-to-string@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b"
+ integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==
mdurl@^1.0.1:
version "1.0.1"
@@ -8163,20 +8209,23 @@ meow@^3.7.0:
redent "^1.0.0"
trim-newlines "^1.0.0"
-meow@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4"
- integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==
+meow@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364"
+ integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==
dependencies:
- camelcase-keys "^4.0.0"
- decamelize-keys "^1.0.0"
- loud-rejection "^1.0.0"
- minimist-options "^3.0.1"
- normalize-package-data "^2.3.4"
- read-pkg-up "^3.0.0"
- redent "^2.0.0"
- trim-newlines "^2.0.0"
- yargs-parser "^10.0.0"
+ "@types/minimist" "^1.2.0"
+ camelcase-keys "^6.2.2"
+ decamelize "^1.2.0"
+ decamelize-keys "^1.1.0"
+ hard-rejection "^2.1.0"
+ minimist-options "4.1.0"
+ normalize-package-data "^3.0.0"
+ read-pkg-up "^7.0.1"
+ redent "^3.0.0"
+ trim-newlines "^3.0.0"
+ type-fest "^0.18.0"
+ yargs-parser "^20.2.3"
merge-descriptors@1.0.1:
version "1.0.1"
@@ -8195,10 +8244,10 @@ merge-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-merge2@^1.2.3:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5"
- integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==
+merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
mermaid@^8.9.0:
version "8.9.0"
@@ -8222,6 +8271,14 @@ methods@~1.1.2:
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+micromark@~2.11.0:
+ version "2.11.4"
+ resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a"
+ integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==
+ dependencies:
+ debug "^4.0.0"
+ parse-entities "^2.0.0"
+
micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
version "3.1.10"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
@@ -8241,7 +8298,7 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
snapdragon "^0.8.1"
to-regex "^3.0.2"
-micromatch@^4.0.0, micromatch@^4.0.2:
+micromatch@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
@@ -8296,6 +8353,11 @@ min-document@^2.19.0:
dependencies:
dom-walk "^0.1.0"
+min-indent@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
+ integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
+
minify@^4.1.1:
version "4.1.2"
resolved "https://registry.yarnpkg.com/minify/-/minify-4.1.2.tgz#88755f4faa5f7ab6d0c64fdd659aa34ea658f180"
@@ -8326,18 +8388,14 @@ minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2, minimatc
dependencies:
brace-expansion "^1.1.7"
-minimist-options@^3.0.1:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954"
- integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==
+minimist-options@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
+ integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==
dependencies:
arrify "^1.0.1"
is-plain-obj "^1.1.0"
-
-minimist@1.1.x:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8"
- integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=
+ kind-of "^6.0.3"
minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5:
version "1.2.5"
@@ -8504,11 +8562,16 @@ ms@2.0.0:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
-ms@2.1.1, ms@^2.1.1:
+ms@2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+ms@2.1.2, ms@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
multicast-dns-service-types@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
@@ -8731,6 +8794,16 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-
semver "2 || 3 || 4 || 5"
validate-npm-package-license "^3.0.1"
+normalize-package-data@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.0.tgz#1f8a7c423b3d2e85eb36985eaf81de381d01301a"
+ integrity sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==
+ dependencies:
+ hosted-git-info "^3.0.6"
+ resolve "^1.17.0"
+ semver "^7.3.2"
+ validate-npm-package-license "^3.0.1"
+
normalize-path@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
@@ -9127,10 +9200,10 @@ parse-color@^1.0.0:
dependencies:
color-convert "~0.5.0"
-parse-entities@^1.0.2, parse-entities@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.0.tgz#9deac087661b2e36814153cb78d7e54a4c5fd6f4"
- integrity sha512-XXtDdOPLSB0sHecbEapQi6/58U/ODj/KWfIXmmMCJF/eRn8laX6LZbOyioMoETOOJoWRW8/qTSl5VQkUIfKM5g==
+parse-entities@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8"
+ integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==
dependencies:
character-entities "^1.0.0"
character-entities-legacy "^1.0.0"
@@ -9146,14 +9219,6 @@ parse-json@^2.2.0:
dependencies:
error-ex "^1.2.0"
-parse-json@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
- integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
- dependencies:
- error-ex "^1.3.1"
- json-parse-better-errors "^1.0.1"
-
parse-json@^5.0.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646"
@@ -9278,6 +9343,11 @@ path-type@^3.0.0:
dependencies:
pify "^3.0.0"
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
pbkdf2@^3.0.3:
version "3.0.14"
resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade"
@@ -9403,13 +9473,6 @@ postcss-html@^0.36.0:
dependencies:
htmlparser2 "^3.10.0"
-postcss-jsx@^0.36.1:
- version "0.36.2"
- resolved "https://registry.yarnpkg.com/postcss-jsx/-/postcss-jsx-0.36.2.tgz#34bcd6752426a60b8df73f069e7595383060a794"
- integrity sha512-7B8a8a6YDOQFqMQ9UmOo+IPPb2i14Z57Fvc9cOI11B3bWMSY2O6r2XJ3tlcQhUhv93TeN0ntxehTaSWJDQavlg==
- dependencies:
- "@babel/core" ">=7.2.2"
-
postcss-less@^3.1.4:
version "3.1.4"
resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad"
@@ -9417,14 +9480,6 @@ postcss-less@^3.1.4:
dependencies:
postcss "^7.0.14"
-postcss-markdown@^0.36.0:
- version "0.36.0"
- resolved "https://registry.yarnpkg.com/postcss-markdown/-/postcss-markdown-0.36.0.tgz#7f22849ae0e3db18820b7b0d5e7833f13a447560"
- integrity sha512-rl7fs1r/LNSB2bWRhyZ+lM/0bwKv9fhl38/06gF6mKMo/NPnp55+K1dSTosSVjFZc0e1ppBlu+WT91ba0PMBfQ==
- dependencies:
- remark "^10.0.1"
- unist-util-find-all-after "^1.0.2"
-
postcss-media-query-parser@^0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244"
@@ -9462,60 +9517,42 @@ postcss-modules-values@^2.0.0:
icss-replace-symbols "^1.1.0"
postcss "^7.0.6"
-postcss-reporter@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-6.0.1.tgz#7c055120060a97c8837b4e48215661aafb74245f"
- integrity sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==
- dependencies:
- chalk "^2.4.1"
- lodash "^4.17.11"
- log-symbols "^2.2.0"
- postcss "^7.0.7"
-
postcss-resolve-nested-selector@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e"
integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=
-postcss-safe-parser@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz#8756d9e4c36fdce2c72b091bbc8ca176ab1fcdea"
- integrity sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==
- dependencies:
- postcss "^7.0.0"
-
-postcss-sass@^0.3.5:
- version "0.3.5"
- resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.3.5.tgz#6d3e39f101a53d2efa091f953493116d32beb68c"
- integrity sha512-B5z2Kob4xBxFjcufFnhQ2HqJQ2y/Zs/ic5EZbCywCkxKd756Q40cIQ/veRDwSrw1BF6+4wUgmpm0sBASqVi65A==
+postcss-safe-parser@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96"
+ integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==
dependencies:
- gonzales-pe "^4.2.3"
- postcss "^7.0.1"
+ postcss "^7.0.26"
-postcss-scss@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.0.0.tgz#248b0a28af77ea7b32b1011aba0f738bda27dea1"
- integrity sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug==
+postcss-sass@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.4.4.tgz#91f0f3447b45ce373227a98b61f8d8f0785285a3"
+ integrity sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==
dependencies:
- postcss "^7.0.0"
+ gonzales-pe "^4.3.0"
+ postcss "^7.0.21"
-postcss-selector-parser@^3.1.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865"
- integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=
+postcss-scss@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383"
+ integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==
dependencies:
- dot-prop "^4.1.1"
- indexes-of "^1.0.1"
- uniq "^1.0.1"
+ postcss "^7.0.6"
-postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c"
- integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==
+postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4:
+ version "6.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3"
+ integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==
dependencies:
cssesc "^3.0.0"
indexes-of "^1.0.1"
uniq "^1.0.1"
+ util-deprecate "^1.0.2"
postcss-syntax@^0.36.2:
version "0.36.2"
@@ -9527,15 +9564,15 @@ postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1:
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
-postcss-value-parser@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.0.tgz#99a983d365f7b2ad8d0f9b8c3094926eab4b936d"
- integrity sha512-ESPktioptiSUchCKgggAkzdmkgzKfmp0EU8jXH+5kbIUB+unr0Y4CY9SRMvibuvYUBjNh1ACLbxqYNpdTQOteQ==
+postcss-value-parser@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
+ integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
-postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7:
- version "7.0.30"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.30.tgz#cc9378beffe46a02cbc4506a0477d05fcea9a8e2"
- integrity sha512-nu/0m+NtIzoubO+xdAlwZl/u5S5vi/y6BCsoL8D+8IxsD3XvBS8X4YEADNIVXKVuQvduiucnRv+vPIqj56EGMQ==
+postcss@^7.0.14, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.5, postcss@^7.0.6:
+ version "7.0.35"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24"
+ integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==
dependencies:
chalk "^2.4.2"
source-map "^0.6.1"
@@ -9885,10 +9922,10 @@ querystringify@^2.1.1:
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
-quick-lru@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8"
- integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=
+quick-lru@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
+ integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
version "2.1.0"
@@ -9966,14 +10003,6 @@ read-pkg-up@^2.0.0:
find-up "^2.0.0"
read-pkg "^2.0.0"
-read-pkg-up@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07"
- integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=
- dependencies:
- find-up "^2.0.0"
- read-pkg "^3.0.0"
-
read-pkg-up@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
@@ -10001,15 +10030,6 @@ read-pkg@^2.0.0:
normalize-package-data "^2.3.2"
path-type "^2.0.0"
-read-pkg@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
- integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=
- dependencies:
- load-json-file "^4.0.0"
- normalize-package-data "^2.3.2"
- path-type "^3.0.0"
-
read-pkg@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
@@ -10033,10 +10053,10 @@ read-pkg@^5.2.0:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
-readable-stream@^3.0.6:
- version "3.0.6"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.0.6.tgz#351302e4c68b5abd6a2ed55376a7f9a25be3057a"
- integrity sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg==
+readable-stream@^3.0.6, readable-stream@^3.1.1:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
@@ -10077,13 +10097,13 @@ redent@^1.0.0:
indent-string "^2.1.0"
strip-indent "^1.0.1"
-redent@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa"
- integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=
+redent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
+ integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
dependencies:
- indent-string "^3.0.0"
- strip-indent "^2.0.0"
+ indent-string "^4.0.0"
+ strip-indent "^3.0.0"
regenerate-unicode-properties@^8.2.0:
version "8.2.0"
@@ -10166,55 +10186,28 @@ relateurl@^0.2.7:
resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
-remark-parse@^6.0.0:
- version "6.0.3"
- resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-6.0.3.tgz#c99131052809da482108413f87b0ee7f52180a3a"
- integrity sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==
+remark-parse@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640"
+ integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==
dependencies:
- collapse-white-space "^1.0.2"
- is-alphabetical "^1.0.0"
- is-decimal "^1.0.0"
- is-whitespace-character "^1.0.0"
- is-word-character "^1.0.0"
- markdown-escapes "^1.0.0"
- parse-entities "^1.1.0"
- repeat-string "^1.5.4"
- state-toggle "^1.0.0"
- trim "0.0.1"
- trim-trailing-lines "^1.0.0"
- unherit "^1.0.4"
- unist-util-remove-position "^1.0.0"
- vfile-location "^2.0.0"
- xtend "^4.0.1"
-
-remark-stringify@^6.0.0:
- version "6.0.4"
- resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-6.0.4.tgz#16ac229d4d1593249018663c7bddf28aafc4e088"
- integrity sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg==
+ mdast-util-from-markdown "^0.8.0"
+
+remark-stringify@^9.0.0:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-9.0.1.tgz#576d06e910548b0a7191a71f27b33f1218862894"
+ integrity sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==
dependencies:
- ccount "^1.0.0"
- is-alphanumeric "^1.0.0"
- is-decimal "^1.0.0"
- is-whitespace-character "^1.0.0"
- longest-streak "^2.0.1"
- markdown-escapes "^1.0.0"
- markdown-table "^1.1.0"
- mdast-util-compact "^1.0.0"
- parse-entities "^1.0.2"
- repeat-string "^1.5.4"
- state-toggle "^1.0.0"
- stringify-entities "^1.0.1"
- unherit "^1.0.4"
- xtend "^4.0.1"
-
-remark@^10.0.1:
- version "10.0.1"
- resolved "https://registry.yarnpkg.com/remark/-/remark-10.0.1.tgz#3058076dc41781bf505d8978c291485fe47667df"
- integrity sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==
- dependencies:
- remark-parse "^6.0.0"
- remark-stringify "^6.0.0"
- unified "^7.0.0"
+ mdast-util-to-markdown "^0.6.0"
+
+remark@^13.0.0:
+ version "13.0.0"
+ resolved "https://registry.yarnpkg.com/remark/-/remark-13.0.0.tgz#d15d9bf71a402f40287ebe36067b66d54868e425"
+ integrity sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==
+ dependencies:
+ remark-parse "^9.0.0"
+ remark-stringify "^9.0.0"
+ unified "^9.1.0"
remove-trailing-separator@^1.0.1:
version "1.1.0"
@@ -10226,7 +10219,7 @@ repeat-element@^1.1.2:
resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
-repeat-string@^1.5.4, repeat-string@^1.6.1:
+repeat-string@^1.0.0, repeat-string@^1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
@@ -10238,11 +10231,6 @@ repeating@^2.0.0:
dependencies:
is-finite "^1.0.0"
-replace-ext@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
- integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=
-
request-light@^0.2.4:
version "0.2.5"
resolved "https://registry.yarnpkg.com/request-light/-/request-light-0.2.5.tgz#38a3da7b2e56f7af8cbba57e8a94930ee2380746"
@@ -10373,7 +10361,7 @@ resolve-url@^0.2.1:
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
-resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2:
+resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0:
version "1.17.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
@@ -10397,12 +10385,17 @@ retry@^0.12.0:
resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
rfdc@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2"
integrity sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==
-rimraf@2, rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.3:
+rimraf@2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.3:
version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
@@ -10439,6 +10432,11 @@ rsvp@^4.8.4:
resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911"
integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==
+run-parallel@^1.1.9:
+ version "1.1.10"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef"
+ integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==
+
run-queue@^1.0.0, run-queue@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
@@ -10732,6 +10730,13 @@ shellwords@^0.1.1:
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
+shortcss@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/shortcss/-/shortcss-0.1.3.tgz#ee2a7904d80b7f5502c98408f4a2f313faadfb48"
+ integrity sha1-7ip5BNgLf1UCyYQI9KLzE/qt+0g=
+ dependencies:
+ css-shorthand-properties "^1.0.0"
+
sigmund@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
@@ -10752,25 +10757,11 @@ slash@^1.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
-slash@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
- integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
-
slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-slice-ansi@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
- integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
- dependencies:
- ansi-styles "^3.2.0"
- astral-regex "^1.0.0"
- is-fullwidth-code-point "^2.0.0"
-
slice-ansi@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
@@ -11054,11 +11045,6 @@ stack-utils@^2.0.2:
dependencies:
escape-string-regexp "^2.0.0"
-state-toggle@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.1.tgz#c3cb0974f40a6a0f8e905b96789eb41afa1cde3a"
- integrity sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==
-
static-extend@^0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
@@ -11200,16 +11186,6 @@ string_decoder@~0.10.x:
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
-stringify-entities@^1.0.1:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-1.3.2.tgz#a98417e5471fd227b3e45d3db1861c11caf668f7"
- integrity sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==
- dependencies:
- character-entities-html4 "^1.0.0"
- character-entities-legacy "^1.0.0"
- is-alphanumerical "^1.0.0"
- is-hexadecimal "^1.0.0"
-
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
@@ -11272,10 +11248,12 @@ strip-indent@^1.0.1:
dependencies:
get-stdin "^4.0.1"
-strip-indent@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
- integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=
+strip-indent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
+ integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
+ dependencies:
+ min-indent "^1.0.0"
strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
version "3.1.1"
@@ -11300,75 +11278,78 @@ style-search@^0.1.0:
resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902"
integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=
-stylelint-config-recommended@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-2.2.0.tgz#46ab139db4a0e7151fd5f94af155512886c96d3f"
- integrity sha512-bZ+d4RiNEfmoR74KZtCKmsABdBJr4iXRiCso+6LtMJPw5rd/KnxUWTxht7TbafrTJK1YRjNgnN0iVZaJfc3xJA==
+stylelint-declaration-strict-value@^1.7.7:
+ version "1.7.7"
+ resolved "https://registry.yarnpkg.com/stylelint-declaration-strict-value/-/stylelint-declaration-strict-value-1.7.7.tgz#d2f0aabc7f3e701a8988207f27d9696bd1d1ed0d"
+ integrity sha512-Gr5RZYMIS7af6N6PGRD3vmCJM/NlKY4D/jWdidQqxcXkhBtsmV6C99GjQOB0nfdYtjfJEQZLMlTNBztY4tRGfA==
+ dependencies:
+ css-values "^0.1.0"
+ shortcss "^0.1.3"
-stylelint-scss@^3.9.2:
- version "3.9.2"
- resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-3.9.2.tgz#5435174a57696ee52eae40146778a4e62f7ed3a3"
- integrity sha512-VUh173p3T1qJf016P7yeJ6nxkUpqF5qQ+VSDw3J8P6wEJbA1loaNgBHR3k3skHvUkF+9brLO1ibCHA00pjW3cw==
+stylelint-scss@^3.18.0:
+ version "3.19.0"
+ resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-3.19.0.tgz#528006d5a4c5a0f1f4d709b02fd3f626ed66d742"
+ integrity sha512-Ic5bsmpS4wVucOw44doC1Yi9f5qbeVL4wPFiEOaUElgsOuLEN6Ofn/krKI8BeNL2gAn53Zu+IcVV4E345r6rBw==
dependencies:
- lodash "^4.17.11"
+ lodash "^4.17.15"
postcss-media-query-parser "^0.2.3"
postcss-resolve-nested-selector "^0.1.1"
postcss-selector-parser "^6.0.2"
- postcss-value-parser "^4.0.0"
+ postcss-value-parser "^4.1.0"
-stylelint@^10.1.0:
- version "10.1.0"
- resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-10.1.0.tgz#1bc4c4ce878107e7c396b19226d91ba28268911a"
- integrity sha512-OmlUXrgzEMLQYj1JPTpyZPR9G4bl0StidfHnGJEMpdiQ0JyTq0MPg1xkHk1/xVJ2rTPESyJCDWjG8Kbpoo7Kuw==
+stylelint@^13.2.1:
+ version "13.9.0"
+ resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.9.0.tgz#93921ee6e11d4556b9f31131f485dc813b68e32a"
+ integrity sha512-VVWH2oixOAxpWL1vH+V42ReCzBjW2AeqskSAbi8+3OjV1Xg3VZkmTcAqBZfRRvJeF4BvYuDLXebW3tIHxgZDEg==
dependencies:
- autoprefixer "^9.5.1"
+ "@stylelint/postcss-css-in-js" "^0.37.2"
+ "@stylelint/postcss-markdown" "^0.36.2"
+ autoprefixer "^9.8.6"
balanced-match "^1.0.0"
- chalk "^2.4.2"
- cosmiconfig "^5.2.0"
- debug "^4.1.1"
+ chalk "^4.1.0"
+ cosmiconfig "^7.0.0"
+ debug "^4.3.1"
execall "^2.0.0"
- file-entry-cache "^5.0.1"
- get-stdin "^7.0.0"
+ fast-glob "^3.2.5"
+ fastest-levenshtein "^1.0.12"
+ file-entry-cache "^6.0.0"
+ get-stdin "^8.0.0"
global-modules "^2.0.0"
- globby "^9.2.0"
+ globby "^11.0.2"
globjoin "^0.1.4"
- html-tags "^3.0.0"
- ignore "^5.0.6"
+ html-tags "^3.1.0"
+ ignore "^5.1.8"
import-lazy "^4.0.0"
imurmurhash "^0.1.4"
- known-css-properties "^0.14.0"
- leven "^3.1.0"
- lodash "^4.17.11"
- log-symbols "^3.0.0"
- mathml-tag-names "^2.1.0"
- meow "^5.0.0"
- micromatch "^4.0.0"
+ known-css-properties "^0.20.0"
+ lodash "^4.17.20"
+ log-symbols "^4.0.0"
+ mathml-tag-names "^2.1.3"
+ meow "^9.0.0"
+ micromatch "^4.0.2"
normalize-selector "^0.2.0"
- pify "^4.0.1"
- postcss "^7.0.14"
+ postcss "^7.0.35"
postcss-html "^0.36.0"
- postcss-jsx "^0.36.1"
postcss-less "^3.1.4"
- postcss-markdown "^0.36.0"
postcss-media-query-parser "^0.2.3"
- postcss-reporter "^6.0.1"
postcss-resolve-nested-selector "^0.1.1"
- postcss-safe-parser "^4.0.1"
- postcss-sass "^0.3.5"
- postcss-scss "^2.0.0"
- postcss-selector-parser "^3.1.0"
+ postcss-safe-parser "^4.0.2"
+ postcss-sass "^0.4.4"
+ postcss-scss "^2.1.1"
+ postcss-selector-parser "^6.0.4"
postcss-syntax "^0.36.2"
- postcss-value-parser "^3.3.1"
+ postcss-value-parser "^4.1.0"
resolve-from "^5.0.0"
- signal-exit "^3.0.2"
slash "^3.0.0"
specificity "^0.4.1"
- string-width "^4.1.0"
- strip-ansi "^5.2.0"
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
style-search "^0.1.0"
sugarss "^2.0.0"
svg-tags "^1.0.0"
- table "^5.2.3"
+ table "^6.0.7"
+ v8-compile-cache "^2.2.0"
+ write-file-atomic "^3.0.3"
stylis@^3.5.2:
version "3.5.4"
@@ -11436,17 +11417,7 @@ symbol-tree@^3.2.4:
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
-table@^5.2.3:
- version "5.4.4"
- resolved "https://registry.yarnpkg.com/table/-/table-5.4.4.tgz#6e0f88fdae3692793d1077fd172a4667afe986a6"
- integrity sha512-IIfEAUx5QlODLblLrGTTLJA7Tk0iLSGBvgY8essPRVNGHAzThujww1YqHLs6h3HfTg55h++RzLHH5Xw/rfv+mg==
- dependencies:
- ajv "^6.10.2"
- lodash "^4.17.14"
- slice-ansi "^2.1.0"
- string-width "^3.0.0"
-
-table@^6.0.4:
+table@^6.0.4, table@^6.0.7:
version "6.0.7"
resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34"
integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==
@@ -11769,25 +11740,15 @@ trim-newlines@^1.0.0:
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=
-trim-newlines@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20"
- integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=
-
-trim-trailing-lines@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz#e0ec0810fd3c3f1730516b45f49083caaf2774d9"
- integrity sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg==
-
-trim@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
- integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0=
+trim-newlines@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30"
+ integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==
trough@^1.0.0:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.3.tgz#e29bd1614c6458d44869fc28b255ab7857ef7c24"
- integrity sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406"
+ integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==
"true-case-path@^1.0.2":
version "1.0.3"
@@ -11893,6 +11854,11 @@ type-detect@4.0.8:
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+type-fest@^0.18.0:
+ version "0.18.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f"
+ integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==
+
type-fest@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
@@ -11970,14 +11936,6 @@ underscore@~1.8.3:
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022"
integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=
-unherit@^1.0.4:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.1.tgz#132748da3e88eab767e08fabfbb89c5e9d28628c"
- integrity sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==
- dependencies:
- inherits "^2.0.1"
- xtend "^4.0.1"
-
unicode-canonical-property-names-ecmascript@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
@@ -12001,19 +11959,17 @@ unicode-property-aliases-ecmascript@^1.0.4:
resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0"
integrity sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==
-unified@^7.0.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/unified/-/unified-7.1.0.tgz#5032f1c1ee3364bd09da12e27fdd4a7553c7be13"
- integrity sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==
+unified@^9.1.0:
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8"
+ integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==
dependencies:
- "@types/unist" "^2.0.0"
- "@types/vfile" "^3.0.0"
bail "^1.0.0"
extend "^3.0.0"
- is-plain-obj "^1.1.0"
+ is-buffer "^2.0.0"
+ is-plain-obj "^2.0.0"
trough "^1.0.0"
- vfile "^3.0.0"
- x-is-string "^0.1.0"
+ vfile "^4.0.0"
union-value@^1.0.0:
version "1.0.1"
@@ -12051,43 +12007,24 @@ unique-string@^2.0.0:
dependencies:
crypto-random-string "^2.0.0"
-unist-util-find-all-after@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-1.0.2.tgz#9be49cfbae5ca1566b27536670a92836bf2f8d6d"
- integrity sha512-nDl79mKpffXojLpCimVXnxhlH/jjaTnDuScznU9J4jjsaUtBdDbxmlc109XtcqxY4SDO0SwzngsxxW8DIISt1w==
- dependencies:
- unist-util-is "^2.0.0"
-
-unist-util-is@^2.0.0, unist-util-is@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-2.1.2.tgz#1193fa8f2bfbbb82150633f3a8d2eb9a1c1d55db"
- integrity sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw==
-
-unist-util-remove-position@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz#86b5dad104d0bbfbeb1db5f5c92f3570575c12cb"
- integrity sha512-XxoNOBvq1WXRKXxgnSYbtCF76TJrRoe5++pD4cCBsssSiWSnPEktyFrFLE8LTk3JW5mt9hB0Sk5zn4x/JeWY7Q==
+unist-util-find-all-after@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz#fdfecd14c5b7aea5e9ef38d5e0d5f774eeb561f6"
+ integrity sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==
dependencies:
- unist-util-visit "^1.1.0"
+ unist-util-is "^4.0.0"
-unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6"
- integrity sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==
-
-unist-util-visit-parents@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz#63fffc8929027bee04bfef7d2cce474f71cb6217"
- integrity sha512-6B0UTiMfdWql4cQ03gDTCSns+64Zkfo2OCbK31Ov0uMizEz+CJeAp0cgZVb5Fhmcd7Bct2iRNywejT0orpbqUA==
- dependencies:
- unist-util-is "^2.1.2"
+unist-util-is@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.4.tgz#3e9e8de6af2eb0039a59f50c9b3e99698a924f50"
+ integrity sha512-3dF39j/u423v4BBQrk1AQ2Ve1FxY5W3JKwXxVFzBODQ6WEvccguhgp802qQLKSnxPODE6WuRZtV+ohlUg4meBA==
-unist-util-visit@^1.1.0:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3"
- integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==
+unist-util-stringify-position@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da"
+ integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==
dependencies:
- unist-util-visit-parents "^2.0.0"
+ "@types/unist" "^2.0.2"
universalify@^0.1.0:
version "0.1.2"
@@ -12201,7 +12138,7 @@ useragent@2.3.0:
lru-cache "4.1.x"
tmp "0.0.x"
-util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
@@ -12245,7 +12182,7 @@ uuid@^8.3.0:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31"
integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==
-v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1:
+v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1, v8-compile-cache@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132"
integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==
@@ -12281,27 +12218,23 @@ verror@1.10.0:
core-util-is "1.0.2"
extsprintf "^1.2.0"
-vfile-location@^2.0.0:
+vfile-message@^2.0.0:
version "2.0.4"
- resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.4.tgz#2a5e7297dd0d9e2da4381464d04acc6b834d3e55"
- integrity sha512-KRL5uXQPoUKu+NGvQVL4XLORw45W62v4U4gxJ3vRlDfI9QsT4ZN1PNXn/zQpKUulqGDpYuT0XDfp5q9O87/y/w==
-
-vfile-message@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.1.1.tgz#5833ae078a1dfa2d96e9647886cd32993ab313e1"
- integrity sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==
+ resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a"
+ integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==
dependencies:
- unist-util-stringify-position "^1.1.1"
+ "@types/unist" "^2.0.0"
+ unist-util-stringify-position "^2.0.0"
-vfile@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/vfile/-/vfile-3.0.1.tgz#47331d2abe3282424f4a4bb6acd20a44c4121803"
- integrity sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==
+vfile@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624"
+ integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==
dependencies:
+ "@types/unist" "^2.0.0"
is-buffer "^2.0.0"
- replace-ext "1.0.0"
- unist-util-stringify-position "^1.0.0"
- vfile-message "^1.0.0"
+ unist-util-stringify-position "^2.0.0"
+ vfile-message "^2.0.0"
visibilityjs@^1.2.4:
version "1.2.4"
@@ -12815,7 +12748,7 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-write-file-atomic@^3.0.0:
+write-file-atomic@^3.0.0, write-file-atomic@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
@@ -12825,13 +12758,6 @@ write-file-atomic@^3.0.0:
signal-exit "^3.0.2"
typedarray-to-buffer "^3.1.5"
-write@1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
- integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
- dependencies:
- mkdirp "^0.5.1"
-
ws@^6.0.0, ws@^6.2.1:
version "6.2.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
@@ -12853,11 +12779,6 @@ ws@~3.3.1:
safe-buffer "~5.1.0"
ultron "~1.1.0"
-x-is-string@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82"
- integrity sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=
-
xdg-basedir@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
@@ -12914,7 +12835,7 @@ xmlhttprequest-ssl@~1.5.4:
resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e"
integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=
-xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
+xtend@^4.0.0, xtend@~4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
@@ -12966,17 +12887,15 @@ yaml-language-server@^0.11.1:
optionalDependencies:
prettier "2.0.5"
-yargs-parser@20.x:
- version "20.2.1"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.1.tgz#28f3773c546cdd8a69ddae68116b48a5da328e77"
- integrity sha512-yYsjuSkjbLMBp16eaOt7/siKTjNVjMm3SoJnIg3sEh/JsvqVVDyjRKmaJV4cl+lNIgq6QEco2i3gDebJl7/vLA==
+yaml@^1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
+ integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
-yargs-parser@^10.0.0:
- version "10.1.0"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"
- integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==
- dependencies:
- camelcase "^4.1.0"
+yargs-parser@20.x, yargs-parser@^20.2.3:
+ version "20.2.4"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54"
+ integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==
yargs-parser@^13.1.2:
version "13.1.2"
@@ -13065,3 +12984,8 @@ zrender@4.3.2:
version "4.3.2"
resolved "https://registry.yarnpkg.com/zrender/-/zrender-4.3.2.tgz#ec7432f9415c82c73584b6b7b8c47e1b016209c6"
integrity sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g==
+
+zwitch@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"
+ integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==