diff --git a/app/assets/javascripts/analytics/shared/constants.js b/app/assets/javascripts/analytics/shared/constants.js index 4f157727d80..7dbe241903a 100644 --- a/app/assets/javascripts/analytics/shared/constants.js +++ b/app/assets/javascripts/analytics/shared/constants.js @@ -83,6 +83,7 @@ export const UNITS = { DAYS: 'DAYS', PER_DAY: 'PER_DAY', PERCENT: 'PERCENT', + TIME_INTERVAL: 'TIME_INTERVAL', }; export const NUMBER_OF_DAYS_SELECTED = (numDays) => { diff --git a/app/services/notes/destroy_service.rb b/app/services/notes/destroy_service.rb index 76ddd32a76b..4a535ea2ffe 100644 --- a/app/services/notes/destroy_service.rb +++ b/app/services/notes/destroy_service.rb @@ -11,6 +11,7 @@ module Notes track_note_removal_usage_for_issues(note) if note.for_issue? track_note_removal_usage_for_merge_requests(note) if note.for_merge_request? track_note_removal_usage_for_design(note) if note.for_design? + track_note_removal_usage_for_wiki(note) if note.for_wiki_page? end private @@ -32,6 +33,15 @@ module Notes project: project ) end + + def track_note_removal_usage_for_wiki(note) + track_internal_event( + 'delete_wiki_page_note', + project: project, + namespace: note.noteable.namespace, + user: current_user + ) + end end end diff --git a/config/events/delete_wiki_page_note.yml b/config/events/delete_wiki_page_note.yml new file mode 100644 index 00000000000..ef4ef42c8e7 --- /dev/null +++ b/config/events/delete_wiki_page_note.yml @@ -0,0 +1,17 @@ +--- +description: Wiki page notes deleted +internal_events: true +action: delete_wiki_page_note +identifiers: +- project +- namespace +- user +product_group: knowledge +product_categories: +- wiki +milestone: '17.11' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/186551 +tiers: +- free +- premium +- ultimate diff --git a/config/gitlab_loose_foreign_keys.yml b/config/gitlab_loose_foreign_keys.yml index bc3481a5102..b6ec2b75dd0 100644 --- a/config/gitlab_loose_foreign_keys.yml +++ b/config/gitlab_loose_foreign_keys.yml @@ -7,6 +7,10 @@ ai_conversation_messages: - table: ai_conversation_threads column: thread_id on_delete: async_delete +analyzer_namespace_statuses: + - table: namespaces + column: namespace_id + on_delete: async_delete analyzer_project_statuses: - table: projects column: project_id diff --git a/config/metrics/counts_all/count_distinct_user_id_from_delete_wiki_page_note.yml b/config/metrics/counts_all/count_distinct_user_id_from_delete_wiki_page_note.yml new file mode 100644 index 00000000000..67ab9be5d2d --- /dev/null +++ b/config/metrics/counts_all/count_distinct_user_id_from_delete_wiki_page_note.yml @@ -0,0 +1,23 @@ +--- +key_path: redis_hll_counters.count_distinct_user_id_from_delete_wiki_page_note +description: Count of unique users who deleted a wiki page note +product_group: knowledge +product_categories: +- wiki +performance_indicator_type: [] +value_type: number +status: active +milestone: '17.11' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/186551 +time_frame: +- 28d +- 7d +data_source: internal_events +data_category: optional +tiers: +- free +- premium +- ultimate +events: +- name: delete_wiki_page_note + unique: user.id diff --git a/config/metrics/counts_all/count_total_delete_wiki_page_note.yml b/config/metrics/counts_all/count_total_delete_wiki_page_note.yml new file mode 100644 index 00000000000..34702bae062 --- /dev/null +++ b/config/metrics/counts_all/count_total_delete_wiki_page_note.yml @@ -0,0 +1,23 @@ +--- +key_path: counts.count_total_delete_wiki_page_note +description: Count of wiki page notes deleted +product_group: knowledge +product_categories: +- wiki +performance_indicator_type: [] +value_type: number +status: active +milestone: '17.11' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/186551 +time_frame: +- 28d +- 7d +- all +data_source: internal_events +data_category: optional +tiers: +- free +- premium +- ultimate +events: +- name: delete_wiki_page_note diff --git a/db/docs/analyzer_namespace_statuses.yml b/db/docs/analyzer_namespace_statuses.yml new file mode 100644 index 00000000000..cd3ba33d3ae --- /dev/null +++ b/db/docs/analyzer_namespace_statuses.yml @@ -0,0 +1,14 @@ +--- +table_name: analyzer_namespace_statuses +classes: +- Security::AnalyzerNamespaceStatus +feature_categories: +- security_asset_inventories +description: | + Stores analyzer status counts per namespace. + This includes all descendants of this namespace, not only direct descendants. +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/185595 +milestone: '17.11' +gitlab_schema: gitlab_sec +sharding_key: + namespace_id: namespaces diff --git a/db/migrate/20250324093114_create_analyzer_namespace_statuses.rb b/db/migrate/20250324093114_create_analyzer_namespace_statuses.rb new file mode 100644 index 00000000000..bae8cb606bb --- /dev/null +++ b/db/migrate/20250324093114_create_analyzer_namespace_statuses.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +class CreateAnalyzerNamespaceStatuses < Gitlab::Database::Migration[2.2] + milestone '17.11' + + ANALYZER_TYPE_INDEX_NAME = 'index_analyzer_namespace_statuses_status' + TRAVERSAL_IDS_INDEX_NAME = 'index_analyzer_namespace_statuses_traversal_ids' + + def up + create_table :analyzer_namespace_statuses do |t| + t.timestamps_with_timezone null: false + t.bigint :namespace_id, null: false + t.column :analyzer_type, :smallint, null: false + t.bigint :success, default: 0, null: false + t.bigint :failure, default: 0, null: false + t.bigint :traversal_ids, array: true, default: [], null: false + t.index :traversal_ids, name: TRAVERSAL_IDS_INDEX_NAME + t.index [:namespace_id, :analyzer_type], unique: true, name: ANALYZER_TYPE_INDEX_NAME + end + end + + def down + drop_table :analyzer_namespace_statuses + end +end diff --git a/db/post_migrate/20250403044238_drop_index_for_p_ci_pipelines_trigger_id.rb b/db/post_migrate/20250403044238_drop_index_for_p_ci_pipelines_trigger_id.rb new file mode 100644 index 00000000000..3c49e33d60c --- /dev/null +++ b/db/post_migrate/20250403044238_drop_index_for_p_ci_pipelines_trigger_id.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +class DropIndexForPCiPipelinesTriggerId < Gitlab::Database::Migration[2.2] + include Gitlab::Database::PartitioningMigrationHelpers + include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum + + milestone '17.11' + disable_ddl_transaction! + + TABLE_NAME = :p_ci_pipelines + COLUMN_NAMES = [:trigger_id] + INDEX_NAME = :p_ci_pipelines_trigger_id_idx + + def up + return unless can_execute_on?(:ci_pipelines) + + remove_concurrent_partitioned_index_by_name(TABLE_NAME, INDEX_NAME) + end + + def down + return unless can_execute_on?(:ci_pipelines) + + add_concurrent_partitioned_index(TABLE_NAME, COLUMN_NAMES, name: INDEX_NAME) + end +end diff --git a/db/schema_migrations/20250324093114 b/db/schema_migrations/20250324093114 new file mode 100644 index 00000000000..05f244041de --- /dev/null +++ b/db/schema_migrations/20250324093114 @@ -0,0 +1 @@ +978f57f87bfe9d854e8d5cda7b41af205534c7ec3be86cc337cf2e59e08fe0e7 \ No newline at end of file diff --git a/db/schema_migrations/20250403044238 b/db/schema_migrations/20250403044238 new file mode 100644 index 00000000000..250c8410357 --- /dev/null +++ b/db/schema_migrations/20250403044238 @@ -0,0 +1 @@ +b2ab84bc66acaa4a5d726b86e92165b951356c38dc002abb3966595c1c42fa03 \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 7edcf2894d8..592dc574e3b 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -8381,6 +8381,26 @@ CREATE SEQUENCE analytics_usage_trends_measurements_id_seq ALTER SEQUENCE analytics_usage_trends_measurements_id_seq OWNED BY analytics_usage_trends_measurements.id; +CREATE TABLE analyzer_namespace_statuses ( + id bigint NOT NULL, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone NOT NULL, + namespace_id bigint NOT NULL, + analyzer_type smallint NOT NULL, + success bigint DEFAULT 0 NOT NULL, + failure bigint DEFAULT 0 NOT NULL, + traversal_ids bigint[] DEFAULT '{}'::bigint[] NOT NULL +); + +CREATE SEQUENCE analyzer_namespace_statuses_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE analyzer_namespace_statuses_id_seq OWNED BY analyzer_namespace_statuses.id; + CREATE TABLE analyzer_project_statuses ( id bigint NOT NULL, created_at timestamp with time zone NOT NULL, @@ -26512,6 +26532,8 @@ ALTER TABLE ONLY analytics_devops_adoption_snapshots ALTER COLUMN id SET DEFAULT ALTER TABLE ONLY analytics_usage_trends_measurements ALTER COLUMN id SET DEFAULT nextval('analytics_usage_trends_measurements_id_seq'::regclass); +ALTER TABLE ONLY analyzer_namespace_statuses ALTER COLUMN id SET DEFAULT nextval('analyzer_namespace_statuses_id_seq'::regclass); + ALTER TABLE ONLY analyzer_project_statuses ALTER COLUMN id SET DEFAULT nextval('analyzer_project_statuses_id_seq'::regclass); ALTER TABLE ONLY appearances ALTER COLUMN id SET DEFAULT nextval('appearances_id_seq'::regclass); @@ -28539,6 +28561,9 @@ ALTER TABLE ONLY analytics_language_trend_repository_languages ALTER TABLE ONLY analytics_usage_trends_measurements ADD CONSTRAINT analytics_usage_trends_measurements_pkey PRIMARY KEY (id); +ALTER TABLE ONLY analyzer_namespace_statuses + ADD CONSTRAINT analyzer_namespace_statuses_pkey PRIMARY KEY (id); + ALTER TABLE ONLY analyzer_project_statuses ADD CONSTRAINT analyzer_project_statuses_pkey PRIMARY KEY (id); @@ -33258,10 +33283,6 @@ CREATE INDEX index_abuse_reports_on_status_reporter_id_and_id ON abuse_reports U CREATE INDEX index_abuse_trust_scores_on_user_id_and_source_and_created_at ON abuse_trust_scores USING btree (user_id, source, created_at); -CREATE INDEX p_ci_pipelines_trigger_id_idx ON ONLY p_ci_pipelines USING btree (trigger_id); - -CREATE INDEX index_ac3541b851 ON ci_pipelines USING btree (trigger_id); - CREATE UNIQUE INDEX "index_achievements_on_namespace_id_LOWER_name" ON achievements USING btree (namespace_id, lower(name)); CREATE UNIQUE INDEX index_active_context_connections_single_active ON ai_active_context_connections USING btree (active) WHERE (active = true); @@ -33426,6 +33447,10 @@ CREATE UNIQUE INDEX index_analytics_dashboards_pointers_on_namespace_id ON analy CREATE INDEX index_analytics_dashboards_pointers_on_target_project_id ON analytics_dashboards_pointers USING btree (target_project_id); +CREATE UNIQUE INDEX index_analyzer_namespace_statuses_status ON analyzer_namespace_statuses USING btree (namespace_id, analyzer_type); + +CREATE INDEX index_analyzer_namespace_statuses_traversal_ids ON analyzer_namespace_statuses USING btree (traversal_ids); + CREATE UNIQUE INDEX index_analyzer_project_statuses_status ON analyzer_project_statuses USING btree (project_id, analyzer_type); CREATE INDEX index_analyzer_project_statuses_traversal_ids ON analyzer_project_statuses USING btree (traversal_ids); @@ -40324,8 +40349,6 @@ ALTER INDEX tmp_p_ci_builds_trigger_request_id_idx ATTACH PARTITION index_437b18 ALTER INDEX index_ci_runner_machines_on_executor_type ATTACH PARTITION index_aa3b4fe8c6; -ALTER INDEX p_ci_pipelines_trigger_id_idx ATTACH PARTITION index_ac3541b851; - ALTER INDEX p_ci_builds_metadata_build_id_idx ATTACH PARTITION index_ci_builds_metadata_on_build_id_and_has_exposed_artifacts; ALTER INDEX p_ci_builds_metadata_build_id_id_idx ATTACH PARTITION index_ci_builds_metadata_on_build_id_and_id_and_interruptible; diff --git a/doc/user/application_security/vulnerabilities/_index.md b/doc/user/application_security/vulnerabilities/_index.md index 90afbbcb294..db7425442e6 100644 --- a/doc/user/application_security/vulnerabilities/_index.md +++ b/doc/user/application_security/vulnerabilities/_index.md @@ -25,12 +25,13 @@ including: - Severity For vulnerabilities in the [Common Vulnerabilities and Exposures (CVE)](https://www.cve.org/) -catalog you can also retrieve the following by using the GraphQL API: +catalog, these details also include: -- EPSS score -- KEV status +- CVSS score +- [EPSS score](risk_assessment_data.md#epss) +- [KEV status](risk_assessment_data.md#kev) -For details on how to retrieve this additional data, see [vulnerability risk assessment data](risk_assessment_data.md). +For further details on this additional data, see [vulnerability risk assessment data](risk_assessment_data.md). If the scanner determined the vulnerability to be a false positive, an alert message is included at the top of the vulnerability's page. diff --git a/doc/user/application_security/vulnerabilities/risk_assessment_data.md b/doc/user/application_security/vulnerabilities/risk_assessment_data.md index 6590a56e01c..3f5016fbb1a 100644 --- a/doc/user/application_security/vulnerabilities/risk_assessment_data.md +++ b/doc/user/application_security/vulnerabilities/risk_assessment_data.md @@ -9,7 +9,8 @@ Use vulnerability risk data to help assess the potential impact to your environm - Severity: Each vulnerability is assigned a standardized GitLab severity value. -- For vulnerabilities in the [Common Vulnerabilities and Exposures (CVE)](https://www.cve.org/) catalog, the following data can be retrieved by using a GraphQL query: +- For vulnerabilities in the [Common Vulnerabilities and Exposures (CVE)](https://www.cve.org/) catalog, +the following data can be retrieved through the [vulnerability details](_index.md) page or by using a GraphQL query: - Likelihood of exploitation: [Exploit Prediction Scoring System (EPSS)](https://www.first.org/epss) score. - Existence of known exploits: [Known Exploited Vulnerabilities (KEV)](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) status. diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 4fd5de67e1b..a9917a415b5 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -1615,6 +1615,9 @@ msgstr "" msgid "%{user} user’s menu" msgstr "" +msgid "%{value} /day" +msgstr "" + msgid "%{value} is a reserved name" msgstr "" diff --git a/package.json b/package.json index 4ba7dec3648..b3deb344afb 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "@gitlab/fonts": "^1.3.0", "@gitlab/query-language-rust": "0.5.2", "@gitlab/svgs": "3.126.0", - "@gitlab/ui": "112.0.0", + "@gitlab/ui": "112.1.2", "@gitlab/vue-router-vue3": "npm:vue-router@4.5.0", "@gitlab/vuex-vue3": "npm:vuex@4.1.0", "@gitlab/web-ide": "^0.0.1-dev-20250401183248", diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb index af184176304..6d6df1e97f4 100644 --- a/spec/db/schema_spec.rb +++ b/spec/db/schema_spec.rb @@ -268,7 +268,7 @@ RSpec.describe 'Database schema', { approval_merge_request_rules: 17, ci_builds: 27, - ci_pipelines: 25, # TODO: will change it back to 24 when duplicated index is removed + ci_pipelines: 24, ci_runners: 16, ci_runners_archived: 17, deployments: 18, @@ -281,7 +281,7 @@ RSpec.describe 'Database schema', merge_requests: 33, namespaces: 26, p_ci_builds: 27, - p_ci_pipelines: 25, # TODO: will change it back to 24 when duplicated index is removed + p_ci_pipelines: 24, packages_package_files: 16, packages_packages: 27, project_type_ci_runners: 17, diff --git a/spec/services/notes/destroy_service_spec.rb b/spec/services/notes/destroy_service_spec.rb index d17a6a331a9..9860abd6696 100644 --- a/spec/services/notes/destroy_service_spec.rb +++ b/spec/services/notes/destroy_service_spec.rb @@ -106,5 +106,18 @@ RSpec.describe Notes::DestroyService, feature_category: :team_planning do described_class.new(project, user).execute(note) end + + context 'wiki page note' do + let(:wiki_page_meta) { create(:wiki_page_meta, :for_wiki_page, container: project) } + let(:note) { create(:note, project: project, noteable: wiki_page_meta, author: user, note: "Old note") } + + it_behaves_like 'internal event tracking' do + let(:event) { 'delete_wiki_page_note' } + let(:category) { described_class.name } + let(:namespace) { nil } + + subject(:track_event) { described_class.new(project, user).execute(note) } + end + end end end diff --git a/spec/support/helpers/database/duplicate_indexes.yml b/spec/support/helpers/database/duplicate_indexes.yml index 5746fcea38c..277584a4c55 100644 --- a/spec/support/helpers/database/duplicate_indexes.yml +++ b/spec/support/helpers/database/duplicate_indexes.yml @@ -2,13 +2,6 @@ ci_job_artifact_states: index_on_job_artifact_id_partition_id_verification_state: - index_job_artifact_states_on_verification_state -# TODO: will remove these ci_pipelines related rows when the duplicated index is removed -ci_pipelines: - index_d8ae6ea3f3: - - index_ac3541b851 -p_ci_pipelines: - p_ci_pipelines_trigger_id_id_desc_idx: - - p_ci_pipelines_trigger_id_idx dast_site_tokens: index_dast_site_token_on_project_id_and_url: - index_dast_site_tokens_on_project_id diff --git a/yarn.lock b/yarn.lock index 0d6c725d357..a2731969bc8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1441,10 +1441,10 @@ resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-3.126.0.tgz#1c0bb95c11de808b78afd05dc95aca258c3b39f0" integrity sha512-7X8uzitNn7NDcVy+FVCw8npMNEUpLGHTO5Z+BJZqVILj/FD+0WveYdPxAEVa9hXYQn5qXWM0ZAknzB9LM6Id8w== -"@gitlab/ui@112.0.0": - version "112.0.0" - resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-112.0.0.tgz#792477acba46f86e7e8ddd09762024bf90bdc9a8" - integrity sha512-diXB3gRIjKKAbfOpE5AznMD4e+ToZtRfA51+ITmvvN+ULMuUiyUxVc/LO2m1hr8a4tMNDyEggF+19GIwD0VJxA== +"@gitlab/ui@112.1.2": + version "112.1.2" + resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-112.1.2.tgz#8343de1b35473a64edfb38f5e2677c5e77dad7a0" + integrity sha512-1vaLWo89/vr904H8kv3yC+tXIfxuQV0VsE2RkI5z2KHhAv/NXvwDL2EYbuoQ8G7+lPIQer+Kk5nE369w09Q2wQ== dependencies: "@floating-ui/dom" "1.4.3" echarts "^5.3.2"