summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-12-13 00:07:17 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2022-12-13 00:07:17 +0000
commit886f0a286c2b7efb048fb30199cb4d691a722cc9 (patch)
tree97959365971b1bee8cbf4d18d3c02c7caba3b08b
parent9c35027837a3f84eb0c12a9bd3753ab426427613 (diff)
downloadgitlab-ce-886f0a286c2b7efb048fb30199cb4d691a722cc9.tar.gz
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--.rubocop_todo/rails/time_zone.yml6
-rw-r--r--app/helpers/application_settings_helper.rb4
-rw-r--r--app/helpers/issuables_helper.rb19
-rw-r--r--app/models/application_setting.rb4
-rw-r--r--app/models/application_setting_implementation.rb3
-rw-r--r--app/models/ci/job_artifact.rb8
-rw-r--r--app/models/user.rb2
-rw-r--r--app/services/users/assigned_issues_count_service.rb63
-rw-r--r--app/views/admin/application_settings/_visibility_and_access.html.haml6
-rw-r--r--app/views/layouts/header/_default.html.haml2
-rw-r--r--config/feature_flags/development/limit_assigned_issues_count.yml8
-rw-r--r--config/open_api.yml2
-rw-r--r--db/migrate/20221130182056_add_plan_limits_max_size_to_requirements_v2_artifact.rb7
-rw-r--r--db/migrate/20221207140259_add_bulk_import_enabled_to_application_settings.rb7
-rw-r--r--db/post_migrate/20221202031332_add_index_to_issue_assignees_on_user_id_and_issue_id.rb15
-rw-r--r--db/post_migrate/20221202031417_remove_index_to_issue_assignees_on_user_id.rb15
-rw-r--r--db/schema_migrations/202211301820561
-rw-r--r--db/schema_migrations/202212020313321
-rw-r--r--db/schema_migrations/202212020314171
-rw-r--r--db/schema_migrations/202212071402591
-rw-r--r--db/structure.sql6
-rw-r--r--doc/administration/gitaly/troubleshooting.md14
-rw-r--r--doc/administration/instance_limits.md1
-rw-r--r--doc/api/graphql/reference/index.md1
-rw-r--r--doc/api/settings.md1
-rw-r--r--doc/user/markdown.md2
-rw-r--r--lib/api/api.rb2
-rw-r--r--lib/api/rpm_project_packages.rb42
-rw-r--r--lib/api/settings.rb2
-rw-r--r--lib/gitlab/ci/config/entry/reports.rb5
-rw-r--r--lib/gitlab/database/load_balancing/service_discovery.rb7
-rw-r--r--locale/gitlab.pot3
-rw-r--r--spec/controllers/admin/runner_projects_controller_spec.rb2
-rw-r--r--spec/controllers/admin/runners_controller_spec.rb2
-rw-r--r--spec/controllers/groups/runners_controller_spec.rb2
-rw-r--r--spec/controllers/projects/runners_controller_spec.rb2
-rw-r--r--spec/features/admin/admin_runners_spec.rb2
-rw-r--r--spec/features/admin/admin_settings_spec.rb10
-rw-r--r--spec/features/dashboard/issuables_counter_spec.rb23
-rw-r--r--spec/features/groups/group_runners_spec.rb2
-rw-r--r--spec/features/runners_spec.rb2
-rw-r--r--spec/fixtures/api/schemas/group_link/group_link.json84
-rw-r--r--spec/fixtures/api/schemas/jira_connect/author.json29
-rw-r--r--spec/fixtures/api/schemas/jira_connect/branch.json37
-rw-r--r--spec/fixtures/api/schemas/jira_connect/commit.json57
-rw-r--r--spec/fixtures/api/schemas/jira_connect/file.json29
-rw-r--r--spec/fixtures/api/schemas/jira_connect/pull_request.json68
-rw-r--r--spec/fixtures/api/schemas/jira_connect/repository.json45
-rw-r--r--spec/fixtures/api/schemas/job/build_trace_line.json22
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/basic_environment.json34
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/basic_environments.json6
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/branch.json43
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/deploy_token.json4
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/environments.json7
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/feature_flag_scopes.json7
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/feature_flags.json7
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/integration.json76
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/issue.json299
-rw-r--r--spec/graphql/mutations/ci/runner/bulk_delete_spec.rb2
-rw-r--r--spec/graphql/mutations/ci/runner/delete_spec.rb2
-rw-r--r--spec/graphql/mutations/ci/runner/update_spec.rb2
-rw-r--r--spec/graphql/resolvers/ci/group_runners_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/ci/project_runners_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/ci/runner_platforms_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/ci/runner_projects_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/ci/runner_setup_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/ci/runner_status_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/ci/runners_resolver_spec.rb2
-rw-r--r--spec/helpers/issuables_helper_spec.rb60
-rw-r--r--spec/migrations/20220922143143_schedule_reset_duplicate_ci_runners_token_values_spec.rb2
-rw-r--r--spec/migrations/20220922143634_schedule_reset_duplicate_ci_runners_token_encrypted_values_spec.rb4
-rw-r--r--spec/models/application_setting_spec.rb4
-rw-r--r--spec/models/ci/processable_spec.rb1
-rw-r--r--spec/models/ci/runner_version_spec.rb2
-rw-r--r--spec/models/plan_limits_spec.rb1
-rw-r--r--spec/requests/api/ci/runner/runners_delete_spec.rb2
-rw-r--r--spec/requests/api/ci/runner/runners_post_spec.rb2
-rw-r--r--spec/requests/api/ci/runner/runners_reset_spec.rb2
-rw-r--r--spec/requests/api/ci/runners_reset_registration_token_spec.rb2
-rw-r--r--spec/requests/api/ci/runners_spec.rb2
-rw-r--r--spec/requests/api/environments_spec.rb4
-rw-r--r--spec/requests/api/graphql/ci/runner_spec.rb2
-rw-r--r--spec/requests/api/graphql/ci/runner_web_url_edge_spec.rb2
-rw-r--r--spec/requests/api/graphql/ci/runners_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb2
-rw-r--r--spec/requests/api/settings_spec.rb7
-rw-r--r--spec/requests/ide_controller_spec.rb1
-rw-r--r--spec/requests/runner_setup_controller_spec.rb2
-rw-r--r--spec/services/ci/runners/assign_runner_service_spec.rb2
-rw-r--r--spec/services/ci/runners/bulk_delete_runners_service_spec.rb2
-rw-r--r--spec/services/ci/runners/process_runner_version_update_service_spec.rb2
-rw-r--r--spec/services/ci/runners/reconcile_existing_runner_versions_service_spec.rb2
-rw-r--r--spec/services/ci/runners/register_runner_service_spec.rb2
-rw-r--r--spec/services/ci/runners/reset_registration_token_service_spec.rb2
-rw-r--r--spec/services/ci/runners/set_runner_associated_projects_service_spec.rb2
-rw-r--r--spec/services/ci/runners/unassign_runner_service_spec.rb2
-rw-r--r--spec/services/ci/runners/unregister_runner_service_spec.rb2
-rw-r--r--spec/services/ci/runners/update_runner_service_spec.rb2
-rw-r--r--spec/services/incident_management/link_alerts/create_service_spec.rb6
-rw-r--r--spec/services/users/assigned_issues_count_service_spec.rb57
-rw-r--r--spec/spec_helper.rb4
-rw-r--r--spec/tooling/danger/project_helper_spec.rb2
-rw-r--r--spec/workers/ci/runners/process_runner_version_update_worker_spec.rb2
-rw-r--r--spec/workers/ci/runners/reconcile_existing_runner_versions_cron_worker_spec.rb2
-rw-r--r--tooling/danger/project_helper.rb2
106 files changed, 1108 insertions, 277 deletions
diff --git a/.rubocop_todo/rails/time_zone.yml b/.rubocop_todo/rails/time_zone.yml
index af57e55f6e9..378c00c1063 100644
--- a/.rubocop_todo/rails/time_zone.yml
+++ b/.rubocop_todo/rails/time_zone.yml
@@ -9,12 +9,6 @@ Rails/TimeZone:
- 'ee/lib/gitlab/geo/log_cursor/events/repository_updated_event.rb'
- 'ee/lib/gitlab/geo/log_cursor/logger.rb'
- 'ee/lib/gitlab/geo/oauth/login_state.rb'
- - 'ee/lib/gitlab/prometheus/queries/cluster_query.rb'
- - 'ee/spec/lib/gitlab/analytics/cycle_analytics/data_collector_spec.rb'
- - 'ee/spec/lib/gitlab/analytics/cycle_analytics/summary/group/stage_summary_spec.rb'
- - 'ee/spec/lib/gitlab/auth/ldap/access_spec.rb'
- - 'ee/spec/lib/gitlab/auth/smartcard/san_extension_spec.rb'
- - 'ee/spec/lib/gitlab/auth/smartcard/session_spec.rb'
- 'ee/spec/lib/gitlab/geo/base_request_spec.rb'
- 'ee/spec/lib/gitlab/geo/log_cursor/events/cache_invalidation_event_spec.rb'
- 'ee/spec/lib/gitlab/geo/log_cursor/events/design_repository_updated_event_spec.rb'
diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb
index f573aa34730..47c7fa7e477 100644
--- a/app/helpers/application_settings_helper.rb
+++ b/app/helpers/application_settings_helper.rb
@@ -288,6 +288,7 @@ module ApplicationSettingsHelper
:max_import_size,
:max_pages_size,
:max_pages_custom_domains_per_project,
+ :max_terraform_state_size_bytes,
:max_yaml_size_bytes,
:max_yaml_depth,
:metrics_method_call_threshold,
@@ -446,7 +447,8 @@ module ApplicationSettingsHelper
:project_runner_token_expiration_interval,
:pipeline_limit_per_project_user_sha,
:invitation_flow_enforcement,
- :can_create_group
+ :can_create_group,
+ :bulk_import_enabled
].tap do |settings|
next if Gitlab.com?
diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb
index e0bf4e8a759..2b21d8c51e6 100644
--- a/app/helpers/issuables_helper.rb
+++ b/app/helpers/issuables_helper.rb
@@ -207,7 +207,14 @@ module IssuablesHelper
def assigned_issuables_count(issuable_type)
case issuable_type
when :issues
- current_user.assigned_open_issues_count
+ if Feature.enabled?(:limit_assigned_issues_count)
+ ::Users::AssignedIssuesCountService.new(
+ current_user: current_user,
+ max_limit: User::MAX_LIMIT_FOR_ASSIGNEED_ISSUES_COUNT
+ ).count
+ else
+ current_user.assigned_open_issues_count
+ end
when :merge_requests
current_user.assigned_open_merge_requests_count
else
@@ -215,6 +222,16 @@ module IssuablesHelper
end
end
+ def assigned_open_issues_count_text
+ count = assigned_issuables_count(:issues)
+
+ if Feature.enabled?(:limit_assigned_issues_count) && count > User::MAX_LIMIT_FOR_ASSIGNEED_ISSUES_COUNT - 1
+ "#{count - 1}+"
+ else
+ count.to_s
+ end
+ end
+
def issuable_reference(issuable)
@show_full_reference ? issuable.to_reference(full: true) : issuable.to_reference(@group || @project)
end
diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb
index 965a10d7158..f468ed5cfef 100644
--- a/app/models/application_setting.rb
+++ b/app/models/application_setting.rb
@@ -689,6 +689,10 @@ class ApplicationSetting < ApplicationRecord
validates :disable_admin_oauth_scopes,
inclusion: { in: [true, false], message: N_('must be a boolean value') }
+ validates :bulk_import_enabled,
+ allow_nil: false,
+ inclusion: { in: [true, false], message: N_('must be a boolean value') }
+
before_validation :ensure_uuid!
before_validation :coerce_repository_storages_weighted, if: :repository_storages_weighted_changed?
before_validation :normalize_default_branch_name
diff --git a/app/models/application_setting_implementation.rb b/app/models/application_setting_implementation.rb
index 308c05d638c..74fad46f205 100644
--- a/app/models/application_setting_implementation.rb
+++ b/app/models/application_setting_implementation.rb
@@ -243,7 +243,8 @@ module ApplicationSettingImplementation
search_rate_limit_unauthenticated: 10,
users_get_by_id_limit: 300,
users_get_by_id_limit_allowlist: [],
- can_create_group: true
+ can_create_group: true,
+ bulk_import_enabled: false
}
end
diff --git a/app/models/ci/job_artifact.rb b/app/models/ci/job_artifact.rb
index af233609a3b..53c358f4eba 100644
--- a/app/models/ci/job_artifact.rb
+++ b/app/models/ci/job_artifact.rb
@@ -51,7 +51,8 @@ module Ci
cobertura: 'cobertura-coverage.xml',
terraform: 'tfplan.json',
cluster_applications: 'gl-cluster-applications.json', # DEPRECATED: https://gitlab.com/gitlab-org/gitlab/-/issues/361094
- requirements: 'requirements.json',
+ requirements: 'requirements.json', # Will be DEPRECATED soon: https://gitlab.com/groups/gitlab-org/-/epics/9203
+ requirements_v2: 'requirements_v2.json',
coverage_fuzzing: 'gl-coverage-fuzzing.json',
api_fuzzing: 'gl-api-fuzzing-report.json',
cyclonedx: 'gl-sbom.cdx.json'
@@ -94,6 +95,7 @@ module Ci
load_performance: :raw,
terraform: :raw,
requirements: :raw,
+ requirements_v2: :raw,
coverage_fuzzing: :raw,
api_fuzzing: :raw
}.freeze
@@ -118,6 +120,7 @@ module Ci
sast
secret_detection
requirements
+ requirements_v2
cluster_image_scanning
cyclonedx
].freeze
@@ -208,7 +211,8 @@ module Ci
load_performance: 25, ## EE-specific
api_fuzzing: 26, ## EE-specific
cluster_image_scanning: 27, ## EE-specific
- cyclonedx: 28 ## EE-specific
+ cyclonedx: 28, ## EE-specific
+ requirements_v2: 29 ## EE-specific
}
# `file_location` indicates where actual files are stored.
diff --git a/app/models/user.rb b/app/models/user.rb
index d71176f89e8..fb742e7c11f 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -46,6 +46,8 @@ class User < ApplicationRecord
MAX_USERNAME_LENGTH = 255
MIN_USERNAME_LENGTH = 2
+ MAX_LIMIT_FOR_ASSIGNEED_ISSUES_COUNT = 100
+
SECONDARY_EMAIL_ATTRIBUTES = [
:commit_email,
:notification_email,
diff --git a/app/services/users/assigned_issues_count_service.rb b/app/services/users/assigned_issues_count_service.rb
new file mode 100644
index 00000000000..6590902587d
--- /dev/null
+++ b/app/services/users/assigned_issues_count_service.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+module Users
+ class AssignedIssuesCountService < ::BaseCountService
+ def initialize(current_user:, max_limit: User::MAX_LIMIT_FOR_ASSIGNEED_ISSUES_COUNT)
+ @current_user = current_user
+ @max_limit = max_limit
+ end
+
+ def cache_key
+ ['users', @current_user.id, 'max_assigned_open_issues_count']
+ end
+
+ def cache_options
+ { force: false, expires_in: User::COUNT_CACHE_VALIDITY_PERIOD }
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def uncached_count
+ # When a user has many assigned issues, counting them all can be very slow.
+ # As a workaround, we will short-circuit the counting query once the count reaches some threshold.
+ #
+ # Concretely, given a threshold, say 100 (= max_limit),
+ # iterate through the first 100 issues, sorted by ID desc, assigned to the user using `issue_assignees` table.
+ # For each issue iterated, use IssuesFinder to check if the issue should be counted.
+ initializer = IssueAssignee
+ .select(:issue_id).joins(", LATERAL (#{finder_constraint.to_sql}) as issues")
+ .where(user_id: @current_user.id)
+ .order(issue_id: :desc)
+ .limit(1)
+ recursive_finder = initializer.where("issue_assignees.issue_id < assigned_issues.issue_id")
+
+ cte = <<~SQL
+ WITH RECURSIVE assigned_issues AS (
+ (
+ #{initializer.to_sql}
+ )
+ UNION ALL
+ (
+ SELECT next_assigned_issue.issue_id
+ FROM assigned_issues,
+ LATERAL (
+ #{recursive_finder.to_sql}
+ ) next_assigned_issue
+ )
+ ) SELECT COUNT(*) FROM (SELECT * FROM assigned_issues LIMIT #{@max_limit}) issues
+ SQL
+
+ ApplicationRecord.connection.execute(cte).first["count"]
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ private
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def finder_constraint
+ IssuesFinder.new(@current_user, assignee_id: @current_user.id, state: 'opened', non_archived: true)
+ .execute
+ .where("issues.id=issue_assignees.issue_id").limit(1)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+end
diff --git a/app/views/admin/application_settings/_visibility_and_access.html.haml b/app/views/admin/application_settings/_visibility_and_access.html.haml
index 85bee72e863..c9c73d9f997 100644
--- a/app/views/admin/application_settings/_visibility_and_access.html.haml
+++ b/app/views/admin/application_settings/_visibility_and_access.html.haml
@@ -36,10 +36,14 @@
= render_if_exists 'admin/application_settings/ldap_access_setting', form: f
- .form-group
+ .form-group{ data: { testid: 'project-export' } }
= f.label :project_export, s_('AdminSettings|Project export'), class: 'label-bold'
= f.gitlab_ui_checkbox_component :project_export_enabled, s_('AdminSettings|Enabled')
+ .form-group{ data: { testid: 'bulk-import' } }
+ = f.label :bulk_import, s_('AdminSettings|Enable migrating GitLab groups and projects by direct transfer'), class: 'gl-font-weight-bold'
+ = f.gitlab_ui_checkbox_component :bulk_import_enabled, s_('AdminSettings|Enabled')
+
.form-group
%label.label-bold= _('Enabled Git access protocols')
= select(:application_setting, :enabled_git_access_protocol, [['Both SSH and HTTP(S)', nil], ['Only SSH', 'ssh'], ['Only HTTP(S)', 'http']], {}, class: 'form-control')
diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml
index 7f956e3f458..558af352ae9 100644
--- a/app/views/layouts/header/_default.html.haml
+++ b/app/views/layouts/header/_default.html.haml
@@ -54,7 +54,7 @@
= sprite_icon('issues')
- issues_count = assigned_issuables_count(:issues)
= gl_badge_tag({ size: :sm, variant: :success }, { class: "gl-ml-n2 #{'gl-display-none' if issues_count == 0}", "aria-label": n_("%d assigned issue", "%d assigned issues", issues_count) % issues_count }) do
- = number_with_delimiter(issues_count)
+ = assigned_open_issues_count_text
- if header_link?(:merge_requests)
= nav_link(path: 'dashboard#merge_requests', html_options: { class: "user-counter dropdown" }) do
- top_level_link = assigned_mrs_dashboard_path
diff --git a/config/feature_flags/development/limit_assigned_issues_count.yml b/config/feature_flags/development/limit_assigned_issues_count.yml
new file mode 100644
index 00000000000..7fb58220f26
--- /dev/null
+++ b/config/feature_flags/development/limit_assigned_issues_count.yml
@@ -0,0 +1,8 @@
+---
+name: limit_assigned_issues_count
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/105759
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/384363
+milestone: '15.7'
+type: development
+group: group::project management
+default_enabled: false
diff --git a/config/open_api.yml b/config/open_api.yml
index 911d6a6323b..cbf70c24ce1 100644
--- a/config/open_api.yml
+++ b/config/open_api.yml
@@ -127,6 +127,8 @@ metadata:
description: Operations related to releases
- name: resource_milestone_events
description: Operations about resource milestone events
+ - name: rpm_packages
+ description: Operations related to RPM packages
- name: rubygem_packages
description: Operations related to RubyGems
- name: suggestions
diff --git a/db/migrate/20221130182056_add_plan_limits_max_size_to_requirements_v2_artifact.rb b/db/migrate/20221130182056_add_plan_limits_max_size_to_requirements_v2_artifact.rb
new file mode 100644
index 00000000000..48d53d69898
--- /dev/null
+++ b/db/migrate/20221130182056_add_plan_limits_max_size_to_requirements_v2_artifact.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddPlanLimitsMaxSizeToRequirementsV2Artifact < Gitlab::Database::Migration[2.0]
+ def change
+ add_column :plan_limits, :ci_max_artifact_size_requirements_v2, :integer, null: false, default: 0
+ end
+end
diff --git a/db/migrate/20221207140259_add_bulk_import_enabled_to_application_settings.rb b/db/migrate/20221207140259_add_bulk_import_enabled_to_application_settings.rb
new file mode 100644
index 00000000000..c6702559da1
--- /dev/null
+++ b/db/migrate/20221207140259_add_bulk_import_enabled_to_application_settings.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddBulkImportEnabledToApplicationSettings < Gitlab::Database::Migration[2.1]
+ def change
+ add_column :application_settings, :bulk_import_enabled, :boolean, default: false, null: false
+ end
+end
diff --git a/db/post_migrate/20221202031332_add_index_to_issue_assignees_on_user_id_and_issue_id.rb b/db/post_migrate/20221202031332_add_index_to_issue_assignees_on_user_id_and_issue_id.rb
new file mode 100644
index 00000000000..5c008008218
--- /dev/null
+++ b/db/post_migrate/20221202031332_add_index_to_issue_assignees_on_user_id_and_issue_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexToIssueAssigneesOnUserIdAndIssueId < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = "index_issue_assignees_on_user_id_and_issue_id"
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :issue_assignees, [:user_id, :issue_id], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :issue_assignees, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20221202031417_remove_index_to_issue_assignees_on_user_id.rb b/db/post_migrate/20221202031417_remove_index_to_issue_assignees_on_user_id.rb
new file mode 100644
index 00000000000..abdda680098
--- /dev/null
+++ b/db/post_migrate/20221202031417_remove_index_to_issue_assignees_on_user_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class RemoveIndexToIssueAssigneesOnUserId < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = "index_issue_assignees_on_user_id"
+
+ disable_ddl_transaction!
+
+ def up
+ remove_concurrent_index_by_name :issue_assignees, INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :issue_assignees, [:user_id], name: INDEX_NAME
+ end
+end
diff --git a/db/schema_migrations/20221130182056 b/db/schema_migrations/20221130182056
new file mode 100644
index 00000000000..5cadd5084e5
--- /dev/null
+++ b/db/schema_migrations/20221130182056
@@ -0,0 +1 @@
+8a6a12d28ddca01863d39e21461daace89aa9d0940bc13a1747712f699c07600 \ No newline at end of file
diff --git a/db/schema_migrations/20221202031332 b/db/schema_migrations/20221202031332
new file mode 100644
index 00000000000..10dd1ac1b36
--- /dev/null
+++ b/db/schema_migrations/20221202031332
@@ -0,0 +1 @@
+b07f7fdc85af4cdf85ea3f4add62896fea2fc1fa6fcc973ba615f8a0ed84746e \ No newline at end of file
diff --git a/db/schema_migrations/20221202031417 b/db/schema_migrations/20221202031417
new file mode 100644
index 00000000000..324807b8421
--- /dev/null
+++ b/db/schema_migrations/20221202031417
@@ -0,0 +1 @@
+0c422bc0ef354437302cda84dae77d883ab28775e6008c669075b447828ba914 \ No newline at end of file
diff --git a/db/schema_migrations/20221207140259 b/db/schema_migrations/20221207140259
new file mode 100644
index 00000000000..d0f4a627129
--- /dev/null
+++ b/db/schema_migrations/20221207140259
@@ -0,0 +1 @@
+4ec6d2cd2a497c7416c08fa31618f34474c868fdf0060692b8815492bace3a0d \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 7c19f136791..1a6287183b8 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -11554,6 +11554,7 @@ CREATE TABLE application_settings (
encrypted_telesign_api_key_iv bytea,
disable_personal_access_tokens boolean DEFAULT false NOT NULL,
max_terraform_state_size_bytes integer DEFAULT 0 NOT NULL,
+ bulk_import_enabled boolean DEFAULT false NOT NULL,
CONSTRAINT app_settings_container_reg_cleanup_tags_max_list_size_positive CHECK ((container_registry_cleanup_tags_service_max_list_size >= 0)),
CONSTRAINT app_settings_container_registry_pre_import_tags_rate_positive CHECK ((container_registry_pre_import_tags_rate >= (0)::numeric)),
CONSTRAINT app_settings_dep_proxy_ttl_policies_worker_capacity_positive CHECK ((dependency_proxy_ttl_group_policy_worker_capacity >= 0)),
@@ -19512,7 +19513,8 @@ CREATE TABLE plan_limits (
project_ci_variables integer DEFAULT 200 NOT NULL,
group_ci_variables integer DEFAULT 200 NOT NULL,
ci_max_artifact_size_cyclonedx integer DEFAULT 1 NOT NULL,
- rpm_max_file_size bigint DEFAULT '5368709120'::bigint NOT NULL
+ rpm_max_file_size bigint DEFAULT '5368709120'::bigint NOT NULL,
+ ci_max_artifact_size_requirements_v2 integer DEFAULT 0 NOT NULL
);
CREATE SEQUENCE plan_limits_id_seq
@@ -29598,7 +29600,7 @@ CREATE INDEX index_issuable_slas_on_due_at_id_label_applied_issuable_closed ON i
CREATE UNIQUE INDEX index_issuable_slas_on_issue_id ON issuable_slas USING btree (issue_id);
-CREATE INDEX index_issue_assignees_on_user_id ON issue_assignees USING btree (user_id);
+CREATE INDEX index_issue_assignees_on_user_id_and_issue_id ON issue_assignees USING btree (user_id, issue_id);
CREATE UNIQUE INDEX index_issue_crm_contacts_on_issue_id_and_contact_id ON issue_customer_relations_contacts USING btree (issue_id, contact_id);
diff --git a/doc/administration/gitaly/troubleshooting.md b/doc/administration/gitaly/troubleshooting.md
index 164f2d65594..7f5d4b9e443 100644
--- a/doc/administration/gitaly/troubleshooting.md
+++ b/doc/administration/gitaly/troubleshooting.md
@@ -478,6 +478,20 @@ in sync so the token check succeeds.
This check helps identify the root cause of `permission denied`
[errors being logged by Praefect](#permission-denied-errors-appearing-in-gitaly-or-praefect-logs-when-accessing-repositories).
+For offline environments where access to public [`pool.ntp.org`](https://pool.ntp.org) servers is not possible, the Praefect `check` sub-command fails this
+check with an error message similar to:
+
+```plaintext
+checking with NTP service at and allowed clock drift 60000ms [correlation_id: <XXX>]
+Failed (fatal) error: gitaly node at tcp://[gitlab.example-instance.com]:8075: rpc error: code = DeadlineExceeded desc = context deadline exceeded
+```
+
+To resolve this issue, set an environment variable on all Praefect servers to point to an accessible internal NTP server. For example:
+
+```shell
+export NTP_HOST=ntp.example.com
+```
+
### Praefect errors in logs
If you receive an error, check `/var/log/gitlab/gitlab-rails/production.log`.
diff --git a/doc/administration/instance_limits.md b/doc/administration/instance_limits.md
index b06e16b0cc3..59746fc0f07 100644
--- a/doc/administration/instance_limits.md
+++ b/doc/administration/instance_limits.md
@@ -673,6 +673,7 @@ setting is used:
| `ci_max_artifact_size_network_referee` | 0 |
| `ci_max_artifact_size_performance` | 0 |
| `ci_max_artifact_size_requirements` | 0 |
+| `ci_max_artifact_size_requirements_v2` | 0 |
| `ci_max_artifact_size_sast` | 0 |
| `ci_max_artifact_size_secret_detection` | 0 |
| `ci_max_artifact_size_terraform` | 5 MB ([introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37018) in GitLab 13.3) |
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 1f6d9870ebb..14fced27be4 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -21975,6 +21975,7 @@ Iteration ID wildcard values.
| <a id="jobartifactfiletypenetwork_referee"></a>`NETWORK_REFEREE` | NETWORK REFEREE job artifact file type. |
| <a id="jobartifactfiletypeperformance"></a>`PERFORMANCE` | PERFORMANCE job artifact file type. |
| <a id="jobartifactfiletyperequirements"></a>`REQUIREMENTS` | REQUIREMENTS job artifact file type. |
+| <a id="jobartifactfiletyperequirements_v2"></a>`REQUIREMENTS_V2` | REQUIREMENTS V2 job artifact file type. |
| <a id="jobartifactfiletypesast"></a>`SAST` | SAST job artifact file type. |
| <a id="jobartifactfiletypesecret_detection"></a>`SECRET_DETECTION` | SECRET DETECTION job artifact file type. |
| <a id="jobartifactfiletypeterraform"></a>`TERRAFORM` | TERRAFORM job artifact file type. |
diff --git a/doc/api/settings.md b/doc/api/settings.md
index 346b1078f3e..9a4f079d8df 100644
--- a/doc/api/settings.md
+++ b/doc/api/settings.md
@@ -400,6 +400,7 @@ listed in the descriptions of the relevant settings.
| `max_pages_size` | integer | no | Maximum size of pages repositories in MB. |
| `max_personal_access_token_lifetime` **(ULTIMATE SELF)** | integer | no | Maximum allowable lifetime for access tokens in days. |
| `max_ssh_key_lifetime` **(ULTIMATE SELF)** | integer | no | Maximum allowable lifetime for SSH keys in days. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1007) in GitLab 14.6. |
+| `max_terraform_state_size_bytes` | integer | no | Maximum size in bytes of the [Terraform state](../administration/terraform_state.md) files. Set this to 0 for unlimited file size. |
| `metrics_method_call_threshold` | integer | no | A method call is only tracked when it takes longer than the given amount of milliseconds. |
| `max_number_of_repository_downloads` **(ULTIMATE SELF)** | integer | no | Maximum number of unique repositories a user can download in the specified time period before they are banned. Default: 0, Maximum: 10,000 repositories. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87980) in GitLab 15.1. |
| `max_number_of_repository_downloads_within_time_period` **(ULTIMATE SELF)** | integer | no | Reporting time period (in seconds). Default: 0, Maximum: 864000 seconds (10 days). [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87980) in GitLab 15.1. |
diff --git a/doc/user/markdown.md b/doc/user/markdown.md
index 41805eec175..d15268a938f 100644
--- a/doc/user/markdown.md
+++ b/doc/user/markdown.md
@@ -211,7 +211,7 @@ You can use it to point out a :bug: or warn about :speak_no_evil: patches. And i
If you're new to this, don't be :fearful:. You can join the emoji :family:. Just look up one of the supported codes.
-Consult the [Emoji Cheat Sheet](https://www.emojicopy.com) for a list of all supported emoji codes. :thumbsup:
+Consult the [Emoji Cheat Sheet](https://www.webfx.com/tools/emoji-cheat-sheet/) for a list of all supported emoji codes. :thumbsup:
```
Sometimes you want to <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/monkey.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> around a bit and add some <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/star2.png" width="20px" height="20px" style="display:inline;margin:0;border: 0"> to your <img src="https://gitlab.com/gitlab-org/gitlab-foss/raw/master/public/-/emojis/2/speech_balloon.png" width="20px" height="20px" style="display:inline;margin:0;border: 0">. Well we have a gift for you:
diff --git a/lib/api/api.rb b/lib/api/api.rb
index 4cf661f33a3..b23b11d0c29 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -279,6 +279,7 @@ module API
mount ::API::Repositories
mount ::API::ResourceAccessTokens
mount ::API::ResourceMilestoneEvents
+ mount ::API::RpmProjectPackages
mount ::API::RubygemPackages
mount ::API::Snippets
mount ::API::SnippetRepositoryStorageMoves
@@ -323,7 +324,6 @@ module API
mount ::API::ProtectedTags
mount ::API::ResourceLabelEvents
mount ::API::ResourceStateEvents
- mount ::API::RpmProjectPackages
mount ::API::Search
mount ::API::Settings
mount ::API::SidekiqMetrics
diff --git a/lib/api/rpm_project_packages.rb b/lib/api/rpm_project_packages.rb
index db85113f7a7..f02d288982a 100644
--- a/lib/api/rpm_project_packages.rb
+++ b/lib/api/rpm_project_packages.rb
@@ -25,7 +25,16 @@ module API
end
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
namespace ':id/packages/rpm' do
- desc 'Download repository metadata files'
+ desc 'Download repository metadata files' do
+ detail 'This feature was introduced in GitLab 15.7'
+ success code: 200
+ failure [
+ { code: 401, message: 'Unauthorized' },
+ { code: 403, message: 'Forbidden' },
+ { code: 404, message: 'Not Found' }
+ ]
+ tags %w[rpm_packages]
+ end
params do
requires :file_name, type: String, desc: 'Repository metadata file name'
end
@@ -40,7 +49,15 @@ module API
present_carrierwave_file!(repository_file.file)
end
- desc 'Download RPM package files'
+ desc 'Download RPM package files' do
+ detail 'This feature was introduced in GitLab 15.7'
+ failure [
+ { code: 401, message: 'Unauthorized' },
+ { code: 403, message: 'Forbidden' },
+ { code: 404, message: 'Not Found' }
+ ]
+ tags %w[rpm_packages]
+ end
params do
requires :package_file_id, type: Integer, desc: 'RPM package file id'
requires :file_name, type: String, desc: 'RPM package file name'
@@ -56,7 +73,16 @@ module API
not_found!
end
- desc 'Upload a RPM package'
+ desc 'Upload a RPM package' do
+ detail 'This feature was introduced in GitLab 15.7'
+ failure [
+ { code: 400, message: 'Bad Request' },
+ { code: 401, message: 'Unauthorized' },
+ { code: 403, message: 'Forbidden' },
+ { code: 404, message: 'Not Found' }
+ ]
+ tags %w[rpm_packages]
+ end
post do
authorize_create_package!(authorized_user_project)
@@ -80,7 +106,15 @@ module API
not_found!
end
- desc 'Authorize package upload from workhorse'
+ desc 'Authorize package upload from workhorse' do
+ detail 'This feature was introduced in GitLab 15.7'
+ failure [
+ { code: 401, message: 'Unauthorized' },
+ { code: 403, message: 'Forbidden' },
+ { code: 404, message: 'Not Found' }
+ ]
+ tags %w[rpm_packages]
+ end
post 'authorize' do
not_found!
end
diff --git a/lib/api/settings.rb b/lib/api/settings.rb
index 6ed4e6da3f3..2a5cf5999cf 100644
--- a/lib/api/settings.rb
+++ b/lib/api/settings.rb
@@ -100,6 +100,7 @@ module API
optional :max_import_size, type: Integer, desc: 'Maximum import size in MB'
optional :max_pages_size, type: Integer, desc: 'Maximum size of pages in MB'
optional :max_pages_custom_domains_per_project, type: Integer, desc: 'Maximum number of GitLab Pages custom domains per project'
+ optional :max_terraform_state_size_bytes, type: Integer, desc: "Maximum size in bytes of the Terraform state file. Set this to 0 for unlimited file size."
optional :metrics_method_call_threshold, type: Integer, desc: 'A method call is only tracked when it takes longer to complete than the given amount of milliseconds.'
optional :password_authentication_enabled, type: Boolean, desc: 'Flag indicating if password authentication is enabled for the web interface' # support legacy names, can be removed in v5
optional :password_authentication_enabled_for_web, type: Boolean, desc: 'Flag indicating if password authentication is enabled for the web interface'
@@ -186,6 +187,7 @@ module API
optional :pipeline_limit_per_project_user_sha, type: Integer, desc: "Maximum number of pipeline creation requests allowed per minute per user and commit. Set to 0 for unlimited requests per minute."
optional :jira_connect_application_key, type: String, desc: "Application ID of the OAuth application that should be used to authenticate with the GitLab.com for Jira Cloud app"
optional :jira_connect_proxy_url, type: String, desc: "URL of the GitLab instance that should be used as a proxy for the GitLab.com for Jira Cloud app"
+ optional :bulk_import_enabled, type: Boolean, desc: 'Enable migrating GitLab groups and projects by direct transfer'
Gitlab::SSHPublicKey.supported_types.each do |type|
optional :"#{type}_key_restriction",
diff --git a/lib/gitlab/ci/config/entry/reports.rb b/lib/gitlab/ci/config/entry/reports.rb
index f77876cc926..16844fa88db 100644
--- a/lib/gitlab/ci/config/entry/reports.rb
+++ b/lib/gitlab/ci/config/entry/reports.rb
@@ -16,8 +16,8 @@ module Gitlab
%i[junit codequality sast secret_detection dependency_scanning container_scanning
dast performance browser_performance load_performance license_scanning metrics lsif
dotenv terraform accessibility
- requirements coverage_fuzzing api_fuzzing cluster_image_scanning
- coverage_report cyclonedx].freeze
+ coverage_fuzzing api_fuzzing cluster_image_scanning
+ requirements requirements_v2 coverage_report cyclonedx].freeze
attributes ALLOWED_KEYS
@@ -48,6 +48,7 @@ module Gitlab
validates :terraform, array_of_strings_or_string: true
validates :accessibility, array_of_strings_or_string: true
validates :requirements, array_of_strings_or_string: true
+ validates :requirements_v2, array_of_strings_or_string: true
validates :cyclonedx, array_of_strings_or_string: true
end
end
diff --git a/lib/gitlab/database/load_balancing/service_discovery.rb b/lib/gitlab/database/load_balancing/service_discovery.rb
index 52a9e8798d4..3295301a2d7 100644
--- a/lib/gitlab/database/load_balancing/service_discovery.rb
+++ b/lib/gitlab/database/load_balancing/service_discovery.rb
@@ -125,13 +125,6 @@ module Gitlab
old_host_list_length: current.length
)
replace_hosts(from_dns)
- else
- ::Gitlab::Database::LoadBalancing::Logger.info(
- event: :host_list_unchanged,
- message: "Unchanged host list for service discovery",
- host_list_length: from_dns.length,
- old_host_list_length: current.length
- )
end
interval
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 977c6349e4c..af8e1124052 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -2827,6 +2827,9 @@ msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
msgstr ""
+msgid "AdminSettings|Enable migrating GitLab groups and projects by direct transfer"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
diff --git a/spec/controllers/admin/runner_projects_controller_spec.rb b/spec/controllers/admin/runner_projects_controller_spec.rb
index 5e4fee17e67..38cc2d171ac 100644
--- a/spec/controllers/admin/runner_projects_controller_spec.rb
+++ b/spec/controllers/admin/runner_projects_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Admin::RunnerProjectsController, feature_category: :runner do
+RSpec.describe Admin::RunnerProjectsController, feature_category: :runner_fleet do
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, group: group) }
diff --git a/spec/controllers/admin/runners_controller_spec.rb b/spec/controllers/admin/runners_controller_spec.rb
index a73071e14b3..6d58abb9d4d 100644
--- a/spec/controllers/admin/runners_controller_spec.rb
+++ b/spec/controllers/admin/runners_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Admin::RunnersController, feature_category: :runner do
+RSpec.describe Admin::RunnersController, feature_category: :runner_fleet do
let_it_be(:runner) { create(:ci_runner) }
let_it_be(:user) { create(:admin) }
diff --git a/spec/controllers/groups/runners_controller_spec.rb b/spec/controllers/groups/runners_controller_spec.rb
index 0e349e1d53f..93c1571bb6c 100644
--- a/spec/controllers/groups/runners_controller_spec.rb
+++ b/spec/controllers/groups/runners_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Groups::RunnersController, feature_category: :runner do
+RSpec.describe Groups::RunnersController, feature_category: :runner_fleet do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, group: group) }
diff --git a/spec/controllers/projects/runners_controller_spec.rb b/spec/controllers/projects/runners_controller_spec.rb
index dba78617e89..5733b8114d4 100644
--- a/spec/controllers/projects/runners_controller_spec.rb
+++ b/spec/controllers/projects/runners_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Projects::RunnersController, feature_category: :runner do
+RSpec.describe Projects::RunnersController, feature_category: :runner_fleet do
let(:user) { create(:user) }
let(:project) { create(:project) }
let(:runner) { create(:ci_runner, :project, projects: [project]) }
diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb
index 342c4d55dd6..3a5abd0a7a6 100644
--- a/spec/features/admin/admin_runners_spec.rb
+++ b/spec/features/admin/admin_runners_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe "Admin Runners", feature_category: :runner do
+RSpec.describe "Admin Runners", feature_category: :runner_fleet do
include Spec::Support::Helpers::Features::RunnersHelpers
include Spec::Support::Helpers::ModalHelpers
diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb
index 3fdcf4151ed..2ac86ab9f49 100644
--- a/spec/features/admin/admin_settings_spec.rb
+++ b/spec/features/admin/admin_settings_spec.rb
@@ -71,11 +71,19 @@ RSpec.describe 'Admin updates settings', feature_category: :not_owned do
it 'change Visibility and Access Controls' do
page.within('.as-visibility-access') do
- uncheck 'Enabled'
+ page.within('[data-testid="project-export"]') do
+ uncheck 'Enabled'
+ end
+
+ page.within('[data-testid="bulk-import"]') do
+ check 'Enabled'
+ end
+
click_button 'Save changes'
end
expect(current_settings.project_export_enabled).to be_falsey
+ expect(current_settings.bulk_import_enabled).to be(true)
expect(page).to have_content "Application settings saved successfully"
end
diff --git a/spec/features/dashboard/issuables_counter_spec.rb b/spec/features/dashboard/issuables_counter_spec.rb
index f728d73c809..5c7285f0491 100644
--- a/spec/features/dashboard/issuables_counter_spec.rb
+++ b/spec/features/dashboard/issuables_counter_spec.rb
@@ -12,6 +12,7 @@ RSpec.describe 'Navigation bar counter', :use_clean_rails_memory_store_caching,
issue.assignees = [user]
merge_request.update!(assignees: [user])
sign_in(user)
+ stub_feature_flags(limit_assigned_issues_count: false)
end
it 'reflects dashboard issues count' do
@@ -30,6 +31,28 @@ RSpec.describe 'Navigation bar counter', :use_clean_rails_memory_store_caching,
end
end
+ context 'when :limit_assigned_issues_count FF is used' do
+ before do
+ stub_feature_flags(limit_assigned_issues_count: true)
+ end
+
+ it 'reflects dashboard issues count' do
+ visit issues_path
+
+ expect_counters('issues', '1', n_("%d assigned issue", "%d assigned issues", 1) % 1)
+
+ issue.update!(assignees: [])
+
+ Users::AssignedIssuesCountService.new(current_user: user).delete_cache
+
+ travel_to(3.minutes.from_now) do
+ visit issues_path
+
+ expect_counters('issues', '0', n_("%d assigned issue", "%d assigned issues", 0) % 0)
+ end
+ end
+ end
+
it 'reflects dashboard merge requests count', :js do
visit merge_requests_path
diff --git a/spec/features/groups/group_runners_spec.rb b/spec/features/groups/group_runners_spec.rb
index c920a06665c..ab53ef7c470 100644
--- a/spec/features/groups/group_runners_spec.rb
+++ b/spec/features/groups/group_runners_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe "Group Runners", feature_category: :runner do
+RSpec.describe "Group Runners", feature_category: :runner_fleet do
include Spec::Support::Helpers::Features::RunnersHelpers
include Spec::Support::Helpers::ModalHelpers
diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb
index 2dc388d714a..40ba0fa9ebb 100644
--- a/spec/features/runners_spec.rb
+++ b/spec/features/runners_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Runners', feature_category: :runner do
+RSpec.describe 'Runners', feature_category: :runner_fleet do
let_it_be(:user) { create(:user) }
before do
diff --git a/spec/fixtures/api/schemas/group_link/group_link.json b/spec/fixtures/api/schemas/group_link/group_link.json
index 3c2195df11e..885ed6d18e0 100644
--- a/spec/fixtures/api/schemas/group_link/group_link.json
+++ b/spec/fixtures/api/schemas/group_link/group_link.json
@@ -11,34 +11,82 @@
"is_direct_member"
],
"properties": {
- "id": { "type": "integer" },
- "created_at": { "type": "date-time" },
- "expires_at": { "type": ["date-time", "null"] },
+ "id": {
+ "type": "integer"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "expires_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "date-time"
+ },
"access_level": {
"type": "object",
- "required": ["integer_value", "string_value"],
+ "required": [
+ "integer_value",
+ "string_value"
+ ],
"properties": {
- "integer_value": { "type": "integer" },
- "string_value": { "type": "string" }
+ "integer_value": {
+ "type": "integer"
+ },
+ "string_value": {
+ "type": "string"
+ }
},
"additionalProperties": false
},
- "valid_roles": { "type": "object" },
+ "valid_roles": {
+ "type": "object"
+ },
"shared_with_group": {
"type": "object",
- "required": ["id", "name", "full_name", "full_path", "avatar_url", "web_url"],
+ "required": [
+ "id",
+ "name",
+ "full_name",
+ "full_path",
+ "avatar_url",
+ "web_url"
+ ],
"properties": {
- "id": { "type": "integer" },
- "name": { "type": "string" },
- "full_name": { "type": "string" },
- "full_path": { "type": "string" },
- "avatar_url": { "type": ["string", "null"] },
- "web_url": { "type": "string" }
+ "id": {
+ "type": "integer"
+ },
+ "name": {
+ "type": "string"
+ },
+ "full_name": {
+ "type": "string"
+ },
+ "full_path": {
+ "type": "string"
+ },
+ "avatar_url": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "web_url": {
+ "type": "string"
+ }
},
"additionalProperties": false
},
- "can_update": { "type": "boolean" },
- "can_remove": { "type": "boolean" },
- "is_direct_member": { "type": "boolean" }
+ "can_update": {
+ "type": "boolean"
+ },
+ "can_remove": {
+ "type": "boolean"
+ },
+ "is_direct_member": {
+ "type": "boolean"
+ }
}
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/jira_connect/author.json b/spec/fixtures/api/schemas/jira_connect/author.json
index bd2cff96d99..e653db9a97d 100644
--- a/spec/fixtures/api/schemas/jira_connect/author.json
+++ b/spec/fixtures/api/schemas/jira_connect/author.json
@@ -1,12 +1,27 @@
{
"type": "object",
"properties": {
- "name": { "type": "string" },
- "email": { "type": "string" },
- "username": { "type": "string" },
- "url": { "type": "uri" },
- "avatar": { "type": "uri" }
+ "name": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string"
+ },
+ "username": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string",
+ "format": "uri"
+ },
+ "avatar": {
+ "type": "string",
+ "format": "uri"
+ }
},
- "required": [ "name", "email" ],
+ "required": [
+ "name",
+ "email"
+ ],
"additionalProperties": false
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/jira_connect/branch.json b/spec/fixtures/api/schemas/jira_connect/branch.json
index c397d88fa91..237dc8abbc0 100644
--- a/spec/fixtures/api/schemas/jira_connect/branch.json
+++ b/spec/fixtures/api/schemas/jira_connect/branch.json
@@ -1,19 +1,38 @@
{
"type": "object",
"properties": {
- "id": { "type": "string" },
- "issueKeys": { "type": "array" },
- "name": { "type": "string" },
+ "id": {
+ "type": "string"
+ },
+ "issueKeys": {
+ "type": "array"
+ },
+ "name": {
+ "type": "string"
+ },
"lastCommit": {
"$ref": "./commit.json"
},
- "url": { "type": "uri" },
- "createPullRequestUrl": { "type": "uri" },
- "updateSequenceId": { "type": "integer" }
+ "url": {
+ "type": "string",
+ "format": "uri"
+ },
+ "createPullRequestUrl": {
+ "type": "string",
+ "format": "uri"
+ },
+ "updateSequenceId": {
+ "type": "integer"
+ }
},
"required": [
- "id", "issueKeys", "name", "lastCommit",
- "url", "createPullRequestUrl", "updateSequenceId"
+ "id",
+ "issueKeys",
+ "name",
+ "lastCommit",
+ "url",
+ "createPullRequestUrl",
+ "updateSequenceId"
],
"additionalProperties": false
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/jira_connect/commit.json b/spec/fixtures/api/schemas/jira_connect/commit.json
index 794cf9ef365..e6d1a85196b 100644
--- a/spec/fixtures/api/schemas/jira_connect/commit.json
+++ b/spec/fixtures/api/schemas/jira_connect/commit.json
@@ -1,29 +1,60 @@
{
"type": "object",
"properties": {
- "id": { "type": "string" },
- "issueKeys": { "type": "array" },
- "hash": { "type": "string" },
- "displayId": { "type": "string" },
- "message": { "type": "string" },
- "flags": { "type": "array" },
+ "id": {
+ "type": "string"
+ },
+ "issueKeys": {
+ "type": "array"
+ },
+ "hash": {
+ "type": "string"
+ },
+ "displayId": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ },
+ "flags": {
+ "type": "array"
+ },
"author": {
"$ref": "./author.json"
},
- "fileCount": { "type": "integer" },
+ "fileCount": {
+ "type": "integer"
+ },
"files": {
"type": "array",
"items": {
"$ref": "./file.json"
}
},
- "authorTimestamp": { "type": "timestamp" },
- "url": { "type": "uri" },
- "updateSequenceId": { "type": "integer" }
+ "authorTimestamp": {
+ "type": "timestamp"
+ },
+ "url": {
+ "type": "string",
+ "format": "uri"
+ },
+ "updateSequenceId": {
+ "type": "integer"
+ }
},
"required": [
- "id", "issueKeys", "hash", "displayId", "message", "flags", "author",
- "fileCount", "files", "authorTimestamp", "url", "updateSequenceId"
+ "id",
+ "issueKeys",
+ "hash",
+ "displayId",
+ "message",
+ "flags",
+ "author",
+ "fileCount",
+ "files",
+ "authorTimestamp",
+ "url",
+ "updateSequenceId"
],
"additionalProperties": false
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/jira_connect/file.json b/spec/fixtures/api/schemas/jira_connect/file.json
index 34718991237..3e93911ece4 100644
--- a/spec/fixtures/api/schemas/jira_connect/file.json
+++ b/spec/fixtures/api/schemas/jira_connect/file.json
@@ -1,14 +1,29 @@
{
"type": "object",
"properties": {
- "path": { "type": "string" },
- "changeType": { "type": "string" },
- "linesAdded": { "type": "integer" },
- "linesRemoved": { "type": "integer" },
- "url": { "type": "uri" }
+ "path": {
+ "type": "string"
+ },
+ "changeType": {
+ "type": "string"
+ },
+ "linesAdded": {
+ "type": "integer"
+ },
+ "linesRemoved": {
+ "type": "integer"
+ },
+ "url": {
+ "type": "string",
+ "format": "uri"
+ }
},
"required": [
- "path", "changeType", "linesAdded", "linesRemoved", "url"
+ "path",
+ "changeType",
+ "linesAdded",
+ "linesRemoved",
+ "url"
],
"additionalProperties": false
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/jira_connect/pull_request.json b/spec/fixtures/api/schemas/jira_connect/pull_request.json
index 56ce6faf498..58c7671e29c 100644
--- a/spec/fixtures/api/schemas/jira_connect/pull_request.json
+++ b/spec/fixtures/api/schemas/jira_connect/pull_request.json
@@ -1,26 +1,62 @@
{
"type": "object",
"properties": {
- "id": { "type": "string" },
- "issueKeys": { "type": "array" },
- "displayId": { "type": "string" },
- "title": { "type": "string" },
+ "id": {
+ "type": "string"
+ },
+ "issueKeys": {
+ "type": "array"
+ },
+ "displayId": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ },
"author": {
"$ref": "./author.json"
},
- "commentCount": { "type": "integer" },
- "sourceBranch": { "type": "string" },
- "destinationBranch": { "type": "string" },
- "lastUpdate": { "type": "timestamp" },
- "status": { "type": "string" },
- "sourceBranchUrl": { "type": "uri" },
- "url": { "type": "uri" },
- "updateSequenceId": { "type": "integer" }
+ "commentCount": {
+ "type": "integer"
+ },
+ "sourceBranch": {
+ "type": "string"
+ },
+ "destinationBranch": {
+ "type": "string"
+ },
+ "lastUpdate": {
+ "type": "timestamp"
+ },
+ "status": {
+ "type": "string"
+ },
+ "sourceBranchUrl": {
+ "type": "string",
+ "format": "uri"
+ },
+ "url": {
+ "type": "string",
+ "format": "uri"
+ },
+ "updateSequenceId": {
+ "type": "integer"
+ }
},
"required": [
- "id", "issueKeys", "displayId", "title", "author", "commentCount",
- "sourceBranch", "destinationBranch", "lastUpdate", "status",
- "sourceBranchUrl", "url", "updateSequenceId"
+ "id",
+ "issueKeys",
+ "displayId",
+ "title",
+ "author",
+ "commentCount",
+ "sourceBranch",
+ "destinationBranch",
+ "lastUpdate",
+ "status",
+ "sourceBranchUrl",
+ "url",
+ "updateSequenceId"
],
"additionalProperties": false
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/jira_connect/repository.json b/spec/fixtures/api/schemas/jira_connect/repository.json
index 9e81d77bc6a..5a45bf7cc77 100644
--- a/spec/fixtures/api/schemas/jira_connect/repository.json
+++ b/spec/fixtures/api/schemas/jira_connect/repository.json
@@ -1,11 +1,29 @@
{
"type": "object",
"properties": {
- "id": { "type": "string" },
- "name": { "type": "string" },
- "description": { "type": ["string", "null"] },
- "url": { "type": "uri" },
- "avatar": { "type": "uri" },
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "description": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "format": "uri"
+ },
+ "avatar": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "uri"
+ },
"commits": {
"type": "array",
"items": {
@@ -24,11 +42,20 @@
"$ref": "./pull_request.json"
}
},
- "updateSequenceId": { "type": "integer" }
+ "updateSequenceId": {
+ "type": "integer"
+ }
},
"required": [
- "id", "name", "description", "url", "avatar",
- "commits", "branches", "pullRequests", "updateSequenceId"
+ "id",
+ "name",
+ "description",
+ "url",
+ "avatar",
+ "commits",
+ "branches",
+ "pullRequests",
+ "updateSequenceId"
],
"additionalProperties": false
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/job/build_trace_line.json b/spec/fixtures/api/schemas/job/build_trace_line.json
index 18726dff2bb..ada2b4edb7d 100644
--- a/spec/fixtures/api/schemas/job/build_trace_line.json
+++ b/spec/fixtures/api/schemas/job/build_trace_line.json
@@ -6,13 +6,23 @@
"content"
],
"properties": {
- "offset": { "type": "integer" },
+ "offset": {
+ "type": "integer"
+ },
"content": {
"type": "array",
- "items": { "$ref": "./build_trace_line_content.json" }
+ "items": {
+ "$ref": "./build_trace_line_content.json"
+ }
+ },
+ "section": {
+ "type": "string"
+ },
+ "section_header": {
+ "type": "boolean"
},
- "section": "string",
- "section_header": "boolean",
- "section_duration": "string"
+ "section_duration": {
+ "type": "string"
+ }
}
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/public_api/v4/basic_environment.json b/spec/fixtures/api/schemas/public_api/v4/basic_environment.json
new file mode 100644
index 00000000000..f22f73f573b
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/basic_environment.json
@@ -0,0 +1,34 @@
+{
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "slug",
+ "external_url",
+ "created_at",
+ "updated_at"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "name": {
+ "type": "string"
+ },
+ "slug": {
+ "type": "string"
+ },
+ "external_url": {
+ "$ref": "../../types/nullable_string.json"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ },
+ "additionalProperties": false
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/public_api/v4/basic_environments.json b/spec/fixtures/api/schemas/public_api/v4/basic_environments.json
new file mode 100644
index 00000000000..6620e423c96
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/basic_environments.json
@@ -0,0 +1,6 @@
+{
+ "type": "array",
+ "items": {
+ "$ref": "./basic_environment.json"
+ }
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/public_api/v4/branch.json b/spec/fixtures/api/schemas/public_api/v4/branch.json
index 0073a6d89fc..ed65f3c2e5c 100644
--- a/spec/fixtures/api/schemas/public_api/v4/branch.json
+++ b/spec/fixtures/api/schemas/public_api/v4/branch.json
@@ -1,6 +1,6 @@
{
"type": "object",
- "required" : [
+ "required": [
"name",
"commit",
"merged",
@@ -10,16 +10,35 @@
"developers_can_merge",
"web_url"
],
- "properties" : {
- "name": { "type": "string" },
- "commit": { "$ref": "commit/basic.json" },
- "merged": { "type": "boolean" },
- "protected": { "type": "boolean" },
- "default": { "type": "boolean" },
- "developers_can_push": { "type": "boolean" },
- "developers_can_merge": { "type": "boolean" },
- "can_push": { "type": "boolean" },
- "web_url": { "type": "uri" }
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "commit": {
+ "$ref": "commit/basic.json"
+ },
+ "merged": {
+ "type": "boolean"
+ },
+ "protected": {
+ "type": "boolean"
+ },
+ "default": {
+ "type": "boolean"
+ },
+ "developers_can_push": {
+ "type": "boolean"
+ },
+ "developers_can_merge": {
+ "type": "boolean"
+ },
+ "can_push": {
+ "type": "boolean"
+ },
+ "web_url": {
+ "type": "string",
+ "format": "uri"
+ }
},
"additionalProperties": false
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/public_api/v4/deploy_token.json b/spec/fixtures/api/schemas/public_api/v4/deploy_token.json
index 102ab95a4ee..664740c2a3c 100644
--- a/spec/fixtures/api/schemas/public_api/v4/deploy_token.json
+++ b/spec/fixtures/api/schemas/public_api/v4/deploy_token.json
@@ -19,7 +19,9 @@
"username": {
"type": "string"
},
- "expires_at": { "type": "string" },
+ "expires_at": {
+ "type": "string"
+ },
"scopes": {
"type": "array",
"items": {
diff --git a/spec/fixtures/api/schemas/public_api/v4/environments.json b/spec/fixtures/api/schemas/public_api/v4/environments.json
index f739c06f604..1697da0f231 100644
--- a/spec/fixtures/api/schemas/public_api/v4/environments.json
+++ b/spec/fixtures/api/schemas/public_api/v4/environments.json
@@ -1,9 +1,6 @@
{
"type": "array",
"items": {
- "type": "object",
- "properties": {
- "$ref": "./environment.json"
- }
+ "$ref": "./environment.json"
}
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/public_api/v4/feature_flag_scopes.json b/spec/fixtures/api/schemas/public_api/v4/feature_flag_scopes.json
index b1a7021db8b..1df46780a03 100644
--- a/spec/fixtures/api/schemas/public_api/v4/feature_flag_scopes.json
+++ b/spec/fixtures/api/schemas/public_api/v4/feature_flag_scopes.json
@@ -1,9 +1,6 @@
{
"type": "array",
"items": {
- "type": "object",
- "properties": {
- "$ref": "./feature_flag_scope.json"
- }
+ "$ref": "./feature_flag_scope.json"
}
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/public_api/v4/feature_flags.json b/spec/fixtures/api/schemas/public_api/v4/feature_flags.json
index c19df0443d9..f381adc3c8b 100644
--- a/spec/fixtures/api/schemas/public_api/v4/feature_flags.json
+++ b/spec/fixtures/api/schemas/public_api/v4/feature_flags.json
@@ -1,9 +1,6 @@
{
"type": "array",
"items": {
- "type": "object",
- "properties": {
- "$ref": "./feature_flag.json"
- }
+ "$ref": "./feature_flag.json"
}
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/public_api/v4/integration.json b/spec/fixtures/api/schemas/public_api/v4/integration.json
index b6f13d1cfe7..d1538db7de4 100644
--- a/spec/fixtures/api/schemas/public_api/v4/integration.json
+++ b/spec/fixtures/api/schemas/public_api/v4/integration.json
@@ -1,24 +1,62 @@
{
"type": "object",
"properties": {
- "id": { "type": "integer" },
- "title": { "type": "string" },
- "slug": { "type": "string" },
- "created_at": { "type": "date-time" },
- "updated_at": { "type": "date-time" },
- "active": { "type": "boolean" },
- "commit_events": { "type": "boolean" },
- "push_events": { "type": "boolean" },
- "issues_events": { "type": "boolean" },
- "confidential_issues_events": { "type": "boolean" },
- "merge_requests_events": { "type": "boolean" },
- "tag_push_events": { "type": "boolean" },
- "note_events": { "type": "boolean" },
- "confidential_note_events": { "type": "boolean" },
- "pipeline_events": { "type": "boolean" },
- "wiki_page_events": { "type": "boolean" },
- "job_events": { "type": "boolean" },
- "comment_on_event_enabled": { "type": "boolean" }
+ "id": {
+ "type": "integer"
+ },
+ "title": {
+ "type": "string"
+ },
+ "slug": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "active": {
+ "type": "boolean"
+ },
+ "commit_events": {
+ "type": "boolean"
+ },
+ "push_events": {
+ "type": "boolean"
+ },
+ "issues_events": {
+ "type": "boolean"
+ },
+ "confidential_issues_events": {
+ "type": "boolean"
+ },
+ "merge_requests_events": {
+ "type": "boolean"
+ },
+ "tag_push_events": {
+ "type": "boolean"
+ },
+ "note_events": {
+ "type": "boolean"
+ },
+ "confidential_note_events": {
+ "type": "boolean"
+ },
+ "pipeline_events": {
+ "type": "boolean"
+ },
+ "wiki_page_events": {
+ "type": "boolean"
+ },
+ "job_events": {
+ "type": "boolean"
+ },
+ "comment_on_event_enabled": {
+ "type": "boolean"
+ }
},
"additionalProperties": false
-}
+} \ No newline at end of file
diff --git a/spec/fixtures/api/schemas/public_api/v4/issue.json b/spec/fixtures/api/schemas/public_api/v4/issue.json
index 90b368b5226..0e8de3cd3d7 100644
--- a/spec/fixtures/api/schemas/public_api/v4/issue.json
+++ b/spec/fixtures/api/schemas/public_api/v4/issue.json
@@ -1,16 +1,47 @@
{
"type": "object",
- "properties" : {
- "id": { "type": "integer" },
- "iid": { "type": "integer" },
- "project_id": { "type": "integer" },
- "title": { "type": "string" },
- "description": { "type": ["string", "null"] },
- "state": { "type": "string" },
- "discussion_locked": { "type": ["boolean", "null"] },
- "closed_at": { "type": ["string", "null"] },
- "created_at": { "type": "string", "format": "date-time" },
- "updated_at": { "type": "string", "format": "date-time" },
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "iid": {
+ "type": "integer"
+ },
+ "project_id": {
+ "type": "integer"
+ },
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "state": {
+ "type": "string"
+ },
+ "discussion_locked": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "closed_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time"
+ },
"labels": {
"type": "array",
"items": {
@@ -18,58 +49,144 @@
}
},
"milestone": {
- "type": ["object", "null"],
+ "type": [
+ "object",
+ "null"
+ ],
"properties": {
- "id": { "type": "integer" },
- "iid": { "type": "integer" },
- "project_id": { "type": ["integer", "null"] },
- "group_id": { "type": ["integer", "null"] },
- "title": { "type": "string" },
- "description": { "type": ["string", "null"] },
- "state": { "type": "string" },
- "created_at": { "type": "string", "format": "date-time" },
- "updated_at": { "type": "string", "format": "date-time" },
- "due_date": { "type": "string" , "format": "date-time" },
- "start_date": { "type": "string", "format": "date-time" }
+ "id": {
+ "type": "integer"
+ },
+ "iid": {
+ "type": "integer"
+ },
+ "project_id": {
+ "type": [
+ "integer",
+ "null"
+ ]
+ },
+ "group_id": {
+ "type": [
+ "integer",
+ "null"
+ ]
+ },
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "state": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "due_date": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "start_date": {
+ "type": "string",
+ "format": "date-time"
+ }
},
"additionalProperties": false
},
"assignees": {
"type": "array",
"items": {
- "type": ["object", "null"],
+ "type": [
+ "object",
+ "null"
+ ],
"properties": {
- "name": { "type": "string" },
- "username": { "type": "string" },
- "id": { "type": "integer" },
- "state": { "type": "string" },
- "avatar_url": { "type": "uri" },
- "web_url": { "type": "uri" }
+ "name": {
+ "type": "string"
+ },
+ "username": {
+ "type": "string"
+ },
+ "id": {
+ "type": "integer"
+ },
+ "state": {
+ "type": "string"
+ },
+ "avatar_url": {
+ "type": "string",
+ "format": "uri"
+ },
+ "web_url": {
+ "type": "string",
+ "format": "uri"
+ }
},
"additionalProperties": false
}
},
"assignee": {
- "type": ["object", "null"],
+ "type": [
+ "object",
+ "null"
+ ],
"properties": {
- "name": { "type": "string" },
- "username": { "type": "string" },
- "id": { "type": "integer" },
- "state": { "type": "string" },
- "avatar_url": { "type": "uri" },
- "web_url": { "type": "uri" }
+ "name": {
+ "type": "string"
+ },
+ "username": {
+ "type": "string"
+ },
+ "id": {
+ "type": "integer"
+ },
+ "state": {
+ "type": "string"
+ },
+ "avatar_url": {
+ "type": "string",
+ "format": "uri"
+ },
+ "web_url": {
+ "type": "string",
+ "format": "uri"
+ }
},
"additionalProperties": false
},
"author": {
"type": "object",
"properties": {
- "name": { "type": "string" },
- "username": { "type": "string" },
- "id": { "type": "integer" },
- "state": { "type": "string" },
- "avatar_url": { "type": "uri" },
- "web_url": { "type": "uri" }
+ "name": {
+ "type": "string"
+ },
+ "username": {
+ "type": "string"
+ },
+ "id": {
+ "type": "integer"
+ },
+ "state": {
+ "type": "string"
+ },
+ "avatar_url": {
+ "type": "string",
+ "format": "uri"
+ },
+ "web_url": {
+ "type": "string",
+ "format": "uri"
+ }
},
"required": [
"id",
@@ -80,30 +197,88 @@
"web_url"
]
},
- "user_notes_count": { "type": "integer" },
- "upvotes": { "type": "integer" },
- "downvotes": { "type": "integer" },
- "due_date": { "type": ["string", "null"] },
- "confidential": { "type": "boolean" },
- "web_url": { "type": "uri" },
- "severity": { "type": "string", "enum": ["UNKNOWN", "LOW", "MEDIUM", "HIGH", "CRITICAL"] },
+ "user_notes_count": {
+ "type": "integer"
+ },
+ "upvotes": {
+ "type": "integer"
+ },
+ "downvotes": {
+ "type": "integer"
+ },
+ "due_date": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "confidential": {
+ "type": "boolean"
+ },
+ "web_url": {
+ "type": "string",
+ "format": "uri"
+ },
+ "severity": {
+ "type": "string",
+ "enum": [
+ "UNKNOWN",
+ "LOW",
+ "MEDIUM",
+ "HIGH",
+ "CRITICAL"
+ ]
+ },
"time_stats": {
- "time_estimate": { "type": "integer" },
- "total_time_spent": { "type": "integer" },
- "human_time_estimate": { "type": ["string", "null"] },
- "human_total_time_spent": { "type": ["string", "null"] }
+ "time_estimate": {
+ "type": "integer"
+ },
+ "total_time_spent": {
+ "type": "integer"
+ },
+ "human_time_estimate": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "human_total_time_spent": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
},
"references": {
- "short": {"type": "string"},
- "relative": {"type": "string"},
- "full": {"type": "string"}
+ "short": {
+ "type": "string"
+ },
+ "relative": {
+ "type": "string"
+ },
+ "full": {
+ "type": "string"
+ }
}
},
"required": [
- "id", "iid", "project_id", "title", "description",
- "state", "created_at", "updated_at", "labels",
- "milestone", "assignees", "author", "user_notes_count",
- "upvotes", "downvotes", "due_date", "confidential",
+ "id",
+ "iid",
+ "project_id",
+ "title",
+ "description",
+ "state",
+ "created_at",
+ "updated_at",
+ "labels",
+ "milestone",
+ "assignees",
+ "author",
+ "user_notes_count",
+ "upvotes",
+ "downvotes",
+ "due_date",
+ "confidential",
"web_url"
]
-}
+} \ No newline at end of file
diff --git a/spec/graphql/mutations/ci/runner/bulk_delete_spec.rb b/spec/graphql/mutations/ci/runner/bulk_delete_spec.rb
index 7300d2ad5bd..aaa74fa78aa 100644
--- a/spec/graphql/mutations/ci/runner/bulk_delete_spec.rb
+++ b/spec/graphql/mutations/ci/runner/bulk_delete_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Mutations::Ci::Runner::BulkDelete, feature_category: :runner do
+RSpec.describe Mutations::Ci::Runner::BulkDelete, feature_category: :runner_fleet do
include GraphqlHelpers
let_it_be(:admin_user) { create(:user, :admin) }
diff --git a/spec/graphql/mutations/ci/runner/delete_spec.rb b/spec/graphql/mutations/ci/runner/delete_spec.rb
index e21b35602cc..f19fa7c34a9 100644
--- a/spec/graphql/mutations/ci/runner/delete_spec.rb
+++ b/spec/graphql/mutations/ci/runner/delete_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Mutations::Ci::Runner::Delete, feature_category: :runner do
+RSpec.describe Mutations::Ci::Runner::Delete, feature_category: :runner_fleet do
include GraphqlHelpers
let_it_be(:runner) { create(:ci_runner) }
diff --git a/spec/graphql/mutations/ci/runner/update_spec.rb b/spec/graphql/mutations/ci/runner/update_spec.rb
index 35a44740065..e0c8219e0f6 100644
--- a/spec/graphql/mutations/ci/runner/update_spec.rb
+++ b/spec/graphql/mutations/ci/runner/update_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Mutations::Ci::Runner::Update, feature_category: :runner do
+RSpec.describe Mutations::Ci::Runner::Update, feature_category: :runner_fleet do
include GraphqlHelpers
let_it_be(:user) { create(:user) }
diff --git a/spec/graphql/resolvers/ci/group_runners_resolver_spec.rb b/spec/graphql/resolvers/ci/group_runners_resolver_spec.rb
index eb613457555..5d06db904d5 100644
--- a/spec/graphql/resolvers/ci/group_runners_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/group_runners_resolver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Resolvers::Ci::GroupRunnersResolver do
+RSpec.describe Resolvers::Ci::GroupRunnersResolver, feature_category: :runner_fleet do
include GraphqlHelpers
describe '#resolve' do
diff --git a/spec/graphql/resolvers/ci/project_runners_resolver_spec.rb b/spec/graphql/resolvers/ci/project_runners_resolver_spec.rb
index 5025878cc21..4cc00ced104 100644
--- a/spec/graphql/resolvers/ci/project_runners_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/project_runners_resolver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Resolvers::Ci::ProjectRunnersResolver do
+RSpec.describe Resolvers::Ci::ProjectRunnersResolver, feature_category: :runner_fleet do
include GraphqlHelpers
describe '#resolve' do
diff --git a/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb
index ba8a127bec5..963a642fa4e 100644
--- a/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Resolvers::Ci::RunnerJobsResolver do
+RSpec.describe Resolvers::Ci::RunnerJobsResolver, feature_category: :runner_fleet do
include GraphqlHelpers
let_it_be(:project) { create(:project, :repository) }
diff --git a/spec/graphql/resolvers/ci/runner_platforms_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_platforms_resolver_spec.rb
index 3cb6e94e81e..1d1fb4a9967 100644
--- a/spec/graphql/resolvers/ci/runner_platforms_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/runner_platforms_resolver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Resolvers::Ci::RunnerPlatformsResolver do
+RSpec.describe Resolvers::Ci::RunnerPlatformsResolver, feature_category: :runner_fleet do
include GraphqlHelpers
describe '#resolve' do
diff --git a/spec/graphql/resolvers/ci/runner_projects_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_projects_resolver_spec.rb
index 952c7337d65..6c69cdc19cc 100644
--- a/spec/graphql/resolvers/ci/runner_projects_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/runner_projects_resolver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Resolvers::Ci::RunnerProjectsResolver do
+RSpec.describe Resolvers::Ci::RunnerProjectsResolver, feature_category: :runner_fleet do
include GraphqlHelpers
let_it_be(:project1) { create(:project, description: 'Project1.1') }
diff --git a/spec/graphql/resolvers/ci/runner_setup_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_setup_resolver_spec.rb
index 13ef89023d9..734337f7c92 100644
--- a/spec/graphql/resolvers/ci/runner_setup_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/runner_setup_resolver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Resolvers::Ci::RunnerSetupResolver do
+RSpec.describe Resolvers::Ci::RunnerSetupResolver, feature_category: :runner_fleet do
include GraphqlHelpers
describe '#resolve' do
diff --git a/spec/graphql/resolvers/ci/runner_status_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_status_resolver_spec.rb
index fbef07b72e6..2bea256856d 100644
--- a/spec/graphql/resolvers/ci/runner_status_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/runner_status_resolver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Resolvers::Ci::RunnerStatusResolver do
+RSpec.describe Resolvers::Ci::RunnerStatusResolver, feature_category: :runner_fleet do
include GraphqlHelpers
describe '#resolve' do
diff --git a/spec/graphql/resolvers/ci/runners_resolver_spec.rb b/spec/graphql/resolvers/ci/runners_resolver_spec.rb
index 9e3793ba1e2..d6da8222234 100644
--- a/spec/graphql/resolvers/ci/runners_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/runners_resolver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Resolvers::Ci::RunnersResolver do
+RSpec.describe Resolvers::Ci::RunnersResolver, feature_category: :runner_fleet do
include GraphqlHelpers
describe '#resolve' do
diff --git a/spec/helpers/issuables_helper_spec.rb b/spec/helpers/issuables_helper_spec.rb
index 18a21b59409..15b57a4c9eb 100644
--- a/spec/helpers/issuables_helper_spec.rb
+++ b/spec/helpers/issuables_helper_spec.rb
@@ -98,6 +98,66 @@ RSpec.describe IssuablesHelper do
end
end
+ describe '#assigned_issuables_count', feature_category: :project_management do
+ context 'when issuable is issues' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project).tap { |p| p.add_developer(user) } }
+
+ subject { helper.assigned_issuables_count(:issues) }
+
+ before do
+ allow(helper).to receive(:current_user).and_return(user)
+ end
+
+ context 'when assigned issues count is over 100' do
+ let_it_be(:issues) { create_list(:issue, 101, project: project, assignees: [user]) }
+
+ before do
+ stub_feature_flags(limit_assigned_issues_count: false)
+ end
+
+ it { is_expected.to eq 101 }
+
+ context 'when FF limit_assigned_issues_count is enabled' do
+ before do
+ stub_feature_flags(limit_assigned_issues_count: true)
+ end
+
+ it { is_expected.to eq 100 }
+ end
+ end
+ end
+ end
+
+ describe '#assigned_open_issues_count_text', feature_category: :project_management do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project).tap { |p| p.add_developer(user) } }
+
+ subject { helper.assigned_open_issues_count_text }
+
+ before do
+ allow(helper).to receive(:current_user).and_return(user)
+ end
+
+ context 'when assigned issues count is over 99' do
+ let_it_be(:issues) { create_list(:issue, 100, project: project, assignees: [user]) }
+
+ before do
+ stub_feature_flags(limit_assigned_issues_count: false)
+ end
+
+ it { is_expected.to eq '100' }
+
+ context 'when FF limit_assigned_issues_count is enabled' do
+ before do
+ stub_feature_flags(limit_assigned_issues_count: true)
+ end
+
+ it { is_expected.to eq '99+' }
+ end
+ end
+ end
+
describe '#issuable_meta', time_travel_to: '2022-08-05 00:00:00 +0000' do
let(:user) { create(:user) }
diff --git a/spec/migrations/20220922143143_schedule_reset_duplicate_ci_runners_token_values_spec.rb b/spec/migrations/20220922143143_schedule_reset_duplicate_ci_runners_token_values_spec.rb
index a0041bb9fd2..07627725ed0 100644
--- a/spec/migrations/20220922143143_schedule_reset_duplicate_ci_runners_token_values_spec.rb
+++ b/spec/migrations/20220922143143_schedule_reset_duplicate_ci_runners_token_values_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
require_migration!
-RSpec.describe ScheduleResetDuplicateCiRunnersTokenValues, feature_category: :runner, migration: :gitlab_ci do
+RSpec.describe ScheduleResetDuplicateCiRunnersTokenValues, feature_category: :runner_fleet, migration: :gitlab_ci do
let(:migration) { described_class::MIGRATION }
describe '#up' do
diff --git a/spec/migrations/20220922143634_schedule_reset_duplicate_ci_runners_token_encrypted_values_spec.rb b/spec/migrations/20220922143634_schedule_reset_duplicate_ci_runners_token_encrypted_values_spec.rb
index 4b3e9bfef05..42f200e0d6f 100644
--- a/spec/migrations/20220922143634_schedule_reset_duplicate_ci_runners_token_encrypted_values_spec.rb
+++ b/spec/migrations/20220922143634_schedule_reset_duplicate_ci_runners_token_encrypted_values_spec.rb
@@ -3,7 +3,9 @@
require 'spec_helper'
require_migration!
-RSpec.describe ScheduleResetDuplicateCiRunnersTokenEncryptedValues, feature_category: :runner, migration: :gitlab_ci do
+RSpec.describe ScheduleResetDuplicateCiRunnersTokenEncryptedValues,
+ feature_category: :runner_fleet,
+ migration: :gitlab_ci do
let(:migration) { described_class::MIGRATION }
describe '#up' do
diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb
index e231879beae..b774e6d1248 100644
--- a/spec/models/application_setting_spec.rb
+++ b/spec/models/application_setting_spec.rb
@@ -216,6 +216,10 @@ RSpec.describe ApplicationSetting do
it { is_expected.to allow_value(http).for(:jira_connect_proxy_url) }
it { is_expected.to allow_value(https).for(:jira_connect_proxy_url) }
+ it { is_expected.to allow_value(true).for(:bulk_import_enabled) }
+ it { is_expected.to allow_value(false).for(:bulk_import_enabled) }
+ it { is_expected.not_to allow_value(nil).for(:bulk_import_enabled) }
+
context 'when deactivate_dormant_users is enabled' do
before do
stub_application_setting(deactivate_dormant_users: true)
diff --git a/spec/models/ci/processable_spec.rb b/spec/models/ci/processable_spec.rb
index 2ff29bf207e..07fac4ee2f7 100644
--- a/spec/models/ci/processable_spec.rb
+++ b/spec/models/ci/processable_spec.rb
@@ -73,6 +73,7 @@ RSpec.describe Ci::Processable do
job_artifacts_network_referee job_artifacts_dotenv
job_artifacts_cobertura needs job_artifacts_accessibility
job_artifacts_requirements job_artifacts_coverage_fuzzing
+ job_artifacts_requirements_v2
job_artifacts_api_fuzzing terraform_state_versions job_artifacts_cyclonedx].freeze
end
diff --git a/spec/models/ci/runner_version_spec.rb b/spec/models/ci/runner_version_spec.rb
index 80d72de3b14..552b271fe85 100644
--- a/spec/models/ci/runner_version_spec.rb
+++ b/spec/models/ci/runner_version_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::RunnerVersion, feature_category: :runner do
+RSpec.describe Ci::RunnerVersion, feature_category: :runner_fleet do
let_it_be(:runner_version_recommended) do
create(:ci_runner_version, version: 'abc234', status: :recommended)
end
diff --git a/spec/models/plan_limits_spec.rb b/spec/models/plan_limits_spec.rb
index f9c458b2c80..d4e550657c8 100644
--- a/spec/models/plan_limits_spec.rb
+++ b/spec/models/plan_limits_spec.rb
@@ -200,6 +200,7 @@ RSpec.describe PlanLimits do
ci_max_artifact_size_cluster_applications
ci_max_artifact_size_secret_detection
ci_max_artifact_size_requirements
+ ci_max_artifact_size_requirements_v2
ci_max_artifact_size_coverage_fuzzing
ci_max_artifact_size_api_fuzzing
]
diff --git a/spec/requests/api/ci/runner/runners_delete_spec.rb b/spec/requests/api/ci/runner/runners_delete_spec.rb
index d53c9d3c644..65c287a9535 100644
--- a/spec/requests/api/ci/runner/runners_delete_spec.rb
+++ b/spec/requests/api/ci/runner/runners_delete_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state, feature_category: :runner do
+RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state, feature_category: :runner_fleet do
include StubGitlabCalls
include RedisHelpers
include WorkhorseHelpers
diff --git a/spec/requests/api/ci/runner/runners_post_spec.rb b/spec/requests/api/ci/runner/runners_post_spec.rb
index a501437e21a..73f8e87a9fb 100644
--- a/spec/requests/api/ci/runner/runners_post_spec.rb
+++ b/spec/requests/api/ci/runner/runners_post_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state, feature_category: :runner do
+RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state, feature_category: :runner_fleet do
describe '/api/v4/runners' do
describe 'POST /api/v4/runners' do
context 'when no token is provided' do
diff --git a/spec/requests/api/ci/runner/runners_reset_spec.rb b/spec/requests/api/ci/runner/runners_reset_spec.rb
index 43e9f7ddf38..6ab21138d26 100644
--- a/spec/requests/api/ci/runner/runners_reset_spec.rb
+++ b/spec/requests/api/ci/runner/runners_reset_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state, feature_category: :runner do
+RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state, feature_category: :runner_fleet do
include StubGitlabCalls
include RedisHelpers
include WorkhorseHelpers
diff --git a/spec/requests/api/ci/runners_reset_registration_token_spec.rb b/spec/requests/api/ci/runners_reset_registration_token_spec.rb
index 6ac341240ca..1110dbf5fbc 100644
--- a/spec/requests/api/ci/runners_reset_registration_token_spec.rb
+++ b/spec/requests/api/ci/runners_reset_registration_token_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe API::Ci::Runners, feature_category: :runner do
+RSpec.describe API::Ci::Runners, feature_category: :runner_fleet do
subject { post api("#{prefix}/runners/reset_registration_token", user) }
shared_examples 'bad request' do |result|
diff --git a/spec/requests/api/ci/runners_spec.rb b/spec/requests/api/ci/runners_spec.rb
index fe57a574ceb..b07dd388390 100644
--- a/spec/requests/api/ci/runners_spec.rb
+++ b/spec/requests/api/ci/runners_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe API::Ci::Runners, feature_category: :runner do
+RSpec.describe API::Ci::Runners, feature_category: :runner_fleet do
let_it_be(:admin) { create(:user, :admin) }
let_it_be(:user) { create(:user) }
let_it_be(:user2) { create(:user) }
diff --git a/spec/requests/api/environments_spec.rb b/spec/requests/api/environments_spec.rb
index d7b0b365015..d06e70a1a02 100644
--- a/spec/requests/api/environments_spec.rb
+++ b/spec/requests/api/environments_spec.rb
@@ -321,8 +321,8 @@ RSpec.describe API::Environments, feature_category: :continuous_delivery do
expect(json_response["scheduled_entries"].size).to eq(1)
expect(json_response["scheduled_entries"].first["id"]).to eq(old_stopped_review_env.id)
expect(json_response["unprocessable_entries"].size).to eq(0)
- expect(json_response["scheduled_entries"]).to match_schema('public_api/v4/environments')
- expect(json_response["unprocessable_entries"]).to match_schema('public_api/v4/environments')
+ expect(json_response["scheduled_entries"]).to match_schema('public_api/v4/basic_environments')
+ expect(json_response["unprocessable_entries"]).to match_schema('public_api/v4/basic_environments')
expect(old_stopped_review_env.reload.auto_delete_at).to eq(1.week.from_now)
expect(new_stopped_review_env.reload.auto_delete_at).to be_nil
diff --git a/spec/requests/api/graphql/ci/runner_spec.rb b/spec/requests/api/graphql/ci/runner_spec.rb
index b2a7c523cb0..1b3241c9959 100644
--- a/spec/requests/api/graphql/ci/runner_spec.rb
+++ b/spec/requests/api/graphql/ci/runner_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Query.runner(id)', feature_category: :runner do
+RSpec.describe 'Query.runner(id)', feature_category: :runner_fleet do
include GraphqlHelpers
let_it_be(:user) { create(:user, :admin) }
diff --git a/spec/requests/api/graphql/ci/runner_web_url_edge_spec.rb b/spec/requests/api/graphql/ci/runner_web_url_edge_spec.rb
index 9afa11a40b2..e84a1ca4cc4 100644
--- a/spec/requests/api/graphql/ci/runner_web_url_edge_spec.rb
+++ b/spec/requests/api/graphql/ci/runner_web_url_edge_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe 'RunnerWebUrlEdge', feature_category: :runner do
+RSpec.describe 'RunnerWebUrlEdge', feature_category: :runner_fleet do
include GraphqlHelpers
describe 'inside a Query.group' do
diff --git a/spec/requests/api/graphql/ci/runners_spec.rb b/spec/requests/api/graphql/ci/runners_spec.rb
index 37911698770..75d8609dc38 100644
--- a/spec/requests/api/graphql/ci/runners_spec.rb
+++ b/spec/requests/api/graphql/ci/runners_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe 'Query.runners', feature_category: :runner do
+RSpec.describe 'Query.runners', feature_category: :runner_fleet do
include GraphqlHelpers
let_it_be(:current_user) { create_default(:user, :admin) }
diff --git a/spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb b/spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb
index 17a7d0ac99c..752242c3ab3 100644
--- a/spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb
+++ b/spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'RunnersRegistrationTokenReset', feature_category: :runner do
+RSpec.describe 'RunnersRegistrationTokenReset', feature_category: :runner_fleet do
include GraphqlHelpers
let(:mutation) { graphql_mutation(:runners_registration_token_reset, input) }
diff --git a/spec/requests/api/settings_spec.rb b/spec/requests/api/settings_spec.rb
index 504fb5a7261..e93ef52ef03 100644
--- a/spec/requests/api/settings_spec.rb
+++ b/spec/requests/api/settings_spec.rb
@@ -56,6 +56,7 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu
expect(json_response['group_runner_token_expiration_interval']).to be_nil
expect(json_response['project_runner_token_expiration_interval']).to be_nil
expect(json_response['max_export_size']).to eq(0)
+ expect(json_response['max_terraform_state_size_bytes']).to eq(0)
expect(json_response['pipeline_limit_per_project_user_sha']).to eq(0)
expect(json_response['delete_inactive_projects']).to be(false)
expect(json_response['inactive_projects_delete_after_months']).to eq(2)
@@ -149,6 +150,7 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu
mailgun_events_enabled: true,
mailgun_signing_key: 'MAILGUN_SIGNING_KEY',
max_export_size: 6,
+ max_terraform_state_size_bytes: 1_000,
disabled_oauth_sign_in_sources: 'unknown',
import_sources: 'github,bitbucket',
wiki_page_max_content_bytes: 12345,
@@ -163,7 +165,8 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu
inactive_projects_send_warning_email_after_months: 12,
can_create_group: false,
jira_connect_application_key: '123',
- jira_connect_proxy_url: 'http://example.com'
+ jira_connect_proxy_url: 'http://example.com',
+ bulk_import_enabled: false
}
expect(response).to have_gitlab_http_status(:ok)
@@ -212,6 +215,7 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu
expect(json_response['mailgun_events_enabled']).to be(true)
expect(json_response['mailgun_signing_key']).to eq('MAILGUN_SIGNING_KEY')
expect(json_response['max_export_size']).to eq(6)
+ expect(json_response['max_terraform_state_size_bytes']).to eq(1_000)
expect(json_response['disabled_oauth_sign_in_sources']).to eq([])
expect(json_response['import_sources']).to match_array(%w(github bitbucket))
expect(json_response['wiki_page_max_content_bytes']).to eq(12345)
@@ -227,6 +231,7 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu
expect(json_response['can_create_group']).to eq(false)
expect(json_response['jira_connect_application_key']).to eq('123')
expect(json_response['jira_connect_proxy_url']).to eq('http://example.com')
+ expect(json_response['bulk_import_enabled']).to be(false)
end
end
diff --git a/spec/requests/ide_controller_spec.rb b/spec/requests/ide_controller_spec.rb
index d6d5a2710bf..b7c57ca11f3 100644
--- a/spec/requests/ide_controller_spec.rb
+++ b/spec/requests/ide_controller_spec.rb
@@ -34,6 +34,7 @@ RSpec.describe IdeController, feature_category: :web_ide do
end
before do
+ stub_feature_flags(vscode_web_ide: true)
sign_in(user)
end
diff --git a/spec/requests/runner_setup_controller_spec.rb b/spec/requests/runner_setup_controller_spec.rb
index 5a9c296afd1..8d75b9e81b7 100644
--- a/spec/requests/runner_setup_controller_spec.rb
+++ b/spec/requests/runner_setup_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe RunnerSetupController, feature_category: :runner do
+RSpec.describe RunnerSetupController, feature_category: :runner_fleet do
let(:user) { create(:user) }
before do
diff --git a/spec/services/ci/runners/assign_runner_service_spec.rb b/spec/services/ci/runners/assign_runner_service_spec.rb
index 030b54c2753..92f6db2bdfb 100644
--- a/spec/services/ci/runners/assign_runner_service_spec.rb
+++ b/spec/services/ci/runners/assign_runner_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ::Ci::Runners::AssignRunnerService, '#execute', feature_category: :runner do
+RSpec.describe ::Ci::Runners::AssignRunnerService, '#execute', feature_category: :runner_fleet do
subject(:execute) { described_class.new(runner, project, user).execute }
let_it_be(:runner) { create(:ci_runner, :project, projects: [project]) }
diff --git a/spec/services/ci/runners/bulk_delete_runners_service_spec.rb b/spec/services/ci/runners/bulk_delete_runners_service_spec.rb
index dbdcda08282..5e697565972 100644
--- a/spec/services/ci/runners/bulk_delete_runners_service_spec.rb
+++ b/spec/services/ci/runners/bulk_delete_runners_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ::Ci::Runners::BulkDeleteRunnersService, '#execute', feature_category: :runner do
+RSpec.describe ::Ci::Runners::BulkDeleteRunnersService, '#execute', feature_category: :runner_fleet do
subject(:execute) { described_class.new(**service_args).execute }
let_it_be(:admin_user) { create(:user, :admin) }
diff --git a/spec/services/ci/runners/process_runner_version_update_service_spec.rb b/spec/services/ci/runners/process_runner_version_update_service_spec.rb
index 1591782be11..d2a7e87b2d5 100644
--- a/spec/services/ci/runners/process_runner_version_update_service_spec.rb
+++ b/spec/services/ci/runners/process_runner_version_update_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::Runners::ProcessRunnerVersionUpdateService, feature_category: :runner do
+RSpec.describe Ci::Runners::ProcessRunnerVersionUpdateService, feature_category: :runner_fleet do
subject(:service) { described_class.new(version) }
let(:version) { '1.0.0' }
diff --git a/spec/services/ci/runners/reconcile_existing_runner_versions_service_spec.rb b/spec/services/ci/runners/reconcile_existing_runner_versions_service_spec.rb
index 1169e6f8106..39082b5c0f4 100644
--- a/spec/services/ci/runners/reconcile_existing_runner_versions_service_spec.rb
+++ b/spec/services/ci/runners/reconcile_existing_runner_versions_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ::Ci::Runners::ReconcileExistingRunnerVersionsService, '#execute', feature_category: :runner do
+RSpec.describe ::Ci::Runners::ReconcileExistingRunnerVersionsService, '#execute', feature_category: :runner_fleet do
include RunnerReleasesHelper
subject(:execute) { described_class.new.execute }
diff --git a/spec/services/ci/runners/register_runner_service_spec.rb b/spec/services/ci/runners/register_runner_service_spec.rb
index 6ec1cd11c89..47d399cb19a 100644
--- a/spec/services/ci/runners/register_runner_service_spec.rb
+++ b/spec/services/ci/runners/register_runner_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ::Ci::Runners::RegisterRunnerService, '#execute', feature_category: :runner do
+RSpec.describe ::Ci::Runners::RegisterRunnerService, '#execute', feature_category: :runner_fleet do
let(:registration_token) { 'abcdefg123456' }
let(:token) {}
let(:args) { {} }
diff --git a/spec/services/ci/runners/reset_registration_token_service_spec.rb b/spec/services/ci/runners/reset_registration_token_service_spec.rb
index 0563ea0d0cc..c8115236034 100644
--- a/spec/services/ci/runners/reset_registration_token_service_spec.rb
+++ b/spec/services/ci/runners/reset_registration_token_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ::Ci::Runners::ResetRegistrationTokenService, '#execute', feature_category: :runner do
+RSpec.describe ::Ci::Runners::ResetRegistrationTokenService, '#execute', feature_category: :runner_fleet do
subject(:execute) { described_class.new(scope, current_user).execute }
let_it_be(:user) { build(:user) }
diff --git a/spec/services/ci/runners/set_runner_associated_projects_service_spec.rb b/spec/services/ci/runners/set_runner_associated_projects_service_spec.rb
index 66bd8cd9bd2..9921f9322bd 100644
--- a/spec/services/ci/runners/set_runner_associated_projects_service_spec.rb
+++ b/spec/services/ci/runners/set_runner_associated_projects_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ::Ci::Runners::SetRunnerAssociatedProjectsService, '#execute', feature_category: :runner do
+RSpec.describe ::Ci::Runners::SetRunnerAssociatedProjectsService, '#execute', feature_category: :runner_fleet do
subject(:execute) { described_class.new(runner: runner, current_user: user, project_ids: project_ids).execute }
let_it_be(:owner_project) { create(:project) }
diff --git a/spec/services/ci/runners/unassign_runner_service_spec.rb b/spec/services/ci/runners/unassign_runner_service_spec.rb
index 36620ab9c57..e91d4249473 100644
--- a/spec/services/ci/runners/unassign_runner_service_spec.rb
+++ b/spec/services/ci/runners/unassign_runner_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ::Ci::Runners::UnassignRunnerService, '#execute', feature_category: :runner do
+RSpec.describe ::Ci::Runners::UnassignRunnerService, '#execute', feature_category: :runner_fleet do
let_it_be(:project) { create(:project) }
let_it_be(:runner) { create(:ci_runner, :project, projects: [project]) }
diff --git a/spec/services/ci/runners/unregister_runner_service_spec.rb b/spec/services/ci/runners/unregister_runner_service_spec.rb
index 33266bc58e5..fb779e1a673 100644
--- a/spec/services/ci/runners/unregister_runner_service_spec.rb
+++ b/spec/services/ci/runners/unregister_runner_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ::Ci::Runners::UnregisterRunnerService, '#execute', feature_category: :runner do
+RSpec.describe ::Ci::Runners::UnregisterRunnerService, '#execute', feature_category: :runner_fleet do
subject(:execute) { described_class.new(runner, 'some_token').execute }
let(:runner) { create(:ci_runner) }
diff --git a/spec/services/ci/runners/update_runner_service_spec.rb b/spec/services/ci/runners/update_runner_service_spec.rb
index 42c509fee9e..86875df70a2 100644
--- a/spec/services/ci/runners/update_runner_service_spec.rb
+++ b/spec/services/ci/runners/update_runner_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::Runners::UpdateRunnerService, '#execute', feature_category: :runner do
+RSpec.describe Ci::Runners::UpdateRunnerService, '#execute', feature_category: :runner_fleet do
subject(:execute) { described_class.new(runner).execute(params) }
let(:runner) { create(:ci_runner) }
diff --git a/spec/services/incident_management/link_alerts/create_service_spec.rb b/spec/services/incident_management/link_alerts/create_service_spec.rb
index 51cdb0d18a6..fab28771174 100644
--- a/spec/services/incident_management/link_alerts/create_service_spec.rb
+++ b/spec/services/incident_management/link_alerts/create_service_spec.rb
@@ -57,7 +57,7 @@ RSpec.describe IncidentManagement::LinkAlerts::CreateService, feature_category:
expect { execute }
.to change { incident.reload.alert_management_alerts.to_a }
.from([linked_alert])
- .to([linked_alert, alert1, alert2])
+ .to match_array([linked_alert, alert1, alert2])
end
context 'when linking an already linked alert' do
@@ -75,7 +75,7 @@ RSpec.describe IncidentManagement::LinkAlerts::CreateService, feature_category:
expect { execute }
.to change { incident.reload.alert_management_alerts.to_a }
.from([linked_alert])
- .to([linked_alert, external_alert])
+ .to match_array([linked_alert, external_alert])
end
end
end
@@ -90,7 +90,7 @@ RSpec.describe IncidentManagement::LinkAlerts::CreateService, feature_category:
expect { execute }
.to change { incident.reload.alert_management_alerts.to_a }
.from([linked_alert])
- .to([linked_alert, alert1])
+ .to match_array([linked_alert, alert1])
end
end
end
diff --git a/spec/services/users/assigned_issues_count_service_spec.rb b/spec/services/users/assigned_issues_count_service_spec.rb
new file mode 100644
index 00000000000..afa6a0af3dd
--- /dev/null
+++ b/spec/services/users/assigned_issues_count_service_spec.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Users::AssignedIssuesCountService, :use_clean_rails_memory_store_caching,
+ feature_category: :project_management do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:max_limit) { 10 }
+
+ let(:current_user) { user }
+
+ subject { described_class.new(current_user: current_user, max_limit: max_limit) }
+
+ it_behaves_like 'a counter caching service'
+
+ context 'when user has assigned open issues from archived and closed projects' do
+ before do
+ project = create(:project, :public)
+ archived_project = create(:project, :public, :archived)
+
+ create(:issue, project: project, author: user, assignees: [user])
+ create(:issue, :closed, project: project, author: user, assignees: [user])
+ create(:issue, project: archived_project, author: user, assignees: [user])
+ end
+
+ it 'count all assigned open issues excluding those from closed or archived projects' do
+ expect(subject.count).to eq(1)
+ end
+ end
+
+ context 'when the number of assigned open issues exceeds max_limit' do
+ let_it_be(:banned_user) { create(:user, :banned) }
+ let_it_be(:project) { create(:project).tap { |p| p.add_developer(user) } }
+
+ context 'when user is admin', :enable_admin_mode do
+ let_it_be(:admin) { create(:admin) }
+ let_it_be(:issues) { create_list(:issue, max_limit + 1, project: project, assignees: [admin]) }
+ let_it_be(:banned_issue) { create(:issue, project: project, assignees: [admin], author: banned_user) }
+
+ let(:current_user) { admin }
+
+ it 'returns the max_limit count' do
+ expect(subject.count).to eq max_limit
+ end
+ end
+
+ context 'when user is non-admin' do
+ let_it_be(:issues) { create_list(:issue, max_limit + 1, project: project, assignees: [user]) }
+ let_it_be(:closed_issue) { create(:issue, :closed, project: project, assignees: [user]) }
+ let_it_be(:banned_issue) { create(:issue, project: project, assignees: [user], author: banned_user) }
+
+ it 'returns the max_limit count' do
+ expect(subject.count).to eq max_limit
+ end
+ end
+ end
+end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 7dcd2324488..dc2f12628d0 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -272,6 +272,10 @@ RSpec.configure do |config|
# cause spec failures.
stub_feature_flags(use_click_house_database_for_error_tracking: false)
+ # Disable this to avoid the Web IDE modals popping up in tests:
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/385453
+ stub_feature_flags(vscode_web_ide: false)
+
enable_rugged = example.metadata[:enable_rugged].present?
# Disable Rugged features by default
diff --git a/spec/tooling/danger/project_helper_spec.rb b/spec/tooling/danger/project_helper_spec.rb
index f9ad9ed13c2..669867ffb4f 100644
--- a/spec/tooling/danger/project_helper_spec.rb
+++ b/spec/tooling/danger/project_helper_spec.rb
@@ -156,8 +156,6 @@ RSpec.describe Tooling::Danger::ProjectHelper do
'lib/gitlab/database.rb' | [:database, :backend]
'lib/gitlab/database/foo' | [:database, :backend]
'ee/lib/gitlab/database/foo' | [:database, :backend]
- 'lib/gitlab/github_import.rb' | [:database, :backend]
- 'lib/gitlab/github_import/foo' | [:database, :backend]
'lib/gitlab/sql/foo' | [:database, :backend]
'rubocop/cop/migration/foo' | [:database]
diff --git a/spec/workers/ci/runners/process_runner_version_update_worker_spec.rb b/spec/workers/ci/runners/process_runner_version_update_worker_spec.rb
index d6c31fe2016..30b451f2112 100644
--- a/spec/workers/ci/runners/process_runner_version_update_worker_spec.rb
+++ b/spec/workers/ci/runners/process_runner_version_update_worker_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::Runners::ProcessRunnerVersionUpdateWorker, feature_category: :runner do
+RSpec.describe Ci::Runners::ProcessRunnerVersionUpdateWorker, feature_category: :runner_fleet do
subject(:worker) { described_class.new }
describe '#perform' do
diff --git a/spec/workers/ci/runners/reconcile_existing_runner_versions_cron_worker_spec.rb b/spec/workers/ci/runners/reconcile_existing_runner_versions_cron_worker_spec.rb
index 46145dc6c35..34b1cb33e6b 100644
--- a/spec/workers/ci/runners/reconcile_existing_runner_versions_cron_worker_spec.rb
+++ b/spec/workers/ci/runners/reconcile_existing_runner_versions_cron_worker_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::Runners::ReconcileExistingRunnerVersionsCronWorker, feature_category: :runner do
+RSpec.describe Ci::Runners::ReconcileExistingRunnerVersionsCronWorker, feature_category: :runner_fleet do
subject(:worker) { described_class.new }
describe '#perform' do
diff --git a/tooling/danger/project_helper.rb b/tooling/danger/project_helper.rb
index 335214d3c9d..fbf102422aa 100644
--- a/tooling/danger/project_helper.rb
+++ b/tooling/danger/project_helper.rb
@@ -98,7 +98,7 @@ module Tooling
%r{\A((ee|jh)/)?db/(geo/)?(migrate|post_migrate)/} => [:database, :migration],
%r{\A((ee|jh)/)?db/(?!fixtures)[^/]+} => [:database],
- %r{\A((ee|jh)/)?lib/gitlab/(database|background_migration|sql|github_import)(/|\.rb)} => [:database, :backend],
+ %r{\A((ee|jh)/)?lib/gitlab/(database|background_migration|sql)(/|\.rb)} => [:database, :backend],
%r{\A(app/services/authorized_project_update/find_records_due_for_refresh_service)(/|\.rb)} => [:database, :backend],
%r{\A(app/models/project_authorization|app/services/users/refresh_authorized_projects_service)(/|\.rb)} => [:database, :backend],
%r{\A((ee|jh)/)?app/finders/} => [:database, :backend],