diff options
23 files changed, 118 insertions, 38 deletions
diff --git a/app/assets/javascripts/pages/dashboard/todos/index/todos.js b/app/assets/javascripts/pages/dashboard/todos/index/todos.js index 946076cfb29..a1e7eb5d3de 100644 --- a/app/assets/javascripts/pages/dashboard/todos/index/todos.js +++ b/app/assets/javascripts/pages/dashboard/todos/index/todos.js @@ -1,4 +1,4 @@ -/* eslint-disable class-methods-use-this, no-unneeded-ternary */ +/* eslint-disable class-methods-use-this */ import $ from 'jquery'; import { getGroups } from '~/api/groups_api'; @@ -78,7 +78,7 @@ export default class Todos { initDeprecatedJQueryDropdown($dropdown, { fieldName, selectable: true, - filterable: searchFields ? true : false, + filterable: Boolean(searchFields), search: { fields: searchFields }, data: $dropdown.data('data'), clicked: () => { @@ -172,8 +172,8 @@ export default class Todos { updateBadges(data) { $(document).trigger('todo:toggle', data.count); - document.querySelector('.todos-pending .badge').innerHTML = addDelimiter(data.count); - document.querySelector('.todos-done .badge').innerHTML = addDelimiter(data.done_count); + document.querySelector('.js-todos-pending .badge').innerHTML = addDelimiter(data.count); + document.querySelector('.js-todos-done .badge').innerHTML = addDelimiter(data.done_count); } goToTodoUrl(e) { diff --git a/app/assets/javascripts/security_configuration/components/constants.js b/app/assets/javascripts/security_configuration/components/constants.js index b6f0bd18d0f..d0a7b0d0b89 100644 --- a/app/assets/javascripts/security_configuration/components/constants.js +++ b/app/assets/javascripts/security_configuration/components/constants.js @@ -17,6 +17,7 @@ import { } from '~/vue_shared/security_reports/constants'; import configureSastMutation from '../graphql/configure_sast.mutation.graphql'; +import configureSastIacMutation from '../graphql/configure_iac.mutation.graphql'; import configureSecretDetectionMutation from '../graphql/configure_secret_detection.mutation.graphql'; /** @@ -162,6 +163,11 @@ export const securityFeatures = [ configurationHelpPath: SAST_IAC_CONFIG_HELP_PATH, type: REPORT_TYPE_SAST_IAC, + // This field is currently hardcoded because SAST IaC is always available. + // It will eventually come from the Backend, the progress is tracked in + // https://gitlab.com/gitlab-org/gitlab/-/issues/331622 + available: true, + // This field will eventually come from the backend, the progress is // tracked in https://gitlab.com/gitlab-org/gitlab/-/issues/331621 canEnableByMergeRequest: true, @@ -269,6 +275,21 @@ export const featureToMutationMap = { }, }), }, + ...(gon?.features?.configureIacScanningViaMr + ? { + [REPORT_TYPE_SAST_IAC]: { + mutationId: 'configureSastIac', + getMutationPayload: (projectPath) => ({ + mutation: configureSastIacMutation, + variables: { + input: { + projectPath, + }, + }, + }), + }, + } + : {}), [REPORT_TYPE_SECRET_DETECTION]: { mutationId: 'configureSecretDetection', getMutationPayload: (projectPath) => ({ diff --git a/app/assets/javascripts/security_configuration/graphql/configure_iac.mutation.graphql b/app/assets/javascripts/security_configuration/graphql/configure_iac.mutation.graphql new file mode 100644 index 00000000000..26b826ef722 --- /dev/null +++ b/app/assets/javascripts/security_configuration/graphql/configure_iac.mutation.graphql @@ -0,0 +1,6 @@ +mutation configureSastIac($input: ConfigureSastIacInput!) { + configureSastIac(input: $input) { + successPath + errors + } +} diff --git a/app/helpers/tab_helper.rb b/app/helpers/tab_helper.rb index a6bb2f3b246..d1046b7b668 100644 --- a/app/helpers/tab_helper.rb +++ b/app/helpers/tab_helper.rb @@ -210,3 +210,11 @@ module TabHelper current_page?(options) end end + +def gl_tab_counter_badge(count, html_options = {}) + badge_classes = %w[badge badge-muted badge-pill gl-badge sm gl-tab-counter-badge] + content_tag(:span, + count, + class: [*html_options[:class], badge_classes].join(' ') + ) +end diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb index ba9665555cc..540e8f7b970 100644 --- a/app/services/ci/create_pipeline_service.rb +++ b/app/services/ci/create_pipeline_service.rb @@ -25,6 +25,7 @@ module Ci Gitlab::Ci::Pipeline::Chain::Populate, Gitlab::Ci::Pipeline::Chain::StopDryRun, Gitlab::Ci::Pipeline::Chain::Create, + Gitlab::Ci::Pipeline::Chain::CreateCrossDatabaseAssociations, Gitlab::Ci::Pipeline::Chain::Limit::Activity, Gitlab::Ci::Pipeline::Chain::Limit::JobActivity, Gitlab::Ci::Pipeline::Chain::CancelPendingPipelines, diff --git a/app/views/dashboard/todos/index.html.haml b/app/views/dashboard/todos/index.html.haml index 58f817bf63b..aa54a1e589e 100644 --- a/app/views/dashboard/todos/index.html.haml +++ b/app/views/dashboard/todos/index.html.haml @@ -10,19 +10,13 @@ - if current_user.todos.any? .top-area - %ul.nav-links.mobile-separator.nav.nav-tabs - %li.todos-pending{ class: active_when(params[:state].blank? || params[:state] == 'pending') }> - = link_to todos_filter_path(state: 'pending') do - %span - To Do - %span.badge.gl-tab-counter-badge.badge-muted.badge-pill.gl-badge.sm - = number_with_delimiter(todos_pending_count) - %li.todos-done{ class: active_when(params[:state] == 'done') }> - = link_to todos_filter_path(state: 'done') do - %span - Done - %span.badge.gl-tab-counter-badge.badge-muted.badge-pill.gl-badge.sm - = number_with_delimiter(todos_done_count) + = gl_tabs_nav({ class: 'gl-flex-grow-1 gl-border-0' }) do + = gl_tab_link_to todos_filter_path(state: 'pending'), item_active: params[:state].blank? || params[:state] == 'pending', class: "js-todos-pending" do + = _("To Do") + = gl_tab_counter_badge number_with_delimiter(todos_pending_count) + = gl_tab_link_to todos_filter_path(state: 'done'), item_active: params[:state] == 'done', class: "js-todos-done" do + = _("Done") + = gl_tab_counter_badge number_with_delimiter(todos_done_count) .nav-controls - if @allowed_todos.any?(&:pending?) diff --git a/config/known_invalid_graphql_queries.yml b/config/known_invalid_graphql_queries.yml index 3376ad16583..84c6039793d 100644 --- a/config/known_invalid_graphql_queries.yml +++ b/config/known_invalid_graphql_queries.yml @@ -1,4 +1,3 @@ --- filenames: - - ee/app/assets/javascripts/oncall_schedules/graphql/mutations/update_oncall_schedule_rotation.mutation.graphql - - ee/app/assets/javascripts/security_configuration/graphql/configure_iac.mutation.graphql + - ee/app/assets/javascripts/oncall_schedules/graphql/mutations/update_oncall_schedule_rotation.mutation.graphql
\ No newline at end of file diff --git a/db/migrate/20211108211434_remove_index_for_resource_group.rb b/db/migrate/20211108211434_remove_index_for_resource_group.rb new file mode 100644 index 00000000000..8b03f12d08b --- /dev/null +++ b/db/migrate/20211108211434_remove_index_for_resource_group.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class RemoveIndexForResourceGroup < Gitlab::Database::Migration[1.0] + INDEX_NAME = 'index_for_resource_group' + + disable_ddl_transaction! + + def up + remove_concurrent_index_by_name :ci_builds, INDEX_NAME + end + + def down + # rubocop:disable Migration/PreventIndexCreation + add_concurrent_index :ci_builds, [:resource_group_id, :id], where: 'resource_group_id IS NOT NULL', name: INDEX_NAME + # rubocop:enable Migration/PreventIndexCreation + end +end diff --git a/db/schema_migrations/20211108211434 b/db/schema_migrations/20211108211434 new file mode 100644 index 00000000000..17a90668900 --- /dev/null +++ b/db/schema_migrations/20211108211434 @@ -0,0 +1 @@ +06cbecc52e62a48664ae486181047d8ca4d71a7991ba36bdca4bfa44257627f3
\ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 4fd96e5d3c5..619b0cbcf03 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -25893,8 +25893,6 @@ CREATE UNIQUE INDEX index_feature_gates_on_feature_key_and_key_and_value ON feat CREATE UNIQUE INDEX index_features_on_key ON features USING btree (key); -CREATE INDEX index_for_resource_group ON ci_builds USING btree (resource_group_id, id) WHERE (resource_group_id IS NOT NULL); - CREATE INDEX index_for_status_per_branch_per_project ON merge_trains USING btree (target_project_id, target_branch, status); CREATE INDEX index_fork_network_members_on_fork_network_id ON fork_network_members USING btree (fork_network_id); diff --git a/doc/administration/operations/moving_repositories.md b/doc/administration/operations/moving_repositories.md index e355059f5c8..9cf7ac18c81 100644 --- a/doc/administration/operations/moving_repositories.md +++ b/doc/administration/operations/moving_repositories.md @@ -49,9 +49,8 @@ until the move has completed. To move repositories: -1. Ensure all storages are accessible to the GitLab instance. Configure [local storage](../repository_storage_paths.md#example-configuration), - and [cluster storage](../repository_storage_paths.md). In this example, these are - `<original_storage_name>` and `<cluster_storage_name>`. +1. Ensure all [local and cluster storages](../gitaly/configure_gitaly.md#mixed-configuration) are accessible to the GitLab instance. In + this example, these are `<original_storage_name>` and `<cluster_storage_name>`. 1. [Configure repository storage weights](../repository_storage_paths.md#configure-where-new-repositories-are-stored) so that the new storages receives all new projects. This stops new projects from being created on existing storages while the migration is in progress. diff --git a/doc/raketasks/backup_restore.md b/doc/raketasks/backup_restore.md index f1ddefef5de..cd541e7827f 100644 --- a/doc/raketasks/backup_restore.md +++ b/doc/raketasks/backup_restore.md @@ -1022,7 +1022,7 @@ docker exec -it <name of container> gitlab-ctl stop sidekiq # Verify that the processes are all down before continuing docker exec -it <name of container> gitlab-ctl status -# Run the restore +# Run the restore. NOTE: "_gitlab_backup.tar" is omitted from the name docker exec -it <name of container> gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce # Restart the GitLab container diff --git a/doc/user/permissions.md b/doc/user/permissions.md index 21c22f050b6..dd129cfce49 100644 --- a/doc/user/permissions.md +++ b/doc/user/permissions.md @@ -33,8 +33,13 @@ usernames. A GitLab administrator can configure the GitLab instance to ## Project members permissions -The Owner role is only available at the group or personal namespace level (and for instance administrators) and is inherited by its projects. -While Maintainer is the highest project-level role, some actions can only be performed by a personal namespace or group owner, or an instance administrator, who receives all permissions. +A user's role determines what permissions they have on a project. The Owner role provides all permissions but is +available only: + +- For group owners. The role is inherited for a group's projects. +- For Administrators. + +Personal namespace owners have the same permissions as an Owner, but are displayed with the Maintainer role on projects created in their personal namespace. For more information, see [projects members documentation](project/members/index.md). The following table lists project permissions available for each role: diff --git a/lib/gitlab/ci/pipeline/chain/create_cross_database_associations.rb b/lib/gitlab/ci/pipeline/chain/create_cross_database_associations.rb new file mode 100644 index 00000000000..bb5b4e722b7 --- /dev/null +++ b/lib/gitlab/ci/pipeline/chain/create_cross_database_associations.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Gitlab + module Ci + module Pipeline + module Chain + class CreateCrossDatabaseAssociations < Chain::Base + def perform! + # to be overridden in EE + end + + def break? + false # to be overridden in EE + end + end + end + end + end +end + +Gitlab::Ci::Pipeline::Chain::CreateCrossDatabaseAssociations.prepend_mod_with('Gitlab::Ci::Pipeline::Chain::CreateCrossDatabaseAssociations') diff --git a/lib/gitlab/ci/pipeline/seed/build.rb b/lib/gitlab/ci/pipeline/seed/build.rb index f223d1d4b4e..21238068743 100644 --- a/lib/gitlab/ci/pipeline/seed/build.rb +++ b/lib/gitlab/ci/pipeline/seed/build.rb @@ -244,5 +244,3 @@ module Gitlab end end end - -Gitlab::Ci::Pipeline::Seed::Build.prepend_mod_with('Gitlab::Ci::Pipeline::Seed::Build') diff --git a/lib/gitlab/gon_helper.rb b/lib/gitlab/gon_helper.rb index 98dd8104310..6faf3575bc1 100644 --- a/lib/gitlab/gon_helper.rb +++ b/lib/gitlab/gon_helper.rb @@ -57,6 +57,7 @@ module Gitlab push_frontend_feature_flag(:improved_emoji_picker, default_enabled: :yaml) push_frontend_feature_flag(:new_header_search, default_enabled: :yaml) push_frontend_feature_flag(:suppress_apollo_errors_during_navigation, current_user, default_enabled: :yaml) + push_frontend_feature_flag(:configure_iac_scanning_via_mr, current_user, default_enabled: :yaml) end # Exposes the state of a feature flag to the frontend code. diff --git a/spec/frontend/pages/dashboard/todos/index/todos_spec.js b/spec/frontend/pages/dashboard/todos/index/todos_spec.js index de8b29d54fc..5bba98bdf96 100644 --- a/spec/frontend/pages/dashboard/todos/index/todos_spec.js +++ b/spec/frontend/pages/dashboard/todos/index/todos_spec.js @@ -94,13 +94,13 @@ describe('Todos', () => { }); it('updates pending text', () => { - expect(document.querySelector('.todos-pending .badge').innerHTML).toEqual( + expect(document.querySelector('.js-todos-pending .badge').innerHTML).toEqual( addDelimiter(TEST_COUNT_BIG), ); }); it('updates done text', () => { - expect(document.querySelector('.todos-done .badge').innerHTML).toEqual( + expect(document.querySelector('.js-todos-done .badge').innerHTML).toEqual( addDelimiter(TEST_DONE_COUNT_BIG), ); }); diff --git a/spec/helpers/tab_helper_spec.rb b/spec/helpers/tab_helper_spec.rb index 346bfc7850c..7286aa288cf 100644 --- a/spec/helpers/tab_helper_spec.rb +++ b/spec/helpers/tab_helper_spec.rb @@ -150,4 +150,16 @@ RSpec.describe TabHelper do end end end + + describe 'gl_tab_counter_badge' do + it 'creates a tab counter badge' do + expect(gl_tab_counter_badge(1)).to eq('<span class="badge badge-muted badge-pill gl-badge sm gl-tab-counter-badge">1</span>') + end + + context 'with extra classes' do + it 'creates a tab counter badge with the correct class attribute' do + expect(gl_tab_counter_badge(1, { class: 'js-test' })).to eq('<span class="js-test badge badge-muted badge-pill gl-badge sm gl-tab-counter-badge">1</span>') + end + end + end end diff --git a/spec/lib/gitlab/ci/pipeline/quota/deployments_spec.rb b/spec/lib/gitlab/ci/pipeline/quota/deployments_spec.rb index c52994fc6a2..5b0917c5c6f 100644 --- a/spec/lib/gitlab/ci/pipeline/quota/deployments_spec.rb +++ b/spec/lib/gitlab/ci/pipeline/quota/deployments_spec.rb @@ -3,9 +3,9 @@ require 'spec_helper' RSpec.describe Gitlab::Ci::Pipeline::Quota::Deployments do - let_it_be(:namespace) { create(:namespace) } - let_it_be(:default_plan, reload: true) { create(:default_plan) } - let_it_be(:project, reload: true) { create(:project, :repository, namespace: namespace) } + let_it_be_with_refind(:namespace) { create(:namespace) } + let_it_be_with_reload(:default_plan) { create(:default_plan) } + let_it_be_with_reload(:project) { create(:project, :repository, namespace: namespace) } let_it_be(:plan_limits) { create(:plan_limits, plan: default_plan) } let(:pipeline) { build_stubbed(:ci_pipeline, project: project) } diff --git a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb index 66b759f4778..e2b64e65938 100644 --- a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb +++ b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe Gitlab::Ci::Pipeline::Seed::Build do - let_it_be(:project) { create(:project, :repository) } + let_it_be_with_reload(:project) { create(:project, :repository) } let_it_be(:head_sha) { project.repository.head_commit.id } let(:pipeline) { build(:ci_empty_pipeline, project: project, sha: head_sha) } diff --git a/spec/models/ci/pipeline_schedule_spec.rb b/spec/models/ci/pipeline_schedule_spec.rb index c7e1fe91b1e..fee74f8f674 100644 --- a/spec/models/ci/pipeline_schedule_spec.rb +++ b/spec/models/ci/pipeline_schedule_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe Ci::PipelineSchedule do - let_it_be(:project) { create_default(:project) } + let_it_be_with_reload(:project) { create_default(:project) } subject { build(:ci_pipeline_schedule) } diff --git a/spec/models/hooks/project_hook_spec.rb b/spec/models/hooks/project_hook_spec.rb index d811f67d16b..f0ee9a613d8 100644 --- a/spec/models/hooks/project_hook_spec.rb +++ b/spec/models/hooks/project_hook_spec.rb @@ -32,8 +32,8 @@ RSpec.describe ProjectHook do end describe '#rate_limit' do - let_it_be(:hook) { create(:project_hook) } let_it_be(:plan_limits) { create(:plan_limits, :default_plan, web_hook_calls: 100) } + let_it_be(:hook) { create(:project_hook) } it 'returns the default limit' do expect(hook.rate_limit).to be(100) diff --git a/spec/support/database/cross-database-modification-allowlist.yml b/spec/support/database/cross-database-modification-allowlist.yml index bff5507c9d3..e7bf7ded7c1 100644 --- a/spec/support/database/cross-database-modification-allowlist.yml +++ b/spec/support/database/cross-database-modification-allowlist.yml @@ -20,7 +20,6 @@ - "./ee/spec/services/app_sec/dast/profiles/update_service_spec.rb" - "./ee/spec/services/app_sec/dast/scans/create_service_spec.rb" - "./ee/spec/services/app_sec/dast/scans/run_service_spec.rb" -- "./ee/spec/services/ci/create_pipeline_service/dast_configuration_spec.rb" - "./ee/spec/services/ci/destroy_pipeline_service_spec.rb" - "./ee/spec/services/ci/retry_build_service_spec.rb" - "./ee/spec/services/ci/subscribe_bridge_service_spec.rb" |