Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
a74ca2457e
commit
0c1344a7c1
|
|
@ -1929,6 +1929,12 @@
|
|||
changes: ["vendor/gems/bundler-checksum/**/*"]
|
||||
- <<: *if-merge-request-labels-run-all-rspec
|
||||
|
||||
.vendor:rules:cloud_profiler_agent:
|
||||
rules:
|
||||
- <<: *if-merge-request
|
||||
changes: ["vendor/gems/cloud_profiler_agent/**/*"]
|
||||
- <<: *if-merge-request-labels-run-all-rspec
|
||||
|
||||
##################
|
||||
# Releases rules #
|
||||
##################
|
||||
|
|
|
|||
|
|
@ -93,3 +93,11 @@ vendor gitlab_active_record:
|
|||
trigger:
|
||||
include: vendor/gems/gitlab_active_record/.gitlab-ci.yml
|
||||
strategy: depend
|
||||
|
||||
vendor cloud_profiler_agent:
|
||||
extends:
|
||||
- .vendor:rules:cloud_profiler_agent
|
||||
needs: []
|
||||
trigger:
|
||||
include: vendor/gems/cloud_profiler_agent/.gitlab-ci.yml
|
||||
strategy: depend
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
---
|
||||
RSpec/MissingFeatureCategory:
|
||||
Exclude:
|
||||
- 'ee/spec/components/billing/plan_component_spec.rb'
|
||||
- 'ee/spec/components/namespaces/free_user_cap/enforcement_alert_component_spec.rb'
|
||||
- 'ee/spec/components/namespaces/free_user_cap/enforcement_at_limit_alert_component_spec.rb'
|
||||
- 'ee/spec/components/namespaces/free_user_cap/non_owner_alert_component_spec.rb'
|
||||
|
|
@ -205,7 +204,6 @@ RSpec/MissingFeatureCategory:
|
|||
- 'ee/spec/graphql/graphql_triggers_spec.rb'
|
||||
- 'ee/spec/graphql/mutations/app_sec/fuzzing/api/ci_configuration/create_spec.rb'
|
||||
- 'ee/spec/graphql/mutations/app_sec/fuzzing/coverage/corpus/create_spec.rb'
|
||||
- 'ee/spec/graphql/mutations/audit_events/streaming/event_type_filters/destroy_spec.rb'
|
||||
- 'ee/spec/graphql/mutations/audit_events/streaming/headers/create_spec.rb'
|
||||
- 'ee/spec/graphql/mutations/audit_events/streaming/headers/destroy_spec.rb'
|
||||
- 'ee/spec/graphql/mutations/boards/epic_boards/create_spec.rb'
|
||||
|
|
@ -490,7 +488,6 @@ RSpec/MissingFeatureCategory:
|
|||
- 'ee/spec/graphql/types/vulnerability_details/list_type_spec.rb'
|
||||
- 'ee/spec/graphql/types/vulnerability_details/markdown_type_spec.rb'
|
||||
- 'ee/spec/graphql/types/vulnerability_details/module_location_type_spec.rb'
|
||||
- 'ee/spec/graphql/types/vulnerability_details/table_type_spec.rb'
|
||||
- 'ee/spec/graphql/types/vulnerability_details/text_type_spec.rb'
|
||||
- 'ee/spec/graphql/types/vulnerability_details/url_type_spec.rb'
|
||||
- 'ee/spec/graphql/types/vulnerability_evidence_source_type_spec.rb'
|
||||
|
|
@ -740,7 +737,6 @@ RSpec/MissingFeatureCategory:
|
|||
- 'ee/spec/lib/ee/gitlab/background_migration/purge_stale_security_scans_spec.rb'
|
||||
- 'ee/spec/lib/ee/gitlab/background_migration/recalculate_vulnerability_finding_signatures_for_findings_spec.rb'
|
||||
- 'ee/spec/lib/ee/gitlab/background_migration/update_vulnerability_occurrences_location_spec.rb'
|
||||
- 'ee/spec/lib/ee/gitlab/checks/push_rule_check_spec.rb'
|
||||
- 'ee/spec/lib/ee/gitlab/checks/push_rules/branch_check_spec.rb'
|
||||
- 'ee/spec/lib/ee/gitlab/checks/push_rules/commit_check_spec.rb'
|
||||
- 'ee/spec/lib/ee/gitlab/checks/push_rules/file_size_check_spec.rb'
|
||||
|
|
@ -824,7 +820,6 @@ RSpec/MissingFeatureCategory:
|
|||
- 'ee/spec/lib/elastic/latest/config_spec.rb'
|
||||
- 'ee/spec/lib/elastic/latest/custom_language_analyzers_spec.rb'
|
||||
- 'ee/spec/lib/elastic/latest/git_instance_proxy_spec.rb'
|
||||
- 'ee/spec/lib/elastic/latest/issue_class_proxy_spec.rb'
|
||||
- 'ee/spec/lib/elastic/latest/issue_config_spec.rb'
|
||||
- 'ee/spec/lib/elastic/latest/merge_request_config_spec.rb'
|
||||
- 'ee/spec/lib/elastic/latest/note_config_spec.rb'
|
||||
|
|
@ -1222,7 +1217,6 @@ RSpec/MissingFeatureCategory:
|
|||
- 'ee/spec/models/concerns/ee/participable_spec.rb'
|
||||
- 'ee/spec/models/concerns/ee/project_security_scanners_information_spec.rb'
|
||||
- 'ee/spec/models/concerns/ee/weight_eventable_spec.rb'
|
||||
- 'ee/spec/models/concerns/elastic/application_versioned_search_spec.rb'
|
||||
- 'ee/spec/models/concerns/elastic/merge_request_spec.rb'
|
||||
- 'ee/spec/models/concerns/elastic/milestone_spec.rb'
|
||||
- 'ee/spec/models/concerns/elastic/project_wiki_spec.rb'
|
||||
|
|
@ -1688,7 +1682,6 @@ RSpec/MissingFeatureCategory:
|
|||
- 'ee/spec/services/audit_events/release_updated_audit_event_service_spec.rb'
|
||||
- 'ee/spec/services/audit_events/runner_custom_audit_event_service_spec.rb'
|
||||
- 'ee/spec/services/audit_events/runners_token_audit_event_service_spec.rb'
|
||||
- 'ee/spec/services/audit_events/streaming/event_type_filters/destroy_service_spec.rb'
|
||||
- 'ee/spec/services/audit_events/streaming/headers/base_spec.rb'
|
||||
- 'ee/spec/services/audit_events/streaming/headers/create_service_spec.rb'
|
||||
- 'ee/spec/services/audit_events/streaming/headers/destroy_service_spec.rb'
|
||||
|
|
@ -1722,22 +1715,11 @@ RSpec/MissingFeatureCategory:
|
|||
- 'ee/spec/services/ee/auto_merge_service_spec.rb'
|
||||
- 'ee/spec/services/ee/event_create_service_spec.rb'
|
||||
- 'ee/spec/services/ee/merge_request_metrics_service_spec.rb'
|
||||
- 'ee/spec/services/ee/merge_requests/base_service_spec.rb'
|
||||
- 'ee/spec/services/ee/merge_requests/create_approval_event_service_spec.rb'
|
||||
- 'ee/spec/services/ee/merge_requests/create_from_vulnerability_data_service_spec.rb'
|
||||
- 'ee/spec/services/ee/merge_requests/create_service_spec.rb'
|
||||
- 'ee/spec/services/ee/merge_requests/execute_approval_hooks_service_spec.rb'
|
||||
- 'ee/spec/services/ee/merge_requests/handle_assignees_change_service_spec.rb'
|
||||
- 'ee/spec/services/ee/merge_requests/post_merge_service_spec.rb'
|
||||
- 'ee/spec/services/ee/merge_requests/update_assignees_service_spec.rb'
|
||||
- 'ee/spec/services/ee/merge_requests/update_reviewers_service_spec.rb'
|
||||
- 'ee/spec/services/ee/namespace_settings/update_service_spec.rb'
|
||||
- 'ee/spec/services/ee/notes/destroy_service_spec.rb'
|
||||
- 'ee/spec/services/ee/notes/post_process_service_spec.rb'
|
||||
- 'ee/spec/services/ee/notes/quick_actions_service_spec.rb'
|
||||
- 'ee/spec/services/ee/notes/update_service_spec.rb'
|
||||
- 'ee/spec/services/ee/null_notification_service_spec.rb'
|
||||
- 'ee/spec/services/ee/personal_access_tokens/revoke_service_spec.rb'
|
||||
- 'ee/spec/services/ee/post_receive_service_spec.rb'
|
||||
- 'ee/spec/services/ee/preview_markdown_service_spec.rb'
|
||||
- 'ee/spec/services/ee/projects/autocomplete_service_spec.rb'
|
||||
|
|
@ -1767,44 +1749,6 @@ RSpec/MissingFeatureCategory:
|
|||
- 'ee/spec/services/ee/vulnerability_feedback_module/update_service_spec.rb'
|
||||
- 'ee/spec/services/external_status_checks/create_service_spec.rb'
|
||||
- 'ee/spec/services/ldap_group_reset_service_spec.rb'
|
||||
- 'ee/spec/services/merge_request_approval_settings/update_service_spec.rb'
|
||||
- 'ee/spec/services/merge_requests/approval_service_spec.rb'
|
||||
- 'ee/spec/services/merge_requests/build_service_spec.rb'
|
||||
- 'ee/spec/services/merge_requests/merge_service_spec.rb'
|
||||
- 'ee/spec/services/merge_requests/merge_to_ref_service_spec.rb'
|
||||
- 'ee/spec/services/merge_requests/mergeability/check_approved_service_spec.rb'
|
||||
- 'ee/spec/services/merge_requests/mergeability/check_blocked_by_other_mrs_service_spec.rb'
|
||||
- 'ee/spec/services/merge_requests/mergeability/check_denied_policies_service_spec.rb'
|
||||
- 'ee/spec/services/merge_requests/mergeability/check_external_status_checks_passed_service_spec.rb'
|
||||
- 'ee/spec/services/merge_requests/push_options_handler_service_spec.rb'
|
||||
- 'ee/spec/services/merge_requests/reload_merge_head_diff_service_spec.rb'
|
||||
- 'ee/spec/services/merge_requests/remove_approval_service_spec.rb'
|
||||
- 'ee/spec/services/merge_requests/stream_approval_audit_event_service_spec.rb'
|
||||
- 'ee/spec/services/merge_requests/sync_code_owner_approval_rules_spec.rb'
|
||||
- 'ee/spec/services/merge_requests/sync_report_approver_approval_rules_spec.rb'
|
||||
- 'ee/spec/services/merge_requests/update_blocks_service_spec.rb'
|
||||
- 'ee/spec/services/merge_trains/check_status_service_spec.rb'
|
||||
- 'ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb'
|
||||
- 'ee/spec/services/merge_trains/refresh_service_spec.rb'
|
||||
- 'ee/spec/services/milestones/destroy_service_spec.rb'
|
||||
- 'ee/spec/services/milestones/promote_service_spec.rb'
|
||||
- 'ee/spec/services/milestones/update_service_spec.rb'
|
||||
- 'ee/spec/services/namespaces/in_product_marketing_emails_service_spec.rb'
|
||||
- 'ee/spec/services/namespaces/storage/email_notification_service_spec.rb'
|
||||
- 'ee/spec/services/path_locks/lock_service_spec.rb'
|
||||
- 'ee/spec/services/path_locks/unlock_service_spec.rb'
|
||||
- 'ee/spec/services/personal_access_tokens/create_service_audit_log_spec.rb'
|
||||
- 'ee/spec/services/personal_access_tokens/groups/update_lifetime_service_spec.rb'
|
||||
- 'ee/spec/services/personal_access_tokens/instance/update_lifetime_service_spec.rb'
|
||||
- 'ee/spec/services/personal_access_tokens/revoke_invalid_tokens_spec.rb'
|
||||
- 'ee/spec/services/personal_access_tokens/revoke_service_audit_log_spec.rb'
|
||||
- 'ee/spec/services/personal_access_tokens/rotation_verifier_service_spec.rb'
|
||||
- 'ee/spec/services/phone_verification/telesign_client/base_service_spec.rb'
|
||||
- 'ee/spec/services/phone_verification/telesign_client/risk_score_service_spec.rb'
|
||||
- 'ee/spec/services/phone_verification/telesign_client/send_verification_code_service_spec.rb'
|
||||
- 'ee/spec/services/phone_verification/telesign_client/verify_code_service_spec.rb'
|
||||
- 'ee/spec/services/phone_verification/users/send_verification_code_service_spec.rb'
|
||||
- 'ee/spec/services/product_analytics/initialize_stack_service_spec.rb'
|
||||
- 'ee/spec/services/projects/after_rename_service_spec.rb'
|
||||
- 'ee/spec/services/projects/alerting/notify_service_spec.rb'
|
||||
- 'ee/spec/services/projects/cleanup_service_spec.rb'
|
||||
|
|
@ -1961,7 +1905,6 @@ RSpec/MissingFeatureCategory:
|
|||
- 'ee/spec/views/devise/sessions/new.html.haml_spec.rb'
|
||||
- 'ee/spec/views/groups/_compliance_frameworks.html.haml_spec.rb'
|
||||
- 'ee/spec/views/groups/analytics/dashboards/index.html.haml_spec.rb'
|
||||
- 'ee/spec/views/groups/billings/index.html.haml_spec.rb'
|
||||
- 'ee/spec/views/groups/compliance_frameworks/edit.html.haml_spec.rb'
|
||||
- 'ee/spec/views/groups/compliance_frameworks/new.html.haml_spec.rb'
|
||||
- 'ee/spec/views/groups/edit.html.haml_spec.rb'
|
||||
|
|
@ -2956,10 +2899,8 @@ RSpec/MissingFeatureCategory:
|
|||
- 'spec/graphql/types/dependency_proxy/image_ttl_group_policy_type_spec.rb'
|
||||
- 'spec/graphql/types/dependency_proxy/manifest_type_spec.rb'
|
||||
- 'spec/graphql/types/deployment_tier_enum_spec.rb'
|
||||
- 'spec/graphql/types/design_management/design_at_version_type_spec.rb'
|
||||
- 'spec/graphql/types/design_management/design_collection_copy_state_enum_spec.rb'
|
||||
- 'spec/graphql/types/design_management/design_collection_type_spec.rb'
|
||||
- 'spec/graphql/types/design_management/design_type_spec.rb'
|
||||
- 'spec/graphql/types/design_management/design_version_event_enum_spec.rb'
|
||||
- 'spec/graphql/types/design_management/version_type_spec.rb'
|
||||
- 'spec/graphql/types/design_management_type_spec.rb'
|
||||
|
|
@ -3219,7 +3160,6 @@ RSpec/MissingFeatureCategory:
|
|||
- 'spec/helpers/numbers_helper_spec.rb'
|
||||
- 'spec/helpers/one_trust_helper_spec.rb'
|
||||
- 'spec/helpers/operations_helper_spec.rb'
|
||||
- 'spec/helpers/packages_helper_spec.rb'
|
||||
- 'spec/helpers/page_layout_helper_spec.rb'
|
||||
- 'spec/helpers/pagination_helper_spec.rb'
|
||||
- 'spec/helpers/preferences_helper_spec.rb'
|
||||
|
|
@ -3750,9 +3690,7 @@ RSpec/MissingFeatureCategory:
|
|||
- 'spec/lib/gitlab/chat_name_token_spec.rb'
|
||||
- 'spec/lib/gitlab/chat_spec.rb'
|
||||
- 'spec/lib/gitlab/checks/branch_check_spec.rb'
|
||||
- 'spec/lib/gitlab/checks/changes_access_spec.rb'
|
||||
- 'spec/lib/gitlab/checks/container_moved_spec.rb'
|
||||
- 'spec/lib/gitlab/checks/diff_check_spec.rb'
|
||||
- 'spec/lib/gitlab/checks/force_push_spec.rb'
|
||||
- 'spec/lib/gitlab/checks/lfs_check_spec.rb'
|
||||
- 'spec/lib/gitlab/checks/lfs_integrity_spec.rb'
|
||||
|
|
@ -5623,7 +5561,6 @@ RSpec/MissingFeatureCategory:
|
|||
- 'spec/models/error_tracking/client_key_spec.rb'
|
||||
- 'spec/models/error_tracking/error_event_spec.rb'
|
||||
- 'spec/models/error_tracking/error_spec.rb'
|
||||
- 'spec/models/error_tracking/project_error_tracking_setting_spec.rb'
|
||||
- 'spec/models/event_collection_spec.rb'
|
||||
- 'spec/models/exported_protected_branch_spec.rb'
|
||||
- 'spec/models/external_issue_spec.rb'
|
||||
|
|
@ -5980,7 +5917,6 @@ RSpec/MissingFeatureCategory:
|
|||
- 'spec/policies/deploy_key_policy_spec.rb'
|
||||
- 'spec/policies/deploy_keys_project_policy_spec.rb'
|
||||
- 'spec/policies/deploy_token_policy_spec.rb'
|
||||
- 'spec/policies/design_management/design_policy_spec.rb'
|
||||
- 'spec/policies/environment_policy_spec.rb'
|
||||
- 'spec/policies/group_deploy_key_policy_spec.rb'
|
||||
- 'spec/policies/group_deploy_keys_group_policy_spec.rb'
|
||||
|
|
@ -6457,156 +6393,10 @@ RSpec/MissingFeatureCategory:
|
|||
- 'spec/services/gravatar_service_spec.rb'
|
||||
- 'spec/services/import_export_clean_up_service_spec.rb'
|
||||
- 'spec/services/markdown_content_rewriter_service_spec.rb'
|
||||
- 'spec/services/merge_requests/add_context_service_spec.rb'
|
||||
- 'spec/services/merge_requests/add_spent_time_service_spec.rb'
|
||||
- 'spec/services/merge_requests/add_todo_when_build_fails_service_spec.rb'
|
||||
- 'spec/services/merge_requests/approval_service_spec.rb'
|
||||
- 'spec/services/merge_requests/assign_issues_service_spec.rb'
|
||||
- 'spec/services/merge_requests/cleanup_refs_service_spec.rb'
|
||||
- 'spec/services/merge_requests/conflicts/list_service_spec.rb'
|
||||
- 'spec/services/merge_requests/conflicts/resolve_service_spec.rb'
|
||||
- 'spec/services/merge_requests/create_approval_event_service_spec.rb'
|
||||
- 'spec/services/merge_requests/create_pipeline_service_spec.rb'
|
||||
- 'spec/services/merge_requests/delete_non_latest_diffs_service_spec.rb'
|
||||
- 'spec/services/merge_requests/execute_approval_hooks_service_spec.rb'
|
||||
- 'spec/services/merge_requests/ff_merge_service_spec.rb'
|
||||
- 'spec/services/merge_requests/get_urls_service_spec.rb'
|
||||
- 'spec/services/merge_requests/handle_assignees_change_service_spec.rb'
|
||||
- 'spec/services/merge_requests/mark_reviewer_reviewed_service_spec.rb'
|
||||
- 'spec/services/merge_requests/merge_orchestration_service_spec.rb'
|
||||
- 'spec/services/merge_requests/merge_service_spec.rb'
|
||||
- 'spec/services/merge_requests/merge_to_ref_service_spec.rb'
|
||||
- 'spec/services/merge_requests/mergeability/check_base_service_spec.rb'
|
||||
- 'spec/services/merge_requests/mergeability/check_broken_status_service_spec.rb'
|
||||
- 'spec/services/merge_requests/mergeability/check_ci_status_service_spec.rb'
|
||||
- 'spec/services/merge_requests/mergeability/check_discussions_status_service_spec.rb'
|
||||
- 'spec/services/merge_requests/mergeability/check_draft_status_service_spec.rb'
|
||||
- 'spec/services/merge_requests/mergeability/check_open_status_service_spec.rb'
|
||||
- 'spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb'
|
||||
- 'spec/services/merge_requests/mergeability/logger_spec.rb'
|
||||
- 'spec/services/merge_requests/mergeability/run_checks_service_spec.rb'
|
||||
- 'spec/services/merge_requests/mergeability_check_service_spec.rb'
|
||||
- 'spec/services/merge_requests/migrate_external_diffs_service_spec.rb'
|
||||
- 'spec/services/merge_requests/post_merge_service_spec.rb'
|
||||
- 'spec/services/merge_requests/push_options_handler_service_spec.rb'
|
||||
- 'spec/services/merge_requests/reload_diffs_service_spec.rb'
|
||||
- 'spec/services/merge_requests/reload_merge_head_diff_service_spec.rb'
|
||||
- 'spec/services/merge_requests/reopen_service_spec.rb'
|
||||
- 'spec/services/merge_requests/request_review_service_spec.rb'
|
||||
- 'spec/services/merge_requests/resolve_todos_service_spec.rb'
|
||||
- 'spec/services/merge_requests/resolved_discussion_notification_service_spec.rb'
|
||||
- 'spec/services/merge_requests/squash_service_spec.rb'
|
||||
- 'spec/services/merge_requests/update_assignees_service_spec.rb'
|
||||
- 'spec/services/merge_requests/update_reviewers_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/annotations/create_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/annotations/delete_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/clone_dashboard_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/cluster_dashboard_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/cluster_metrics_embed_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/custom_dashboard_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/default_embed_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/dynamic_embed_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/grafana_metric_embed_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/panel_preview_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/pod_dashboard_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/self_monitoring_dashboard_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/system_dashboard_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/transient_embed_service_spec.rb'
|
||||
- 'spec/services/metrics/dashboard/update_dashboard_service_spec.rb'
|
||||
- 'spec/services/metrics/sample_metrics_service_spec.rb'
|
||||
- 'spec/services/metrics/users_starred_dashboards/create_service_spec.rb'
|
||||
- 'spec/services/metrics/users_starred_dashboards/delete_service_spec.rb'
|
||||
- 'spec/services/milestones/close_service_spec.rb'
|
||||
- 'spec/services/milestones/closed_issues_count_service_spec.rb'
|
||||
- 'spec/services/milestones/create_service_spec.rb'
|
||||
- 'spec/services/milestones/destroy_service_spec.rb'
|
||||
- 'spec/services/milestones/find_or_create_service_spec.rb'
|
||||
- 'spec/services/milestones/issues_count_service_spec.rb'
|
||||
- 'spec/services/milestones/merge_requests_count_service_spec.rb'
|
||||
- 'spec/services/milestones/promote_service_spec.rb'
|
||||
- 'spec/services/milestones/transfer_service_spec.rb'
|
||||
- 'spec/services/milestones/update_service_spec.rb'
|
||||
- 'spec/services/ml/experiment_tracking/candidate_repository_spec.rb'
|
||||
- 'spec/services/ml/experiment_tracking/experiment_repository_spec.rb'
|
||||
- 'spec/services/namespace_settings/update_service_spec.rb'
|
||||
- 'spec/services/namespaces/in_product_marketing_emails_service_spec.rb'
|
||||
- 'spec/services/namespaces/package_settings/update_service_spec.rb'
|
||||
- 'spec/services/namespaces/statistics_refresher_service_spec.rb'
|
||||
- 'spec/services/note_summary_spec.rb'
|
||||
- 'spec/services/notes/build_service_spec.rb'
|
||||
- 'spec/services/notes/copy_service_spec.rb'
|
||||
- 'spec/services/notes/destroy_service_spec.rb'
|
||||
- 'spec/services/notes/post_process_service_spec.rb'
|
||||
- 'spec/services/notes/quick_actions_service_spec.rb'
|
||||
- 'spec/services/notes/render_service_spec.rb'
|
||||
- 'spec/services/notes/resolve_service_spec.rb'
|
||||
- 'spec/services/notes/update_service_spec.rb'
|
||||
- 'spec/services/notification_recipients/build_service_spec.rb'
|
||||
- 'spec/services/notification_recipients/builder/default_spec.rb'
|
||||
- 'spec/services/notification_recipients/builder/new_note_spec.rb'
|
||||
- 'spec/services/onboarding/progress_service_spec.rb'
|
||||
- 'spec/services/packages/cleanup/execute_policy_service_spec.rb'
|
||||
- 'spec/services/packages/cleanup/update_policy_service_spec.rb'
|
||||
- 'spec/services/packages/composer/composer_json_service_spec.rb'
|
||||
- 'spec/services/packages/composer/create_package_service_spec.rb'
|
||||
- 'spec/services/packages/composer/version_parser_service_spec.rb'
|
||||
- 'spec/services/packages/conan/create_package_file_service_spec.rb'
|
||||
- 'spec/services/packages/conan/create_package_service_spec.rb'
|
||||
- 'spec/services/packages/create_dependency_service_spec.rb'
|
||||
- 'spec/services/packages/create_event_service_spec.rb'
|
||||
- 'spec/services/packages/create_package_file_service_spec.rb'
|
||||
- 'spec/services/packages/create_temporary_package_service_spec.rb'
|
||||
- 'spec/services/packages/generic/create_package_file_service_spec.rb'
|
||||
- 'spec/services/packages/generic/find_or_create_package_service_spec.rb'
|
||||
- 'spec/services/packages/go/create_package_service_spec.rb'
|
||||
- 'spec/services/packages/go/sync_packages_service_spec.rb'
|
||||
- 'spec/services/packages/helm/extract_file_metadata_service_spec.rb'
|
||||
- 'spec/services/packages/helm/process_file_service_spec.rb'
|
||||
- 'spec/services/packages/mark_package_files_for_destruction_service_spec.rb'
|
||||
- 'spec/services/packages/mark_package_for_destruction_service_spec.rb'
|
||||
- 'spec/services/packages/mark_packages_for_destruction_service_spec.rb'
|
||||
- 'spec/services/packages/maven/create_package_service_spec.rb'
|
||||
- 'spec/services/packages/maven/find_or_create_package_service_spec.rb'
|
||||
- 'spec/services/packages/maven/metadata/append_package_file_service_spec.rb'
|
||||
- 'spec/services/packages/maven/metadata/create_plugins_xml_service_spec.rb'
|
||||
- 'spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb'
|
||||
- 'spec/services/packages/maven/metadata/sync_service_spec.rb'
|
||||
- 'spec/services/packages/npm/create_package_service_spec.rb'
|
||||
- 'spec/services/packages/npm/create_tag_service_spec.rb'
|
||||
- 'spec/services/packages/nuget/create_dependency_service_spec.rb'
|
||||
- 'spec/services/packages/nuget/metadata_extraction_service_spec.rb'
|
||||
- 'spec/services/packages/nuget/search_service_spec.rb'
|
||||
- 'spec/services/packages/nuget/sync_metadatum_service_spec.rb'
|
||||
- 'spec/services/packages/nuget/update_package_from_metadata_service_spec.rb'
|
||||
- 'spec/services/packages/pypi/create_package_service_spec.rb'
|
||||
- 'spec/services/packages/remove_tag_service_spec.rb'
|
||||
- 'spec/services/packages/rpm/parse_package_service_spec.rb'
|
||||
- 'spec/services/packages/rpm/repository_metadata/build_filelist_xml_service_spec.rb'
|
||||
- 'spec/services/packages/rpm/repository_metadata/build_other_xml_service_spec.rb'
|
||||
- 'spec/services/packages/rpm/repository_metadata/build_primary_xml_service_spec.rb'
|
||||
- 'spec/services/packages/rpm/repository_metadata/build_repomd_xml_service_spec.rb'
|
||||
- 'spec/services/packages/rpm/repository_metadata/update_xml_service_spec.rb'
|
||||
- 'spec/services/packages/rubygems/create_dependencies_service_spec.rb'
|
||||
- 'spec/services/packages/rubygems/create_gemspec_service_spec.rb'
|
||||
- 'spec/services/packages/rubygems/dependency_resolver_service_spec.rb'
|
||||
- 'spec/services/packages/rubygems/metadata_extraction_service_spec.rb'
|
||||
- 'spec/services/packages/rubygems/process_gem_service_spec.rb'
|
||||
- 'spec/services/packages/terraform_module/create_package_service_spec.rb'
|
||||
- 'spec/services/packages/update_package_file_service_spec.rb'
|
||||
- 'spec/services/packages/update_tags_service_spec.rb'
|
||||
- 'spec/services/pages/delete_service_spec.rb'
|
||||
- 'spec/services/pages/migrate_legacy_storage_to_deployment_service_spec.rb'
|
||||
- 'spec/services/pages/zip_directory_service_spec.rb'
|
||||
- 'spec/services/pages_domains/create_acme_order_service_spec.rb'
|
||||
- 'spec/services/pages_domains/obtain_lets_encrypt_certificate_service_spec.rb'
|
||||
- 'spec/services/personal_access_tokens/last_used_service_spec.rb'
|
||||
- 'spec/services/personal_access_tokens/revoke_service_spec.rb'
|
||||
- 'spec/services/post_receive_service_spec.rb'
|
||||
- 'spec/services/preview_markdown_service_spec.rb'
|
||||
- 'spec/services/product_analytics/build_activity_graph_service_spec.rb'
|
||||
- 'spec/services/product_analytics/build_graph_service_spec.rb'
|
||||
- 'spec/services/projects/after_rename_service_spec.rb'
|
||||
- 'spec/services/projects/alerting/notify_service_spec.rb'
|
||||
- 'spec/services/projects/all_issues_count_service_spec.rb'
|
||||
|
|
@ -7263,7 +7053,6 @@ RSpec/MissingFeatureCategory:
|
|||
- 'spec/workers/gitlab/github_import/stage/import_pull_requests_merged_by_worker_spec.rb'
|
||||
- 'spec/workers/gitlab/github_import/stage/import_pull_requests_review_requests_worker_spec.rb'
|
||||
- 'spec/workers/gitlab/github_import/stage/import_pull_requests_reviews_worker_spec.rb'
|
||||
- 'spec/workers/gitlab/github_import/stage/import_pull_requests_worker_spec.rb'
|
||||
- 'spec/workers/gitlab/github_import/stage/import_repository_worker_spec.rb'
|
||||
- 'spec/workers/gitlab/import/stuck_import_job_spec.rb'
|
||||
- 'spec/workers/gitlab/import/stuck_project_import_jobs_worker_spec.rb'
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
298f8eccf2fcb88280be3ea6ecee81842c1f77d4
|
||||
affdc645175554504efdf19daad28900b5b43e87
|
||||
|
|
|
|||
3
Gemfile
3
Gemfile
|
|
@ -358,6 +358,9 @@ gem 'batch-loader', '~> 2.0.1'
|
|||
# Perf bar
|
||||
gem 'peek', '~> 1.1'
|
||||
|
||||
# Google Cloud Profiler support
|
||||
gem 'cloud_profiler_agent', '~> 0.0.0', path: 'vendor/gems/cloud_profiler_agent', require: false
|
||||
|
||||
# Snowplow events tracking
|
||||
gem 'snowplow-tracker', '~> 0.8.0'
|
||||
|
||||
|
|
|
|||
|
|
@ -194,6 +194,7 @@
|
|||
{"name":"fugit","version":"1.8.1","platform":"ruby","checksum":"18ffb26813869610f71bb0b7d568c3624d2b3025aeebb6600a18df0c77a6a2b2"},
|
||||
{"name":"fuubar","version":"2.2.0","platform":"ruby","checksum":"9b0263c4074f39c68b37f1e4e69a7d3cfc7523c41bea43601235daa723179b4a"},
|
||||
{"name":"fuzzyurl","version":"0.9.0","platform":"ruby","checksum":"542efa80f2bcaadbdc402c2f0b572f2e335a1d53e375aecad68bbb3d86860c0f"},
|
||||
{"name":"gapic-common","version":"0.18.0","platform":"ruby","checksum":"6fd55a538ce2d63026fa05f379b1aec00788cc060f76903739516ab1ca1496ab"},
|
||||
{"name":"gemoji","version":"3.0.1","platform":"ruby","checksum":"80553f2f4932a7a95fb1b3c7c63f7dd937e7c8c610164bbdea28fd06eba5f36d"},
|
||||
{"name":"get_process_mem","version":"0.2.7","platform":"ruby","checksum":"4afd3c3641dd6a817c09806c7d6d509d8a9984512ac38dea8b917426bbf77eba"},
|
||||
{"name":"gettext","version":"3.3.6","platform":"ruby","checksum":"ee6bbd1b2f833ee52d7797fa68acbfecc4726aec6b6280fd7eab92aa0190b413"},
|
||||
|
|
@ -234,6 +235,7 @@
|
|||
{"name":"google-cloud-core","version":"1.6.0","platform":"ruby","checksum":"ea1744cd5a3085d3072de3fab9106afc769cd198609ebb5c6eeb5f13da46b72a"},
|
||||
{"name":"google-cloud-env","version":"1.6.0","platform":"ruby","checksum":"6179acb946975892c7908748df5722a4ebadfc8cf5bb7b0d8d933ca67183fa15"},
|
||||
{"name":"google-cloud-errors","version":"1.3.0","platform":"ruby","checksum":"450b681e24c089a20721a01acc4408bb4a7b0df28c175aaab488da917480d64b"},
|
||||
{"name":"google-cloud-profiler-v2","version":"0.4.0","platform":"ruby","checksum":"53fc2ab175d08f54233c644310d47798feac996220916815c4fb44c937b5d3e3"},
|
||||
{"name":"google-cloud-storage","version":"1.44.0","platform":"ruby","checksum":"299a1e055c9277c8120f7c10d21d37e4d8c17c7b963350c0e0bff7e9d9a570ea"},
|
||||
{"name":"google-protobuf","version":"3.22.1","platform":"arm64-darwin","checksum":"bd904af849bd1f143c4d9eb74e0622f9efca7ed20719b00baa77fcb1a5fc2aa7"},
|
||||
{"name":"google-protobuf","version":"3.22.1","platform":"java","checksum":"268359af055709c5796b1c726f839ef0fe356702c7abdb136367eb37cf9662e3"},
|
||||
|
|
@ -244,7 +246,8 @@
|
|||
{"name":"google-protobuf","version":"3.22.1","platform":"x86-mingw32","checksum":"a8ab1fda2a208dc238f16b2796d5a3383e6a273f8ef88a23ca90e0c2846594ee"},
|
||||
{"name":"google-protobuf","version":"3.22.1","platform":"x86_64-darwin","checksum":"a425ce701b8c4f9aeb7cac0e7f1b36496ff8f6bf86dc7fe9d06af534d25e45d8"},
|
||||
{"name":"google-protobuf","version":"3.22.1","platform":"x86_64-linux","checksum":"a62f7d472c346cea6c6141c70b1caba5b7e75319c56cf44a24b62bad6c1adf10"},
|
||||
{"name":"googleapis-common-protos-types","version":"1.3.0","platform":"ruby","checksum":"c5411f3197cc3e02547ded1858303b1f830b4dc89c588c142ad6c8a231050671"},
|
||||
{"name":"googleapis-common-protos","version":"1.4.0","platform":"ruby","checksum":"da2380fb5ab1563580816c74e8d684ac17512c3654c829a3ee84f6d6139de382"},
|
||||
{"name":"googleapis-common-protos-types","version":"1.5.0","platform":"ruby","checksum":"5769cf7376abc86ef7f5897a4aaca1d5c5a3c49ddabeddd2c251fcf8155f858b"},
|
||||
{"name":"googleauth","version":"1.3.0","platform":"ruby","checksum":"51dd7362353cf1e90a2d01e1fb94321ae3926c776d4dc4a79db65230217ffcc2"},
|
||||
{"name":"gpgme","version":"2.0.22","platform":"ruby","checksum":"7c6904952afdd0bf2c7c3ed6de98a5143f86c6b7390dbcd9d7012bddfa3ec862"},
|
||||
{"name":"grape","version":"1.5.2","platform":"ruby","checksum":"1df3b734c3862e235174232bc629587eddda9ef3df648230827575186700ae29"},
|
||||
|
|
|
|||
27
Gemfile.lock
27
Gemfile.lock
|
|
@ -10,6 +10,15 @@ PATH
|
|||
bundler-checksum (0.1.0)
|
||||
bundler
|
||||
|
||||
PATH
|
||||
remote: vendor/gems/cloud_profiler_agent
|
||||
specs:
|
||||
cloud_profiler_agent (0.0.1.pre)
|
||||
google-cloud-profiler-v2 (~> 0.3)
|
||||
google-protobuf (~> 3.13)
|
||||
googleauth (>= 0.14)
|
||||
stackprof (~> 0.2)
|
||||
|
||||
PATH
|
||||
remote: vendor/gems/devise-pbkdf2-encryptable
|
||||
specs:
|
||||
|
|
@ -544,6 +553,14 @@ GEM
|
|||
rspec-core (~> 3.0)
|
||||
ruby-progressbar (~> 1.4)
|
||||
fuzzyurl (0.9.0)
|
||||
gapic-common (0.18.0)
|
||||
faraday (>= 1.9, < 3.a)
|
||||
faraday-retry (>= 1.0, < 3.a)
|
||||
google-protobuf (~> 3.14)
|
||||
googleapis-common-protos (>= 1.3.12, < 2.a)
|
||||
googleapis-common-protos-types (>= 1.3.1, < 2.a)
|
||||
googleauth (~> 1.0)
|
||||
grpc (~> 1.36)
|
||||
gemoji (3.0.1)
|
||||
get_process_mem (0.2.7)
|
||||
ffi (~> 1.0)
|
||||
|
|
@ -656,6 +673,9 @@ GEM
|
|||
google-cloud-env (1.6.0)
|
||||
faraday (>= 0.17.3, < 3.0)
|
||||
google-cloud-errors (1.3.0)
|
||||
google-cloud-profiler-v2 (0.4.0)
|
||||
gapic-common (>= 0.18.0, < 2.a)
|
||||
google-cloud-errors (~> 1.0)
|
||||
google-cloud-storage (1.44.0)
|
||||
addressable (~> 2.8)
|
||||
digest-crc (~> 0.4)
|
||||
|
|
@ -665,7 +685,11 @@ GEM
|
|||
googleauth (>= 0.16.2, < 2.a)
|
||||
mini_mime (~> 1.0)
|
||||
google-protobuf (3.22.1)
|
||||
googleapis-common-protos-types (1.3.0)
|
||||
googleapis-common-protos (1.4.0)
|
||||
google-protobuf (~> 3.14)
|
||||
googleapis-common-protos-types (~> 1.2)
|
||||
grpc (~> 1.27)
|
||||
googleapis-common-protos-types (1.5.0)
|
||||
google-protobuf (~> 3.14)
|
||||
googleauth (1.3.0)
|
||||
faraday (>= 0.17.3, < 3.a)
|
||||
|
|
@ -1633,6 +1657,7 @@ DEPENDENCIES
|
|||
capybara-screenshot (~> 1.0.22)
|
||||
carrierwave (~> 1.3)
|
||||
charlock_holmes (~> 0.7.7)
|
||||
cloud_profiler_agent (~> 0.0.0)!
|
||||
commonmarker (~> 0.23.6)
|
||||
concurrent-ruby (~> 1.1)
|
||||
connection_pool (~> 2.0)
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ export default {
|
|||
{{ __('Duration') }}
|
||||
</div>
|
||||
<div role="rowheader" class="table-section section-10">
|
||||
{{ __('Details'), }}
|
||||
{{ __('Details') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -162,7 +162,7 @@ export default {
|
|||
</div>
|
||||
|
||||
<div class="table-section section-10 section-wrap">
|
||||
<div role="rowheader" class="table-mobile-header">{{ __('Details'), }}</div>
|
||||
<div role="rowheader" class="table-mobile-header">{{ __('Details') }}</div>
|
||||
<div class="table-mobile-content">
|
||||
<gl-button v-gl-modal-directive="`test-case-details-${index}`">{{
|
||||
__('View details')
|
||||
|
|
|
|||
|
|
@ -50,13 +50,13 @@ export default {
|
|||
{{ __('Failed') }}
|
||||
</div>
|
||||
<div role="rowheader" class="table-section section-10 gl-text-center">
|
||||
{{ __('Errors'), }}
|
||||
{{ __('Errors') }}
|
||||
</div>
|
||||
<div role="rowheader" class="table-section section-10 gl-text-center">
|
||||
{{ __('Skipped'), }}
|
||||
{{ __('Skipped') }}
|
||||
</div>
|
||||
<div role="rowheader" class="table-section section-10 gl-text-center">
|
||||
{{ __('Passed'), }}
|
||||
{{ __('Passed') }}
|
||||
</div>
|
||||
<div role="rowheader" class="table-section section-10 gl-pr-5 gl-text-right">
|
||||
{{ __('Total') }}
|
||||
|
|
|
|||
|
|
@ -80,9 +80,7 @@ module MarkupHelper
|
|||
)
|
||||
)
|
||||
|
||||
# since <img> tags are stripped, this can leave empty <a> tags hanging around
|
||||
# (as our markdown wraps images in links)
|
||||
strip_empty_link_tags(text).html_safe
|
||||
render_links(text)
|
||||
end
|
||||
|
||||
def markdown(text, context = {})
|
||||
|
|
@ -171,9 +169,22 @@ module MarkupHelper
|
|||
{ project: wiki.container }
|
||||
end
|
||||
|
||||
def strip_empty_link_tags(text)
|
||||
# Sanitize and style user references links
|
||||
#
|
||||
# @param String text the string to be sanitized
|
||||
#
|
||||
# 1. Remove empty <a> tags which are caused by the <img> tags being stripped
|
||||
# (as our markdown wraps images in links)
|
||||
# 2. Strip all link tags, except user references, leaving just the link text
|
||||
# 3. Add a highlight class for current user's references
|
||||
#
|
||||
# @return sanitized HTML string
|
||||
def render_links(text)
|
||||
scrubber = Loofah::Scrubber.new do |node|
|
||||
node.remove if node.name == 'a' && node.children.empty?
|
||||
next unless node.name == 'a'
|
||||
next node.remove if node.children.empty?
|
||||
next node.replace(node.children) if node['data-reference-type'] != 'user'
|
||||
next node.append_class('current-user') if node['data-user'] == current_user.id.to_s
|
||||
end
|
||||
|
||||
sanitize text, scrubber: scrubber
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
return unless Gitlab::Utils.to_boolean(ENV['GITLAB_GOOGLE_CLOUD_PROFILER_ENABLED'])
|
||||
return unless ENV['GITLAB_GOOGLE_CLOUD_PROFILER_PROJECT_ID']
|
||||
|
||||
# For the initial iteration, we enable it only for `web`.
|
||||
# This is because we have global service accounts configured this way, details:
|
||||
# https://gitlab.com/gitlab-com/gl-infra/reliability/-/issues/17492#note_1303914983
|
||||
return unless Gitlab::Runtime.puma?
|
||||
|
||||
Gitlab::Cluster::LifecycleEvents.on_worker_start do
|
||||
require 'cloud_profiler_agent'
|
||||
|
||||
agent = CloudProfilerAgent::Agent.new(
|
||||
service: 'gitlab-web',
|
||||
project_id: ENV['GITLAB_GOOGLE_CLOUD_PROFILER_PROJECT_ID'],
|
||||
logger: ::Gitlab::AppJsonLogger.build,
|
||||
log_labels: {
|
||||
message: 'Google Cloud Profiler Ruby',
|
||||
pid: $$,
|
||||
worker_id: ::Prometheus::PidProvider.worker_id
|
||||
}
|
||||
)
|
||||
agent.start
|
||||
end
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class MigrateEvidencesFromRawMetadata < Gitlab::Database::Migration[2.1]
|
||||
restrict_gitlab_migration gitlab_schema: :gitlab_main
|
||||
|
||||
MIGRATION = 'MigrateEvidencesForVulnerabilityFindings'
|
||||
DELAY_INTERVAL = 2.minutes
|
||||
SUB_BATCH_SIZE = 500
|
||||
BATCH_SIZE = 10000
|
||||
|
||||
def up
|
||||
queue_batched_background_migration(
|
||||
MIGRATION,
|
||||
:vulnerability_occurrences,
|
||||
:id,
|
||||
job_interval: DELAY_INTERVAL,
|
||||
batch_size: BATCH_SIZE,
|
||||
sub_batch_size: SUB_BATCH_SIZE
|
||||
)
|
||||
end
|
||||
|
||||
def down
|
||||
delete_batched_background_migration(MIGRATION, :vulnerability_occurrences, :id, [])
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1 @@
|
|||
ec6c176dc707bcaa39747fb23add886c711e075b22823174bc9f0ebee2ec224e
|
||||
|
|
@ -270,7 +270,7 @@ These LDAP sync configuration settings are available:
|
|||
|
||||
| Setting | Description | Required | Examples |
|
||||
|-------------------|-------------|----------|----------|
|
||||
| `group_base` | Base used to search for groups. | **{dotted-circle}** No | `'ou=groups,dc=gitlab,dc=example'` |
|
||||
| `group_base` | Base used to search for groups. | **{dotted-circle}** No (required when `external_groups` is configured) | `'ou=groups,dc=gitlab,dc=example'` |
|
||||
| `admin_group` | The CN of a group containing GitLab administrators. Not `cn=administrators` or the full DN. | **{dotted-circle}** No | `'administrators'` |
|
||||
| `external_groups` | An array of CNs of groups containing users that should be considered external. Not `cn=interns` or the full DN. | **{dotted-circle}** No | `['interns', 'contractors']` |
|
||||
| `sync_ssh_keys` | The LDAP attribute containing a user's public SSH key. | **{dotted-circle}** No | `'sshPublicKey'` or false if not set |
|
||||
|
|
|
|||
|
|
@ -101,8 +101,8 @@ parameter:
|
|||
|
||||
| `metric` query parameter | Description of `value` in response |
|
||||
|:---------------------------|:-----------------------------------|
|
||||
| `deployment_frequency` | The API returns the total number of successful deployments during the time period. [Issue 371271](https://gitlab.com/gitlab-org/gitlab/-/issues/371271) proposes to update the API to return the daily average instead of the total number. |
|
||||
| `change_failure_rate` | The number of incidents divided by the number of deployments during the time period. Available only for production environment. |
|
||||
| `deployment_frequency` | The number of successful deployments during the time period. |
|
||||
| `lead_time_for_changes` | The median number of seconds between the merge of the merge request (MR) and the deployment of the MR commits for all MRs deployed during the time period. |
|
||||
| `time_to_restore_service` | The median number of seconds an incident was open during the time period. Available only for production environment. |
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,45 @@ Example response:
|
|||
}
|
||||
```
|
||||
|
||||
### Create Error Tracking settings
|
||||
|
||||
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/393035/) in GitLab 15.10.
|
||||
The API allows you to create Error Tracking settings for a project. Only for users with Maintainer role for
|
||||
the project.
|
||||
|
||||
NOTE:
|
||||
This API is only available when used with [integrated error tracking](../operations/error_tracking.md#integrated-error-tracking).
|
||||
|
||||
```plaintext
|
||||
PUT /projects/:id/error_tracking/settings
|
||||
```
|
||||
|
||||
Supported attributes:
|
||||
|
||||
| Attribute | Type | Required | Description |
|
||||
| ------------ | ------- |----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| `id` | integer | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `active` | boolean | yes | Pass `true` to enable the error tracking setting configuration or `false` to disable it. |
|
||||
| `integrated` | boolean | yes | Pass `true` to enable the integrated error tracking backend. [Available in](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68260) GitLab 14.2 and later. |
|
||||
|
||||
Example request:
|
||||
|
||||
```shell
|
||||
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/error_tracking/settings?active=true&integrated=true"
|
||||
```
|
||||
|
||||
Example response:
|
||||
|
||||
```json
|
||||
{
|
||||
"active": true,
|
||||
"project_name": null,
|
||||
"sentry_external_url": null,
|
||||
"api_url": null,
|
||||
"integrated": true
|
||||
}
|
||||
```
|
||||
|
||||
### Enable or disable the Error Tracking project settings
|
||||
|
||||
The API allows you to enable or disable the Error Tracking settings for a project. Only for users with the
|
||||
|
|
@ -55,7 +94,7 @@ PATCH /projects/:id/error_tracking/settings
|
|||
| `integrated` | boolean | no | Pass `true` to enable the integrated error tracking backend. [Available in](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68260) GitLab 14.2 and later. |
|
||||
|
||||
```shell
|
||||
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/error_tracking/settings?active=true"
|
||||
curl --request PATCH --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/error_tracking/settings?active=true"
|
||||
```
|
||||
|
||||
Example response:
|
||||
|
|
|
|||
|
|
@ -6227,6 +6227,7 @@ Input type: `VulnerabilityConfirmInput`
|
|||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="mutationvulnerabilityconfirmclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
|
||||
| <a id="mutationvulnerabilityconfirmcomment"></a>`comment` | [`String`](#string) | Comment why vulnerability was marked as confirmed (max. 50 000 characters). |
|
||||
| <a id="mutationvulnerabilityconfirmid"></a>`id` | [`VulnerabilityID!`](#vulnerabilityid) | ID of the vulnerability to be confirmed. |
|
||||
|
||||
#### Fields
|
||||
|
|
|
|||
|
|
@ -4,12 +4,12 @@ group: Import
|
|||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
||||
# Group import/export API **(FREE)**
|
||||
# Group import and export API **(FREE)**
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20353) in GitLab 12.8.
|
||||
|
||||
Group Import/Export allows you to export group structure and import it to a new location.
|
||||
When used with [Project Import/Export](project_import_export.md), you can preserve connections with
|
||||
Use the group import and export API to export a group structure and import it to a new location.
|
||||
When you use the group import and export API with the [project import and export API](project_import_export.md), you can preserve connections with
|
||||
group-level relationships, such as connections between project issues and group epics.
|
||||
|
||||
Group exports include the following:
|
||||
|
|
@ -22,6 +22,13 @@ Group exports include the following:
|
|||
- Subgroups. Each subgroup includes all data above
|
||||
- Group wikis **(PREMIUM SELF)**
|
||||
|
||||
To preserve group-level relationships from imported projects, you should run group import and export first. This way, you can import project exports into the desired group structure.
|
||||
|
||||
Imported groups have a `private` visibility level unless you import them into a parent group.
|
||||
If you import groups into a parent group, the subgroups inherit by default a similar level of visibility.
|
||||
|
||||
To preserve the member list and their respective permissions on imported groups, review the users in these groups. Make sure these users exist before importing the desired groups.
|
||||
|
||||
## Schedule new export
|
||||
|
||||
Start a new group export.
|
||||
|
|
@ -103,14 +110,3 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
|
|||
NOTE:
|
||||
The maximum import file size can be set by the Administrator, default is `0` (unlimited).
|
||||
As an administrator, you can modify the maximum import file size. To do so, use the `max_import_size` option in the [Application settings API](settings.md#change-application-settings) or the [Admin Area](../user/admin_area/settings/account_and_limit_settings.md). Default [modified](https://gitlab.com/gitlab-org/gitlab/-/issues/251106) from 50 MB to 0 in GitLab 13.8.
|
||||
|
||||
## Important notes
|
||||
|
||||
Note the following:
|
||||
|
||||
- To preserve group-level relationships from imported projects, run Group Import/Export first,
|
||||
to allow project imports into the desired group structure.
|
||||
- Imported groups are given a `private` visibility level, unless imported into a parent group.
|
||||
- If imported into a parent group, subgroups inherit a similar level of visibility, unless otherwise restricted.
|
||||
- To preserve the member list and their respective permissions on imported groups,
|
||||
review the users in these groups. Make sure these users exist before importing the desired groups.
|
||||
|
|
|
|||
|
|
@ -8,6 +8,19 @@ info: To determine the technical writer assigned to the Stage/Group associated w
|
|||
|
||||
Use the Import API to import repositories from GitHub or Bitbucket Server.
|
||||
|
||||
Related APIs include:
|
||||
|
||||
- [Group migration by direct transfer API](bulk_imports.md)
|
||||
- [Group import and export API](group_import_export.md)
|
||||
- [Project import and export API](project_import_export.md)
|
||||
|
||||
## Prerequisites
|
||||
|
||||
For information on prerequisites for using the Import API, see:
|
||||
|
||||
- [Prerequisites for GitHub importer](../user/project/import/github.md#prerequisites)
|
||||
- [Prerequisites for Bitbucket Server importer](../user/project/import/bitbucket_server.md#import-your-bitbucket-repositories)
|
||||
|
||||
## Import repository from GitHub
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/381902) in GitLab 15.8, GitLab no longer automatically creates namespaces or groups if the namespace or group name specified in `target_namespace` doesn't exist. GitLab also no longer falls back to using the user's personal namespace if the namespace or group name is taken or `target_namespace` is blank.
|
||||
|
|
|
|||
|
|
@ -4,12 +4,17 @@ group: Source Code
|
|||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
||||
# Project import/export API **(FREE)**
|
||||
# Project import and export API **(FREE)**
|
||||
|
||||
See also:
|
||||
Use the project import and export API to import and export projects using file transfers.
|
||||
|
||||
- [Project import/export documentation](../user/project/settings/import_export.md).
|
||||
- [Project import/export administration Rake tasks](../administration/raketasks/project_import_export.md). **(FREE SELF)**
|
||||
For more information, see:
|
||||
|
||||
- [Migrating projects using file exports](../user/project/settings/import_export.md)
|
||||
- [Project import and export Rake tasks](../administration/raketasks/project_import_export.md)
|
||||
|
||||
Before using the project import and export API, you might want to use the
|
||||
[group import and export API](group_import_export.md).
|
||||
|
||||
## Schedule an export
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,43 @@
|
|||
---
|
||||
info: For assistance with this Style Guide page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments-to-other-projects-and-subjects
|
||||
stage: none
|
||||
group: unassigned
|
||||
---
|
||||
|
||||
# Document Alpha, Beta, LA features
|
||||
|
||||
Some features are not generally available and are instead considered
|
||||
[Alpha, Beta, or Limited Availability](../../policy/alpha-beta-support.md).
|
||||
|
||||
When you document a feature in one of these three statuses:
|
||||
|
||||
- Add `(Alpha)`, `(Beta)`, or `(Limited Availability)` in parentheses after the page or topic title.
|
||||
- Do not include `(Alpha)`, `(Beta)`, or `(Limited Availability)` in the left nav.
|
||||
- Ensure the version history lists the feature's status.
|
||||
|
||||
These features are usually behind a feature flag, which follow [these documentation guidelines](feature_flags.md).
|
||||
|
||||
If you add details of how users should enroll, or how to contact the team with issues,
|
||||
the `FLAG:` note should be above these details. For example:
|
||||
|
||||
```markdown
|
||||
## Great new feature (Alpha)
|
||||
|
||||
FLAG:
|
||||
On self-managed GitLab, by default this feature is not available.
|
||||
To make it available, ask an administrator to enable the feature flag named example_flag.
|
||||
On GitLab.com, this feature is not available. This feature is not ready for production use.
|
||||
|
||||
Use this great new feature when you need to do this new thing.
|
||||
|
||||
This feature is in Alpha. To join the list of users testing this feature,
|
||||
do this thing. If you find a bug, [open an issue](link).
|
||||
```
|
||||
|
||||
When the feature is released, remove:
|
||||
|
||||
- The text in parentheses.
|
||||
- Any language about the feature not being ready for production.
|
||||
- The feature flag information.
|
||||
|
||||
Ensure the version history is up-to-date.
|
||||
|
|
@ -111,7 +111,7 @@ To remove a metric:
|
|||
can be safely removed from Service Ping. Use this
|
||||
[example issue](https://gitlab.com/gitlab-data/analytics/-/issues/15266) for guidance.
|
||||
|
||||
1. Notify the Customer Success Ops team (`@csops-team`), Analytics Engineers (`@gitlab-data/analytics-engineers`), and Product Analysts (`@gitlab-data/product-analysts`) by `@` mentioning those groups in a comment in the issue regarding the deletion of the metric.
|
||||
1. Notify the Customer Success Ops team (`@csops-team`), Analytics Engineers (`@gitlab-data/analytics-engineers`), and Product Analysts (`@gitlab-data/product-analysts`) by `@` mentioning those groups in a comment in the issue from step 1 regarding the deletion of the metric.
|
||||
Many Service Ping metrics are relied upon for health score and XMAU reporting and unexpected changes to those metrics could break reporting.
|
||||
|
||||
1. After you verify the metric can be safely removed,
|
||||
|
|
|
|||
|
|
@ -6,12 +6,14 @@ info: To determine the technical writer assigned to the Stage/Group associated w
|
|||
|
||||
# Value Streams Dashboard **(ULTIMATE)**
|
||||
|
||||
> Introduced in GitLab 15.8 as a Closed [Beta](../../policy/alpha-beta-support.md#beta-features) feature.
|
||||
> Introduced in GitLab 15.8 as a Closed [Beta](../../policy/alpha-beta-support.md#beta-features) feature [with a flag](../../administration/feature_flags.md) named `group_analytics_dashboards_page`. Disabled by default.
|
||||
|
||||
FLAG:
|
||||
On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `group_analytics_dashboards_page`.
|
||||
On GitLab.com, this feature is not available. This feature is not ready for production use.
|
||||
|
||||
You can leave feedback on dashboard bugs or functionality in [issue 381787](https://gitlab.com/gitlab-org/gitlab/-/issues/381787).
|
||||
|
||||
This feature is not ready for production use.
|
||||
|
||||
The Value Streams Dashboard is a customizable dashboard that enables decision-makers to identify trends, patterns, and opportunities for digital transformation improvements.
|
||||
This page is a work in progress, and we're updating the information as we add more features.
|
||||
For more information, see the [Value Stream Management category direction page](https://about.gitlab.com/direction/plan/value_stream_management/).
|
||||
|
|
|
|||
|
|
@ -23,8 +23,6 @@ module API
|
|||
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
|
||||
before do
|
||||
authorize! :admin_operations, user_project
|
||||
|
||||
not_found!('Error Tracking Setting') unless project_setting
|
||||
end
|
||||
|
||||
desc 'Get Error Tracking settings' do
|
||||
|
|
@ -34,6 +32,7 @@ module API
|
|||
end
|
||||
|
||||
get ':id/error_tracking/settings' do
|
||||
not_found!('Error Tracking Setting') unless project_setting
|
||||
present project_setting, with: Entities::ErrorTracking::ProjectSetting
|
||||
end
|
||||
|
||||
|
|
@ -59,6 +58,7 @@ module API
|
|||
end
|
||||
|
||||
patch ':id/error_tracking/settings/' do
|
||||
not_found!('Error Tracking Setting') unless project_setting
|
||||
update_params = {
|
||||
error_tracking_setting_attributes: { enabled: params[:active] }
|
||||
}
|
||||
|
|
@ -75,6 +75,42 @@ module API
|
|||
result
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Update Error Tracking project settings. Available in GitLab 15.10 and later.' do
|
||||
detail 'Update Error Tracking settings for a project. ' \
|
||||
'Only for users with Maintainer role for the project.'
|
||||
success Entities::ErrorTracking::ProjectSetting
|
||||
failure [
|
||||
{ code: 400, message: 'Bad request' },
|
||||
{ code: 401, message: 'Unauthorized' },
|
||||
{ code: 404, message: 'Not found' }
|
||||
]
|
||||
tags ERROR_TRACKING_PROJECT_SETTINGS_TAGS
|
||||
end
|
||||
params do
|
||||
requires :active, type: Boolean,
|
||||
desc: 'Pass true to enable the configured Error Tracking settings or false to disable it.',
|
||||
allow_blank: false
|
||||
requires :integrated,
|
||||
type: Boolean,
|
||||
desc: 'Pass true to enable the integrated Error Tracking backend.'
|
||||
end
|
||||
|
||||
put ':id/error_tracking/settings' do
|
||||
not_found! unless Feature.enabled?(:integrated_error_tracking, user_project)
|
||||
update_params = {
|
||||
error_tracking_setting_attributes: { enabled: params[:active] }
|
||||
}
|
||||
|
||||
update_params[:error_tracking_setting_attributes][:integrated] = params[:integrated]
|
||||
|
||||
result = ::Projects::Operations::UpdateService.new(user_project, current_user, update_params).execute
|
||||
if result[:status] == :success
|
||||
present project_setting, with: Entities::ErrorTracking::ProjectSetting
|
||||
else
|
||||
result
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -0,0 +1,81 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Gitlab
|
||||
module BackgroundMigration
|
||||
# The class to migrate the evidence data into their own records from the json attribute
|
||||
class MigrateEvidencesForVulnerabilityFindings < BatchedMigrationJob
|
||||
feature_category :vulnerability_management
|
||||
operation_name :migrate_evidences_for_vulnerability_findings
|
||||
|
||||
# The class is mimicking Vulnerabilites::Finding
|
||||
class Finding < ApplicationRecord
|
||||
self.table_name = 'vulnerability_occurrences'
|
||||
|
||||
validates :details, json_schema: { filename: 'vulnerability_finding_details', draft: 7 }, if: false
|
||||
end
|
||||
|
||||
# The class is mimicking Vulnerabilites::Finding::Evidence
|
||||
class Evidence < ApplicationRecord
|
||||
self.table_name = 'vulnerability_finding_evidences'
|
||||
|
||||
# This data has been already validated when parsed into vulnerability_occurrences.raw_metadata
|
||||
# Having this validation is a requerment from:
|
||||
# https://gitlab.com/gitlab-org/gitlab/-/blob/dc3262f850cbd0ac14171d3c389b1258b4749cda/spec/db/schema_spec.rb#L253-265
|
||||
validates :data, json_schema: { filename: "filename" }, if: false
|
||||
end
|
||||
|
||||
def perform
|
||||
each_sub_batch do |sub_batch|
|
||||
migrate_evidences(sub_batch)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def migrate_evidences(sub_batch)
|
||||
attrs = sub_batch.filter_map do |finding|
|
||||
evidence = extract_evidence(finding.raw_metadata)
|
||||
|
||||
next unless evidence
|
||||
|
||||
build_evidence(finding, evidence)
|
||||
end.compact
|
||||
|
||||
begin
|
||||
create_evidences(attrs) if attrs.present?
|
||||
rescue StandardError => e
|
||||
logger.error(
|
||||
message: e.message,
|
||||
class: self.class.name
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def build_evidence(finding, evidence)
|
||||
current_time = Time.current
|
||||
{
|
||||
vulnerability_occurrence_id: finding.id,
|
||||
data: evidence,
|
||||
created_at: current_time,
|
||||
updated_at: current_time
|
||||
}
|
||||
end
|
||||
|
||||
def create_evidences(evidences)
|
||||
Evidence.upsert_all(evidences, returning: false, unique_by: %i[vulnerability_occurrence_id])
|
||||
end
|
||||
|
||||
def extract_evidence(metadata)
|
||||
parsed_metadata = Gitlab::Json.parse(metadata)
|
||||
|
||||
parsed_metadata['evidence']
|
||||
rescue JSON::ParserError
|
||||
nil
|
||||
end
|
||||
|
||||
def logger
|
||||
@logger ||= ::Gitlab::AppLogger
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -12,6 +12,7 @@ module Gitlab
|
|||
# For now, these migrations are not considered ready for general use, for more information see the tracking epic:
|
||||
# https://gitlab.com/groups/gitlab-org/-/epics/6751
|
||||
module BatchedBackgroundMigrationHelpers
|
||||
NonExistentMigrationError = Class.new(StandardError)
|
||||
BATCH_SIZE = 1_000 # Number of rows to process per job
|
||||
SUB_BATCH_SIZE = 100 # Number of rows to process per sub-batch
|
||||
BATCH_CLASS_NAME = 'PrimaryKeyBatchingStrategy' # Default batch class for batched migrations
|
||||
|
|
@ -213,6 +214,10 @@ module Gitlab
|
|||
job_arguments: job_arguments
|
||||
}
|
||||
|
||||
if ENV['DBLAB_ENVIRONMENT'] && migration.nil?
|
||||
raise NonExistentMigrationError, 'called ensure_batched_background_migration_is_finished with non-existent migration name'
|
||||
end
|
||||
|
||||
return Gitlab::AppLogger.warn "Could not find batched background migration for the given configuration: #{configuration}" if migration.nil?
|
||||
|
||||
return if migration.finished?
|
||||
|
|
|
|||
|
|
@ -6470,6 +6470,9 @@ msgstr ""
|
|||
msgid "BillingPlans|Faster code reviews"
|
||||
msgstr ""
|
||||
|
||||
msgid "BillingPlans|Free"
|
||||
msgstr ""
|
||||
|
||||
msgid "BillingPlans|Free forever features for individual users"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -18156,9 +18159,6 @@ msgstr ""
|
|||
msgid "Framework successfully deleted"
|
||||
msgstr ""
|
||||
|
||||
msgid "Free"
|
||||
msgstr ""
|
||||
|
||||
msgid "Free Trial of GitLab.com Ultimate"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -47804,6 +47804,54 @@ msgstr ""
|
|||
msgid "VulnerabilityDismissalReasons|Used in tests"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityExport|Activity"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityExport|Additional Info"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityExport|CVE"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityExport|CWE"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityExport|Comments"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityExport|Details"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityExport|Detected At"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityExport|Group Name"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityExport|Location"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityExport|Other Identifiers"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityExport|Project Name"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityExport|Scanner Name"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityExport|Severity"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityExport|Status"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityExport|Tool"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityExport|Vulnerability"
|
||||
msgstr ""
|
||||
|
||||
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
|
||||
msgstr ""
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Projects::HooksController do
|
||||
RSpec.describe Projects::HooksController, feature_category: :integrations do
|
||||
include AfterNextHelpers
|
||||
|
||||
let_it_be(:project) { create(:project) }
|
||||
|
|
|
|||
|
|
@ -16,7 +16,12 @@ FactoryBot.define do
|
|||
end
|
||||
|
||||
trait :integrated do
|
||||
api_url { nil }
|
||||
integrated { true }
|
||||
token { nil }
|
||||
project_name { nil }
|
||||
organization_name { nil }
|
||||
sentry_project_id { nil }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -43,3 +43,212 @@ exports[`Remove cluster confirmation modal renders buttons with modal included 1
|
|||
<!---->
|
||||
</div>
|
||||
`;
|
||||
|
||||
exports[`Remove cluster confirmation modal two buttons open modal with "cleanup" option 1`] = `
|
||||
<div
|
||||
class="gl-display-flex"
|
||||
>
|
||||
<button
|
||||
class="btn gl-mr-3 btn-danger btn-md gl-button"
|
||||
data-testid="remove-integration-and-resources-button"
|
||||
type="button"
|
||||
>
|
||||
<!---->
|
||||
|
||||
<!---->
|
||||
|
||||
<span
|
||||
class="gl-button-text"
|
||||
>
|
||||
|
||||
Remove integration and resources
|
||||
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="btn btn-danger btn-md gl-button btn-danger-secondary"
|
||||
data-testid="remove-integration-button"
|
||||
type="button"
|
||||
>
|
||||
<!---->
|
||||
|
||||
<!---->
|
||||
|
||||
<span
|
||||
class="gl-button-text"
|
||||
>
|
||||
|
||||
Remove integration
|
||||
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<div
|
||||
kind="danger"
|
||||
>
|
||||
<p>
|
||||
You are about to remove your cluster integration and all GitLab-created resources associated with this cluster.
|
||||
</p>
|
||||
|
||||
<div>
|
||||
|
||||
This will permanently delete the following resources:
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
Any project namespaces
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<code>
|
||||
clusterroles
|
||||
</code>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<code>
|
||||
clusterrolebindings
|
||||
</code>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<strong>
|
||||
To remove your integration and resources, type
|
||||
<code>
|
||||
my-test-cluster
|
||||
</code>
|
||||
to confirm:
|
||||
</strong>
|
||||
|
||||
<form
|
||||
action="clusterPath"
|
||||
class="gl-mb-5"
|
||||
method="post"
|
||||
>
|
||||
<input
|
||||
name="_method"
|
||||
type="hidden"
|
||||
value="delete"
|
||||
/>
|
||||
|
||||
<input
|
||||
name="authenticity_token"
|
||||
type="hidden"
|
||||
/>
|
||||
|
||||
<input
|
||||
name="cleanup"
|
||||
type="hidden"
|
||||
value="true"
|
||||
/>
|
||||
|
||||
<input
|
||||
autocomplete="off"
|
||||
class="gl-form-input form-control"
|
||||
id="__BVID__14"
|
||||
name="confirm_cluster_name_input"
|
||||
type="text"
|
||||
/>
|
||||
</form>
|
||||
|
||||
<span>
|
||||
If you do not wish to delete all associated GitLab resources, you can simply remove the integration.
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
exports[`Remove cluster confirmation modal two buttons open modal without "cleanup" option 1`] = `
|
||||
<div
|
||||
class="gl-display-flex"
|
||||
>
|
||||
<button
|
||||
class="btn gl-mr-3 btn-danger btn-md gl-button"
|
||||
data-testid="remove-integration-and-resources-button"
|
||||
type="button"
|
||||
>
|
||||
<!---->
|
||||
|
||||
<!---->
|
||||
|
||||
<span
|
||||
class="gl-button-text"
|
||||
>
|
||||
|
||||
Remove integration and resources
|
||||
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="btn btn-danger btn-md gl-button btn-danger-secondary"
|
||||
data-testid="remove-integration-button"
|
||||
type="button"
|
||||
>
|
||||
<!---->
|
||||
|
||||
<!---->
|
||||
|
||||
<span
|
||||
class="gl-button-text"
|
||||
>
|
||||
|
||||
Remove integration
|
||||
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<div
|
||||
kind="danger"
|
||||
>
|
||||
<p>
|
||||
You are about to remove your cluster integration.
|
||||
</p>
|
||||
|
||||
<!---->
|
||||
|
||||
<strong>
|
||||
To remove your integration, type
|
||||
<code>
|
||||
my-test-cluster
|
||||
</code>
|
||||
to confirm:
|
||||
</strong>
|
||||
|
||||
<form
|
||||
action="clusterPath"
|
||||
class="gl-mb-5"
|
||||
method="post"
|
||||
>
|
||||
<input
|
||||
name="_method"
|
||||
type="hidden"
|
||||
value="delete"
|
||||
/>
|
||||
|
||||
<input
|
||||
name="authenticity_token"
|
||||
type="hidden"
|
||||
/>
|
||||
|
||||
<input
|
||||
name="cleanup"
|
||||
type="hidden"
|
||||
value="true"
|
||||
/>
|
||||
|
||||
<input
|
||||
autocomplete="off"
|
||||
class="gl-form-input form-control"
|
||||
id="__BVID__21"
|
||||
name="confirm_cluster_name_input"
|
||||
type="text"
|
||||
/>
|
||||
</form>
|
||||
|
||||
<!---->
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import RemoveClusterConfirmation from '~/clusters/components/remove_cluster_conf
|
|||
|
||||
describe('Remove cluster confirmation modal', () => {
|
||||
let wrapper;
|
||||
const showMock = jest.fn();
|
||||
|
||||
const createComponent = ({ props = {}, stubs = {} } = {}) => {
|
||||
wrapper = mount(RemoveClusterConfirmation, {
|
||||
|
|
@ -33,9 +34,13 @@ describe('Remove cluster confirmation modal', () => {
|
|||
beforeEach(() => {
|
||||
createComponent({
|
||||
props: { clusterName: 'my-test-cluster' },
|
||||
stubs: { GlSprintf, GlModal: stubComponent(GlModal) },
|
||||
stubs: {
|
||||
GlSprintf,
|
||||
GlModal: stubComponent(GlModal, {
|
||||
methods: { show: showMock },
|
||||
}),
|
||||
},
|
||||
});
|
||||
jest.spyOn(findModal().vm, 'show').mockReturnValue();
|
||||
});
|
||||
|
||||
it('open modal with "cleanup" option', async () => {
|
||||
|
|
@ -43,8 +48,8 @@ describe('Remove cluster confirmation modal', () => {
|
|||
|
||||
await nextTick();
|
||||
|
||||
expect(findModal().vm.show).toHaveBeenCalled();
|
||||
expect(wrapper.vm.confirmCleanup).toEqual(true);
|
||||
expect(showMock).toHaveBeenCalled();
|
||||
expect(wrapper.element).toMatchSnapshot();
|
||||
expect(findModal().html()).toContain(
|
||||
'<strong>To remove your integration and resources, type <code>my-test-cluster</code> to confirm:</strong>',
|
||||
);
|
||||
|
|
@ -55,8 +60,8 @@ describe('Remove cluster confirmation modal', () => {
|
|||
|
||||
await nextTick();
|
||||
|
||||
expect(findModal().vm.show).toHaveBeenCalled();
|
||||
expect(wrapper.vm.confirmCleanup).toEqual(false);
|
||||
expect(showMock).toHaveBeenCalled();
|
||||
expect(wrapper.element).toMatchSnapshot();
|
||||
expect(findModal().html()).toContain(
|
||||
'<strong>To remove your integration, type <code>my-test-cluster</code> to confirm:</strong>',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -3,14 +3,14 @@ import { shallowMount } from '@vue/test-utils';
|
|||
import Visibility from 'visibilityjs';
|
||||
import { nextTick } from 'vue';
|
||||
import fixture from 'test_fixtures/pipelines/pipelines.json';
|
||||
import { createAlert } from '~/flash';
|
||||
import { createAlert } from '~/alert';
|
||||
import Poll from '~/lib/utils/poll';
|
||||
import CommitPipelineStatus from '~/projects/tree/components/commit_pipeline_status_component.vue';
|
||||
import CiIcon from '~/vue_shared/components/ci_icon.vue';
|
||||
|
||||
jest.mock('~/lib/utils/poll');
|
||||
jest.mock('visibilityjs');
|
||||
jest.mock('~/flash');
|
||||
jest.mock('~/alert');
|
||||
|
||||
const mockFetchData = jest.fn();
|
||||
jest.mock('~/projects/tree/services/commit_pipeline_service', () =>
|
||||
|
|
@ -164,7 +164,7 @@ describe('Commit pipeline status component', () => {
|
|||
});
|
||||
});
|
||||
|
||||
it('displays flash error message', () => {
|
||||
it('displays alert error message', () => {
|
||||
expect(createAlert).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ import {
|
|||
HTTP_STATUS_OK,
|
||||
HTTP_STATUS_UNAUTHORIZED,
|
||||
} from '~/lib/utils/http_status';
|
||||
import { createAlert } from '~/flash';
|
||||
import { createAlert } from '~/alert';
|
||||
import { TOAST_MESSAGE } from '~/pipelines/constants';
|
||||
import axios from '~/lib/utils/axios_utils';
|
||||
|
||||
|
|
@ -22,7 +22,7 @@ const $toast = {
|
|||
show: jest.fn(),
|
||||
};
|
||||
|
||||
jest.mock('~/flash');
|
||||
jest.mock('~/alert');
|
||||
|
||||
describe('Pipelines table in Commits and Merge requests', () => {
|
||||
let wrapper;
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
import { GlButton, GlModal } from '@gitlab/ui';
|
||||
import { nextTick } from 'vue';
|
||||
import { createAlert } from '~/flash';
|
||||
import { createAlert } from '~/alert';
|
||||
import Modal from '~/ide/components/new_dropdown/modal.vue';
|
||||
import { createStore } from '~/ide/stores';
|
||||
import { stubComponent } from 'helpers/stub_component';
|
||||
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
|
||||
import { createEntriesFromPaths } from '../../helpers';
|
||||
|
||||
jest.mock('~/flash');
|
||||
jest.mock('~/alert');
|
||||
|
||||
const NEW_NAME = 'babar';
|
||||
|
||||
|
|
@ -339,7 +339,7 @@ describe('new file modal component', () => {
|
|||
});
|
||||
});
|
||||
|
||||
it('does not trigger flash', () => {
|
||||
it('does not trigger alert', () => {
|
||||
expect(createAlert).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
|
@ -358,7 +358,7 @@ describe('new file modal component', () => {
|
|||
});
|
||||
});
|
||||
|
||||
it('does not trigger flash', () => {
|
||||
it('does not trigger alert', () => {
|
||||
expect(createAlert).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
|
@ -378,7 +378,7 @@ describe('new file modal component', () => {
|
|||
triggerSubmitModal();
|
||||
});
|
||||
|
||||
it('creates flash', () => {
|
||||
it('creates alert', () => {
|
||||
expect(createAlert).toHaveBeenCalledWith({
|
||||
message: 'The name "src" is already taken in this directory.',
|
||||
fadeTransition: false,
|
||||
|
|
@ -403,7 +403,7 @@ describe('new file modal component', () => {
|
|||
triggerSubmitModal();
|
||||
});
|
||||
|
||||
it('does not create flash', () => {
|
||||
it('does not create alert', () => {
|
||||
expect(createAlert).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import { range } from 'lodash';
|
|||
import { stubPerformanceWebAPI } from 'helpers/performance';
|
||||
import { TEST_HOST } from 'helpers/test_constants';
|
||||
import testAction from 'helpers/vuex_action_helper';
|
||||
import { createAlert } from '~/flash';
|
||||
import { createAlert } from '~/alert';
|
||||
import { leftSidebarViews, PERMISSION_READ_MR, MAX_MR_FILES_AUTO_OPEN } from '~/ide/constants';
|
||||
import service from '~/ide/services';
|
||||
import { createStore } from '~/ide/stores';
|
||||
|
|
@ -30,7 +30,7 @@ const createMergeRequestChangesCount = (n) =>
|
|||
|
||||
const testGetUrlForPath = (path) => `${TEST_HOST}/test/${path}`;
|
||||
|
||||
jest.mock('~/flash');
|
||||
jest.mock('~/alert');
|
||||
|
||||
describe('IDE store merge request actions', () => {
|
||||
let store;
|
||||
|
|
@ -135,7 +135,7 @@ describe('IDE store merge request actions', () => {
|
|||
mock.onGet(/api\/(.*)\/projects\/abcproject\/merge_requests/).networkError();
|
||||
});
|
||||
|
||||
it('flashes message, if error', () => {
|
||||
it('alerts message, if error', () => {
|
||||
return store
|
||||
.dispatch('getMergeRequestsForBranch', {
|
||||
projectId: TEST_PROJECT,
|
||||
|
|
@ -519,7 +519,7 @@ describe('IDE store merge request actions', () => {
|
|||
);
|
||||
});
|
||||
|
||||
it('flashes message, if error', () => {
|
||||
it('alerts message, if error', () => {
|
||||
store.dispatch.mockRejectedValue();
|
||||
|
||||
return openMergeRequest(store, mr).catch(() => {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import MockAdapter from 'axios-mock-adapter';
|
|||
import { useMockLocationHelper } from 'helpers/mock_window_location_helper';
|
||||
import testAction from 'helpers/vuex_action_helper';
|
||||
import api from '~/api';
|
||||
import { createAlert } from '~/flash';
|
||||
import { createAlert } from '~/alert';
|
||||
import service from '~/ide/services';
|
||||
import { createStore } from '~/ide/stores';
|
||||
import {
|
||||
|
|
@ -19,7 +19,7 @@ import {
|
|||
import { logError } from '~/lib/logger';
|
||||
import axios from '~/lib/utils/axios_utils';
|
||||
|
||||
jest.mock('~/flash');
|
||||
jest.mock('~/alert');
|
||||
jest.mock('~/lib/logger');
|
||||
|
||||
const TEST_PROJECT_ID = 'abc/def';
|
||||
|
|
@ -104,7 +104,7 @@ describe('IDE store project actions', () => {
|
|||
desc | projectPath | responseSuccess | expectedMutations
|
||||
${'does not fetch permissions if project does not exist'} | ${undefined} | ${true} | ${[]}
|
||||
${'fetches permission when project is specified'} | ${TEST_PROJECT_ID} | ${true} | ${[...permissionsMutations]}
|
||||
${'flashes an error if the request fails'} | ${TEST_PROJECT_ID} | ${false} | ${[]}
|
||||
${'alerts an error if the request fails'} | ${TEST_PROJECT_ID} | ${false} | ${[]}
|
||||
`('$desc', async ({ projectPath, expectedMutations, responseSuccess } = {}) => {
|
||||
store.state.currentProjectId = projectPath;
|
||||
if (responseSuccess) {
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import testAction from 'helpers/vuex_action_helper';
|
|||
import eventHub from '~/ide/eventhub';
|
||||
import { createRouter } from '~/ide/ide_router';
|
||||
import { createStore } from '~/ide/stores';
|
||||
import { createAlert } from '~/flash';
|
||||
import { createAlert } from '~/alert';
|
||||
import {
|
||||
init,
|
||||
stageAllChanges,
|
||||
|
|
@ -31,7 +31,7 @@ jest.mock('~/lib/utils/url_utility', () => ({
|
|||
visitUrl: jest.fn(),
|
||||
joinPaths: jest.requireActual('~/lib/utils/url_utility').joinPaths,
|
||||
}));
|
||||
jest.mock('~/flash');
|
||||
jest.mock('~/alert');
|
||||
|
||||
describe('Multi-file store actions', () => {
|
||||
let store;
|
||||
|
|
@ -210,7 +210,7 @@ describe('Multi-file store actions', () => {
|
|||
expect(store.dispatch).toHaveBeenCalledWith('setFileActive', 'test');
|
||||
});
|
||||
|
||||
it('creates flash message if file already exists', async () => {
|
||||
it('creates alert message if file already exists', async () => {
|
||||
const f = file('test', '1', 'blob');
|
||||
store.state.trees['abcproject/mybranch'].tree = [f];
|
||||
store.state.entries[f.path] = f;
|
||||
|
|
@ -927,7 +927,7 @@ describe('Multi-file store actions', () => {
|
|||
expect(document.querySelector('.flash-alert')).toBeNull();
|
||||
});
|
||||
|
||||
it('does not pass the error further and flashes an alert if error is not 404', async () => {
|
||||
it('does not pass the error further and creates an alert if error is not 404', async () => {
|
||||
mock.onGet(/(.*)/).replyOnce(HTTP_STATUS_IM_A_TEAPOT);
|
||||
|
||||
await expect(getBranchData(...callParams)).rejects.toEqual(
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import MockAdapter from 'axios-mock-adapter';
|
||||
import testAction from 'helpers/vuex_action_helper';
|
||||
import { createAlert } from '~/flash';
|
||||
import { createAlert } from '~/alert';
|
||||
import * as actions from '~/ide/stores/modules/terminal/actions/session_controls';
|
||||
import { STARTING, PENDING, STOPPING, STOPPED } from '~/ide/stores/modules/terminal/constants';
|
||||
import * as messages from '~/ide/stores/modules/terminal/messages';
|
||||
|
|
@ -13,7 +13,7 @@ import {
|
|||
HTTP_STATUS_UNPROCESSABLE_ENTITY,
|
||||
} from '~/lib/utils/http_status';
|
||||
|
||||
jest.mock('~/flash');
|
||||
jest.mock('~/alert');
|
||||
|
||||
const TEST_PROJECT_PATH = 'lorem/root';
|
||||
const TEST_BRANCH_ID = 'main';
|
||||
|
|
@ -91,7 +91,7 @@ describe('IDE store terminal session controls actions', () => {
|
|||
});
|
||||
|
||||
describe('receiveStartSessionError', () => {
|
||||
it('flashes message', () => {
|
||||
it('alerts message', () => {
|
||||
actions.receiveStartSessionError({ dispatch });
|
||||
|
||||
expect(createAlert).toHaveBeenCalledWith({
|
||||
|
|
@ -165,7 +165,7 @@ describe('IDE store terminal session controls actions', () => {
|
|||
});
|
||||
|
||||
describe('receiveStopSessionError', () => {
|
||||
it('flashes message', () => {
|
||||
it('alerts message', () => {
|
||||
actions.receiveStopSessionError({ dispatch });
|
||||
|
||||
expect(createAlert).toHaveBeenCalledWith({
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import MockAdapter from 'axios-mock-adapter';
|
||||
import testAction from 'helpers/vuex_action_helper';
|
||||
import { createAlert } from '~/flash';
|
||||
import { createAlert } from '~/alert';
|
||||
import * as actions from '~/ide/stores/modules/terminal/actions/session_status';
|
||||
import { PENDING, RUNNING, STOPPING, STOPPED } from '~/ide/stores/modules/terminal/constants';
|
||||
import * as messages from '~/ide/stores/modules/terminal/messages';
|
||||
|
|
@ -8,7 +8,7 @@ import * as mutationTypes from '~/ide/stores/modules/terminal/mutation_types';
|
|||
import axios from '~/lib/utils/axios_utils';
|
||||
import { HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_OK } from '~/lib/utils/http_status';
|
||||
|
||||
jest.mock('~/flash');
|
||||
jest.mock('~/alert');
|
||||
|
||||
const TEST_SESSION = {
|
||||
id: 7,
|
||||
|
|
@ -113,7 +113,7 @@ describe('IDE store terminal session controls actions', () => {
|
|||
});
|
||||
|
||||
describe('receiveSessionStatusError', () => {
|
||||
it('flashes message', () => {
|
||||
it('alerts message', () => {
|
||||
actions.receiveSessionStatusError({ dispatch });
|
||||
|
||||
expect(createAlert).toHaveBeenCalledWith({
|
||||
|
|
|
|||
|
|
@ -1,18 +1,16 @@
|
|||
import { mount } from '@vue/test-utils';
|
||||
import katex from 'katex';
|
||||
import Vue, { nextTick } from 'vue';
|
||||
import { nextTick } from 'vue';
|
||||
import markdownTableJson from 'test_fixtures/blob/notebook/markdown-table.json';
|
||||
import basicJson from 'test_fixtures/blob/notebook/basic.json';
|
||||
import mathJson from 'test_fixtures/blob/notebook/math.json';
|
||||
import MarkdownComponent from '~/notebook/cells/markdown.vue';
|
||||
import Prompt from '~/notebook/cells/prompt.vue';
|
||||
|
||||
const Component = Vue.extend(MarkdownComponent);
|
||||
|
||||
window.katex = katex;
|
||||
|
||||
function buildCellComponent(cell, relativePath = '', hidePrompt) {
|
||||
return mount(Component, {
|
||||
return mount(MarkdownComponent, {
|
||||
propsData: {
|
||||
cell,
|
||||
hidePrompt,
|
||||
|
|
|
|||
|
|
@ -2,12 +2,12 @@ import MockAdapter from 'axios-mock-adapter';
|
|||
import $ from 'jquery';
|
||||
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
|
||||
import { TEST_HOST } from 'helpers/test_constants';
|
||||
import { createAlert } from '~/flash';
|
||||
import { createAlert } from '~/alert';
|
||||
import axios from '~/lib/utils/axios_utils';
|
||||
import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
|
||||
import ProtectedBranchEdit from '~/protected_branches/protected_branch_edit';
|
||||
|
||||
jest.mock('~/flash');
|
||||
jest.mock('~/alert');
|
||||
|
||||
const TEST_URL = `${TEST_HOST}/url`;
|
||||
const FORCE_PUSH_TOGGLE_TESTID = 'force-push-toggle';
|
||||
|
|
@ -149,7 +149,7 @@ describe('ProtectedBranchEdit', () => {
|
|||
toggle.click();
|
||||
});
|
||||
|
||||
it('flashes error', async () => {
|
||||
it('alerts error', async () => {
|
||||
await axios.waitForAll();
|
||||
|
||||
expect(createAlert).toHaveBeenCalled();
|
||||
|
|
|
|||
|
|
@ -534,6 +534,27 @@ RSpec.describe MarkupHelper do
|
|||
helper.first_line_in_markdown(object, attribute, 100, is_todo: true, project: project)
|
||||
end.not_to change { Gitlab::GitalyClient.get_request_count }
|
||||
end
|
||||
|
||||
it 'strips non-user links' do
|
||||
html = 'This a cool [website](https://gitlab.com/).'
|
||||
|
||||
object = create_object(html)
|
||||
result = helper.first_line_in_markdown(object, attribute, 100, is_todo: true, project: project)
|
||||
|
||||
expect(result).to include('This a cool website.')
|
||||
end
|
||||
|
||||
it 'styles the current user link', :aggregate_failures do
|
||||
another_user = create(:user)
|
||||
html = "Please have a look, @#{user.username} @#{another_user.username}!"
|
||||
|
||||
object = create_object(html)
|
||||
result = helper.first_line_in_markdown(object, attribute, 100, is_todo: true, project: project)
|
||||
links = Nokogiri::HTML.parse(result).css('//a')
|
||||
|
||||
expect(links[0].classes).to include('current-user')
|
||||
expect(links[1].classes).not_to include('current-user')
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the asked attribute can be redacted' do
|
||||
|
|
|
|||
|
|
@ -0,0 +1,87 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe 'google cloud profiler', :aggregate_failures, feature_category: :application_performance do
|
||||
subject(:load_initializer) do
|
||||
load rails_root_join('config/initializers/google_cloud_profiler.rb')
|
||||
end
|
||||
|
||||
shared_examples 'does not call profiler agent' do
|
||||
it do
|
||||
expect(CloudProfilerAgent::Agent).not_to receive(:new)
|
||||
|
||||
load_initializer
|
||||
end
|
||||
end
|
||||
|
||||
context 'when GITLAB_GOOGLE_CLOUD_PROFILER_ENABLED is set to true' do
|
||||
before do
|
||||
stub_env('GITLAB_GOOGLE_CLOUD_PROFILER_ENABLED', true)
|
||||
end
|
||||
|
||||
context 'when GITLAB_GOOGLE_CLOUD_PROFILER_PROJECT_ID is not set' do
|
||||
include_examples 'does not call profiler agent'
|
||||
end
|
||||
|
||||
context 'when GITLAB_GOOGLE_CLOUD_PROFILER_PROJECT_ID is set' do
|
||||
let(:project_id) { 'gitlab-staging-1' }
|
||||
let(:agent) { instance_double(CloudProfilerAgent::Agent) }
|
||||
|
||||
before do
|
||||
stub_env('GITLAB_GOOGLE_CLOUD_PROFILER_PROJECT_ID', project_id)
|
||||
end
|
||||
|
||||
context 'when run in Puma context' do
|
||||
before do
|
||||
allow(::Gitlab::Runtime).to receive(:puma?).and_return(true)
|
||||
allow(::Gitlab::Runtime).to receive(:sidekiq?).and_return(false)
|
||||
end
|
||||
|
||||
it 'calls the agent' do
|
||||
expect(CloudProfilerAgent::Agent)
|
||||
.to receive(:new).with(service: 'gitlab-web', project_id: project_id,
|
||||
logger: an_instance_of(::Gitlab::AppJsonLogger),
|
||||
log_labels: hash_including(
|
||||
message: 'Google Cloud Profiler Ruby',
|
||||
pid: be_a(Integer),
|
||||
worker_id: be_a(String)
|
||||
)).and_return(agent)
|
||||
expect(agent).to receive(:start)
|
||||
|
||||
load_initializer
|
||||
end
|
||||
end
|
||||
|
||||
context 'when run in Sidekiq context' do
|
||||
before do
|
||||
allow(::Gitlab::Runtime).to receive(:puma?).and_return(false)
|
||||
allow(::Gitlab::Runtime).to receive(:sidekiq?).and_return(true)
|
||||
end
|
||||
|
||||
include_examples 'does not call profiler agent'
|
||||
end
|
||||
|
||||
context 'when run in another context' do
|
||||
before do
|
||||
allow(::Gitlab::Runtime).to receive(:puma?).and_return(false)
|
||||
allow(::Gitlab::Runtime).to receive(:sidekiq?).and_return(false)
|
||||
end
|
||||
|
||||
include_examples 'does not call profiler agent'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when GITLAB_GOOGLE_CLOUD_PROFILER_ENABLED is not set' do
|
||||
include_examples 'does not call profiler agent'
|
||||
end
|
||||
|
||||
context 'when GITLAB_GOOGLE_CLOUD_PROFILER_ENABLED is set to false' do
|
||||
before do
|
||||
stub_env('GITLAB_GOOGLE_CLOUD_PROFILER_ENABLED', false)
|
||||
end
|
||||
|
||||
include_examples 'does not call profiler agent'
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,136 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Gitlab::BackgroundMigration::MigrateEvidencesForVulnerabilityFindings,
|
||||
feature_category: :vulnerability_management do
|
||||
let(:vulnerability_occurrences) { table(:vulnerability_occurrences) }
|
||||
let(:vulnerability_finding_evidences) { table(:vulnerability_finding_evidences) }
|
||||
let(:evidence_hash) { { url: 'http://test.com' } }
|
||||
let(:namespace1) { table(:namespaces).create!(name: 'namespace 1', path: 'namespace1') }
|
||||
let(:project1) { table(:projects).create!(namespace_id: namespace1.id, project_namespace_id: namespace1.id) }
|
||||
let(:user) { table(:users).create!(email: 'test1@example.com', projects_limit: 5) }
|
||||
|
||||
let(:scanner1) do
|
||||
table(:vulnerability_scanners).create!(project_id: project1.id, external_id: 'test 1', name: 'test scanner 1')
|
||||
end
|
||||
|
||||
let(:stating_id) { vulnerability_occurrences.pluck(:id).min }
|
||||
let(:end_id) { vulnerability_occurrences.pluck(:id).max }
|
||||
|
||||
let(:migration) do
|
||||
described_class.new(
|
||||
start_id: stating_id,
|
||||
end_id: end_id,
|
||||
batch_table: :vulnerability_occurrences,
|
||||
batch_column: :id,
|
||||
sub_batch_size: 2,
|
||||
pause_ms: 2,
|
||||
connection: ApplicationRecord.connection
|
||||
)
|
||||
end
|
||||
|
||||
subject(:perform_migration) { migration.perform }
|
||||
|
||||
context 'without the presence of evidence key' do
|
||||
before do
|
||||
create_finding!(project1.id, scanner1.id, { other_keys: 'test' })
|
||||
end
|
||||
|
||||
it 'does not create any evidence' do
|
||||
expect(Gitlab::AppLogger).not_to receive(:error)
|
||||
|
||||
expect { perform_migration }.not_to change { vulnerability_finding_evidences.count }
|
||||
end
|
||||
end
|
||||
|
||||
context 'with evidence equals to nil' do
|
||||
before do
|
||||
create_finding!(project1.id, scanner1.id, { evidence: nil })
|
||||
end
|
||||
|
||||
it 'does not create any evidence' do
|
||||
expect(Gitlab::AppLogger).not_to receive(:error)
|
||||
|
||||
expect { perform_migration }.not_to change { vulnerability_finding_evidences.count }
|
||||
end
|
||||
end
|
||||
|
||||
context 'with existing evidence within raw_metadata' do
|
||||
let!(:finding1) { create_finding!(project1.id, scanner1.id, { evidence: evidence_hash }) }
|
||||
let!(:finding2) { create_finding!(project1.id, scanner1.id, { evidence: evidence_hash }) }
|
||||
|
||||
it 'creates new evidence for each finding' do
|
||||
expect(Gitlab::AppLogger).not_to receive(:error)
|
||||
|
||||
expect { perform_migration }.to change { vulnerability_finding_evidences.count }.by(2)
|
||||
end
|
||||
|
||||
context 'when create throws exception StandardError' do
|
||||
before do
|
||||
allow(migration).to receive(:create_evidences).and_raise(StandardError)
|
||||
end
|
||||
|
||||
it 'logs StandardError' do
|
||||
expect(Gitlab::AppLogger).to receive(:error).with({
|
||||
class: described_class.name, message: StandardError.to_s
|
||||
})
|
||||
expect { perform_migration }.not_to change { vulnerability_finding_evidences.count }
|
||||
end
|
||||
end
|
||||
|
||||
context 'when parse throws exception JSON::ParserError' do
|
||||
before do
|
||||
allow(Gitlab::Json).to receive(:parse).and_raise(JSON::ParserError)
|
||||
end
|
||||
|
||||
it 'does not log this error nor create new records' do
|
||||
expect(Gitlab::AppLogger).not_to receive(:error)
|
||||
|
||||
expect { perform_migration }.not_to change { vulnerability_finding_evidences.count }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'with existing evidence records' do
|
||||
let!(:finding) { create_finding!(project1.id, scanner1.id, { evidence: evidence_hash }) }
|
||||
|
||||
before do
|
||||
vulnerability_finding_evidences.create!(vulnerability_occurrence_id: finding.id, data: evidence_hash)
|
||||
end
|
||||
|
||||
it 'does not create new evidence' do
|
||||
expect(Gitlab::AppLogger).not_to receive(:error)
|
||||
|
||||
expect { perform_migration }.not_to change { vulnerability_finding_evidences.count }
|
||||
end
|
||||
|
||||
context 'with non-existing evidence' do
|
||||
let!(:finding3) { create_finding!(project1.id, scanner1.id, { evidence: { url: 'http://secondary.com' } }) }
|
||||
|
||||
it 'creates a new evidence only to the non-existing evidence' do
|
||||
expect(Gitlab::AppLogger).not_to receive(:error)
|
||||
|
||||
expect { perform_migration }.to change { vulnerability_finding_evidences.count }.by(1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def create_finding!(project_id, scanner_id, raw_metadata)
|
||||
vulnerability = table(:vulnerabilities).create!(project_id: project_id, author_id: user.id, title: 'test',
|
||||
severity: 4, confidence: 4, report_type: 0)
|
||||
|
||||
identifier = table(:vulnerability_identifiers).create!(project_id: project_id, external_type: 'uuid-v5',
|
||||
external_id: 'uuid-v5', fingerprint: OpenSSL::Digest::SHA256.hexdigest(vulnerability.id.to_s),
|
||||
name: 'Identifier for UUIDv5 2 2')
|
||||
|
||||
table(:vulnerability_occurrences).create!(
|
||||
vulnerability_id: vulnerability.id, project_id: project_id, scanner_id: scanner_id,
|
||||
primary_identifier_id: identifier.id, name: 'test', severity: 4, confidence: 4, report_type: 0,
|
||||
uuid: SecureRandom.uuid, project_fingerprint: '123qweasdzxc', location: { "image" => "alpine:3.4" },
|
||||
location_fingerprint: 'test', metadata_version: 'test',
|
||||
raw_metadata: raw_metadata.to_json)
|
||||
end
|
||||
end
|
||||
|
|
@ -482,16 +482,35 @@ RSpec.describe Gitlab::Database::Migrations::BatchedBackgroundMigrationHelpers d
|
|||
.not_to raise_error
|
||||
end
|
||||
|
||||
it 'logs a warning when migration does not exist' do
|
||||
expect(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas).to receive(:require_dml_mode!)
|
||||
context 'when specified migration does not exist' do
|
||||
let(:lab_key) { 'DBLAB_ENVIRONMENT' }
|
||||
|
||||
create(:batched_background_migration, :active, migration_attributes.merge(gitlab_schema: :gitlab_something_else))
|
||||
context 'when DBLAB_ENVIRONMENT is not set' do
|
||||
it 'logs a warning' do
|
||||
stub_env(lab_key, nil)
|
||||
expect(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas).to receive(:require_dml_mode!)
|
||||
|
||||
expect(Gitlab::AppLogger).to receive(:warn)
|
||||
.with("Could not find batched background migration for the given configuration: #{configuration}")
|
||||
create(:batched_background_migration, :active, migration_attributes.merge(gitlab_schema: :gitlab_something_else))
|
||||
|
||||
expect { ensure_batched_background_migration_is_finished }
|
||||
.not_to raise_error
|
||||
expect(Gitlab::AppLogger).to receive(:warn)
|
||||
.with("Could not find batched background migration for the given configuration: #{configuration}")
|
||||
|
||||
expect { ensure_batched_background_migration_is_finished }
|
||||
.not_to raise_error
|
||||
end
|
||||
end
|
||||
|
||||
context 'when DBLAB_ENVIRONMENT is set' do
|
||||
it 'raises an error' do
|
||||
stub_env(lab_key, 'foo')
|
||||
expect(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas).to receive(:require_dml_mode!)
|
||||
|
||||
create(:batched_background_migration, :active, migration_attributes.merge(gitlab_schema: :gitlab_something_else))
|
||||
|
||||
expect { ensure_batched_background_migration_is_finished }
|
||||
.to raise_error(Gitlab::Database::Migrations::BatchedBackgroundMigrationHelpers::NonExistentMigrationError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it 'finalizes the migration' do
|
||||
|
|
|
|||
|
|
@ -0,0 +1,31 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
require_migration!
|
||||
|
||||
RSpec.describe MigrateEvidencesFromRawMetadata, :migration, feature_category: :vulnerability_management do
|
||||
let(:migration) { described_class::MIGRATION }
|
||||
|
||||
describe '#up' do
|
||||
it 'schedules a batched background migration' do
|
||||
migrate!
|
||||
|
||||
expect(migration).to have_scheduled_batched_migration(
|
||||
table_name: :vulnerability_occurrences,
|
||||
column_name: :id,
|
||||
interval: described_class::DELAY_INTERVAL,
|
||||
batch_size: described_class::BATCH_SIZE,
|
||||
sub_batch_size: described_class::SUB_BATCH_SIZE
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
describe '#down' do
|
||||
it 'deletes all batched migration records' do
|
||||
migrate!
|
||||
schema_migrate_down!
|
||||
|
||||
expect(migration).not_to have_scheduled_batched_migration
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -93,9 +93,7 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting, feature_category: :er
|
|||
end
|
||||
|
||||
context 'with sentry backend' do
|
||||
before do
|
||||
subject.integrated = false
|
||||
end
|
||||
subject { build(:project_error_tracking_setting, project: project) }
|
||||
|
||||
it 'does not create a new client key' do
|
||||
expect { subject.save! }.not_to change { ErrorTracking::ClientKey.count }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe ProjectHookPolicy do
|
||||
RSpec.describe ProjectHookPolicy, feature_category: :integrations do
|
||||
let_it_be(:user) { create(:user) }
|
||||
|
||||
let(:hook) { create(:project_hook) }
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
|
|||
end
|
||||
end
|
||||
|
||||
shared_examples 'returns 404' do
|
||||
shared_examples 'returns no project settings' do
|
||||
it 'returns no project settings' do
|
||||
make_request
|
||||
|
||||
|
|
@ -48,6 +48,57 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
|
|||
end
|
||||
end
|
||||
|
||||
shared_examples 'returns 400' do
|
||||
it 'rejects request' do
|
||||
make_request
|
||||
|
||||
expect(response).to have_gitlab_http_status(:bad_request)
|
||||
end
|
||||
end
|
||||
|
||||
shared_examples 'returns 401' do
|
||||
it 'rejects request' do
|
||||
make_request
|
||||
|
||||
expect(response).to have_gitlab_http_status(:unauthorized)
|
||||
end
|
||||
end
|
||||
|
||||
shared_examples 'returns 403' do
|
||||
it 'rejects request' do
|
||||
make_request
|
||||
|
||||
expect(response).to have_gitlab_http_status(:forbidden)
|
||||
end
|
||||
end
|
||||
|
||||
shared_examples 'returns 404' do
|
||||
it 'rejects request' do
|
||||
make_request
|
||||
|
||||
expect(response).to have_gitlab_http_status(:not_found)
|
||||
end
|
||||
end
|
||||
|
||||
shared_examples 'returns 400 with `integrated` param required or invalid' do |error|
|
||||
it 'returns 400' do
|
||||
make_request
|
||||
|
||||
expect(response).to have_gitlab_http_status(:bad_request)
|
||||
expect(json_response['error'])
|
||||
.to eq(error)
|
||||
end
|
||||
end
|
||||
|
||||
shared_examples "returns error from UpdateService" do
|
||||
it "returns errors" do
|
||||
make_request
|
||||
|
||||
expect(json_response['http_status']).to eq('forbidden')
|
||||
expect(json_response['message']).to eq('An error occurred')
|
||||
end
|
||||
end
|
||||
|
||||
describe "PATCH /projects/:id/error_tracking/settings" do
|
||||
let(:params) { { active: false } }
|
||||
|
||||
|
|
@ -127,14 +178,34 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
|
|||
end
|
||||
|
||||
context 'without a project setting' do
|
||||
let(:project) { create(:project) }
|
||||
let_it_be(:project) { create(:project) }
|
||||
|
||||
before do
|
||||
project.add_maintainer(user)
|
||||
end
|
||||
|
||||
context 'patch settings' do
|
||||
it_behaves_like 'returns 404'
|
||||
it_behaves_like 'returns no project settings'
|
||||
end
|
||||
end
|
||||
|
||||
context "when ::Projects::Operations::UpdateService responds with an error" do
|
||||
before do
|
||||
allow_next_instance_of(::Projects::Operations::UpdateService) do |service|
|
||||
allow(service)
|
||||
.to receive(:execute)
|
||||
.and_return({ status: :error, message: 'An error occurred', http_status: :forbidden })
|
||||
end
|
||||
end
|
||||
|
||||
context "when integrated" do
|
||||
let(:integrated) { true }
|
||||
|
||||
it_behaves_like 'returns error from UpdateService'
|
||||
end
|
||||
|
||||
context "without integrated" do
|
||||
it_behaves_like 'returns error from UpdateService'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -145,11 +216,7 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
|
|||
end
|
||||
|
||||
context 'patch request' do
|
||||
it 'returns 403' do
|
||||
make_request
|
||||
|
||||
expect(response).to have_gitlab_http_status(:forbidden)
|
||||
end
|
||||
it_behaves_like 'returns 403'
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -159,21 +226,13 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
|
|||
end
|
||||
|
||||
context 'patch request' do
|
||||
it 'returns 403' do
|
||||
make_request
|
||||
|
||||
expect(response).to have_gitlab_http_status(:forbidden)
|
||||
end
|
||||
it_behaves_like 'returns 403'
|
||||
end
|
||||
end
|
||||
|
||||
context 'when authenticated as non-member' do
|
||||
context 'patch request' do
|
||||
it 'returns 404' do
|
||||
make_request
|
||||
|
||||
expect(response).to have_gitlab_http_status(:not_found)
|
||||
end
|
||||
it_behaves_like 'returns 404'
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -181,11 +240,7 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
|
|||
let(:user) { nil }
|
||||
|
||||
context 'patch request' do
|
||||
it 'returns 401 for update request' do
|
||||
make_request
|
||||
|
||||
expect(response).to have_gitlab_http_status(:unauthorized)
|
||||
end
|
||||
it_behaves_like 'returns 401'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -227,7 +282,7 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
|
|||
end
|
||||
|
||||
context 'get settings' do
|
||||
it_behaves_like 'returns 404'
|
||||
it_behaves_like 'returns no project settings'
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -236,11 +291,7 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
|
|||
project.add_reporter(user)
|
||||
end
|
||||
|
||||
it 'returns 403' do
|
||||
make_request
|
||||
|
||||
expect(response).to have_gitlab_http_status(:forbidden)
|
||||
end
|
||||
it_behaves_like 'returns 403'
|
||||
end
|
||||
|
||||
context 'when authenticated as developer' do
|
||||
|
|
@ -248,29 +299,138 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
|
|||
project.add_developer(user)
|
||||
end
|
||||
|
||||
it 'returns 403' do
|
||||
make_request
|
||||
|
||||
expect(response).to have_gitlab_http_status(:forbidden)
|
||||
end
|
||||
it_behaves_like 'returns 403'
|
||||
end
|
||||
|
||||
context 'when authenticated as non-member' do
|
||||
it 'returns 404' do
|
||||
make_request
|
||||
|
||||
expect(response).to have_gitlab_http_status(:not_found)
|
||||
end
|
||||
it_behaves_like 'returns 404'
|
||||
end
|
||||
|
||||
context 'when unauthenticated' do
|
||||
let(:user) { nil }
|
||||
|
||||
it 'returns 401' do
|
||||
make_request
|
||||
it_behaves_like 'returns 401'
|
||||
end
|
||||
end
|
||||
|
||||
expect(response).to have_gitlab_http_status(:unauthorized)
|
||||
describe "PUT /projects/:id/error_tracking/settings" do
|
||||
let(:params) { { active: active, integrated: integrated } }
|
||||
let(:active) { true }
|
||||
let(:integrated) { true }
|
||||
|
||||
def make_request
|
||||
put api("/projects/#{project.id}/error_tracking/settings", user), params: params
|
||||
end
|
||||
|
||||
context 'when authenticated' do
|
||||
context 'as maintainer' do
|
||||
before do
|
||||
project.add_maintainer(user)
|
||||
end
|
||||
|
||||
context "when integrated" do
|
||||
let(:integrated) { true }
|
||||
|
||||
context "with existing setting" do
|
||||
let(:setting) { create(:project_error_tracking_setting, :integrated) }
|
||||
let(:active) { false }
|
||||
|
||||
it "updates a setting" do
|
||||
expect { make_request }.not_to change { ErrorTracking::ProjectErrorTrackingSetting.count }
|
||||
|
||||
expect(response).to have_gitlab_http_status(:ok)
|
||||
|
||||
expect(json_response).to eq(
|
||||
"active" => false,
|
||||
"api_url" => nil,
|
||||
"integrated" => integrated,
|
||||
"project_name" => nil,
|
||||
"sentry_external_url" => nil
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
context "without setting" do
|
||||
let(:active) { true }
|
||||
let_it_be(:project) { create(:project) }
|
||||
|
||||
it "creates a setting" do
|
||||
expect { make_request }.to change { ErrorTracking::ProjectErrorTrackingSetting.count }
|
||||
|
||||
expect(response).to have_gitlab_http_status(:ok)
|
||||
|
||||
expect(json_response).to eq(
|
||||
"active" => true,
|
||||
"api_url" => nil,
|
||||
"integrated" => integrated,
|
||||
"project_name" => nil,
|
||||
"sentry_external_url" => nil
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
context "when ::Projects::Operations::UpdateService responds with an error" do
|
||||
before do
|
||||
allow_next_instance_of(::Projects::Operations::UpdateService) do |service|
|
||||
allow(service)
|
||||
.to receive(:execute)
|
||||
.and_return({ status: :error, message: 'An error occurred', http_status: :forbidden })
|
||||
end
|
||||
end
|
||||
|
||||
it_behaves_like 'returns error from UpdateService'
|
||||
end
|
||||
end
|
||||
|
||||
context "integrated_error_tracking feature disabled" do
|
||||
let(:integrated) { true }
|
||||
|
||||
before do
|
||||
stub_feature_flags(integrated_error_tracking: false)
|
||||
end
|
||||
|
||||
it_behaves_like 'returns 404'
|
||||
end
|
||||
|
||||
context "when integrated param is invalid" do
|
||||
let(:params) { { active: active, integrated: 'invalid_string' } }
|
||||
|
||||
it_behaves_like 'returns 400 with `integrated` param required or invalid', 'integrated is invalid'
|
||||
end
|
||||
|
||||
context "when integrated param is missing" do
|
||||
let(:params) { { active: active } }
|
||||
|
||||
it_behaves_like 'returns 400 with `integrated` param required or invalid', 'integrated is missing'
|
||||
end
|
||||
end
|
||||
|
||||
context 'as reporter' do
|
||||
before do
|
||||
project.add_reporter(user)
|
||||
end
|
||||
|
||||
it_behaves_like 'returns 403'
|
||||
end
|
||||
|
||||
context "as developer" do
|
||||
before do
|
||||
project.add_developer(user)
|
||||
end
|
||||
|
||||
it_behaves_like 'returns 403'
|
||||
end
|
||||
|
||||
context 'as non-member' do
|
||||
it_behaves_like 'returns 404'
|
||||
end
|
||||
end
|
||||
|
||||
context "when unauthorized" do
|
||||
let(:user) { nil }
|
||||
let(:integrated) { true }
|
||||
|
||||
it_behaves_like 'returns 401'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::AddContextService do
|
||||
RSpec.describe MergeRequests::AddContextService, feature_category: :code_review_workflow do
|
||||
let(:project) { create(:project, :repository) }
|
||||
let(:admin) { create(:admin) }
|
||||
let(:merge_request) { create(:merge_request, source_project: project, target_project: project, author: admin) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::AddSpentTimeService do
|
||||
RSpec.describe MergeRequests::AddSpentTimeService, feature_category: :code_review_workflow do
|
||||
let_it_be(:user) { create(:user) }
|
||||
let_it_be(:project) { create(:project, :public, :repository) }
|
||||
let_it_be_with_reload(:merge_request) { create(:merge_request, :simple, :unique_branches, source_project: project) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe ::MergeRequests::AddTodoWhenBuildFailsService do
|
||||
RSpec.describe ::MergeRequests::AddTodoWhenBuildFailsService, feature_category: :code_review_workflow do
|
||||
let(:user) { create(:user) }
|
||||
let(:project) { create(:project, :repository) }
|
||||
let(:sha) { '1234567890abcdef1234567890abcdef12345678' }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::ApprovalService do
|
||||
RSpec.describe MergeRequests::ApprovalService, feature_category: :code_review_workflow do
|
||||
describe '#execute' do
|
||||
let(:user) { create(:user) }
|
||||
let(:merge_request) { create(:merge_request, reviewers: [user]) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::AssignIssuesService do
|
||||
RSpec.describe MergeRequests::AssignIssuesService, feature_category: :code_review_workflow do
|
||||
let(:user) { create(:user) }
|
||||
let(:project) { create(:project, :public, :repository) }
|
||||
let(:issue) { create(:issue, project: project) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::CleanupRefsService do
|
||||
RSpec.describe MergeRequests::CleanupRefsService, feature_category: :code_review_workflow do
|
||||
describe '.schedule' do
|
||||
let(:merge_request) { create(:merge_request) }
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::Conflicts::ListService do
|
||||
RSpec.describe MergeRequests::Conflicts::ListService, feature_category: :code_review_workflow do
|
||||
describe '#can_be_resolved_in_ui?' do
|
||||
def create_merge_request(source_branch, target_branch = 'conflict-start')
|
||||
create(:merge_request, source_branch: source_branch, target_branch: target_branch, merge_status: :unchecked) do |mr|
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::Conflicts::ResolveService do
|
||||
RSpec.describe MergeRequests::Conflicts::ResolveService, feature_category: :code_review_workflow do
|
||||
include ProjectForksHelper
|
||||
let(:user) { create(:user) }
|
||||
let(:project) { create(:project, :public, :repository) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::CreateApprovalEventService do
|
||||
RSpec.describe MergeRequests::CreateApprovalEventService, feature_category: :code_review_workflow do
|
||||
let(:user) { create(:user) }
|
||||
let(:merge_request) { create(:merge_request) }
|
||||
let(:project) { merge_request.project }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::CreatePipelineService, :clean_gitlab_redis_cache do
|
||||
RSpec.describe MergeRequests::CreatePipelineService, :clean_gitlab_redis_cache, feature_category: :code_review_workflow do
|
||||
include ProjectForksHelper
|
||||
|
||||
let_it_be(:project, refind: true) { create(:project, :repository) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,8 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::DeleteNonLatestDiffsService, :clean_gitlab_redis_shared_state do
|
||||
RSpec.describe MergeRequests::DeleteNonLatestDiffsService, :clean_gitlab_redis_shared_state,
|
||||
feature_category: :code_review_workflow do
|
||||
let(:merge_request) { create(:merge_request) }
|
||||
|
||||
let!(:subject) { described_class.new(merge_request) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::ExecuteApprovalHooksService do
|
||||
RSpec.describe MergeRequests::ExecuteApprovalHooksService, feature_category: :code_review_workflow do
|
||||
let(:user) { create(:user) }
|
||||
let(:merge_request) { create(:merge_request) }
|
||||
let(:project) { merge_request.project }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::FfMergeService do
|
||||
RSpec.describe MergeRequests::FfMergeService, feature_category: :code_review_workflow do
|
||||
let(:user) { create(:user) }
|
||||
let(:user2) { create(:user) }
|
||||
let(:merge_request) do
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require "spec_helper"
|
||||
|
||||
RSpec.describe MergeRequests::GetUrlsService do
|
||||
RSpec.describe MergeRequests::GetUrlsService, feature_category: :code_review_workflow do
|
||||
include ProjectForksHelper
|
||||
|
||||
let(:project) { create(:project, :public, :repository) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::HandleAssigneesChangeService do
|
||||
RSpec.describe MergeRequests::HandleAssigneesChangeService, feature_category: :code_review_workflow do
|
||||
let_it_be(:project) { create(:project, :repository) }
|
||||
let_it_be(:user) { create(:user) }
|
||||
let_it_be(:assignee) { create(:user) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::MarkReviewerReviewedService do
|
||||
RSpec.describe MergeRequests::MarkReviewerReviewedService, feature_category: :code_review_workflow do
|
||||
let(:current_user) { create(:user) }
|
||||
let(:merge_request) { create(:merge_request, reviewers: [current_user]) }
|
||||
let(:reviewer) { merge_request.merge_request_reviewers.find_by(user_id: current_user.id) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::MergeOrchestrationService do
|
||||
RSpec.describe MergeRequests::MergeOrchestrationService, feature_category: :code_review_workflow do
|
||||
let_it_be(:maintainer) { create(:user) }
|
||||
|
||||
let(:merge_params) { { sha: merge_request.diff_head_sha } }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::MergeService do
|
||||
RSpec.describe MergeRequests::MergeService, feature_category: :code_review_workflow do
|
||||
include ExclusiveLeaseHelpers
|
||||
|
||||
let_it_be(:user) { create(:user) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::MergeToRefService do
|
||||
RSpec.describe MergeRequests::MergeToRefService, feature_category: :code_review_workflow do
|
||||
shared_examples_for 'MergeService for target ref' do
|
||||
it 'target_ref has the same state of target branch' do
|
||||
repo = merge_request.target_project.repository
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::Mergeability::CheckBaseService do
|
||||
RSpec.describe MergeRequests::Mergeability::CheckBaseService, feature_category: :code_review_workflow do
|
||||
subject(:check_base_service) { described_class.new(merge_request: merge_request, params: params) }
|
||||
|
||||
let(:merge_request) { double }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::Mergeability::CheckBrokenStatusService do
|
||||
RSpec.describe MergeRequests::Mergeability::CheckBrokenStatusService, feature_category: :code_review_workflow do
|
||||
subject(:check_broken_status) { described_class.new(merge_request: merge_request, params: {}) }
|
||||
|
||||
let(:merge_request) { build(:merge_request) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::Mergeability::CheckCiStatusService do
|
||||
RSpec.describe MergeRequests::Mergeability::CheckCiStatusService, feature_category: :code_review_workflow do
|
||||
subject(:check_ci_status) { described_class.new(merge_request: merge_request, params: params) }
|
||||
|
||||
let(:merge_request) { build(:merge_request) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::Mergeability::CheckDiscussionsStatusService do
|
||||
RSpec.describe MergeRequests::Mergeability::CheckDiscussionsStatusService, feature_category: :code_review_workflow do
|
||||
subject(:check_discussions_status) { described_class.new(merge_request: merge_request, params: params) }
|
||||
|
||||
let(:merge_request) { build(:merge_request) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::Mergeability::CheckDraftStatusService do
|
||||
RSpec.describe MergeRequests::Mergeability::CheckDraftStatusService, feature_category: :code_review_workflow do
|
||||
subject(:check_draft_status) { described_class.new(merge_request: merge_request, params: {}) }
|
||||
|
||||
let(:merge_request) { build(:merge_request) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::Mergeability::CheckOpenStatusService do
|
||||
RSpec.describe MergeRequests::Mergeability::CheckOpenStatusService, feature_category: :code_review_workflow do
|
||||
subject(:check_open_status) { described_class.new(merge_request: merge_request, params: {}) }
|
||||
|
||||
let(:merge_request) { build(:merge_request) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe ::MergeRequests::Mergeability::DetailedMergeStatusService do
|
||||
RSpec.describe ::MergeRequests::Mergeability::DetailedMergeStatusService, feature_category: :code_review_workflow do
|
||||
subject(:detailed_merge_status) { described_class.new(merge_request: merge_request).execute }
|
||||
|
||||
context 'when merge status is cannot_be_merged_rechecking' do
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::Mergeability::Logger, :request_store do
|
||||
RSpec.describe MergeRequests::Mergeability::Logger, :request_store, feature_category: :code_review_workflow do
|
||||
let_it_be(:merge_request) { create(:merge_request) }
|
||||
|
||||
subject(:logger) { described_class.new(merge_request: merge_request) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::Mergeability::RunChecksService, :clean_gitlab_redis_cache do
|
||||
RSpec.describe MergeRequests::Mergeability::RunChecksService, :clean_gitlab_redis_cache, feature_category: :code_review_workflow do
|
||||
subject(:run_checks) { described_class.new(merge_request: merge_request, params: {}) }
|
||||
|
||||
describe '#execute' do
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::MergeabilityCheckService, :clean_gitlab_redis_shared_state do
|
||||
RSpec.describe MergeRequests::MergeabilityCheckService, :clean_gitlab_redis_shared_state, feature_category: :code_review_workflow do
|
||||
shared_examples_for 'unmergeable merge request' do
|
||||
it 'updates or keeps merge status as cannot_be_merged' do
|
||||
subject
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::MigrateExternalDiffsService do
|
||||
RSpec.describe MergeRequests::MigrateExternalDiffsService, feature_category: :code_review_workflow do
|
||||
let(:merge_request) { create(:merge_request) }
|
||||
let(:diff) { merge_request.merge_request_diff }
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::PostMergeService do
|
||||
RSpec.describe MergeRequests::PostMergeService, feature_category: :code_review_workflow do
|
||||
include ProjectForksHelper
|
||||
|
||||
let_it_be(:user) { create(:user) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::PushOptionsHandlerService do
|
||||
RSpec.describe MergeRequests::PushOptionsHandlerService, feature_category: :source_code_management do
|
||||
include ProjectForksHelper
|
||||
|
||||
let_it_be(:parent_group) { create(:group, :public) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,8 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::ReloadDiffsService, :use_clean_rails_memory_store_caching do
|
||||
RSpec.describe MergeRequests::ReloadDiffsService, :use_clean_rails_memory_store_caching,
|
||||
feature_category: :code_review_workflow do
|
||||
let(:current_user) { create(:user) }
|
||||
let(:merge_request) { create(:merge_request) }
|
||||
let(:subject) { described_class.new(merge_request, current_user) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::ReloadMergeHeadDiffService do
|
||||
RSpec.describe MergeRequests::ReloadMergeHeadDiffService, feature_category: :code_review_workflow do
|
||||
let(:merge_request) { create(:merge_request) }
|
||||
|
||||
subject { described_class.new(merge_request).execute }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::ReopenService do
|
||||
RSpec.describe MergeRequests::ReopenService, feature_category: :code_review_workflow do
|
||||
let(:user) { create(:user) }
|
||||
let(:user2) { create(:user) }
|
||||
let(:guest) { create(:user) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::RequestReviewService do
|
||||
RSpec.describe MergeRequests::RequestReviewService, feature_category: :code_review_workflow do
|
||||
let(:current_user) { create(:user) }
|
||||
let(:user) { create(:user) }
|
||||
let(:merge_request) { create(:merge_request, reviewers: [user]) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::ResolveTodosService do
|
||||
RSpec.describe MergeRequests::ResolveTodosService, feature_category: :code_review_workflow do
|
||||
let_it_be(:merge_request) { create(:merge_request) }
|
||||
let_it_be(:user) { create(:user) }
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::ResolvedDiscussionNotificationService do
|
||||
RSpec.describe MergeRequests::ResolvedDiscussionNotificationService, feature_category: :code_review_workflow do
|
||||
let(:merge_request) { create(:merge_request) }
|
||||
let(:user) { create(:user) }
|
||||
let(:project) { merge_request.project }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::SquashService do
|
||||
RSpec.describe MergeRequests::SquashService, feature_category: :source_code_management do
|
||||
let(:service) { described_class.new(project: project, current_user: user, params: { merge_request: merge_request }) }
|
||||
let(:user) { project.first_owner }
|
||||
let(:project) { create(:project, :repository) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::UpdateAssigneesService do
|
||||
RSpec.describe MergeRequests::UpdateAssigneesService, feature_category: :code_review_workflow do
|
||||
include AfterNextHelpers
|
||||
|
||||
let_it_be(:group) { create(:group, :public) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe MergeRequests::UpdateReviewersService do
|
||||
RSpec.describe MergeRequests::UpdateReviewersService, feature_category: :code_review_workflow do
|
||||
include AfterNextHelpers
|
||||
|
||||
let_it_be(:group) { create(:group, :public) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Metrics::Dashboard::Annotations::CreateService do
|
||||
RSpec.describe Metrics::Dashboard::Annotations::CreateService, feature_category: :metrics do
|
||||
let_it_be(:user) { create(:user) }
|
||||
|
||||
let(:description) { 'test annotation' }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Metrics::Dashboard::Annotations::DeleteService do
|
||||
RSpec.describe Metrics::Dashboard::Annotations::DeleteService, feature_category: :metrics do
|
||||
let(:user) { create(:user) }
|
||||
let(:service_instance) { described_class.new(user, annotation) }
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Metrics::Dashboard::CloneDashboardService, :use_clean_rails_memory_store_caching do
|
||||
RSpec.describe Metrics::Dashboard::CloneDashboardService, :use_clean_rails_memory_store_caching, feature_category: :metrics do
|
||||
include MetricsDashboardHelpers
|
||||
|
||||
let_it_be(:user) { create(:user) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,8 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Metrics::Dashboard::ClusterDashboardService, :use_clean_rails_memory_store_caching do
|
||||
RSpec.describe Metrics::Dashboard::ClusterDashboardService, :use_clean_rails_memory_store_caching,
|
||||
feature_category: :metrics do
|
||||
include MetricsDashboardHelpers
|
||||
|
||||
let_it_be(:user) { create(:user) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,8 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Metrics::Dashboard::ClusterMetricsEmbedService, :use_clean_rails_memory_store_caching do
|
||||
RSpec.describe Metrics::Dashboard::ClusterMetricsEmbedService, :use_clean_rails_memory_store_caching,
|
||||
feature_category: :metrics do
|
||||
include MetricsDashboardHelpers
|
||||
using RSpec::Parameterized::TableSyntax
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,8 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Metrics::Dashboard::CustomDashboardService, :use_clean_rails_memory_store_caching do
|
||||
RSpec.describe Metrics::Dashboard::CustomDashboardService, :use_clean_rails_memory_store_caching,
|
||||
feature_category: :metrics do
|
||||
include MetricsDashboardHelpers
|
||||
|
||||
let_it_be(:user) { create(:user) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Metrics::Dashboard::CustomMetricEmbedService do
|
||||
RSpec.describe Metrics::Dashboard::CustomMetricEmbedService, feature_category: :metrics do
|
||||
include MetricsDashboardHelpers
|
||||
|
||||
let_it_be(:project, reload: true) { build(:project) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,8 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Metrics::Dashboard::DefaultEmbedService, :use_clean_rails_memory_store_caching do
|
||||
RSpec.describe Metrics::Dashboard::DefaultEmbedService, :use_clean_rails_memory_store_caching,
|
||||
feature_category: :metrics do
|
||||
include MetricsDashboardHelpers
|
||||
|
||||
let_it_be(:project) { build(:project) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,8 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Metrics::Dashboard::DynamicEmbedService, :use_clean_rails_memory_store_caching do
|
||||
RSpec.describe Metrics::Dashboard::DynamicEmbedService, :use_clean_rails_memory_store_caching,
|
||||
feature_category: :metrics do
|
||||
include MetricsDashboardHelpers
|
||||
|
||||
let_it_be(:project) { build(:project) }
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Metrics::Dashboard::GitlabAlertEmbedService do
|
||||
RSpec.describe Metrics::Dashboard::GitlabAlertEmbedService, feature_category: :metrics do
|
||||
include MetricsDashboardHelpers
|
||||
|
||||
let_it_be(:alert) { create(:prometheus_alert) }
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue