Running with gitlab-runner 10.7.0 (7c273476)
  on docker-auto-scale-com 9538b0ab
Using Docker executor with image dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.3.7-golang-1.9-git-2.17-chrome-65.0-node-8.x-yarn-1.2-postgresql-9.6 ...
Starting service postgres:9.2 ...
Pulling docker image postgres:9.2 ...
Using docker image sha256:18cdbca56093c841d28e629eb8acd4224afe0aa4c57c839351fc181888b8a470 for postgres:9.2 ...
Starting service redis:alpine ...
Pulling docker image redis:alpine ...
Using docker image sha256:98bd7cfc43b8ef0ff130465e3d5427c0771002c2f35a6a9b62cb2d04602bed0a for redis:alpine ...
Starting service docker.elastic.co/elasticsearch/elasticsearch:5.5.2 ...
Pulling docker image docker.elastic.co/elasticsearch/elasticsearch:5.5.2 ...
Using docker image sha256:ca27036dd5e7fb5aaaa0401342f8160aaff408422cd3b19af85be83478256745 for docker.elastic.co/elasticsearch/elasticsearch:5.5.2 ...
Waiting for services to be up and running...
Pulling docker image dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.3.7-golang-1.9-git-2.17-chrome-65.0-node-8.x-yarn-1.2-postgresql-9.6 ...
Using docker image sha256:fdb36b9f5c89bf331a5884b2bc013addfeac245b65b8051a0e6652fb6d46f8a9 for dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.3.7-golang-1.9-git-2.17-chrome-65.0-node-8.x-yarn-1.2-postgresql-9.6 ...
section_start:1525273472:prepare_script
Running on runner-9538b0ab-project-278964-concurrent-0 via runner-9538b0ab-gsrm-1525271893-9b9aa440...
section_end:1525273474:prepare_script
section_start:1525273474:get_sources
Cloning repository for 5841-geo-basesyncservice-should-prune-the-geo-temporary-directory-before-fetching with git depth set to 20...
Cloning into '/builds/gitlab-org/gitlab-ee'...
Checking out 73af10c1 as 5841-geo-basesyncservice-should-prune-the-geo-temporary-directory-before-fetching...
Skipping Git submodules setup
section_end:1525273495:get_sources
section_start:1525273495:restore_cache
Checking cache for ruby-2.3.7-with-yarn...
Downloading cache.zip from http://runners-cache-4-internal.gitlab.com:444/runner/project/278964/ruby-2.3.7-with-yarn 
Successfully extracted cache
section_end:1525273515:restore_cache
section_start:1525273515:download_artifacts
Downloading artifacts for retrieve-tests-metadata (66066850)...
Downloading artifacts from coordinator... ok        id=66066850 responseStatus=200 OK token=gcRYWULP
Downloading artifacts for compile-assets (66066853)...
Downloading artifacts from coordinator... ok        id=66066853 responseStatus=200 OK token=ZUdCpByW
Downloading artifacts for setup-test-env (66066854)...
Downloading artifacts from coordinator... ok        id=66066854 responseStatus=200 OK token=S7SxDrPM
WARNING: tmp/tests/gitlab-shell/.gitlab_shell_secret: chmod tmp/tests/gitlab-shell/.gitlab_shell_secret: no such file or directory (suppressing repeats) 
section_end:1525273553:download_artifacts
section_start:1525273553:build_script
$ bundle --version
Bundler version 1.16.1
$ date
Wed May  2 15:05:54 UTC 2018
$ source scripts/utils.sh
$ date
Wed May  2 15:05:54 UTC 2018
$ source scripts/prepare_build.sh
The Gemfile's dependencies are satisfied
Successfully installed knapsack-1.16.0
1 gem installed
DROP DATABASE
NOTICE:  database "gitlabhq_test" does not exist, skipping
CREATE DATABASE
CREATE ROLE
GRANT
-- enable_extension("plpgsql")
   -> 0.0105s
-- enable_extension("pg_trgm")
   -> 0.0107s
-- create_table("abuse_reports", {:force=>:cascade})
   -> 0.0097s
-- create_table("appearances", {:force=>:cascade})
   -> 0.0066s
-- create_table("application_settings", {:force=>:cascade})
   -> 0.0376s
-- create_table("approvals", {:force=>:cascade})
   -> 0.0046s
-- add_index("approvals", ["merge_request_id"], {:name=>"index_approvals_on_merge_request_id", :using=>:btree})
   -> 0.0043s
-- create_table("approver_groups", {:force=>:cascade})
   -> 0.0062s
-- add_index("approver_groups", ["group_id"], {:name=>"index_approver_groups_on_group_id", :using=>:btree})
   -> 0.0040s
-- add_index("approver_groups", ["target_id", "target_type"], {:name=>"index_approver_groups_on_target_id_and_target_type", :using=>:btree})
   -> 0.0038s
-- create_table("approvers", {:force=>:cascade})
   -> 0.0058s
-- add_index("approvers", ["target_id", "target_type"], {:name=>"index_approvers_on_target_id_and_target_type", :using=>:btree})
   -> 0.0040s
-- add_index("approvers", ["user_id"], {:name=>"index_approvers_on_user_id", :using=>:btree})
   -> 0.0037s
-- create_table("audit_events", {:force=>:cascade})
   -> 0.0096s
-- add_index("audit_events", ["entity_id", "entity_type"], {:name=>"index_audit_events_on_entity_id_and_entity_type", :using=>:btree})
   -> 0.0043s
-- create_table("award_emoji", {:force=>:cascade})
   -> 0.0063s
-- add_index("award_emoji", ["awardable_type", "awardable_id"], {:name=>"index_award_emoji_on_awardable_type_and_awardable_id", :using=>:btree})
   -> 0.0042s
-- add_index("award_emoji", ["user_id", "name"], {:name=>"index_award_emoji_on_user_id_and_name", :using=>:btree})
   -> 0.0040s
-- create_table("badges", {:force=>:cascade})
   -> 0.0067s
-- add_index("badges", ["group_id"], {:name=>"index_badges_on_group_id", :using=>:btree})
   -> 0.0041s
-- add_index("badges", ["project_id"], {:name=>"index_badges_on_project_id", :using=>:btree})
   -> 0.0043s
-- create_table("board_assignees", {:force=>:cascade})
   -> 0.0041s
-- add_index("board_assignees", ["board_id", "assignee_id"], {:name=>"index_board_assignees_on_board_id_and_assignee_id", :unique=>true, :using=>:btree})
   -> 0.0038s
-- create_table("board_labels", {:force=>:cascade})
   -> 0.0044s
-- add_index("board_labels", ["board_id", "label_id"], {:name=>"index_board_labels_on_board_id_and_label_id", :unique=>true, :using=>:btree})
   -> 0.0040s
-- create_table("boards", {:force=>:cascade})
   -> 0.0070s
-- add_index("boards", ["group_id"], {:name=>"index_boards_on_group_id", :using=>:btree})
   -> 0.0044s
-- add_index("boards", ["milestone_id"], {:name=>"index_boards_on_milestone_id", :using=>:btree})
   -> 0.0039s
-- add_index("boards", ["project_id"], {:name=>"index_boards_on_project_id", :using=>:btree})
   -> 0.0039s
-- create_table("broadcast_messages", {:force=>:cascade})
   -> 0.0064s
-- add_index("broadcast_messages", ["starts_at", "ends_at", "id"], {:name=>"index_broadcast_messages_on_starts_at_and_ends_at_and_id", :using=>:btree})
   -> 0.0039s
-- create_table("chat_names", {:force=>:cascade})
   -> 0.0060s
-- add_index("chat_names", ["service_id", "team_id", "chat_id"], {:name=>"index_chat_names_on_service_id_and_team_id_and_chat_id", :unique=>true, :using=>:btree})
   -> 0.0037s
-- add_index("chat_names", ["user_id", "service_id"], {:name=>"index_chat_names_on_user_id_and_service_id", :unique=>true, :using=>:btree})
   -> 0.0040s
-- create_table("chat_teams", {:force=>:cascade})
   -> 0.0060s
-- add_index("chat_teams", ["namespace_id"], {:name=>"index_chat_teams_on_namespace_id", :unique=>true, :using=>:btree})
   -> 0.0038s
-- create_table("ci_build_trace_section_names", {:force=>:cascade})
   -> 0.0059s
-- add_index("ci_build_trace_section_names", ["project_id", "name"], {:name=>"index_ci_build_trace_section_names_on_project_id_and_name", :unique=>true, :using=>:btree})
   -> 0.0039s
-- create_table("ci_build_trace_sections", {:force=>:cascade})
   -> 0.0045s
-- add_index("ci_build_trace_sections", ["build_id", "section_name_id"], {:name=>"index_ci_build_trace_sections_on_build_id_and_section_name_id", :unique=>true, :using=>:btree})
   -> 0.0039s
-- add_index("ci_build_trace_sections", ["project_id"], {:name=>"index_ci_build_trace_sections_on_project_id", :using=>:btree})
   -> 0.0040s
-- add_index("ci_build_trace_sections", ["section_name_id"], {:name=>"index_ci_build_trace_sections_on_section_name_id", :using=>:btree})
   -> 0.0038s
-- create_table("ci_builds", {:force=>:cascade})
   -> 0.0077s
-- add_index("ci_builds", ["artifacts_expire_at"], {:name=>"index_ci_builds_on_artifacts_expire_at", :where=>"(artifacts_file <> ''::text)", :using=>:btree})
   -> 0.0041s
-- add_index("ci_builds", ["auto_canceled_by_id"], {:name=>"index_ci_builds_on_auto_canceled_by_id", :using=>:btree})
   -> 0.0039s
-- add_index("ci_builds", ["commit_id", "stage_idx", "created_at"], {:name=>"index_ci_builds_on_commit_id_and_stage_idx_and_created_at", :using=>:btree})
   -> 0.0040s
-- add_index("ci_builds", ["commit_id", "status", "type"], {:name=>"index_ci_builds_on_commit_id_and_status_and_type", :using=>:btree})
   -> 0.0039s
-- add_index("ci_builds", ["commit_id", "type", "name", "ref"], {:name=>"index_ci_builds_on_commit_id_and_type_and_name_and_ref", :using=>:btree})
   -> 0.0041s
-- add_index("ci_builds", ["commit_id", "type", "ref"], {:name=>"index_ci_builds_on_commit_id_and_type_and_ref", :using=>:btree})
   -> 0.0040s
-- add_index("ci_builds", ["project_id", "id"], {:name=>"index_ci_builds_on_project_id_and_id", :using=>:btree})
   -> 0.0039s
-- add_index("ci_builds", ["protected"], {:name=>"index_ci_builds_on_protected", :using=>:btree})
   -> 0.0041s
-- add_index("ci_builds", ["runner_id"], {:name=>"index_ci_builds_on_runner_id", :using=>:btree})
   -> 0.0041s
-- add_index("ci_builds", ["stage_id"], {:name=>"index_ci_builds_on_stage_id", :using=>:btree})
   -> 0.0040s
-- add_index("ci_builds", ["status", "type", "runner_id"], {:name=>"index_ci_builds_on_status_and_type_and_runner_id", :using=>:btree})
   -> 0.0039s
-- add_index("ci_builds", ["status"], {:name=>"index_ci_builds_on_status", :using=>:btree})
   -> 0.0041s
-- add_index("ci_builds", ["token"], {:name=>"index_ci_builds_on_token", :unique=>true, :using=>:btree})
   -> 0.0041s
-- add_index("ci_builds", ["updated_at"], {:name=>"index_ci_builds_on_updated_at", :using=>:btree})
   -> 0.0038s
-- add_index("ci_builds", ["user_id"], {:name=>"index_ci_builds_on_user_id", :using=>:btree})
   -> 0.0040s
-- create_table("ci_builds_metadata", {:force=>:cascade})
   -> 0.0051s
-- add_index("ci_builds_metadata", ["build_id"], {:name=>"index_ci_builds_metadata_on_build_id", :unique=>true, :using=>:btree})
   -> 0.0040s
-- add_index("ci_builds_metadata", ["project_id"], {:name=>"index_ci_builds_metadata_on_project_id", :using=>:btree})
   -> 0.0040s
-- create_table("ci_group_variables", {:force=>:cascade})
   -> 0.0071s
-- add_index("ci_group_variables", ["group_id", "key"], {:name=>"index_ci_group_variables_on_group_id_and_key", :unique=>true, :using=>:btree})
   -> 0.0044s
-- create_table("ci_job_artifacts", {:force=>:cascade})
   -> 0.0070s
-- add_index("ci_job_artifacts", ["expire_at", "job_id"], {:name=>"index_ci_job_artifacts_on_expire_at_and_job_id", :using=>:btree})
   -> 0.0047s
-- add_index("ci_job_artifacts", ["file_store"], {:name=>"index_ci_job_artifacts_on_file_store", :using=>:btree})
   -> 0.0039s
-- add_index("ci_job_artifacts", ["job_id", "file_type"], {:name=>"index_ci_job_artifacts_on_job_id_and_file_type", :unique=>true, :using=>:btree})
   -> 0.0039s
-- add_index("ci_job_artifacts", ["project_id"], {:name=>"index_ci_job_artifacts_on_project_id", :using=>:btree})
   -> 0.0038s
-- create_table("ci_pipeline_chat_data", {:id=>:bigserial, :force=>:cascade})
   -> 0.0071s
-- add_index("ci_pipeline_chat_data", ["pipeline_id"], {:name=>"index_ci_pipeline_chat_data_on_pipeline_id", :unique=>true, :using=>:btree})
   -> 0.0041s
-- create_table("ci_pipeline_schedule_variables", {:force=>:cascade})
   -> 0.0065s
-- add_index("ci_pipeline_schedule_variables", ["pipeline_schedule_id", "key"], {:name=>"index_ci_pipeline_schedule_variables_on_schedule_id_and_key", :unique=>true, :using=>:btree})
   -> 0.0051s
-- create_table("ci_pipeline_schedules", {:force=>:cascade})
   -> 0.0071s
-- add_index("ci_pipeline_schedules", ["next_run_at", "active"], {:name=>"index_ci_pipeline_schedules_on_next_run_at_and_active", :using=>:btree})
   -> 0.0042s
-- add_index("ci_pipeline_schedules", ["project_id"], {:name=>"index_ci_pipeline_schedules_on_project_id", :using=>:btree})
   -> 0.0039s
-- create_table("ci_pipeline_variables", {:force=>:cascade})
   -> 0.0064s
-- add_index("ci_pipeline_variables", ["pipeline_id", "key"], {:name=>"index_ci_pipeline_variables_on_pipeline_id_and_key", :unique=>true, :using=>:btree})
   -> 0.0044s
-- create_table("ci_pipelines", {:force=>:cascade})
   -> 0.0071s
-- add_index("ci_pipelines", ["auto_canceled_by_id"], {:name=>"index_ci_pipelines_on_auto_canceled_by_id", :using=>:btree})
   -> 0.0040s
-- add_index("ci_pipelines", ["pipeline_schedule_id"], {:name=>"index_ci_pipelines_on_pipeline_schedule_id", :using=>:btree})
   -> 0.0039s
-- add_index("ci_pipelines", ["project_id", "ref", "status", "id"], {:name=>"index_ci_pipelines_on_project_id_and_ref_and_status_and_id", :using=>:btree})
   -> 0.0043s
-- add_index("ci_pipelines", ["project_id", "sha"], {:name=>"index_ci_pipelines_on_project_id_and_sha", :using=>:btree})
   -> 0.0043s
-- add_index("ci_pipelines", ["project_id"], {:name=>"index_ci_pipelines_on_project_id", :using=>:btree})
   -> 0.0041s
-- add_index("ci_pipelines", ["status"], {:name=>"index_ci_pipelines_on_status", :using=>:btree})
   -> 0.0038s
-- add_index("ci_pipelines", ["user_id"], {:name=>"index_ci_pipelines_on_user_id", :using=>:btree})
   -> 0.0039s
-- create_table("ci_runner_projects", {:force=>:cascade})
   -> 0.0043s
-- add_index("ci_runner_projects", ["project_id"], {:name=>"index_ci_runner_projects_on_project_id", :using=>:btree})
   -> 0.0039s
-- add_index("ci_runner_projects", ["runner_id"], {:name=>"index_ci_runner_projects_on_runner_id", :using=>:btree})
   -> 0.0039s
-- create_table("ci_runners", {:force=>:cascade})
   -> 0.0081s
-- add_index("ci_runners", ["contacted_at"], {:name=>"index_ci_runners_on_contacted_at", :using=>:btree})
   -> 0.0038s
-- add_index("ci_runners", ["is_shared"], {:name=>"index_ci_runners_on_is_shared", :using=>:btree})
   -> 0.0040s
-- add_index("ci_runners", ["locked"], {:name=>"index_ci_runners_on_locked", :using=>:btree})
   -> 0.0040s
-- add_index("ci_runners", ["token"], {:name=>"index_ci_runners_on_token", :using=>:btree})
   -> 0.0038s
-- create_table("ci_sources_pipelines", {:force=>:cascade})
   -> 0.0044s
-- add_index("ci_sources_pipelines", ["pipeline_id"], {:name=>"index_ci_sources_pipelines_on_pipeline_id", :using=>:btree})
   -> 0.0047s
-- add_index("ci_sources_pipelines", ["project_id"], {:name=>"index_ci_sources_pipelines_on_project_id", :using=>:btree})
   -> 0.0044s
-- add_index("ci_sources_pipelines", ["source_job_id"], {:name=>"index_ci_sources_pipelines_on_source_job_id", :using=>:btree})
   -> 0.0042s
-- add_index("ci_sources_pipelines", ["source_pipeline_id"], {:name=>"index_ci_sources_pipelines_on_source_pipeline_id", :using=>:btree})
   -> 0.0039s
-- add_index("ci_sources_pipelines", ["source_project_id"], {:name=>"index_ci_sources_pipelines_on_source_project_id", :using=>:btree})
   -> 0.0037s
-- create_table("ci_stages", {:force=>:cascade})
   -> 0.0063s
-- add_index("ci_stages", ["pipeline_id", "name"], {:name=>"index_ci_stages_on_pipeline_id_and_name", :unique=>true, :using=>:btree})
   -> 0.0039s
-- add_index("ci_stages", ["pipeline_id"], {:name=>"index_ci_stages_on_pipeline_id", :using=>:btree})
   -> 0.0037s
-- add_index("ci_stages", ["project_id"], {:name=>"index_ci_stages_on_project_id", :using=>:btree})
   -> 0.0038s
-- create_table("ci_trigger_requests", {:force=>:cascade})
   -> 0.0062s
-- add_index("ci_trigger_requests", ["commit_id"], {:name=>"index_ci_trigger_requests_on_commit_id", :using=>:btree})
   -> 0.0037s
-- create_table("ci_triggers", {:force=>:cascade})
   -> 0.0060s
-- add_index("ci_triggers", ["project_id"], {:name=>"index_ci_triggers_on_project_id", :using=>:btree})
   -> 0.0038s
-- create_table("ci_variables", {:force=>:cascade})
   -> 0.0069s
-- add_index("ci_variables", ["project_id", "key", "environment_scope"], {:name=>"index_ci_variables_on_project_id_and_key_and_environment_scope", :unique=>true, :using=>:btree})
   -> 0.0039s
-- create_table("cluster_platforms_kubernetes", {:force=>:cascade})
   -> 0.0063s
-- add_index("cluster_platforms_kubernetes", ["cluster_id"], {:name=>"index_cluster_platforms_kubernetes_on_cluster_id", :unique=>true, :using=>:btree})
   -> 0.0039s
-- create_table("cluster_projects", {:force=>:cascade})
   -> 0.0044s
-- add_index("cluster_projects", ["cluster_id"], {:name=>"index_cluster_projects_on_cluster_id", :using=>:btree})
   -> 0.0039s
-- add_index("cluster_projects", ["project_id"], {:name=>"index_cluster_projects_on_project_id", :using=>:btree})
   -> 0.0037s
-- create_table("cluster_providers_gcp", {:force=>:cascade})
   -> 0.0063s
-- add_index("cluster_providers_gcp", ["cluster_id"], {:name=>"index_cluster_providers_gcp_on_cluster_id", :unique=>true, :using=>:btree})
   -> 0.0038s
-- create_table("clusters", {:force=>:cascade})
   -> 0.0069s
-- add_index("clusters", ["enabled"], {:name=>"index_clusters_on_enabled", :using=>:btree})
   -> 0.0038s
-- add_index("clusters", ["user_id"], {:name=>"index_clusters_on_user_id", :using=>:btree})
   -> 0.0039s
-- create_table("clusters_applications_helm", {:force=>:cascade})
   -> 0.0062s
-- create_table("clusters_applications_ingress", {:force=>:cascade})
   -> 0.0070s
-- create_table("clusters_applications_prometheus", {:force=>:cascade})
   -> 0.0062s
-- create_table("clusters_applications_runners", {:force=>:cascade})
   -> 0.0068s
-- add_index("clusters_applications_runners", ["cluster_id"], {:name=>"index_clusters_applications_runners_on_cluster_id", :unique=>true, :using=>:btree})
   -> 0.0097s
-- add_index("clusters_applications_runners", ["runner_id"], {:name=>"index_clusters_applications_runners_on_runner_id", :using=>:btree})
   -> 0.0040s
-- create_table("container_repositories", {:force=>:cascade})
   -> 0.0063s
-- add_index("container_repositories", ["project_id", "name"], {:name=>"index_container_repositories_on_project_id_and_name", :unique=>true, :using=>:btree})
   -> 0.0045s
-- add_index("container_repositories", ["project_id"], {:name=>"index_container_repositories_on_project_id", :using=>:btree})
   -> 0.0041s
-- create_table("conversational_development_index_metrics", {:force=>:cascade})
   -> 0.0082s
-- create_table("deploy_keys_projects", {:force=>:cascade})
   -> 0.0045s
-- add_index("deploy_keys_projects", ["project_id"], {:name=>"index_deploy_keys_projects_on_project_id", :using=>:btree})
   -> 0.0037s
-- create_table("deploy_tokens", {:force=>:cascade})
   -> 0.0071s
-- add_index("deploy_tokens", ["token", "expires_at", "id"], {:name=>"index_deploy_tokens_on_token_and_expires_at_and_id", :where=>"(revoked IS FALSE)", :using=>:btree})
   -> 0.0039s
-- add_index("deploy_tokens", ["token"], {:name=>"index_deploy_tokens_on_token", :unique=>true, :using=>:btree})
   -> 0.0036s
-- create_table("deployments", {:force=>:cascade})
   -> 0.0061s
-- add_index("deployments", ["created_at"], {:name=>"index_deployments_on_created_at", :using=>:btree})
   -> 0.0038s
-- add_index("deployments", ["environment_id", "id"], {:name=>"index_deployments_on_environment_id_and_id", :using=>:btree})
   -> 0.0036s
-- add_index("deployments", ["environment_id", "iid", "project_id"], {:name=>"index_deployments_on_environment_id_and_iid_and_project_id", :using=>:btree})
   -> 0.0036s
-- add_index("deployments", ["project_id", "iid"], {:name=>"index_deployments_on_project_id_and_iid", :unique=>true, :using=>:btree})
   -> 0.0039s
-- create_table("emails", {:force=>:cascade})
   -> 0.0071s
-- add_index("emails", ["confirmation_token"], {:name=>"index_emails_on_confirmation_token", :unique=>true, :using=>:btree})
   -> 0.0041s
-- add_index("emails", ["email"], {:name=>"index_emails_on_email", :unique=>true, :using=>:btree})
   -> 0.0040s
-- add_index("emails", ["user_id"], {:name=>"index_emails_on_user_id", :using=>:btree})
   -> 0.0046s
-- create_table("environments", {:force=>:cascade})
   -> 0.0061s
-- add_index("environments", ["project_id", "name"], {:name=>"index_environments_on_project_id_and_name", :unique=>true, :using=>:btree})
   -> 0.0038s
-- add_index("environments", ["project_id", "slug"], {:name=>"index_environments_on_project_id_and_slug", :unique=>true, :using=>:btree})
   -> 0.0041s
-- create_table("epic_issues", {:force=>:cascade})
   -> 0.0045s
-- add_index("epic_issues", ["epic_id"], {:name=>"index_epic_issues_on_epic_id", :using=>:btree})
   -> 0.0038s
-- add_index("epic_issues", ["issue_id"], {:name=>"index_epic_issues_on_issue_id", :unique=>true, :using=>:btree})
   -> 0.0036s
-- create_table("epic_metrics", {:force=>:cascade})
   -> 0.0040s
-- add_index("epic_metrics", ["epic_id"], {:name=>"index_epic_metrics", :using=>:btree})
   -> 0.0037s
-- create_table("epics", {:force=>:cascade})
   -> 0.0064s
-- add_index("epics", ["assignee_id"], {:name=>"index_epics_on_assignee_id", :using=>:btree})
   -> 0.0039s
-- add_index("epics", ["author_id"], {:name=>"index_epics_on_author_id", :using=>:btree})
   -> 0.0040s
-- add_index("epics", ["end_date"], {:name=>"index_epics_on_end_date", :using=>:btree})
   -> 0.0036s
-- add_index("epics", ["group_id"], {:name=>"index_epics_on_group_id", :using=>:btree})
   -> 0.0044s
-- add_index("epics", ["iid"], {:name=>"index_epics_on_iid", :using=>:btree})
   -> 0.0036s
-- add_index("epics", ["milestone_id"], {:name=>"index_milestone", :using=>:btree})
   -> 0.0038s
-- add_index("epics", ["start_date"], {:name=>"index_epics_on_start_date", :using=>:btree})
   -> 0.0039s
-- create_table("events", {:force=>:cascade})
   -> 0.0070s
-- add_index("events", ["action"], {:name=>"index_events_on_action", :using=>:btree})
   -> 0.0044s
-- add_index("events", ["author_id", "project_id"], {:name=>"index_events_on_author_id_and_project_id", :using=>:btree})
   -> 0.0037s
-- add_index("events", ["project_id", "id"], {:name=>"index_events_on_project_id_and_id", :using=>:btree})
   -> 0.0036s
-- add_index("events", ["target_type", "target_id"], {:name=>"index_events_on_target_type_and_target_id", :using=>:btree})
   -> 0.0036s
-- create_table("feature_gates", {:force=>:cascade})
   -> 0.0058s
-- add_index("feature_gates", ["feature_key", "key", "value"], {:name=>"index_feature_gates_on_feature_key_and_key_and_value", :unique=>true, :using=>:btree})
   -> 0.0037s
-- create_table("features", {:force=>:cascade})
   -> 0.0059s
-- add_index("features", ["key"], {:name=>"index_features_on_key", :unique=>true, :using=>:btree})
   -> 0.0037s
-- create_table("fork_network_members", {:force=>:cascade})
   -> 0.0037s
-- add_index("fork_network_members", ["fork_network_id"], {:name=>"index_fork_network_members_on_fork_network_id", :using=>:btree})
   -> 0.0035s
-- add_index("fork_network_members", ["project_id"], {:name=>"index_fork_network_members_on_project_id", :unique=>true, :using=>:btree})
   -> 0.0038s
-- create_table("fork_networks", {:force=>:cascade})
   -> 0.0056s
-- add_index("fork_networks", ["root_project_id"], {:name=>"index_fork_networks_on_root_project_id", :unique=>true, :using=>:btree})
   -> 0.0035s
-- create_table("forked_project_links", {:force=>:cascade})
   -> 0.0041s
-- add_index("forked_project_links", ["forked_to_project_id"], {:name=>"index_forked_project_links_on_forked_to_project_id", :unique=>true, :using=>:btree})
   -> 0.0037s
-- create_table("gcp_clusters", {:force=>:cascade})
   -> 0.0068s
-- add_index("gcp_clusters", ["project_id"], {:name=>"index_gcp_clusters_on_project_id", :unique=>true, :using=>:btree})
   -> 0.0037s
-- create_table("geo_event_log", {:id=>:bigserial, :force=>:cascade})
   -> 0.0040s
-- add_index("geo_event_log", ["repositories_changed_event_id"], {:name=>"index_geo_event_log_on_repositories_changed_event_id", :using=>:btree})
   -> 0.0041s
-- add_index("geo_event_log", ["repository_created_event_id"], {:name=>"index_geo_event_log_on_repository_created_event_id", :using=>:btree})
   -> 0.0035s
-- add_index("geo_event_log", ["repository_deleted_event_id"], {:name=>"index_geo_event_log_on_repository_deleted_event_id", :using=>:btree})
   -> 0.0034s
-- add_index("geo_event_log", ["repository_renamed_event_id"], {:name=>"index_geo_event_log_on_repository_renamed_event_id", :using=>:btree})
   -> 0.0037s
-- add_index("geo_event_log", ["repository_updated_event_id"], {:name=>"index_geo_event_log_on_repository_updated_event_id", :using=>:btree})
   -> 0.0036s
-- create_table("geo_hashed_storage_attachments_events", {:id=>:bigserial, :force=>:cascade})
   -> 0.0056s
-- add_index("geo_hashed_storage_attachments_events", ["project_id"], {:name=>"index_geo_hashed_storage_attachments_events_on_project_id", :using=>:btree})
   -> 0.0039s
-- create_table("geo_hashed_storage_migrated_events", {:id=>:bigserial, :force=>:cascade})
   -> 0.0060s
-- add_index("geo_hashed_storage_migrated_events", ["project_id"], {:name=>"index_geo_hashed_storage_migrated_events_on_project_id", :using=>:btree})
   -> 0.0038s
-- create_table("geo_job_artifact_deleted_events", {:id=>:bigserial, :force=>:cascade})
   -> 0.0062s
-- add_index("geo_job_artifact_deleted_events", ["job_artifact_id"], {:name=>"index_geo_job_artifact_deleted_events_on_job_artifact_id", :using=>:btree})
   -> 0.0037s
-- create_table("geo_lfs_object_deleted_events", {:id=>:bigserial, :force=>:cascade})
   -> 0.0058s
-- add_index("geo_lfs_object_deleted_events", ["lfs_object_id"], {:name=>"index_geo_lfs_object_deleted_events_on_lfs_object_id", :using=>:btree})
   -> 0.0038s
-- create_table("geo_node_namespace_links", {:force=>:cascade})
   -> 0.0040s
-- add_index("geo_node_namespace_links", ["geo_node_id", "namespace_id"], {:name=>"index_geo_node_namespace_links_on_geo_node_id_and_namespace_id", :unique=>true, :using=>:btree})
   -> 0.0046s
-- add_index("geo_node_namespace_links", ["geo_node_id"], {:name=>"index_geo_node_namespace_links_on_geo_node_id", :using=>:btree})
   -> 0.0035s
-- create_table("geo_node_statuses", {:force=>:cascade})
   -> 0.0067s
-- add_index("geo_node_statuses", ["geo_node_id"], {:name=>"index_geo_node_statuses_on_geo_node_id", :unique=>true, :using=>:btree})
   -> 0.0038s
-- create_table("geo_nodes", {:force=>:cascade})
   -> 0.0071s
-- add_index("geo_nodes", ["access_key"], {:name=>"index_geo_nodes_on_access_key", :using=>:btree})
   -> 0.0038s
-- add_index("geo_nodes", ["primary"], {:name=>"index_geo_nodes_on_primary", :using=>:btree})
   -> 0.0039s
-- add_index("geo_nodes", ["url"], {:name=>"index_geo_nodes_on_url", :unique=>true, :using=>:btree})
   -> 0.0037s
-- create_table("geo_repositories_changed_events", {:id=>:bigserial, :force=>:cascade})
   -> 0.0041s
-- add_index("geo_repositories_changed_events", ["geo_node_id"], {:name=>"index_geo_repositories_changed_events_on_geo_node_id", :using=>:btree})
   -> 0.0038s
-- create_table("geo_repository_created_events", {:id=>:bigserial, :force=>:cascade})
   -> 0.0061s
-- add_index("geo_repository_created_events", ["project_id"], {:name=>"index_geo_repository_created_events_on_project_id", :using=>:btree})
   -> 0.0040s
-- create_table("geo_repository_deleted_events", {:id=>:bigserial, :force=>:cascade})
   -> 0.0063s
-- add_index("geo_repository_deleted_events", ["project_id"], {:name=>"index_geo_repository_deleted_events_on_project_id", :using=>:btree})
   -> 0.0039s
-- create_table("geo_repository_renamed_events", {:id=>:bigserial, :force=>:cascade})
   -> 0.0065s
-- add_index("geo_repository_renamed_events", ["project_id"], {:name=>"index_geo_repository_renamed_events_on_project_id", :using=>:btree})
   -> 0.0039s
-- create_table("geo_repository_updated_events", {:id=>:bigserial, :force=>:cascade})
   -> 0.0068s
-- add_index("geo_repository_updated_events", ["project_id"], {:name=>"index_geo_repository_updated_events_on_project_id", :using=>:btree})
   -> 0.0039s
-- add_index("geo_repository_updated_events", ["source"], {:name=>"index_geo_repository_updated_events_on_source", :using=>:btree})
   -> 0.0037s
-- create_table("geo_upload_deleted_events", {:id=>:bigserial, :force=>:cascade})
   -> 0.0062s
-- add_index("geo_upload_deleted_events", ["upload_id"], {:name=>"index_geo_upload_deleted_events_on_upload_id", :using=>:btree})
   -> 0.0048s
-- create_table("gpg_key_subkeys", {:force=>:cascade})
   -> 0.0065s
-- add_index("gpg_key_subkeys", ["fingerprint"], {:name=>"index_gpg_key_subkeys_on_fingerprint", :unique=>true, :using=>:btree})
   -> 0.0039s
-- add_index("gpg_key_subkeys", ["gpg_key_id"], {:name=>"index_gpg_key_subkeys_on_gpg_key_id", :using=>:btree})
   -> 0.0035s
-- add_index("gpg_key_subkeys", ["keyid"], {:name=>"index_gpg_key_subkeys_on_keyid", :unique=>true, :using=>:btree})
   -> 0.0038s
-- create_table("gpg_keys", {:force=>:cascade})
   -> 0.0061s
-- add_index("gpg_keys", ["fingerprint"], {:name=>"index_gpg_keys_on_fingerprint", :unique=>true, :using=>:btree})
   -> 0.0050s
-- add_index("gpg_keys", ["primary_keyid"], {:name=>"index_gpg_keys_on_primary_keyid", :unique=>true, :using=>:btree})
   -> 0.0045s
-- add_index("gpg_keys", ["user_id"], {:name=>"index_gpg_keys_on_user_id", :using=>:btree})
   -> 0.0038s
-- create_table("gpg_signatures", {:force=>:cascade})
   -> 0.0068s
-- add_index("gpg_signatures", ["commit_sha"], {:name=>"index_gpg_signatures_on_commit_sha", :unique=>true, :using=>:btree})
   -> 0.0038s
-- add_index("gpg_signatures", ["gpg_key_id"], {:name=>"index_gpg_signatures_on_gpg_key_id", :using=>:btree})
   -> 0.0039s
-- add_index("gpg_signatures", ["gpg_key_primary_keyid"], {:name=>"index_gpg_signatures_on_gpg_key_primary_keyid", :using=>:btree})
   -> 0.0037s
-- add_index("gpg_signatures", ["gpg_key_subkey_id"], {:name=>"index_gpg_signatures_on_gpg_key_subkey_id", :using=>:btree})
   -> 0.0037s
-- add_index("gpg_signatures", ["project_id"], {:name=>"index_gpg_signatures_on_project_id", :using=>:btree})
   -> 0.0037s
-- create_table("group_custom_attributes", {:force=>:cascade})
   -> 0.0060s
-- add_index("group_custom_attributes", ["group_id", "key"], {:name=>"index_group_custom_attributes_on_group_id_and_key", :unique=>true, :using=>:btree})
   -> 0.0038s
-- add_index("group_custom_attributes", ["key", "value"], {:name=>"index_group_custom_attributes_on_key_and_value", :using=>:btree})
   -> 0.0037s
-- create_table("historical_data", {:force=>:cascade})
   -> 0.0041s
-- create_table("identities", {:force=>:cascade})
   -> 0.0058s
-- add_index("identities", ["user_id"], {:name=>"index_identities_on_user_id", :using=>:btree})
   -> 0.0037s
-- create_table("index_statuses", {:force=>:cascade})
   -> 0.0076s
-- add_index("index_statuses", ["project_id"], {:name=>"index_index_statuses_on_project_id", :unique=>true, :using=>:btree})
   -> 0.0039s
-- create_table("internal_ids", {:id=>:bigserial, :force=>:cascade})
   -> 0.0041s
-- add_index("internal_ids", ["usage", "namespace_id"], {:name=>"index_internal_ids_on_usage_and_namespace_id", :unique=>true, :where=>"(namespace_id IS NOT NULL)", :using=>:btree})
   -> 0.0039s
-- add_index("internal_ids", ["usage", "project_id"], {:name=>"index_internal_ids_on_usage_and_project_id", :unique=>true, :where=>"(project_id IS NOT NULL)", :using=>:btree})
   -> 0.0039s
-- create_table("issue_assignees", {:id=>false, :force=>:cascade})
   -> 0.0017s
-- add_index("issue_assignees", ["issue_id", "user_id"], {:name=>"index_issue_assignees_on_issue_id_and_user_id", :unique=>true, :using=>:btree})
   -> 0.0041s
-- add_index("issue_assignees", ["user_id"], {:name=>"index_issue_assignees_on_user_id", :using=>:btree})
   -> 0.0036s
-- create_table("issue_links", {:force=>:cascade})
   -> 0.0043s
-- add_index("issue_links", ["source_id", "target_id"], {:name=>"index_issue_links_on_source_id_and_target_id", :unique=>true, :using=>:btree})
   -> 0.0037s
-- add_index("issue_links", ["source_id"], {:name=>"index_issue_links_on_source_id", :using=>:btree})
   -> 0.0038s
-- add_index("issue_links", ["target_id"], {:name=>"index_issue_links_on_target_id", :using=>:btree})
   -> 0.0038s
-- create_table("issue_metrics", {:force=>:cascade})
   -> 0.0042s
-- add_index("issue_metrics", ["issue_id"], {:name=>"index_issue_metrics", :using=>:btree})
   -> 0.0122s
-- create_table("issues", {:force=>:cascade})
   -> 0.0087s
-- add_index("issues", ["author_id"], {:name=>"index_issues_on_author_id", :using=>:btree})
   -> 0.0041s
-- add_index("issues", ["confidential"], {:name=>"index_issues_on_confidential", :using=>:btree})
   -> 0.0040s
-- add_index("issues", ["description"], {:name=>"index_issues_on_description_trigram", :using=>:gin, :opclasses=>{"description"=>"gin_trgm_ops"}})
   -> 0.0025s
-- add_index("issues", ["milestone_id"], {:name=>"index_issues_on_milestone_id", :using=>:btree})
   -> 0.0038s
-- add_index("issues", ["moved_to_id"], {:name=>"index_issues_on_moved_to_id", :where=>"(moved_to_id IS NOT NULL)", :using=>:btree})
   -> 0.0040s
-- add_index("issues", ["project_id", "created_at", "id", "state"], {:name=>"index_issues_on_project_id_and_created_at_and_id_and_state", :using=>:btree})
   -> 0.0040s
-- add_index("issues", ["project_id", "due_date", "id", "state"], {:name=>"idx_issues_on_project_id_and_due_date_and_id_and_state_partial", :where=>"(due_date IS NOT NULL)", :using=>:btree})
   -> 0.0039s
-- add_index("issues", ["project_id", "iid"], {:name=>"index_issues_on_project_id_and_iid", :unique=>true, :using=>:btree})
   -> 0.0038s
-- add_index("issues", ["project_id", "updated_at", "id", "state"], {:name=>"index_issues_on_project_id_and_updated_at_and_id_and_state", :using=>:btree})
   -> 0.0050s
-- add_index("issues", ["relative_position"], {:name=>"index_issues_on_relative_position", :using=>:btree})
   -> 0.0043s
-- add_index("issues", ["state"], {:name=>"index_issues_on_state", :using=>:btree})
   -> 0.0040s
-- add_index("issues", ["title"], {:name=>"index_issues_on_title_trigram", :using=>:gin, :opclasses=>{"title"=>"gin_trgm_ops"}})
   -> 0.0024s
-- add_index("issues", ["updated_at"], {:name=>"index_issues_on_updated_at", :using=>:btree})
   -> 0.0041s
-- add_index("issues", ["updated_by_id"], {:name=>"index_issues_on_updated_by_id", :where=>"(updated_by_id IS NOT NULL)", :using=>:btree})
   -> 0.0039s
-- create_table("keys", {:force=>:cascade})
   -> 0.0067s
-- add_index("keys", ["fingerprint"], {:name=>"index_keys_on_fingerprint", :unique=>true, :using=>:btree})
   -> 0.0042s
-- add_index("keys", ["user_id"], {:name=>"index_keys_on_user_id", :using=>:btree})
   -> 0.0038s
-- create_table("label_links", {:force=>:cascade})
   -> 0.0063s
-- add_index("label_links", ["label_id"], {:name=>"index_label_links_on_label_id", :using=>:btree})
   -> 0.0038s
-- add_index("label_links", ["target_id", "target_type"], {:name=>"index_label_links_on_target_id_and_target_type", :using=>:btree})
   -> 0.0039s
-- create_table("label_priorities", {:force=>:cascade})
   -> 0.0042s
-- add_index("label_priorities", ["priority"], {:name=>"index_label_priorities_on_priority", :using=>:btree})
   -> 0.0039s
-- add_index("label_priorities", ["project_id", "label_id"], {:name=>"index_label_priorities_on_project_id_and_label_id", :unique=>true, :using=>:btree})
   -> 0.0038s
-- create_table("labels", {:force=>:cascade})
   -> 0.0066s
-- add_index("labels", ["group_id", "project_id", "title"], {:name=>"index_labels_on_group_id_and_project_id_and_title", :unique=>true, :using=>:btree})
   -> 0.0045s
-- add_index("labels", ["project_id"], {:name=>"index_labels_on_project_id", :using=>:btree})
   -> 0.0041s
-- add_index("labels", ["template"], {:name=>"index_labels_on_template", :where=>"template", :using=>:btree})
   -> 0.0039s
-- add_index("labels", ["title"], {:name=>"index_labels_on_title", :using=>:btree})
   -> 0.0049s
-- add_index("labels", ["type", "project_id"], {:name=>"index_labels_on_type_and_project_id", :using=>:btree})
   -> 0.0039s
-- create_table("ldap_group_links", {:force=>:cascade})
   -> 0.0062s
-- create_table("lfs_file_locks", {:force=>:cascade})
   -> 0.0061s
-- add_index("lfs_file_locks", ["project_id", "path"], {:name=>"index_lfs_file_locks_on_project_id_and_path", :unique=>true, :using=>:btree})
   -> 0.0039s
-- add_index("lfs_file_locks", ["user_id"], {:name=>"index_lfs_file_locks_on_user_id", :using=>:btree})
   -> 0.0039s
-- create_table("lfs_objects", {:force=>:cascade})
   -> 0.0062s
-- add_index("lfs_objects", ["oid"], {:name=>"index_lfs_objects_on_oid", :unique=>true, :using=>:btree})
   -> 0.0039s
-- create_table("lfs_objects_projects", {:force=>:cascade})
   -> 0.0050s
-- add_index("lfs_objects_projects", ["project_id"], {:name=>"index_lfs_objects_projects_on_project_id", :using=>:btree})
   -> 0.0038s
-- create_table("licenses", {:force=>:cascade})
   -> 0.0070s
-- create_table("lists", {:force=>:cascade})
   -> 0.0047s
-- add_index("lists", ["board_id", "label_id"], {:name=>"index_lists_on_board_id_and_label_id", :unique=>true, :using=>:btree})
   -> 0.0042s
-- add_index("lists", ["label_id"], {:name=>"index_lists_on_label_id", :using=>:btree})
   -> 0.0038s
-- create_table("members", {:force=>:cascade})
   -> 0.0074s
-- add_index("members", ["access_level"], {:name=>"index_members_on_access_level", :using=>:btree})
   -> 0.0038s
-- add_index("members", ["invite_token"], {:name=>"index_members_on_invite_token", :unique=>true, :using=>:btree})
   -> 0.0036s
-- add_index("members", ["requested_at"], {:name=>"index_members_on_requested_at", :using=>:btree})
   -> 0.0038s
-- add_index("members", ["source_id", "source_type"], {:name=>"index_members_on_source_id_and_source_type", :using=>:btree})
   -> 0.0040s
-- add_index("members", ["user_id"], {:name=>"index_members_on_user_id", :using=>:btree})
   -> 0.0036s
-- create_table("merge_request_diff_commits", {:id=>false, :force=>:cascade})
   -> 0.0036s
-- add_index("merge_request_diff_commits", ["merge_request_diff_id", "relative_order"], {:name=>"index_merge_request_diff_commits_on_mr_diff_id_and_order", :unique=>true, :using=>:btree})
   -> 0.0037s
-- add_index("merge_request_diff_commits", ["sha"], {:name=>"index_merge_request_diff_commits_on_sha", :using=>:btree})
   -> 0.0037s
-- create_table("merge_request_diff_files", {:id=>false, :force=>:cascade})
   -> 0.0039s
-- add_index("merge_request_diff_files", ["merge_request_diff_id", "relative_order"], {:name=>"index_merge_request_diff_files_on_mr_diff_id_and_order", :unique=>true, :using=>:btree})
   -> 0.0037s
-- create_table("merge_request_diffs", {:force=>:cascade})
   -> 0.0062s
-- add_index("merge_request_diffs", ["merge_request_id", "id"], {:name=>"index_merge_request_diffs_on_merge_request_id_and_id", :using=>:btree})
   -> 0.0040s
-- create_table("merge_request_metrics", {:force=>:cascade})
   -> 0.0042s
-- add_index("merge_request_metrics", ["first_deployed_to_production_at"], {:name=>"index_merge_request_metrics_on_first_deployed_to_production_at", :using=>:btree})
   -> 0.0038s
-- add_index("merge_request_metrics", ["merge_request_id"], {:name=>"index_merge_request_metrics", :using=>:btree})
   -> 0.0034s
-- add_index("merge_request_metrics", ["pipeline_id"], {:name=>"index_merge_request_metrics_on_pipeline_id", :using=>:btree})
   -> 0.0037s
-- create_table("merge_requests", {:force=>:cascade})
   -> 0.0080s
-- add_index("merge_requests", ["assignee_id"], {:name=>"index_merge_requests_on_assignee_id", :using=>:btree})
   -> 0.0039s
-- add_index("merge_requests", ["author_id"], {:name=>"index_merge_requests_on_author_id", :using=>:btree})
   -> 0.0038s
-- add_index("merge_requests", ["created_at"], {:name=>"index_merge_requests_on_created_at", :using=>:btree})
   -> 0.0037s
-- add_index("merge_requests", ["description"], {:name=>"index_merge_requests_on_description_trigram", :using=>:gin, :opclasses=>{"description"=>"gin_trgm_ops"}})
   -> 0.0023s
-- add_index("merge_requests", ["head_pipeline_id"], {:name=>"index_merge_requests_on_head_pipeline_id", :using=>:btree})
   -> 0.0037s
-- add_index("merge_requests", ["latest_merge_request_diff_id"], {:name=>"index_merge_requests_on_latest_merge_request_diff_id", :using=>:btree})
   -> 0.0039s
-- add_index("merge_requests", ["merge_user_id"], {:name=>"index_merge_requests_on_merge_user_id", :where=>"(merge_user_id IS NOT NULL)", :using=>:btree})
   -> 0.0039s
-- add_index("merge_requests", ["milestone_id"], {:name=>"index_merge_requests_on_milestone_id", :using=>:btree})
   -> 0.0037s
-- add_index("merge_requests", ["source_branch"], {:name=>"index_merge_requests_on_source_branch", :using=>:btree})
   -> 0.0039s
-- add_index("merge_requests", ["source_project_id", "source_branch"], {:name=>"index_merge_requests_on_source_project_and_branch_state_opened", :where=>"((state)::text = 'opened'::text)", :using=>:btree})
   -> 0.0037s
-- add_index("merge_requests", ["source_project_id", "source_branch"], {:name=>"index_merge_requests_on_source_project_id_and_source_branch", :using=>:btree})
   -> 0.0037s
-- add_index("merge_requests", ["target_branch"], {:name=>"index_merge_requests_on_target_branch", :using=>:btree})
   -> 0.0035s
-- add_index("merge_requests", ["target_project_id", "iid"], {:name=>"index_merge_requests_on_target_project_id_and_iid", :unique=>true, :using=>:btree})
   -> 0.0036s
-- add_index("merge_requests", ["target_project_id", "merge_commit_sha", "id"], {:name=>"index_merge_requests_on_tp_id_and_merge_commit_sha_and_id", :using=>:btree})
   -> 0.0037s
-- add_index("merge_requests", ["title"], {:name=>"index_merge_requests_on_title", :using=>:btree})
   -> 0.0036s
-- add_index("merge_requests", ["title"], {:name=>"index_merge_requests_on_title_trigram", :using=>:gin, :opclasses=>{"title"=>"gin_trgm_ops"}})
   -> 0.0023s
-- add_index("merge_requests", ["updated_by_id"], {:name=>"index_merge_requests_on_updated_by_id", :where=>"(updated_by_id IS NOT NULL)", :using=>:btree})
   -> 0.0038s
-- create_table("merge_requests_closing_issues", {:force=>:cascade})
   -> 0.0040s
-- add_index("merge_requests_closing_issues", ["issue_id"], {:name=>"index_merge_requests_closing_issues_on_issue_id", :using=>:btree})
   -> 0.0036s
-- add_index("merge_requests_closing_issues", ["merge_request_id"], {:name=>"index_merge_requests_closing_issues_on_merge_request_id", :using=>:btree})
   -> 0.0038s
-- create_table("milestones", {:force=>:cascade})
   -> 0.0059s
-- add_index("milestones", ["description"], {:name=>"index_milestones_on_description_trigram", :using=>:gin, :opclasses=>{"description"=>"gin_trgm_ops"}})
   -> 0.0023s
-- add_index("milestones", ["due_date"], {:name=>"index_milestones_on_due_date", :using=>:btree})
   -> 0.0035s
-- add_index("milestones", ["group_id"], {:name=>"index_milestones_on_group_id", :using=>:btree})
   -> 0.0036s
-- add_index("milestones", ["project_id", "iid"], {:name=>"index_milestones_on_project_id_and_iid", :unique=>true, :using=>:btree})
   -> 0.0065s
-- add_index("milestones", ["title"], {:name=>"index_milestones_on_title", :using=>:btree})
   -> 0.0047s
-- add_index("milestones", ["title"], {:name=>"index_milestones_on_title_trigram", :using=>:gin, :opclasses=>{"title"=>"gin_trgm_ops"}})
   -> 0.0023s
-- create_table("namespace_statistics", {:force=>:cascade})
   -> 0.0042s
-- add_index("namespace_statistics", ["namespace_id"], {:name=>"index_namespace_statistics_on_namespace_id", :unique=>true, :using=>:btree})
   -> 0.0035s
-- create_table("namespaces", {:force=>:cascade})
   -> 0.0090s
-- add_index("namespaces", ["created_at"], {:name=>"index_namespaces_on_created_at", :using=>:btree})
   -> 0.0037s
-- add_index("namespaces", ["ldap_sync_last_successful_update_at"], {:name=>"index_namespaces_on_ldap_sync_last_successful_update_at", :using=>:btree})
   -> 0.0035s
-- add_index("namespaces", ["ldap_sync_last_update_at"], {:name=>"index_namespaces_on_ldap_sync_last_update_at", :using=>:btree})
   -> 0.0036s
-- add_index("namespaces", ["name", "parent_id"], {:name=>"index_namespaces_on_name_and_parent_id", :unique=>true, :using=>:btree})
   -> 0.0035s
-- add_index("namespaces", ["name"], {:name=>"index_namespaces_on_name_trigram", :using=>:gin, :opclasses=>{"name"=>"gin_trgm_ops"}})
   -> 0.0022s
-- add_index("namespaces", ["owner_id"], {:name=>"index_namespaces_on_owner_id", :using=>:btree})
   -> 0.0034s
-- add_index("namespaces", ["parent_id", "id"], {:name=>"index_namespaces_on_parent_id_and_id", :unique=>true, :using=>:btree})
   -> 0.0039s
-- add_index("namespaces", ["path"], {:name=>"index_namespaces_on_path", :using=>:btree})
   -> 0.0033s
-- add_index("namespaces", ["path"], {:name=>"index_namespaces_on_path_trigram", :using=>:gin, :opclasses=>{"path"=>"gin_trgm_ops"}})
   -> 0.0022s
-- add_index("namespaces", ["plan_id"], {:name=>"index_namespaces_on_plan_id", :using=>:btree})
   -> 0.0045s
-- add_index("namespaces", ["require_two_factor_authentication"], {:name=>"index_namespaces_on_require_two_factor_authentication", :using=>:btree})
   -> 0.0036s
-- add_index("namespaces", ["type"], {:name=>"index_namespaces_on_type", :using=>:btree})
   -> 0.0034s
-- create_table("notes", {:force=>:cascade})
   -> 0.0061s
-- add_index("notes", ["author_id"], {:name=>"index_notes_on_author_id", :using=>:btree})
   -> 0.0035s
-- add_index("notes", ["commit_id"], {:name=>"index_notes_on_commit_id", :using=>:btree})
   -> 0.0033s
-- add_index("notes", ["created_at"], {:name=>"index_notes_on_created_at", :using=>:btree})
   -> 0.0047s
-- add_index("notes", ["discussion_id"], {:name=>"index_notes_on_discussion_id", :using=>:btree})
   -> 0.0034s
-- add_index("notes", ["line_code"], {:name=>"index_notes_on_line_code", :using=>:btree})
   -> 0.0036s
-- add_index("notes", ["note"], {:name=>"index_notes_on_note_trigram", :using=>:gin, :opclasses=>{"note"=>"gin_trgm_ops"}})
   -> 0.0021s
-- add_index("notes", ["noteable_id", "noteable_type"], {:name=>"index_notes_on_noteable_id_and_noteable_type", :using=>:btree})
   -> 0.0035s
-- add_index("notes", ["noteable_type"], {:name=>"index_notes_on_noteable_type", :using=>:btree})
   -> 0.0033s
-- add_index("notes", ["project_id", "noteable_type"], {:name=>"index_notes_on_project_id_and_noteable_type", :using=>:btree})
   -> 0.0036s
-- add_index("notes", ["updated_at"], {:name=>"index_notes_on_updated_at", :using=>:btree})
   -> 0.0035s
-- create_table("notification_settings", {:force=>:cascade})
   -> 0.0065s
-- add_index("notification_settings", ["source_id", "source_type"], {:name=>"index_notification_settings_on_source_id_and_source_type", :using=>:btree})
   -> 0.0038s
-- add_index("notification_settings", ["user_id", "source_id", "source_type"], {:name=>"index_notifications_on_user_id_and_source_id_and_source_type", :unique=>true, :using=>:btree})
   -> 0.0036s
-- add_index("notification_settings", ["user_id"], {:name=>"index_notification_settings_on_user_id", :using=>:btree})
   -> 0.0035s
-- create_table("oauth_access_grants", {:force=>:cascade})
   -> 0.0056s
-- add_index("oauth_access_grants", ["token"], {:name=>"index_oauth_access_grants_on_token", :unique=>true, :using=>:btree})
   -> 0.0037s
-- create_table("oauth_access_tokens", {:force=>:cascade})
   -> 0.0056s
-- add_index("oauth_access_tokens", ["refresh_token"], {:name=>"index_oauth_access_tokens_on_refresh_token", :unique=>true, :using=>:btree})
   -> 0.0036s
-- add_index("oauth_access_tokens", ["resource_owner_id"], {:name=>"index_oauth_access_tokens_on_resource_owner_id", :using=>:btree})
   -> 0.0035s
-- add_index("oauth_access_tokens", ["token"], {:name=>"index_oauth_access_tokens_on_token", :unique=>true, :using=>:btree})
   -> 0.0035s
-- create_table("oauth_applications", {:force=>:cascade})
   -> 0.0062s
-- add_index("oauth_applications", ["owner_id", "owner_type"], {:name=>"index_oauth_applications_on_owner_id_and_owner_type", :using=>:btree})
   -> 0.0036s
-- add_index("oauth_applications", ["uid"], {:name=>"index_oauth_applications_on_uid", :unique=>true, :using=>:btree})
   -> 0.0035s
-- create_table("oauth_openid_requests", {:force=>:cascade})
   -> 0.0060s
-- create_table("pages_domains", {:force=>:cascade})
   -> 0.0059s
-- add_index("pages_domains", ["domain"], {:name=>"index_pages_domains_on_domain", :unique=>true, :using=>:btree})
   -> 0.0036s
-- add_index("pages_domains", ["project_id", "enabled_until"], {:name=>"index_pages_domains_on_project_id_and_enabled_until", :using=>:btree})
   -> 0.0035s
-- add_index("pages_domains", ["project_id"], {:name=>"index_pages_domains_on_project_id", :using=>:btree})
   -> 0.0034s
-- add_index("pages_domains", ["verified_at", "enabled_until"], {:name=>"index_pages_domains_on_verified_at_and_enabled_until", :using=>:btree})
   -> 0.0036s
-- add_index("pages_domains", ["verified_at"], {:name=>"index_pages_domains_on_verified_at", :using=>:btree})
   -> 0.0035s
-- create_table("path_locks", {:force=>:cascade})
   -> 0.0083s
-- add_index("path_locks", ["path"], {:name=>"index_path_locks_on_path", :using=>:btree})
   -> 0.0041s
-- add_index("path_locks", ["project_id"], {:name=>"index_path_locks_on_project_id", :using=>:btree})
   -> 0.0037s
-- add_index("path_locks", ["user_id"], {:name=>"index_path_locks_on_user_id", :using=>:btree})
   -> 0.0036s
-- create_table("personal_access_tokens", {:force=>:cascade})
   -> 0.0071s
-- add_index("personal_access_tokens", ["token"], {:name=>"index_personal_access_tokens_on_token", :unique=>true, :using=>:btree})
   -> 0.0043s
-- add_index("personal_access_tokens", ["user_id"], {:name=>"index_personal_access_tokens_on_user_id", :using=>:btree})
   -> 0.0041s
-- create_table("plans", {:force=>:cascade})
   -> 0.0056s
-- add_index("plans", ["name"], {:name=>"index_plans_on_name", :using=>:btree})
   -> 0.0037s
-- create_table("project_authorizations", {:id=>false, :force=>:cascade})
   -> 0.0018s
-- add_index("project_authorizations", ["project_id"], {:name=>"index_project_authorizations_on_project_id", :using=>:btree})
   -> 0.0036s
-- add_index("project_authorizations", ["user_id", "project_id", "access_level"], {:name=>"index_project_authorizations_on_user_id_project_id_access_level", :unique=>true, :using=>:btree})
   -> 0.0036s
-- create_table("project_auto_devops", {:force=>:cascade})
   -> 0.0059s
-- add_index("project_auto_devops", ["project_id"], {:name=>"index_project_auto_devops_on_project_id", :unique=>true, :using=>:btree})
   -> 0.0036s
-- create_table("project_ci_cd_settings", {:force=>:cascade})
   -> 0.0044s
-- add_index("project_ci_cd_settings", ["project_id"], {:name=>"index_project_ci_cd_settings_on_project_id", :unique=>true, :using=>:btree})
   -> 0.0036s
-- create_table("project_custom_attributes", {:force=>:cascade})
   -> 0.0057s
-- add_index("project_custom_attributes", ["key", "value"], {:name=>"index_project_custom_attributes_on_key_and_value", :using=>:btree})
   -> 0.0036s
-- add_index("project_custom_attributes", ["project_id", "key"], {:name=>"index_project_custom_attributes_on_project_id_and_key", :unique=>true, :using=>:btree})
   -> 0.0035s
-- create_table("project_deploy_tokens", {:force=>:cascade})
   -> 0.0044s
-- add_index("project_deploy_tokens", ["project_id", "deploy_token_id"], {:name=>"index_project_deploy_tokens_on_project_id_and_deploy_token_id", :unique=>true, :using=>:btree})
   -> 0.0038s
-- create_table("project_features", {:force=>:cascade})
   -> 0.0046s
-- add_index("project_features", ["project_id"], {:name=>"index_project_features_on_project_id", :using=>:btree})
   -> 0.0035s
-- create_table("project_group_links", {:force=>:cascade})
   -> 0.0044s
-- add_index("project_group_links", ["group_id"], {:name=>"index_project_group_links_on_group_id", :using=>:btree})
   -> 0.0036s
-- add_index("project_group_links", ["project_id"], {:name=>"index_project_group_links_on_project_id", :using=>:btree})
   -> 0.0034s
-- create_table("project_import_data", {:force=>:cascade})
   -> 0.0057s
-- add_index("project_import_data", ["project_id"], {:name=>"index_project_import_data_on_project_id", :using=>:btree})
   -> 0.0037s
-- create_table("project_mirror_data", {:force=>:cascade})
   -> 0.0045s
-- add_index("project_mirror_data", ["next_execution_timestamp", "retry_count"], {:name=>"index_mirror_data_on_next_execution_and_retry_count", :using=>:btree})
   -> 0.0035s
-- add_index("project_mirror_data", ["project_id"], {:name=>"index_project_mirror_data_on_project_id", :unique=>true, :using=>:btree})
   -> 0.0036s
-- create_table("project_repository_states", {:force=>:cascade})
   -> 0.0055s
-- add_index("project_repository_states", ["last_repository_verification_failure"], {:name=>"idx_repository_states_on_repository_failure_partial", :where=>"(last_repository_verification_failure IS NOT NULL)", :using=>:btree})
   -> 0.0035s
-- add_index("project_repository_states", ["last_wiki_verification_failure"], {:name=>"idx_repository_states_on_wiki_failure_partial", :where=>"(last_wiki_verification_failure IS NOT NULL)", :using=>:btree})
   -> 0.0034s
-- add_index("project_repository_states", ["project_id"], {:name=>"index_project_repository_states_on_project_id", :unique=>true, :using=>:btree})
   -> 0.0045s
-- add_index("project_repository_states", ["repository_verification_checksum", "wiki_verification_checksum"], {:name=>"idx_repository_states_on_checksums_partial", :where=>"((repository_verification_checksum IS NULL) OR (wiki_verification_checksum IS NULL))", :using=>:btree})
   -> 0.0037s
-- create_table("project_statistics", {:force=>:cascade})
   -> 0.0060s
-- add_index("project_statistics", ["namespace_id"], {:name=>"index_project_statistics_on_namespace_id", :using=>:btree})
   -> 0.0035s
-- add_index("project_statistics", ["project_id"], {:name=>"index_project_statistics_on_project_id", :unique=>true, :using=>:btree})
   -> 0.0035s
-- create_table("projects", {:force=>:cascade})
   -> 0.0139s
-- add_index("projects", ["ci_id"], {:name=>"index_projects_on_ci_id", :using=>:btree})
   -> 0.0038s
-- add_index("projects", ["created_at"], {:name=>"index_projects_on_created_at", :using=>:btree})
   -> 0.0037s
-- add_index("projects", ["creator_id"], {:name=>"index_projects_on_creator_id", :using=>:btree})
   -> 0.0034s
-- add_index("projects", ["description"], {:name=>"index_projects_on_description_trigram", :using=>:gin, :opclasses=>{"description"=>"gin_trgm_ops"}})
   -> 0.0023s
-- add_index("projects", ["id"], {:name=>"index_projects_on_id_partial_for_visibility", :unique=>true, :where=>"(visibility_level = ANY (ARRAY[10, 20]))", :using=>:btree})
   -> 0.0037s
-- add_index("projects", ["id"], {:name=>"index_projects_on_mirror_and_mirror_trigger_builds_both_true", :where=>"((mirror IS TRUE) AND (mirror_trigger_builds IS TRUE))", :using=>:btree})
   -> 0.0036s
-- add_index("projects", ["last_activity_at"], {:name=>"index_projects_on_last_activity_at", :using=>:btree})
   -> 0.0034s
-- add_index("projects", ["last_repository_check_failed"], {:name=>"index_projects_on_last_repository_check_failed", :using=>:btree})
   -> 0.0035s
-- add_index("projects", ["last_repository_updated_at"], {:name=>"index_projects_on_last_repository_updated_at", :using=>:btree})
   -> 0.0036s
-- add_index("projects", ["mirror_last_successful_update_at"], {:name=>"index_projects_on_mirror_last_successful_update_at", :using=>:btree})
   -> 0.0037s
-- add_index("projects", ["name"], {:name=>"index_projects_on_name_trigram", :using=>:gin, :opclasses=>{"name"=>"gin_trgm_ops"}})
   -> 0.0022s
-- add_index("projects", ["namespace_id"], {:name=>"index_projects_on_namespace_id", :using=>:btree})
   -> 0.0033s
-- add_index("projects", ["path"], {:name=>"index_projects_on_path", :using=>:btree})
   -> 0.0034s
-- add_index("projects", ["path"], {:name=>"index_projects_on_path_trigram", :using=>:gin, :opclasses=>{"path"=>"gin_trgm_ops"}})
   -> 0.0023s
-- add_index("projects", ["pending_delete"], {:name=>"index_projects_on_pending_delete", :using=>:btree})
   -> 0.0037s
-- add_index("projects", ["repository_storage"], {:name=>"index_projects_on_repository_storage", :using=>:btree})
   -> 0.0036s
-- add_index("projects", ["runners_token"], {:name=>"index_projects_on_runners_token", :using=>:btree})
   -> 0.0038s
-- add_index("projects", ["star_count"], {:name=>"index_projects_on_star_count", :using=>:btree})
   -> 0.0035s
-- add_index("projects", ["visibility_level"], {:name=>"index_projects_on_visibility_level", :using=>:btree})
   -> 0.0037s
-- create_table("prometheus_metrics", {:force=>:cascade})
   -> 0.0058s
-- add_index("prometheus_metrics", ["group"], {:name=>"index_prometheus_metrics_on_group", :using=>:btree})
   -> 0.0037s
-- add_index("prometheus_metrics", ["project_id"], {:name=>"index_prometheus_metrics_on_project_id", :using=>:btree})
   -> 0.0036s
-- create_table("protected_branch_merge_access_levels", {:force=>:cascade})
   -> 0.0042s
-- add_index("protected_branch_merge_access_levels", ["protected_branch_id"], {:name=>"index_protected_branch_merge_access", :using=>:btree})
   -> 0.0073s
-- add_index("protected_branch_merge_access_levels", ["user_id"], {:name=>"index_protected_branch_merge_access_levels_on_user_id", :using=>:btree})
   -> 0.0039s
-- create_table("protected_branch_push_access_levels", {:force=>:cascade})
   -> 0.0047s
-- add_index("protected_branch_push_access_levels", ["protected_branch_id"], {:name=>"index_protected_branch_push_access", :using=>:btree})
   -> 0.0039s
-- add_index("protected_branch_push_access_levels", ["user_id"], {:name=>"index_protected_branch_push_access_levels_on_user_id", :using=>:btree})
   -> 0.0040s
-- create_table("protected_branch_unprotect_access_levels", {:force=>:cascade})
   -> 0.0045s
-- add_index("protected_branch_unprotect_access_levels", ["group_id"], {:name=>"index_protected_branch_unprotect_access_levels_on_group_id", :using=>:btree})
   -> 0.0036s
-- add_index("protected_branch_unprotect_access_levels", ["protected_branch_id"], {:name=>"index_protected_branch_unprotect_access", :using=>:btree})
   -> 0.0038s
-- add_index("protected_branch_unprotect_access_levels", ["user_id"], {:name=>"index_protected_branch_unprotect_access_levels_on_user_id", :using=>:btree})
   -> 0.0038s
-- create_table("protected_branches", {:force=>:cascade})
   -> 0.0066s
-- add_index("protected_branches", ["project_id"], {:name=>"index_protected_branches_on_project_id", :using=>:btree})
   -> 0.0037s
-- create_table("protected_tag_create_access_levels", {:force=>:cascade})
   -> 0.0045s
-- add_index("protected_tag_create_access_levels", ["protected_tag_id"], {:name=>"index_protected_tag_create_access", :using=>:btree})
   -> 0.0039s
-- add_index("protected_tag_create_access_levels", ["user_id"], {:name=>"index_protected_tag_create_access_levels_on_user_id", :using=>:btree})
   -> 0.0036s
-- create_table("protected_tags", {:force=>:cascade})
   -> 0.0062s
-- add_index("protected_tags", ["project_id"], {:name=>"index_protected_tags_on_project_id", :using=>:btree})
   -> 0.0038s
-- create_table("push_event_payloads", {:id=>false, :force=>:cascade})
   -> 0.0038s
-- add_index("push_event_payloads", ["event_id"], {:name=>"index_push_event_payloads_on_event_id", :unique=>true, :using=>:btree})
   -> 0.0037s
-- create_table("push_rules", {:force=>:cascade})
   -> 0.0080s
-- add_index("push_rules", ["is_sample"], {:name=>"index_push_rules_on_is_sample", :where=>"is_sample", :using=>:btree})
   -> 0.0039s
-- add_index("push_rules", ["project_id"], {:name=>"index_push_rules_on_project_id", :using=>:btree})
   -> 0.0038s
-- create_table("redirect_routes", {:force=>:cascade})
   -> 0.0062s
-- add_index("redirect_routes", ["path"], {:name=>"index_redirect_routes_on_path", :unique=>true, :using=>:btree})
   -> 0.0040s
-- add_index("redirect_routes", ["source_type", "source_id"], {:name=>"index_redirect_routes_on_source_type_and_source_id", :using=>:btree})
   -> 0.0038s
-- create_table("releases", {:force=>:cascade})
   -> 0.0061s
-- add_index("releases", ["project_id", "tag"], {:name=>"index_releases_on_project_id_and_tag", :using=>:btree})
   -> 0.0046s
-- add_index("releases", ["project_id"], {:name=>"index_releases_on_project_id", :using=>:btree})
   -> 0.0039s
-- create_table("remote_mirrors", {:force=>:cascade})
   -> 0.0073s
-- add_index("remote_mirrors", ["last_successful_update_at"], {:name=>"index_remote_mirrors_on_last_successful_update_at", :using=>:btree})
   -> 0.0041s
-- add_index("remote_mirrors", ["project_id"], {:name=>"index_remote_mirrors_on_project_id", :using=>:btree})
   -> 0.0039s
-- create_table("routes", {:force=>:cascade})
   -> 0.0059s
-- add_index("routes", ["path"], {:name=>"index_routes_on_path", :unique=>true, :using=>:btree})
   -> 0.0039s
-- add_index("routes", ["path"], {:name=>"index_routes_on_path_text_pattern_ops", :using=>:btree, :opclasses=>{"path"=>"varchar_pattern_ops"}})
   -> 0.0037s
-- add_index("routes", ["source_type", "source_id"], {:name=>"index_routes_on_source_type_and_source_id", :unique=>true, :using=>:btree})
   -> 0.0043s
-- create_table("saml_providers", {:force=>:cascade})
   -> 0.0058s
-- add_index("saml_providers", ["group_id"], {:name=>"index_saml_providers_on_group_id", :using=>:btree})
   -> 0.0036s
-- create_table("sent_notifications", {:force=>:cascade})
   -> 0.0058s
-- add_index("sent_notifications", ["reply_key"], {:name=>"index_sent_notifications_on_reply_key", :unique=>true, :using=>:btree})
   -> 0.0052s
-- create_table("services", {:force=>:cascade})
   -> 0.0111s
-- add_index("services", ["project_id"], {:name=>"index_services_on_project_id", :using=>:btree})
   -> 0.0040s
-- add_index("services", ["template"], {:name=>"index_services_on_template", :using=>:btree})
   -> 0.0039s
-- create_table("slack_integrations", {:force=>:cascade})
   -> 0.0067s
-- add_index("slack_integrations", ["service_id"], {:name=>"index_slack_integrations_on_service_id", :using=>:btree})
   -> 0.0048s
-- add_index("slack_integrations", ["team_id", "alias"], {:name=>"index_slack_integrations_on_team_id_and_alias", :unique=>true, :using=>:btree})
   -> 0.0046s
-- create_table("snippets", {:force=>:cascade})
   -> 0.0068s
-- add_index("snippets", ["author_id"], {:name=>"index_snippets_on_author_id", :using=>:btree})
   -> 0.0040s
-- add_index("snippets", ["file_name"], {:name=>"index_snippets_on_file_name_trigram", :using=>:gin, :opclasses=>{"file_name"=>"gin_trgm_ops"}})
   -> 0.0023s
-- add_index("snippets", ["project_id"], {:name=>"index_snippets_on_project_id", :using=>:btree})
   -> 0.0038s
-- add_index("snippets", ["title"], {:name=>"index_snippets_on_title_trigram", :using=>:gin, :opclasses=>{"title"=>"gin_trgm_ops"}})
   -> 0.0023s
-- add_index("snippets", ["updated_at"], {:name=>"index_snippets_on_updated_at", :using=>:btree})
   -> 0.0037s
-- add_index("snippets", ["visibility_level"], {:name=>"index_snippets_on_visibility_level", :using=>:btree})
   -> 0.0040s
-- create_table("spam_logs", {:force=>:cascade})
   -> 0.0069s
-- create_table("subscriptions", {:force=>:cascade})
   -> 0.0060s
-- add_index("subscriptions", ["subscribable_id", "subscribable_type", "user_id", "project_id"], {:name=>"index_subscriptions_on_subscribable_and_user_id_and_project_id", :unique=>true, :using=>:btree})
   -> 0.0038s
-- create_table("system_note_metadata", {:force=>:cascade})
   -> 0.0063s
-- add_index("system_note_metadata", ["note_id"], {:name=>"index_system_note_metadata_on_note_id", :unique=>true, :using=>:btree})
   -> 0.0039s
-- create_table("taggings", {:force=>:cascade})
   -> 0.0060s
-- add_index("taggings", ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], {:name=>"taggings_idx", :unique=>true, :using=>:btree})
   -> 0.0039s
-- add_index("taggings", ["tag_id"], {:name=>"index_taggings_on_tag_id", :using=>:btree})
   -> 0.0036s
-- add_index("taggings", ["taggable_id", "taggable_type", "context"], {:name=>"index_taggings_on_taggable_id_and_taggable_type_and_context", :using=>:btree})
   -> 0.0042s
-- add_index("taggings", ["taggable_id", "taggable_type"], {:name=>"index_taggings_on_taggable_id_and_taggable_type", :using=>:btree})
   -> 0.0035s
-- create_table("tags", {:force=>:cascade})
   -> 0.0066s
-- add_index("tags", ["name"], {:name=>"index_tags_on_name", :unique=>true, :using=>:btree})
   -> 0.0043s
-- create_table("timelogs", {:force=>:cascade})
   -> 0.0041s
-- add_index("timelogs", ["issue_id"], {:name=>"index_timelogs_on_issue_id", :using=>:btree})
   -> 0.0036s
-- add_index("timelogs", ["merge_request_id"], {:name=>"index_timelogs_on_merge_request_id", :using=>:btree})
   -> 0.0041s
-- add_index("timelogs", ["user_id"], {:name=>"index_timelogs_on_user_id", :using=>:btree})
   -> 0.0038s
-- create_table("todos", {:force=>:cascade})
   -> 0.0059s
-- add_index("todos", ["author_id"], {:name=>"index_todos_on_author_id", :using=>:btree})
   -> 0.0038s
-- add_index("todos", ["commit_id"], {:name=>"index_todos_on_commit_id", :using=>:btree})
   -> 0.0037s
-- add_index("todos", ["note_id"], {:name=>"index_todos_on_note_id", :using=>:btree})
   -> 0.0037s
-- add_index("todos", ["project_id"], {:name=>"index_todos_on_project_id", :using=>:btree})
   -> 0.0035s
-- add_index("todos", ["target_type", "target_id"], {:name=>"index_todos_on_target_type_and_target_id", :using=>:btree})
   -> 0.0037s
-- add_index("todos", ["user_id", "id"], {:name=>"index_todos_on_user_id_and_id_done", :where=>"((state)::text = 'done'::text)", :using=>:btree})
   -> 0.0037s
-- add_index("todos", ["user_id", "id"], {:name=>"index_todos_on_user_id_and_id_pending", :where=>"((state)::text = 'pending'::text)", :using=>:btree})
   -> 0.0040s
-- add_index("todos", ["user_id"], {:name=>"index_todos_on_user_id", :using=>:btree})
   -> 0.0041s
-- create_table("trending_projects", {:force=>:cascade})
   -> 0.0042s
-- add_index("trending_projects", ["project_id"], {:name=>"index_trending_projects_on_project_id", :unique=>true, :using=>:btree})
   -> 0.0039s
-- create_table("u2f_registrations", {:force=>:cascade})
   -> 0.0064s
-- add_index("u2f_registrations", ["key_handle"], {:name=>"index_u2f_registrations_on_key_handle", :using=>:btree})
   -> 0.0038s
-- add_index("u2f_registrations", ["user_id"], {:name=>"index_u2f_registrations_on_user_id", :using=>:btree})
   -> 0.0036s
-- create_table("uploads", {:force=>:cascade})
   -> 0.0064s
-- add_index("uploads", ["checksum"], {:name=>"index_uploads_on_checksum", :using=>:btree})
   -> 0.0040s
-- add_index("uploads", ["model_id", "model_type"], {:name=>"index_uploads_on_model_id_and_model_type", :using=>:btree})
   -> 0.0038s
-- add_index("uploads", ["uploader", "path"], {:name=>"index_uploads_on_uploader_and_path", :using=>:btree})
   -> 0.0039s
-- create_table("user_agent_details", {:force=>:cascade})
   -> 0.0065s
-- add_index("user_agent_details", ["subject_id", "subject_type"], {:name=>"index_user_agent_details_on_subject_id_and_subject_type", :using=>:btree})
   -> 0.0038s
-- create_table("user_callouts", {:force=>:cascade})
   -> 0.0043s
-- add_index("user_callouts", ["user_id", "feature_name"], {:name=>"index_user_callouts_on_user_id_and_feature_name", :unique=>true, :using=>:btree})
   -> 0.0037s
-- add_index("user_callouts", ["user_id"], {:name=>"index_user_callouts_on_user_id", :using=>:btree})
   -> 0.0036s
-- create_table("user_custom_attributes", {:force=>:cascade})
   -> 0.0060s
-- add_index("user_custom_attributes", ["key", "value"], {:name=>"index_user_custom_attributes_on_key_and_value", :using=>:btree})
   -> 0.0037s
-- add_index("user_custom_attributes", ["user_id", "key"], {:name=>"index_user_custom_attributes_on_user_id_and_key", :unique=>true, :using=>:btree})
   -> 0.0037s
-- create_table("user_interacted_projects", {:id=>false, :force=>:cascade})
   -> 0.0017s
-- add_index("user_interacted_projects", ["project_id", "user_id"], {:name=>"index_user_interacted_projects_on_project_id_and_user_id", :unique=>true, :using=>:btree})
   -> 0.0037s
-- add_index("user_interacted_projects", ["user_id"], {:name=>"index_user_interacted_projects_on_user_id", :using=>:btree})
   -> 0.0036s
-- create_table("user_synced_attributes_metadata", {:force=>:cascade})
   -> 0.0071s
-- add_index("user_synced_attributes_metadata", ["user_id"], {:name=>"index_user_synced_attributes_metadata_on_user_id", :unique=>true, :using=>:btree})
   -> 0.0036s
-- create_table("users", {:force=>:cascade})
   -> 0.0152s
-- add_index("users", ["admin"], {:name=>"index_users_on_admin", :using=>:btree})
   -> 0.0041s
-- add_index("users", ["confirmation_token"], {:name=>"index_users_on_confirmation_token", :unique=>true, :using=>:btree})
   -> 0.0043s
-- add_index("users", ["created_at"], {:name=>"index_users_on_created_at", :using=>:btree})
   -> 0.0038s
-- add_index("users", ["email"], {:name=>"index_users_on_email", :unique=>true, :using=>:btree})
   -> 0.0044s
-- add_index("users", ["email"], {:name=>"index_users_on_email_trigram", :using=>:gin, :opclasses=>{"email"=>"gin_trgm_ops"}})
   -> 0.0024s
-- add_index("users", ["ghost"], {:name=>"index_users_on_ghost", :using=>:btree})
   -> 0.0076s
-- add_index("users", ["incoming_email_token"], {:name=>"index_users_on_incoming_email_token", :using=>:btree})
   -> 0.0044s
-- add_index("users", ["name"], {:name=>"index_users_on_name", :using=>:btree})
   -> 0.0043s
-- add_index("users", ["name"], {:name=>"index_users_on_name_trigram", :using=>:gin, :opclasses=>{"name"=>"gin_trgm_ops"}})
   -> 0.0025s
-- add_index("users", ["reset_password_token"], {:name=>"index_users_on_reset_password_token", :unique=>true, :using=>:btree})
   -> 0.0042s
-- add_index("users", ["rss_token"], {:name=>"index_users_on_rss_token", :using=>:btree})
   -> 0.0053s
-- add_index("users", ["state"], {:name=>"index_users_on_state", :using=>:btree})
   -> 0.0039s
-- add_index("users", ["support_bot"], {:name=>"index_users_on_support_bot", :using=>:btree})
   -> 0.0040s
-- add_index("users", ["username"], {:name=>"index_users_on_username", :using=>:btree})
   -> 0.0040s
-- add_index("users", ["username"], {:name=>"index_users_on_username_trigram", :using=>:gin, :opclasses=>{"username"=>"gin_trgm_ops"}})
   -> 0.0026s
-- create_table("users_star_projects", {:force=>:cascade})
   -> 0.0041s
-- add_index("users_star_projects", ["project_id"], {:name=>"index_users_star_projects_on_project_id", :using=>:btree})
   -> 0.0039s
-- add_index("users_star_projects", ["user_id", "project_id"], {:name=>"index_users_star_projects_on_user_id_and_project_id", :unique=>true, :using=>:btree})
   -> 0.0040s
-- create_table("web_hook_logs", {:force=>:cascade})
   -> 0.0061s
-- add_index("web_hook_logs", ["web_hook_id"], {:name=>"index_web_hook_logs_on_web_hook_id", :using=>:btree})
   -> 0.0037s
-- create_table("web_hooks", {:force=>:cascade})
   -> 0.0103s
-- add_index("web_hooks", ["project_id"], {:name=>"index_web_hooks_on_project_id", :using=>:btree})
   -> 0.0040s
-- add_index("web_hooks", ["type"], {:name=>"index_web_hooks_on_type", :using=>:btree})
   -> 0.0036s
-- add_foreign_key("approvals", "merge_requests", {:name=>"fk_310d714958", :on_delete=>:cascade})
   -> 0.0028s
-- add_foreign_key("approver_groups", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("badges", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("badges", "projects", {:on_delete=>:cascade})
   -> 0.0022s
-- add_foreign_key("board_assignees", "boards", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("board_assignees", "users", {:column=>"assignee_id", :on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("board_labels", "boards", {:on_delete=>:cascade})
   -> 0.0021s
-- add_foreign_key("board_labels", "labels", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("boards", "namespaces", {:column=>"group_id", :name=>"fk_1e9a074a35", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("boards", "projects", {:name=>"fk_f15266b5f9", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("chat_teams", "namespaces", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("ci_build_trace_section_names", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_build_trace_sections", "ci_build_trace_section_names", {:column=>"section_name_id", :name=>"fk_264e112c66", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("ci_build_trace_sections", "ci_builds", {:column=>"build_id", :name=>"fk_4ebe41f502", :on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("ci_build_trace_sections", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_builds", "ci_pipelines", {:column=>"auto_canceled_by_id", :name=>"fk_a2141b1522", :on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("ci_builds", "ci_stages", {:column=>"stage_id", :name=>"fk_3a9eaa254d", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_builds", "projects", {:name=>"fk_befce0568a", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("ci_builds_metadata", "ci_builds", {:column=>"build_id", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("ci_builds_metadata", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_group_variables", "namespaces", {:column=>"group_id", :name=>"fk_33ae4d58d8", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("ci_job_artifacts", "ci_builds", {:column=>"job_id", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("ci_job_artifacts", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_pipeline_chat_data", "chat_names", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("ci_pipeline_chat_data", "ci_pipelines", {:column=>"pipeline_id", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("ci_pipeline_schedule_variables", "ci_pipeline_schedules", {:column=>"pipeline_schedule_id", :name=>"fk_41c35fda51", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("ci_pipeline_schedules", "projects", {:name=>"fk_8ead60fcc4", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("ci_pipeline_schedules", "users", {:column=>"owner_id", :name=>"fk_9ea99f58d2", :on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("ci_pipeline_variables", "ci_pipelines", {:column=>"pipeline_id", :name=>"fk_f29c5f4380", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("ci_pipelines", "ci_pipeline_schedules", {:column=>"pipeline_schedule_id", :name=>"fk_3d34ab2e06", :on_delete=>:nullify})
   -> 0.0014s
-- add_foreign_key("ci_pipelines", "ci_pipelines", {:column=>"auto_canceled_by_id", :name=>"fk_262d4c2d19", :on_delete=>:nullify})
   -> 0.0016s
-- add_foreign_key("ci_pipelines", "projects", {:name=>"fk_86635dbd80", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("ci_runner_projects", "projects", {:name=>"fk_4478a6f1e4", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("ci_sources_pipelines", "ci_builds", {:column=>"source_job_id", :name=>"fk_be5624bf37", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_sources_pipelines", "ci_pipelines", {:column=>"pipeline_id", :name=>"fk_e1bad85861", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("ci_sources_pipelines", "ci_pipelines", {:column=>"source_pipeline_id", :name=>"fk_d4e29af7d7", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("ci_sources_pipelines", "projects", {:column=>"source_project_id", :name=>"fk_acd9737679", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_sources_pipelines", "projects", {:name=>"fk_1e53c97c0a", :on_delete=>:cascade})
   -> 0.0024s
-- add_foreign_key("ci_stages", "ci_pipelines", {:column=>"pipeline_id", :name=>"fk_fb57e6cc56", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("ci_stages", "projects", {:name=>"fk_2360681d1d", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("ci_trigger_requests", "ci_triggers", {:column=>"trigger_id", :name=>"fk_b8ec8b7245", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("ci_triggers", "projects", {:name=>"fk_e3e63f966e", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_triggers", "users", {:column=>"owner_id", :name=>"fk_e8e10d1964", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("ci_variables", "projects", {:name=>"fk_ada5eb64b3", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("cluster_platforms_kubernetes", "clusters", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("cluster_projects", "clusters", {:on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("cluster_projects", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("cluster_providers_gcp", "clusters", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("clusters", "users", {:on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("clusters_applications_helm", "clusters", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("clusters_applications_ingress", "clusters", {:name=>"fk_753a7b41c1", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("clusters_applications_prometheus", "clusters", {:name=>"fk_557e773639", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("clusters_applications_runners", "ci_runners", {:column=>"runner_id", :name=>"fk_02de2ded36", :on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("clusters_applications_runners", "clusters", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("container_repositories", "projects")
   -> 0.0019s
-- add_foreign_key("deploy_keys_projects", "projects", {:name=>"fk_58a901ca7e", :on_delete=>:cascade})
   -> 0.0022s
-- add_foreign_key("deployments", "projects", {:name=>"fk_b9a3851b82", :on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("environments", "projects", {:name=>"fk_d1c8c1da6a", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("epic_issues", "epics", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("epic_issues", "issues", {:on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("epic_metrics", "epics", {:on_delete=>:cascade})
   -> 0.0022s
-- add_foreign_key("epics", "milestones", {:on_delete=>:nullify})
   -> 0.0022s
-- add_foreign_key("epics", "namespaces", {:column=>"group_id", :name=>"fk_f081aa4489", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("epics", "users", {:column=>"assignee_id", :name=>"fk_dccd3f98fc", :on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("epics", "users", {:column=>"author_id", :name=>"fk_3654b61b03", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("events", "projects", {:on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("events", "users", {:column=>"author_id", :name=>"fk_edfd187b6f", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("fork_network_members", "fork_networks", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("fork_network_members", "projects", {:column=>"forked_from_project_id", :name=>"fk_b01280dae4", :on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("fork_network_members", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("fork_networks", "projects", {:column=>"root_project_id", :name=>"fk_e7b436b2b5", :on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("forked_project_links", "projects", {:column=>"forked_to_project_id", :name=>"fk_434510edb0", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("gcp_clusters", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("gcp_clusters", "services", {:on_delete=>:nullify})
   -> 0.0019s
-- add_foreign_key("gcp_clusters", "users", {:on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("geo_event_log", "geo_hashed_storage_migrated_events", {:column=>"hashed_storage_migrated_event_id", :name=>"fk_27548c6db3", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("geo_event_log", "geo_job_artifact_deleted_events", {:column=>"job_artifact_deleted_event_id", :name=>"fk_176d3fbb5d", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("geo_event_log", "geo_lfs_object_deleted_events", {:column=>"lfs_object_deleted_event_id", :name=>"fk_d5af95fcd9", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("geo_event_log", "geo_repositories_changed_events", {:column=>"repositories_changed_event_id", :name=>"fk_4a99ebfd60", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("geo_event_log", "geo_repository_created_events", {:column=>"repository_created_event_id", :name=>"fk_9b9afb1916", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("geo_event_log", "geo_repository_deleted_events", {:column=>"repository_deleted_event_id", :name=>"fk_c4b1c1f66e", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("geo_event_log", "geo_repository_renamed_events", {:column=>"repository_renamed_event_id", :name=>"fk_86c84214ec", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("geo_event_log", "geo_repository_updated_events", {:column=>"repository_updated_event_id", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("geo_event_log", "geo_upload_deleted_events", {:column=>"upload_deleted_event_id", :name=>"fk_c1f241c70d", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("geo_hashed_storage_attachments_events", "projects", {:on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("geo_hashed_storage_migrated_events", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("geo_node_namespace_links", "geo_nodes", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("geo_node_namespace_links", "namespaces", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("geo_node_statuses", "geo_nodes", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("geo_repositories_changed_events", "geo_nodes", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("geo_repository_created_events", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("geo_repository_renamed_events", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("geo_repository_updated_events", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("gpg_key_subkeys", "gpg_keys", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("gpg_keys", "users", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("gpg_signatures", "gpg_key_subkeys", {:on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("gpg_signatures", "gpg_keys", {:on_delete=>:nullify})
   -> 0.0014s
-- add_foreign_key("gpg_signatures", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("group_custom_attributes", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("index_statuses", "projects", {:name=>"fk_74b2492545", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("internal_ids", "namespaces", {:name=>"fk_162941d509", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("internal_ids", "projects", {:on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("issue_assignees", "issues", {:name=>"fk_b7d881734a", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("issue_assignees", "users", {:name=>"fk_5e0c8d9154", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("issue_links", "issues", {:column=>"source_id", :name=>"fk_c900194ff2", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("issue_links", "issues", {:column=>"target_id", :name=>"fk_e71bb44f1f", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("issue_metrics", "issues", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("issues", "issues", {:column=>"moved_to_id", :name=>"fk_a194299be1", :on_delete=>:nullify})
   -> 0.0015s
-- add_foreign_key("issues", "milestones", {:name=>"fk_96b1dd429c", :on_delete=>:nullify})
   -> 0.0016s
-- add_foreign_key("issues", "projects", {:name=>"fk_899c8f3231", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("issues", "users", {:column=>"author_id", :name=>"fk_05f1e72feb", :on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("issues", "users", {:column=>"closed_by_id", :name=>"fk_c63cbf6c25", :on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("issues", "users", {:column=>"updated_by_id", :name=>"fk_ffed080f01", :on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("label_priorities", "labels", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("label_priorities", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("labels", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("labels", "projects", {:name=>"fk_7de4989a69", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("lfs_file_locks", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("lfs_file_locks", "users", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("lists", "boards", {:name=>"fk_0d3f677137", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("lists", "labels", {:name=>"fk_7a5553d60f", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("members", "users", {:name=>"fk_2e88fb7ce9", :on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("merge_request_diff_commits", "merge_request_diffs", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("merge_request_diff_files", "merge_request_diffs", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("merge_request_diffs", "merge_requests", {:name=>"fk_8483f3258f", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("merge_request_metrics", "ci_pipelines", {:column=>"pipeline_id", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("merge_request_metrics", "merge_requests", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("merge_request_metrics", "users", {:column=>"latest_closed_by_id", :name=>"fk_ae440388cc", :on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("merge_request_metrics", "users", {:column=>"merged_by_id", :name=>"fk_7f28d925f3", :on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("merge_requests", "ci_pipelines", {:column=>"head_pipeline_id", :name=>"fk_fd82eae0b9", :on_delete=>:nullify})
   -> 0.0019s
-- add_foreign_key("merge_requests", "merge_request_diffs", {:column=>"latest_merge_request_diff_id", :name=>"fk_06067f5644", :on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("merge_requests", "milestones", {:name=>"fk_6a5165a692", :on_delete=>:nullify})
   -> 0.0028s
-- add_foreign_key("merge_requests", "projects", {:column=>"source_project_id", :name=>"fk_3308fe130c", :on_delete=>:nullify})
   -> 0.0025s
-- add_foreign_key("merge_requests", "projects", {:column=>"target_project_id", :name=>"fk_a6963e8447", :on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("merge_requests", "users", {:column=>"assignee_id", :name=>"fk_6149611a04", :on_delete=>:nullify})
   -> 0.0020s
-- add_foreign_key("merge_requests", "users", {:column=>"author_id", :name=>"fk_e719a85f8a", :on_delete=>:nullify})
   -> 0.0019s
-- add_foreign_key("merge_requests", "users", {:column=>"merge_user_id", :name=>"fk_ad525e1f87", :on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("merge_requests", "users", {:column=>"updated_by_id", :name=>"fk_641731faff", :on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("merge_requests_closing_issues", "issues", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("merge_requests_closing_issues", "merge_requests", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("milestones", "namespaces", {:column=>"group_id", :name=>"fk_95650a40d4", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("milestones", "projects", {:name=>"fk_9bd0a0c791", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("namespace_statistics", "namespaces", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("namespaces", "plans", {:name=>"fk_fdd12e5b80", :on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("notes", "projects", {:name=>"fk_99e097b079", :on_delete=>:cascade})
   -> 0.0021s
-- add_foreign_key("oauth_openid_requests", "oauth_access_grants", {:column=>"access_grant_id", :name=>"fk_oauth_openid_requests_oauth_access_grants_access_grant_id"})
   -> 0.0015s
-- add_foreign_key("pages_domains", "projects", {:name=>"fk_ea2f6dfc6f", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("path_locks", "projects", {:name=>"fk_5265c98f24", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("path_locks", "users")
   -> 0.0020s
-- add_foreign_key("personal_access_tokens", "users")
   -> 0.0020s
-- add_foreign_key("project_authorizations", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("project_authorizations", "users", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("project_auto_devops", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("project_ci_cd_settings", "projects", {:name=>"fk_24c15d2f2e", :on_delete=>:cascade})
   -> 0.0023s
-- add_foreign_key("project_custom_attributes", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("project_deploy_tokens", "deploy_tokens", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("project_deploy_tokens", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("project_features", "projects", {:name=>"fk_18513d9b92", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("project_group_links", "projects", {:name=>"fk_daa8cee94c", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("project_import_data", "projects", {:name=>"fk_ffb9ee3a10", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("project_mirror_data", "projects", {:name=>"fk_d1aad367d7", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("project_repository_states", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("project_statistics", "projects", {:on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("prometheus_metrics", "projects", {:on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("protected_branch_merge_access_levels", "namespaces", {:column=>"group_id", :name=>"fk_98f3d044fe", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("protected_branch_merge_access_levels", "protected_branches", {:name=>"fk_8a3072ccb3", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("protected_branch_merge_access_levels", "users")
   -> 0.0018s
-- add_foreign_key("protected_branch_push_access_levels", "namespaces", {:column=>"group_id", :name=>"fk_7111b68cdb", :on_delete=>:cascade})
   -> 0.0023s
-- add_foreign_key("protected_branch_push_access_levels", "protected_branches", {:name=>"fk_9ffc86a3d9", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("protected_branch_push_access_levels", "users")
   -> 0.0018s
-- add_foreign_key("protected_branch_unprotect_access_levels", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("protected_branch_unprotect_access_levels", "protected_branches", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("protected_branch_unprotect_access_levels", "users", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("protected_branches", "projects", {:name=>"fk_7a9c6d93e7", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("protected_tag_create_access_levels", "namespaces", {:column=>"group_id", :name=>"fk_b4eb82fe3c", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("protected_tag_create_access_levels", "protected_tags", {:name=>"fk_f7dfda8c51", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("protected_tag_create_access_levels", "users")
   -> 0.0017s
-- add_foreign_key("protected_tags", "projects", {:name=>"fk_8e4af87648", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("push_event_payloads", "events", {:name=>"fk_36c74129da", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("push_rules", "projects", {:name=>"fk_83b29894de", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("releases", "projects", {:name=>"fk_47fe2a0596", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("remote_mirrors", "projects", {:name=>"fk_43a9aa4ca8", :on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("saml_providers", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("services", "projects", {:name=>"fk_71cce407f9", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("slack_integrations", "services", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("snippets", "projects", {:name=>"fk_be41fd4bb7", :on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("subscriptions", "projects", {:on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("system_note_metadata", "notes", {:name=>"fk_d83a918cb1", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("timelogs", "issues", {:name=>"fk_timelogs_issues_issue_id", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("timelogs", "merge_requests", {:name=>"fk_timelogs_merge_requests_merge_request_id", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("todos", "notes", {:name=>"fk_91d1f47b13", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("todos", "projects", {:name=>"fk_45054f9c45", :on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("todos", "users", {:column=>"author_id", :name=>"fk_ccf0373936", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("todos", "users", {:name=>"fk_d94154aa95", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("trending_projects", "projects", {:on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("u2f_registrations", "users")
   -> 0.0019s
-- add_foreign_key("user_callouts", "users", {:on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("user_custom_attributes", "users", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("user_interacted_projects", "projects", {:name=>"fk_722ceba4f7", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("user_interacted_projects", "users", {:name=>"fk_0894651f08", :on_delete=>:cascade})
   -> 0.0023s
-- add_foreign_key("user_synced_attributes_metadata", "users", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("users_star_projects", "projects", {:name=>"fk_22cd27ddfc", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("web_hook_logs", "web_hooks", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("web_hooks", "projects", {:name=>"fk_0c8ca6d9d1", :on_delete=>:cascade})
   -> 0.0018s
-- initialize_schema_migrations_table()
   -> 0.0122s
-- enable_extension("plpgsql")
   -> 0.0128s
-- create_table("event_log_states", {:primary_key=>"event_id", :force=>:cascade})
   -> 0.0072s
-- create_table("file_registry", {:force=>:cascade})
   -> 0.0082s
-- add_index("file_registry", ["file_type", "file_id"], {:name=>"index_file_registry_on_file_type_and_file_id", :unique=>true, :using=>:btree})
   -> 0.0047s
-- add_index("file_registry", ["file_type"], {:name=>"index_file_registry_on_file_type", :using=>:btree})
   -> 0.0042s
-- add_index("file_registry", ["retry_at"], {:name=>"index_file_registry_on_retry_at", :using=>:btree})
   -> 0.0042s
-- add_index("file_registry", ["success"], {:name=>"index_file_registry_on_success", :using=>:btree})
   -> 0.0041s
-- create_table("job_artifact_registry", {:force=>:cascade})
   -> 0.0069s
-- add_index("job_artifact_registry", ["artifact_id"], {:name=>"index_job_artifact_registry_on_artifact_id", :using=>:btree})
   -> 0.0041s
-- add_index("job_artifact_registry", ["retry_at"], {:name=>"index_job_artifact_registry_on_retry_at", :using=>:btree})
   -> 0.0038s
-- add_index("job_artifact_registry", ["success"], {:name=>"index_job_artifact_registry_on_success", :using=>:btree})
   -> 0.0048s
-- create_table("project_registry", {:force=>:cascade})
   -> 0.0089s
-- add_index("project_registry", ["last_repository_successful_sync_at"], {:name=>"index_project_registry_on_last_repository_successful_sync_at", :using=>:btree})
   -> 0.0045s
-- add_index("project_registry", ["last_repository_synced_at"], {:name=>"index_project_registry_on_last_repository_synced_at", :using=>:btree})
   -> 0.0047s
-- add_index("project_registry", ["project_id"], {:name=>"idx_project_registry_on_repo_checksums_and_failure_partial", :where=>"((repository_verification_checksum_sha IS NULL) AND (last_repository_verification_failure IS NULL))", :using=>:btree})
   -> 0.0041s
-- add_index("project_registry", ["project_id"], {:name=>"idx_project_registry_on_repository_failure_partial", :where=>"(last_repository_verification_failure IS NOT NULL)", :using=>:btree})
   -> 0.0039s
-- add_index("project_registry", ["project_id"], {:name=>"idx_project_registry_on_wiki_checksums_and_failure_partial", :where=>"((wiki_verification_checksum_sha IS NULL) AND (last_wiki_verification_failure IS NULL))", :using=>:btree})
   -> 0.0040s
-- add_index("project_registry", ["project_id"], {:name=>"idx_project_registry_on_wiki_failure_partial", :where=>"(last_wiki_verification_failure IS NOT NULL)", :using=>:btree})
   -> 0.0038s
-- add_index("project_registry", ["project_id"], {:name=>"idx_repository_checksum_mismatch", :where=>"(repository_checksum_mismatch = true)", :using=>:btree})
   -> 0.0041s
-- add_index("project_registry", ["project_id"], {:name=>"idx_wiki_checksum_mismatch", :where=>"(wiki_checksum_mismatch = true)", :using=>:btree})
   -> 0.0038s
-- add_index("project_registry", ["project_id"], {:name=>"index_project_registry_on_project_id", :unique=>true, :using=>:btree})
   -> 0.0041s
-- add_index("project_registry", ["repository_retry_at"], {:name=>"index_project_registry_on_repository_retry_at", :using=>:btree})
   -> 0.0039s
-- add_index("project_registry", ["repository_verification_checksum_sha"], {:name=>"idx_project_registry_on_repository_checksum_sha_partial", :where=>"(repository_verification_checksum_sha IS NULL)", :using=>:btree})
   -> 0.0040s
-- add_index("project_registry", ["resync_repository"], {:name=>"index_project_registry_on_resync_repository", :using=>:btree})
   -> 0.0040s
-- add_index("project_registry", ["resync_wiki"], {:name=>"index_project_registry_on_resync_wiki", :using=>:btree})
   -> 0.0040s
-- add_index("project_registry", ["wiki_retry_at"], {:name=>"index_project_registry_on_wiki_retry_at", :using=>:btree})
   -> 0.0039s
-- add_index("project_registry", ["wiki_verification_checksum_sha"], {:name=>"idx_project_registry_on_wiki_checksum_sha_partial", :where=>"(wiki_verification_checksum_sha IS NULL)", :using=>:btree})
   -> 0.0040s
-- initialize_schema_migrations_table()
   -> 0.0079s
$ date
Wed May  2 15:06:56 UTC 2018
$ export KNAPSACK_TEST_FILE_PATTERN="ee/spec/**{,/*/**}/*_spec.rb" KNAPSACK_GENERATE_REPORT=true CACHE_CLASSES=true
$ JOB_NAME=( $CI_JOB_NAME )
$ export CI_NODE_INDEX=${JOB_NAME[-2]} CI_NODE_TOTAL=${JOB_NAME[-1]}
$ export KNAPSACK_REPORT_PATH=knapsack/${CI_PROJECT_NAME}/${JOB_NAME[0]}_node_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json
$ cp ${EE_KNAPSACK_RSPEC_SUITE_REPORT_PATH} ${KNAPSACK_REPORT_PATH}
$ scripts/gitaly-test-spawn
116
$ knapsack rspec "-Ispec --color --format documentation --tag ~geo"

Report specs:
ee/spec/models/burndown_spec.rb
ee/spec/lib/gitlab/elastic/search_results_spec.rb
ee/spec/controllers/projects/merge_requests_controller_spec.rb
ee/spec/elastic_integration/global_search_spec.rb
ee/spec/features/issues/filtered_search/dropdown_weight_spec.rb
ee/spec/policies/group_policy_spec.rb
ee/spec/features/issues/form_spec.rb
ee/spec/features/search/elastic/project_search_spec.rb
ee/spec/features/boards/sidebar_spec.rb
ee/spec/features/merge_requests/squash_spec.rb
ee/spec/features/merge_request/user_approves_spec.rb
ee/spec/features/merge_request/user_sets_approvers_spec.rb
ee/spec/models/merge_request_spec.rb
ee/spec/features/projects/new_project_spec.rb
ee/spec/features/projects/merge_requests/user_approves_merge_request_spec.rb
ee/spec/features/issues/service_desk_spec.rb
ee/spec/controllers/boards/issues_controller_spec.rb
ee/spec/features/projects/settings/merge_requests_settings_spec.rb
ee/spec/services/geo/repository_sync_service_spec.rb
ee/spec/controllers/groups/epic_issues_controller_spec.rb
ee/spec/workers/elastic_indexer_worker_spec.rb
ee/spec/features/discussion_comments/epic_spec.rb
ee/spec/services/projects/update_remote_mirror_service_spec.rb
ee/spec/controllers/ldap/omniauth_callbacks_controller_spec.rb
ee/spec/controllers/groups/analytics_controller_spec.rb
ee/spec/services/projects/create_service_spec.rb
ee/spec/features/admin/admin_geo_nodes_spec.rb
ee/spec/mailers/notify_spec.rb
ee/spec/features/projects/push_rules_spec.rb
ee/spec/models/ci/build_spec.rb
ee/spec/models/remote_mirror_spec.rb
ee/spec/helpers/push_rules_helper_spec.rb
ee/spec/features/projects/services/user_activates_github_spec.rb
ee/spec/services/epic_issues/update_service_spec.rb
ee/spec/features/search/elastic/global_search_spec.rb
ee/spec/features/groups/group_roadmap_spec.rb
ee/spec/requests/api/project_push_rule_spec.rb
ee/spec/features/admin/admin_audit_logs_spec.rb
ee/spec/requests/api/project_mirror_spec.rb
ee/spec/features/epics/epic_labels_spec.rb
ee/spec/controllers/projects/issues_controller_spec.rb
ee/spec/finders/epics_finder_spec.rb
ee/spec/features/groups/pipeline_quota_spec.rb
ee/spec/controllers/projects/merge_requests/creations_controller_spec.rb
ee/spec/features/projects/milestones/milestone_spec.rb
ee/spec/models/project_import_data_spec.rb
ee/spec/lib/gitlab/chat/command_spec.rb
ee/spec/requests/api/merge_request_approvals_spec.rb
ee/spec/controllers/projects_controller_spec.rb
ee/spec/controllers/projects/push_rules_controller_spec.rb
ee/spec/services/issue_links/list_service_spec.rb
ee/spec/services/ee/notification_service_spec.rb
ee/spec/features/merge_request/user_merges_with_push_rules_spec.rb
ee/spec/features/epics/new_epic_spec.rb
ee/spec/features/projects/pipelines/pipeline_spec.rb
ee/spec/models/concerns/ee/deployment_platform_spec.rb
ee/spec/models/namespace_spec.rb
ee/spec/features/epics/epics_list_spec.rb
ee/spec/models/repository_spec.rb
ee/spec/requests/projects/issue_links_controller_spec.rb
ee/spec/requests/api/ldap_group_links_spec.rb
ee/spec/services/ci/register_job_service_spec.rb
ee/spec/models/project_services/github_service_spec.rb
ee/spec/policies/merge_request_policy_spec.rb
ee/spec/services/audit_event_service_spec.rb
ee/spec/models/project_services/jenkins_service_spec.rb
ee/spec/services/boards/issues/list_service_spec.rb
ee/spec/services/merge_requests/merge_service_spec.rb
ee/spec/requests/projects/path_locks_controller_spec.rb
ee/spec/controllers/admin/application_settings_controller_spec.rb
ee/spec/features/admin/admin_reset_pipeline_minutes_spec.rb
ee/spec/models/geo_node_spec.rb
ee/spec/controllers/projects/approvers_controller_spec.rb
ee/spec/services/projects/update_service_spec.rb
ee/spec/workers/geo/repository_verification/primary/shard_worker_spec.rb
ee/spec/policies/project_policy_spec.rb
ee/spec/features/display_system_header_and_footer_bar_spec.rb
ee/spec/services/geo/file_registry_removal_service_spec.rb
ee/spec/controllers/projects/approver_groups_controller_spec.rb
ee/spec/features/groups/group_settings_spec.rb
ee/spec/services/projects/destroy_service_spec.rb
ee/spec/features/projects/issues/user_creates_issue_spec.rb
ee/spec/features/groups/analytics_spec.rb
ee/spec/workers/repository_update_mirror_worker_spec.rb
ee/spec/workers/admin_emails_worker_spec.rb
ee/spec/models/concerns/elastic/project_wiki_spec.rb
ee/spec/requests/api/geo_spec.rb
ee/spec/requests/api/v3/ldap_group_links_spec.rb
ee/spec/features/boards/group_boards/user_edits_issues_spec.rb
ee/spec/controllers/groups/group_members_controller_spec.rb
ee/spec/views/shared/issuable/_approvals.html.haml_spec.rb
ee/spec/models/concerns/elastic/issue_spec.rb
ee/spec/routing/group_routing_spec.rb
ee/spec/services/issue_links/destroy_service_spec.rb
ee/spec/services/ee/issues/move_service_spec.rb
ee/spec/models/project_services/kubernetes_service_spec.rb
ee/spec/services/epic_issues/list_service_spec.rb
ee/spec/services/search/group_service_spec.rb
ee/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb
ee/spec/controllers/autocomplete_controller_spec.rb
ee/spec/services/geo/hashed_storage_migration_service_spec.rb
ee/spec/serializers/project_mirror_entity_spec.rb
ee/spec/features/merge_request/user_sees_approval_widget_spec.rb
ee/spec/lib/gitlab/ci/external/file/local_spec.rb
ee/spec/models/geo/repository_updated_event_spec.rb

Leftover specs:
ee/spec/features/admin/admin_sends_notification_spec.rb
ee/spec/finders/geo/attachment_registry_finder_spec.rb
ee/spec/finders/geo/job_artifact_registry_finder_spec.rb
ee/spec/finders/geo/project_registry_finder_spec.rb
ee/spec/lib/gitlab/geo/cron_manager_spec.rb
ee/spec/lib/gitlab/geo/file_uploader_spec.rb
ee/spec/lib/gitlab/geo/job_artifact_downloader_spec.rb
ee/spec/lib/gitlab/geo/job_artifact_uploader_spec.rb
ee/spec/lib/gitlab/geo_spec.rb
ee/spec/lib/system_check/geo/fdw_schema_up_to_date_check_spec.rb
ee/spec/models/geo_node_status_spec.rb
ee/spec/requests/api/geo_nodes_spec.rb
ee/spec/services/geo/metrics_update_service_spec.rb
ee/spec/services/geo/node_status_fetch_service_spec.rb
ee/spec/support/protected_tags/access_control_spec.rb
ee/spec/workers/geo/file_download_dispatch_worker_spec.rb
ee/spec/workers/geo/metrics_update_worker_spec.rb
ee/spec/workers/geo/prune_event_log_worker_spec.rb
ee/spec/workers/geo/repository_sync_worker_spec.rb

WARNING: Shared example group 'protected tags > access control > EE' has been previously defined at:
  /builds/gitlab-org/gitlab-ee/ee/spec/support/protected_tags/access_control_spec.rb:1
...and you are now defining it at:
  /builds/gitlab-org/gitlab-ee/ee/spec/support/protected_tags/access_control_spec.rb:1
The new definition will overwrite the original one.
Knapsack report generator started!
Run options: exclude {:geo=>true}

==> Setting up GitLab Shell...
    GitLab Shell setup in 0.463865241 seconds...

==> Setting up Gitaly...
    Gitaly setup in 0.00017903 seconds...

Burndown
  project milestone burndown
    behaves like burndown for milestone
      generates an array with date, issue count and weight
      returns empty array if milestone start date is nil
      returns empty array if milestone due date is nil
      it counts until today if milestone due date > Date.today
      sets attribute accurate to true
      when all closed issues does not have closed events
        considers closed_at as milestone start date
        sets attribute empty to true
      when one or more closed issues does not have a closed event
        sets attribute accurate to false
  group milestone burndown
    when nested group milestone
      behaves like burndown for milestone
        generates an array with date, issue count and weight
        returns empty array if milestone start date is nil
        returns empty array if milestone due date is nil
        it counts until today if milestone due date > Date.today
        sets attribute accurate to true
        when all closed issues does not have closed events
          considers closed_at as milestone start date
          sets attribute empty to true
        when one or more closed issues does not have a closed event
          sets attribute accurate to false
    when non-nested group milestone
      behaves like burndown for milestone
        generates an array with date, issue count and weight
        returns empty array if milestone start date is nil
        returns empty array if milestone due date is nil
        it counts until today if milestone due date > Date.today
        sets attribute accurate to true
        when all closed issues does not have closed events
          considers closed_at as milestone start date
          sets attribute empty to true
        when one or more closed issues does not have a closed event
          sets attribute accurate to false

Gitlab::Elastic::SearchResults
  parse_search_result
    returns an unhighlighted blob when no highlight data is present
    parses the blob with highlighting
  issues
    lists found issues
    returns empty list when issues are not found
    lists issue when search by a valid iid
    returns empty list when search by invalid iid
  confidential issues
    search by term
      does not list confidential issues for guests
      does not list confidential issues for non project members
      lists confidential issues for author
      lists confidential issues for assignee
      lists confidential issues for project members
      lists all issues for admin
    search by iid
      does not list confidential issues for guests
      does not list confidential issues for non project members
      lists confidential issues for author
      lists confidential issues for assignee
      lists confidential issues for project members
      lists all issues for admin
  merge requests
    lists found merge requests
    returns empty list when merge requests are not found
    lists merge request when search by a valid iid
    returns empty list when search by invalid iid
  project scoping
    returns items for project
  Blobs
    finds blobs
    finds blobs from public projects only
    returns zero when blobs are not found
    Searches CamelCased methods
      find by first word
      find by first two words
      find by last two words
      find by exact match
    Searches special characters
      finds files with dashes
      finds files with dots
      finds files with other special chars
  Wikis
    finds wiki blobs
    finds wiki blobs for guest
    finds wiki blobs from public projects only
    returns zero when wiki blobs are not found
    when wiki is disabled
      search by member
        should be empty
      search by non-member
        should be empty
    when wiki is internal
      search by member
        should not be empty
      search by non-member
        should be empty
  Commits
    finds commits
    finds commits from public projects only
    returns zero when commits are not found
  Visibility levels
    Issues
      finds right set of issues
    Milestones
      finds right set of milestine
    Projects
      finds right set of projects
    Merge Requests
      finds right set of merge requests
    Wikis
      finds the right set of wiki blobs
    Commits
      finds right set of commits
    Blobs
      finds right set of blobs

Projects::MergeRequestsController
  behaves like approvals
    approve
      approves the merge request
    approvals
      shows approval information
    unapprove
      unapproves the merge request
  PUT update
    when the merge request requires approval
      behaves like update invalid issuable
        when updating causes conflicts
          renders edit when format is html
          renders json error message when format is json
        when updating an invalid issuable
          renders edit when merge request is invalid
    overriding approvers per MR
      enabled
        updates approvals
      disabled
        does not update approvals_before_merge
        does not update approver_ids
        does not update approver_group_ids
    when the MR targets the project
      behaves like approvals_before_merge param
        approvals_before_merge not set for the existing MR
          when it is less than the one in the target project
            sets the param to nil
            updates the merge request
          when it is equal to the one in the target project
            sets the param to nil
            updates the merge request
          when it is greater than the one in the target project
            saves the param in the merge request
            updates the merge request
        approvals_before_merge set for the existing MR
          when it is not set
            does not change the merge request
            updates the merge request
          when it is less than the one in the target project
            sets the param to nil
            updates the merge request
          when it is equal to the one in the target project
            sets the param to nil
            updates the merge request
          when it is greater than the one in the target project
            saves the param in the merge request
            updates the merge request
    when the project is a fork
      when the MR target upstream
        behaves like approvals_before_merge param
          approvals_before_merge not set for the existing MR
            when it is less than the one in the target project
              sets the param to nil
              updates the merge request
            when it is equal to the one in the target project
              sets the param to nil
              updates the merge request
            when it is greater than the one in the target project
              saves the param in the merge request
              updates the merge request
          approvals_before_merge set for the existing MR
            when it is not set
              does not change the merge request
              updates the merge request
            when it is less than the one in the target project
              sets the param to nil
              updates the merge request
            when it is equal to the one in the target project
              sets the param to nil
              updates the merge request
            when it is greater than the one in the target project
              saves the param in the merge request
              updates the merge request
      when the MR target the fork
        behaves like approvals_before_merge param
          approvals_before_merge not set for the existing MR
            when it is less than the one in the target project
              sets the param to nil
              updates the merge request
            when it is equal to the one in the target project
              sets the param to nil
              updates the merge request
            when it is greater than the one in the target project
              saves the param in the merge request
              updates the merge request
          approvals_before_merge set for the existing MR
            when it is not set
              does not change the merge request
              updates the merge request
            when it is less than the one in the target project
              sets the param to nil
              updates the merge request
            when it is equal to the one in the target project
              sets the param to nil
              updates the merge request
            when it is greater than the one in the target project
              saves the param in the merge request
              updates the merge request
  POST merge
    when the sha parameter matches the source SHA
      when squash is passed as 1
        updates the squash attribute on the MR to true
        merges even when squash is unavailable
      when squash is passed as 0
        updates the squash attribute on the MR to false
  POST #rebase
    approvals pending
      returns 200
    with a forked project
      behaves like approvals
        approve
          approves the merge request
        approvals
          shows approval information
        unapprove
          unapproves the merge request

GlobalSearch
  Respect feature visibility levels
    Private projects
      does not find items if features are disabled
      shows items to member only if features are enabled
    Internal projects
      does not find items if features are disabled
      shows items to member only if features are enabled
      shows items to member only if features are private
    Public projects
      does not find items if features are disabled
      finds items if features are enabled
      shows items to member only if features are private

Dropdown weight
Starting the Capybara driver server...
  behavior
    opens when the search bar has weight:
    closes when the search bar is unfocused
    should load all the weights when opened
  selecting from dropdown
    fills in weight 1
    fills in weight 2
    fills in weight 3
    fills in `no weight`
  input has existing content
    opens weight dropdown with existing search term
    opens weight dropdown with existing assignee
    opens weight dropdown with existing label
    opens weight dropdown with existing milestone

GroupPolicy
  when epics feature is disabled
    should be disallowed :read_epic, :create_epic, :admin_epic, and :destroy_epic
  when epics feature is enabled
    should be allowed :read_epic, :create_epic, :admin_epic, and :destroy_epic
  per group SAML
    should be disallowed :admin_group_saml
    owner
      should be allowed :admin_group_saml
    admin
      should be allowed :admin_group_saml
  when LDAP sync is not enabled
    owner
      should be disallowed :override_group_member
      should be allowed :admin_ldap_group_links
      does not allow group owners to manage ldap
        should be disallowed :admin_ldap_group_links
    admin
      should be disallowed :override_group_member
      should be allowed :admin_ldap_group_links
  when LDAP sync is enabled
    with no user
      should be disallowed :override_group_member
      should be disallowed :admin_ldap_group_links
    guests
      should be disallowed :override_group_member
      should be disallowed :admin_ldap_group_links
    reporter
      should be disallowed :override_group_member
      should be disallowed :admin_ldap_group_links
    developer
      should be disallowed :override_group_member
      should be disallowed :admin_ldap_group_links
    master
      should be disallowed :override_group_member
      should be disallowed :admin_ldap_group_links
    owner
      allow group owners to manage ldap
        should be allowed :override_group_member
      does not allow group owners to manage ldap
        should be disallowed :override_group_member
        should be disallowed :admin_ldap_group_links
    admin
      should be allowed :override_group_member
      should be allowed :admin_ldap_group_links
  create_projects
    project_creation_level enabled
      when group has no project creation level set
        reporter
          should be disallowed :create_projects
        developer
          should be allowed :create_projects
        master
          should be allowed :create_projects
        owner
          should be allowed :create_projects
      when group has project creation level set to no one
        reporter
          should be disallowed :create_projects
        developer
          should be disallowed :create_projects
        master
          should be disallowed :create_projects
        owner
          should be disallowed :create_projects
      when group has project creation level set to master only
        reporter
          should be disallowed :create_projects
        developer
          should be disallowed :create_projects
        master
          should be allowed :create_projects
        owner
          should be allowed :create_projects
      when group has project creation level set to developers + master
        reporter
          should be disallowed :create_projects
        developer
          should be allowed :create_projects
        master
          should be allowed :create_projects
        owner
          should be allowed :create_projects
    project_creation_level disabled
      when group has no project creation level set
        reporter
          should be disallowed :create_projects
        developer
          should be disallowed :create_projects
        master
          should be allowed :create_projects
        owner
          should be allowed :create_projects
      when group has project creation level set to no one
        reporter
          should be disallowed :create_projects
        developer
          should be disallowed :create_projects
        master
          should be allowed :create_projects
        owner
          should be allowed :create_projects
      when group has project creation level set to master only
        reporter
          should be disallowed :create_projects
        developer
          should be disallowed :create_projects
        master
          should be allowed :create_projects
        owner
          should be allowed :create_projects
      when group has project creation level set to developers + master
        reporter
          should be disallowed :create_projects
        developer
          should be disallowed :create_projects
        master
          should be allowed :create_projects
        owner
          should be allowed :create_projects

New/edit issue
  new issue
    allows user to create new issue
    correctly updates the selected user when changing assignee
    shorten users API pagination limit
      should display selected users even if they are not part of the original API call
    multiple assignees
      unselects other assignees when unassigned is selected
      toggles assign to me when current user is selected and unselected

Project elastic search
  searching
    finds issues
    finds merge requests
    finds milestones
    finds wiki pages
    finds notes
    finds commits
    finds blobs

Issue Boards
  assignee
    updates the issues assignee
    adds multiple assignees
    removes the assignee
    assignees to current user
    updates assignee dropdown
  epic
    when the issue is not associated with an epic
      displays `None` for value of epic
    when the issue is associated with an epic
      displays name of epic and links to it
  weight
    displays weight async
    updates weight in sidebar to 1
    updates weight in sidebar to no weight

Squashing merge requests
  when the MR has only one commit
    does not show the squash checkbox
  when squash is enabled on merge request creation
    shows the squash checkbox as checked
    when accepting with squash checked
      squashes the commits into a single commit, and adds a merge commit
    when accepting and unchecking squash
      accepts the merge request without squashing
  when squash is not enabled on merge request creation
    shows the squash checkbox as unchecked
    when accepting and checking squash
      squashes the commits into a single commit, and adds a merge commit
    when accepting with squash unchecked
      accepts the merge request without squashing
  squash is unlicensed
    does not show squash option when creating MR
    does not show squash option when viewing MR

Merge request > User approves
  Approving by approvers from groups
    when group is assigned to a project
      I am able to approve
      I am able to unapprove
    when group is assigned to a merge request
      I am able to approve
      I am able to unapprove
    when CI is running but no approval given
      I am unable to set Merge when pipeline succeeds
  when merge when discussions resolved is active
    does not show checking ability text

Merge request > User sets approvers
  when editing an MR with a different author
    does not allow setting the author as an approver but allows setting the current user as an approver
  when creating an MR from a fork
    allows setting other users as approvers but does not allow setting the current user as an approver, and filters non members from approvers list
  Group approvers
    when creating an MR
      allows setting groups as approvers
      allows delete approvers group when it is set in project
    when editing an MR with a different author
      allows setting groups as approvers
      allows delete approvers group when it`s set in project
      allows changing approvals number

MergeRequest
  should delegate #expose_sast_data? to #head_pipeline object
  should delegate #base_has_sast_data? to #base_pipeline object as #has_sast_data?
  should delegate #head_sast_artifact to #head_pipeline object as #sast_artifact
  should delegate #base_sast_artifact to #base_pipeline object as #sast_artifact
  should delegate #expose_dast_data? to #head_pipeline object
  should delegate #base_has_dast_data? to #base_pipeline object as #has_dast_data?
  should delegate #head_dast_artifact to #head_pipeline object as #dast_artifact
  should delegate #base_dast_artifact to #base_pipeline object as #dast_artifact
  should delegate #expose_sast_container_data? to #head_pipeline object
  should delegate #base_has_sast_container_data? to #base_pipeline object as #has_sast_container_data?
  should delegate #head_sast_container_artifact to #head_pipeline object as #sast_container_artifact
  should delegate #base_sast_container_artifact to #base_pipeline object as #sast_container_artifact
  associations
    should have many approvals dependent => delete_all
    should have many approvers dependent => delete_all
    should have many approver_groups dependent => delete_all
    should have many approved_by_users
  #squash_in_progress?
    when Gitaly squash_in_progress is enabled
      behaves like checking whether a squash is in progress
Preparing /builds/gitlab-org/gitlab-ee/tmp/tests/repositories/@hashed/2c/58/2c58b3a68ac99f845a207a613ce245b3fd2dd839320355a9778e9319f96363b2.git/gitlab-worktree/squash-126 (identifier squash-126)
HEAD is now at b83d6e3 Merge branch 'branch-merged' into 'master'
        returns true when there is a current squash directory
Preparing /builds/gitlab-org/gitlab-ee/tmp/tests/repositories/@hashed/02/52/0252b081bda70b478f0131b310a93cb8d79086d785fb4ae392a8c5ffc3ddc5fe.git/gitlab-worktree/squash-127 (identifier squash-127)
HEAD is now at b83d6e3 Merge branch 'branch-merged' into 'master'
        returns false when there is no squash directory
Preparing /builds/gitlab-org/gitlab-ee/tmp/tests/repositories/@hashed/c7/b9/c7b96125d8bb1b5ac26f057909f1a29dcd87d00ced1a9b563f3220b6d6038d66.git/gitlab-worktree/squash-128 (identifier squash-128)
HEAD is now at b83d6e3 Merge branch 'branch-merged' into 'master'
        returns false when the squash directory has expired
Preparing /builds/gitlab-org/gitlab-ee/tmp/tests/repositories/@hashed/48/e1/48e1ff78f2967629663434954e7034e9a16116b94c678174f080fb20509144dc.git/gitlab-worktree/squash-129 (identifier squash-129)
HEAD is now at b83d6e3 Merge branch 'branch-merged' into 'master'
        returns false when the source project has been removed
    when Gitaly squash_in_progress is disabled
      behaves like checking whether a squash is in progress
Preparing /builds/gitlab-org/gitlab-ee/tmp/tests/repositories/@hashed/d4/05/d40535ac09aac0ef32f8a23b8bb8e04bc2e8f9d6b0981fa98a16d0382f558d83.git/gitlab-worktree/squash-130 (identifier squash-130)
HEAD is now at b83d6e3 Merge branch 'branch-merged' into 'master'
        returns true when there is a current squash directory
Preparing /builds/gitlab-org/gitlab-ee/tmp/tests/repositories/@hashed/ef/ec/efec9aaf21433bf806e7681de337cac7dbecfbf17b22ad3bcdfe5e46e564f32f.git/gitlab-worktree/squash-131 (identifier squash-131)
HEAD is now at b83d6e3 Merge branch 'branch-merged' into 'master'
        returns false when there is no squash directory
Preparing /builds/gitlab-org/gitlab-ee/tmp/tests/repositories/@hashed/27/48/274897360371d52c0d6f5e7dcc285f914c51a39bb714f51a7a547433b143c151.git/gitlab-worktree/squash-132 (identifier squash-132)
HEAD is now at b83d6e3 Merge branch 'branch-merged' into 'master'
        returns false when the squash directory has expired
Preparing /builds/gitlab-org/gitlab-ee/tmp/tests/repositories/@hashed/ca/15/ca153fc499ffc25f1118ad5e58ff242584f3b3a285d4d9428615325613633e3e.git/gitlab-worktree/squash-133 (identifier squash-133)
HEAD is now at b83d6e3 Merge branch 'branch-merged' into 'master'
        returns false when the source project has been removed
  #squash?
    unlicensed
      disabled in database
        should be falsy
      enabled in database
        should be falsy
    licensed
      disabled in database
        should be falsy
      licensed
        should be truthy
  #approvals_before_merge
    license_value: true, db_value: 5, expected: 5
      should eq 5
    license_value: true, db_value: nil, expected: nil
      should eq nil
    license_value: false, db_value: 5, expected: nil
      should eq nil
    license_value: false, db_value: nil, expected: nil
      should eq nil
  #base_pipeline
    should eq #<Ci::Pipeline id: 2, ref: "master", sha: "ae73cb07c9eeaf35924a10f713b364d32b2dd34f", before_sha: nil...il, pipeline_schedule_id: nil, source: 1, config_source: nil, protected: false, failure_reason: nil>
  #base_codeclimate_artifact
WARNING: An expectation of `:codeclimate_artifact` was set on `nil`. To allow expectations on `nil` and suppress this message, set `RSpec::Mocks.configuration.allow_message_expectations_on_nil` to `true`. To disallow expectations on `nil`, set `RSpec::Mocks.configuration.allow_message_expectations_on_nil` to `false`. Called from /builds/gitlab-org/gitlab-ee/ee/spec/models/merge_request_spec.rb:125:in `block (3 levels) in <top (required)>'.
    delegates to merge request diff
  #head_codeclimate_artifact
WARNING: An expectation of `:codeclimate_artifact` was set on `nil`. To allow expectations on `nil` and suppress this message, set `RSpec::Mocks.configuration.allow_message_expectations_on_nil` to `true`. To disallow expectations on `nil`, set `RSpec::Mocks.configuration.allow_message_expectations_on_nil` to `false`. Called from /builds/gitlab-org/gitlab-ee/ee/spec/models/merge_request_spec.rb:136:in `block (3 levels) in <top (required)>'.
    delegates to merge request diff
  #base_performance_artifact
WARNING: An expectation of `:performance_artifact` was set on `nil`. To allow expectations on `nil` and suppress this message, set `RSpec::Mocks.configuration.allow_message_expectations_on_nil` to `true`. To disallow expectations on `nil`, set `RSpec::Mocks.configuration.allow_message_expectations_on_nil` to `false`. Called from /builds/gitlab-org/gitlab-ee/ee/spec/models/merge_request_spec.rb:147:in `block (3 levels) in <top (required)>'.
    delegates to merge request diff
  #head_performance_artifact
WARNING: An expectation of `:performance_artifact` was set on `nil`. To allow expectations on `nil` and suppress this message, set `RSpec::Mocks.configuration.allow_message_expectations_on_nil` to `true`. To disallow expectations on `nil`, set `RSpec::Mocks.configuration.allow_message_expectations_on_nil` to `false`. Called from /builds/gitlab-org/gitlab-ee/ee/spec/models/merge_request_spec.rb:158:in `block (3 levels) in <top (required)>'.
    delegates to merge request diff
  #expose_codeclimate_data?
    with codeclimate data
      should be truthy
    without codeclimate data
      should be falsey
  #expose_performance_data?
    with performance data
      should be truthy
    without performance data
      should be falsey

New project
  repository mirrors
    when licensed
      shows mirror repository checkbox enabled
    when unlicensed
      does not show mirror repository option
  CI/CD for external repositories
    when licensed
      shows CI/CD tab and pane
      "Import project" tab creates projects with features enabled
      creates CI/CD project from repo URL
      creates CI/CD project from GitHub
      new GitHub CI/CD project page has link to status page with ?ci_cd_only=true param
      stays on GitHub import page after access token failure
    when unlicensed
      does not show CI/CD only tab

User approves a merge request
  when user can approve
    approves a merge request
  when a merge request is approved additionally
    shows multiple approvers beyond the needed count
    doesn't show the add approval when a merge request is closed
  when user cannot approve
    does not approves a merge request

Service Desk Issue Tracker
  navigation to service desk
    can navigate to the service desk from link in the sidebar
  issues list
    when service desk has not been activated
      service desk info content
        when user has permissions to edit project settings
          displays the large info box
          has a link to the documentation
          does show a button configure service desk
        when user does not have permission to edit project settings
          does not show a button configure service desk
    when service desk has been activated
      when there are no issues
        service desk info content
          displays the large info box
          has a link to the documentation
          does not show a button configure service desk
          shows the service desk email address
      when there are issues
        service desk info content
          displays the small info box
          has a link to the documentation
          does not show a button configure service desk
          shows the service desk email address
        issues list
          only displays issues created by support bot
        search box
          adds hidden support bot author token
          support bot author token cannot be deleted

Boards::IssuesController
  GET index
    with invalid board id
      returns a not found 404 response
    when list id is present
      with valid list id
        returns issues that have the list label applied
      with invalid list id
        returns a not found 404 response
    when list id is missing
      returns opened issues without board labels applied
    with unauthorized user
      returns a forbidden 403 response
    with external authorization
      returns a 404 for group boards
      is successful for project boards
  POST create
    with valid params
      returns a successful 200 response
      returns the created issue
    with invalid params
      when title is nil
        returns an unprocessable entity 422 response
      when list does not belongs to project board
        returns a not found 404 response
      with invalid board id
        returns a not found 404 response
      with invalid list id
        returns a not found 404 response
    with unauthorized user
      returns a forbidden 403 response
  PATCH update
    with valid params
      returns a successful 200 response
      moves issue to the desired list
    with invalid params
      returns a unprocessable entity 422 response for invalid lists
      returns a not found 404 response for invalid board id
      returns a not found 404 response for invalid issue id
    with unauthorized user
      returns a forbidden 403 response

Project settings > [EE] Merge Requests
  adds approver
  filter approvers
  adds approver group
  with an approver group
    removes approver group
  issuable default templates feature not available
    input to configure merge request template is not shown
  issuable default templates feature is available
    input to configure merge request template is not shown

Geo::RepositorySyncService
  behaves like geo base sync execution
    #execute
      when can acquire exclusive lease
        executes the synchronization
      when exclusive lease is not acquired
        is does not execute synchronization
  behaves like geo base sync fetch and repack
    #fetch_repository
      cleans up temporary repository
      updates registry
      fetches repository from geo node
      redownload
        fetches repository from geo node into temporary location
        schedule git repack
      repository does not exist
        ensures repository is created
        schedule git repack
  #execute
    fetches project repository with JWT credentials
    expires repository caches
    returns the lease when succeed
    voids the failure message when it succeeds after an error
    returns the lease when sync fail
    does not fetch project repository if cannot obtain a lease
    rescues when Gitlab::Shell::Error is raised
    rescues when Gitlab::Git::RepositoryMirroring::RemoteError is raised
    rescues exception and fires after_create hook when Gitlab::Git::Repository::NoRepository is raised
    increases retry count when Gitlab::Git::Repository::NoRepository is raised
    marks sync as successful if no repository found
    tracking database
      creates a new registry if does not exists
      does not create a new registry if one exist
      temporary repositories
        there is a leftover repository
          removes leftover repository
      when repository sync succeed
        sets last_repository_synced_at
        sets last_repository_successful_sync_at
        resets the repository_verification_checksum_sha
        resets the last_repository_verification_failure
        resets the repository_checksum_mismatch
        logs success with timings
        sets repository_retry_count and repository_retry_at to nil
        with non empty repositories
          syncs gitattributes to info/attributes
      when repository sync fail
        sets last_repository_synced_at
        resets last_repository_successful_sync_at
        resets repository_retry_count
        resets repository_retry_at
        sets last_repository_sync_failure
    retries
      tries to fetch repo
      sets the redownload flag to false after success
      tries to redownload repo
      tries to redownload repo when force_redownload flag is set
      cleans temporary repo after redownload
      successfully redownloads the repository even if the retry time exceeds max value
      no repository
        does not raise an error
    behaves like sync retries use the snapshot RPC
      snapshot synchronization method
        does not attempt to snapshot for initial sync
        does not attempt to snapshot for ordinary retries
        registry is ready to be snapshotted
          attempts to snapshot
          attempts to fetch if snapshotting raises an exception
          does not attempt to snapshot if the feature flag is disabled
  #schedule_repack
    schedule GitGarbageCollectWorker for full repack

Groups::EpicIssuesController
  GET #index
    behaves like unlicensed epics action
      returns 400 status
    when epics feature is enabled
      returns status 200
      returns the correct json
  POST #create
    behaves like unlicensed epics action
      returns 400 status
    when epics feature is enabled
      when user has permissions to create requested association
        returns correct response for the correct issue reference
        creates a new EpicIssue record
      when user does not have permissions to create requested association
        returns correct response for the correct issue reference
        does not create a new EpicIssue record
  DELETE #destroy
    behaves like unlicensed epics action
      returns 400 status
    when epics feature is enabled
      when user has permissions to delete the link
        returns status 200
        destroys the link
      when user does not have permissions to delete the link
        returns status 404
        does not destroy the link
      when the epic from the association does not equal epic from the path
        returns status 404
        does not destroy the link
      when the epic_issue record does not exists
        returns status 404
  PUT #update
    behaves like unlicensed epics action
      returns 400 status
    when epics feature is enabled
      when user has permissions to admin the epic
        returns status 200
        updates the issue position value
      when user does not have permissions to admin the epic
        returns status 404
      when the epic from the association does not equal epic from the path
        returns status 404
      when the epic_issue record does not exists
        returns status 404

ElasticIndexerWorker
  returns true if ES disabled
  Indexing new records
    indexes a project
    indexes an issue
    indexes a note
    indexes a milestone
    indexes a merge request
  Updating index
    updates a project
    updates an issue
    updates a note
    updates a milestone
    updates a merge request
  Delete
    deletes a project with all nested objects
    deletes an issue
    deletes a note
    deletes a milestone
    deletes a merge request

Discussion Comments Epic
  behaves like discussion comments
    clicking "Comment" will post a comment
    when the toggle is clicked
      has a "Comment" item (selected by default) and "Start discussion" item
      closes the menu when clicking the toggle or body
      clicking the ul padding or divider should not change the text
      when selecting "Start discussion"
        updates the submit button text and closes the dropdown
        creating a discussion
          clicking "Start discussion" will post a discussion
        when opening the menu
          should have "Start discussion" selected
          when selecting "Comment"
            updates the submit button text and closes the dropdown
            should have "Comment" selected when opening the menu

Projects::UpdateRemoteMirrorService
  #execute
2018-05-02T15:22:36.318Z 130 TID-bla08 INFO: Removing remote remote_mirror_1 from project 1342
2018-05-02T15:22:36.321Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_1 from project 1342
    does nothing when unlicensed
2018-05-02T15:22:36.620Z 130 TID-bla08 INFO: Removing remote remote_mirror_2 from project 1344
2018-05-02T15:22:36.623Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_2 from project 1344
    fetches the remote repository
2018-05-02T15:22:37.091Z 130 TID-bla08 INFO: Removing remote remote_mirror_3 from project 1346
2018-05-02T15:22:37.094Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_3 from project 1346
    succeeds
    Syncing branches
2018-05-02T15:22:37.494Z 130 TID-bla08 INFO: Removing remote remote_mirror_4 from project 1348
2018-05-02T15:22:37.498Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_4 from project 1348
      push all the branches the first time
2018-05-02T15:22:37.880Z 130 TID-bla08 INFO: Removing remote remote_mirror_5 from project 1350
2018-05-02T15:22:37.883Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_5 from project 1350
      does not push anything is remote is up to date
2018-05-02T15:22:38.252Z 130 TID-bla08 INFO: Removing remote remote_mirror_6 from project 1352
2018-05-02T15:22:38.255Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_6 from project 1352
      sync new branches
2018-05-02T15:22:38.621Z 130 TID-bla08 INFO: Removing remote remote_mirror_7 from project 1354
2018-05-02T15:22:38.624Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_7 from project 1354
      sync updated branches
      when push only protected branches option is set
2018-05-02T15:22:39.011Z 130 TID-bla08 INFO: Removing remote remote_mirror_8 from project 1356
2018-05-02T15:22:39.015Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_8 from project 1356
        sync updated protected branches
2018-05-02T15:22:39.414Z 130 TID-bla08 INFO: Removing remote remote_mirror_9 from project 1358
2018-05-02T15:22:39.418Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_9 from project 1358
        does not sync unprotected branches
      when branch exists in local and remote repo
        when it has diverged
2018-05-02T15:22:39.797Z 130 TID-bla08 INFO: Removing remote remote_mirror_10 from project 1360
2018-05-02T15:22:39.800Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_10 from project 1360
          syncs branches
      for delete
        when branch exists in local and remote repo
2018-05-02T15:22:40.178Z 130 TID-bla08 INFO: Removing remote remote_mirror_11 from project 1362
2018-05-02T15:22:40.182Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_11 from project 1362
          deletes the branch from remote repo
        when push only protected branches option is set
          when branch exists in local and remote repo
2018-05-02T15:22:40.557Z 130 TID-bla08 INFO: Removing remote remote_mirror_12 from project 1364
2018-05-02T15:22:40.560Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_12 from project 1364
            deletes the protected branch from remote repo
2018-05-02T15:22:41.013Z 130 TID-bla08 INFO: Removing remote remote_mirror_13 from project 1366
2018-05-02T15:22:41.016Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_13 from project 1366
            does not delete the unprotected branch from remote repo
          when branch only exists on remote repo
            when it has diverged
2018-05-02T15:22:41.382Z 130 TID-bla08 INFO: Removing remote remote_mirror_14 from project 1368
2018-05-02T15:22:41.385Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_14 from project 1368
              does not delete the remote branch
            when it has not diverged
2018-05-02T15:22:41.746Z 130 TID-bla08 INFO: Removing remote remote_mirror_15 from project 1370
2018-05-02T15:22:41.749Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_15 from project 1370
              deletes the remote branch
        when branch only exists on remote repo
          when it has diverged
2018-05-02T15:22:42.109Z 130 TID-bla08 INFO: Removing remote remote_mirror_16 from project 1372
2018-05-02T15:22:42.113Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_16 from project 1372
            does not delete the remote branch
          when it has not diverged
2018-05-02T15:22:42.466Z 130 TID-bla08 INFO: Removing remote remote_mirror_17 from project 1374
2018-05-02T15:22:42.469Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_17 from project 1374
            deletes the remote branch
    Syncing tags
      when there are not tags to push
2018-05-02T15:22:42.826Z 130 TID-bla08 INFO: Removing remote remote_mirror_18 from project 1376
2018-05-02T15:22:42.829Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_18 from project 1376
        does not try to push tags
      when there are some tags to push
2018-05-02T15:22:43.199Z 130 TID-bla08 INFO: Removing remote remote_mirror_19 from project 1378
2018-05-02T15:22:43.202Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_19 from project 1378
        pushes tags to remote
      when there are some tags to delete
2018-05-02T15:22:43.639Z 130 TID-bla08 INFO: Removing remote remote_mirror_20 from project 1380
2018-05-02T15:22:43.643Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_20 from project 1380
        deletes tags from remote

Ldap::OmniauthCallbacksController
  displays LDAP sync flash on first sign in
  skips LDAP sync flash on subsequent sign ins
  access denied
    logs a failure event

Groups::AnalyticsController
  returns 404 when feature is not available and we dont show promotions
  sets instance variables properly
  returns member contributions JSON when format is JSON
  does not cause N+1 queries when the format is JSON
  unlicensed but we show promotions
    returns page when feature is not available and we show promotions
  with views
    avoids a N+1 query in #show
  GET #index
    behaves like disabled when using an external authorization service
      works when the feature is not enabled
      renders a 404 with a message when the feature is enabled

Projects::CreateService#execute
  with a CI/CD only project
    when CI/CD projects feature is available
      calls the service to setup CI/CD on the project
    when CI/CD projects feature is not available
      doesn't call the service to setup CI/CD on the project
  repository_size_limit assignment as Bytes
    when param present
      assign repository_size_limit as Bytes
    when param not present
      assign nil value
  without repository mirror
    sets the mirror to false
  with repository mirror
    when licensed
      sets the correct attributes
      with mirror trigger builds
        sets the mirror trigger builds
      with checks on the namespace
        when not licensed on a namespace
          does not allow enabeling mirrors
        when licensed on a namespace
          allows enabling mirrors
    when unlicensed
      does not set mirror attributes
      with mirror trigger builds
        sets the mirror trigger builds
  git hook sample
    creates git hook from sample
    push rules unlicensed
      ignores the push rule sample
  when running on a primary node
    logs an event to the Geo event log
    does not log event to the Geo log if project creation fails
  when importing Project by repo URL
    and check namespace plan is enabled
      creates the project
  audit events
    does not log audit event if project operation fails
    if operation succeed
      logs an audit event if operation succeed
      logs the project info

admin Geo Nodes
  show all public Geo Nodes and create new node link
  create a new Geo Nodes
    creates a new Geo Node
    returns an error message when a duplicate primary is added
  update an existing Geo Node
    updates an existing Geo Node
  remove an existing Geo Node
    removes an existing Geo Node

Notify
  for a project
    for merge requests
      that are new with approver
        contains the approvers list
      that are approved
        is sent as the last approver
        has the correct subject
        contains the new status
        contains a link to the merge request
        contains the names of all of the approvers
        behaves like a multiple recipients email
          is sent to the given recipient
        behaves like an answer to an existing thread with reply-by-email enabled
          has X-GitLab-Project headers
          has X-GitLab-Project headers
          has the characteristics of a threaded reply
          when reply-by-email is enabled with incoming address with %{key}
            has a Reply-To header
          when reply-by-email is enabled with incoming address without %{key}
            has X-GitLab-Project headers
            has the characteristics of a threaded reply
            has a Reply-To header
        behaves like it should show Gmail Actions View Merge request link
          should have body including "View Merge request"
          behaves like it should have Gmail Actions links
            should have body including "ViewAction"
        behaves like an unsubscribeable thread
          has a List-Unsubscribe header in the correct format, and a body link
          behaves like an unsubscribeable thread with incoming address without %{key}
            has a List-Unsubscribe header in the correct format, and a body link
        when merge request has no assignee
          does not show the assignee
      that are unapproved
        is sent as the last unapprover
        has the correct subject
        contains the new status
        contains a link to the merge request
        contains the names of all of the approvers
        behaves like a multiple recipients email
          is sent to the given recipient
        behaves like an answer to an existing thread with reply-by-email enabled
          has X-GitLab-Project headers
          has X-GitLab-Project headers
          has the characteristics of a threaded reply
          when reply-by-email is enabled with incoming address with %{key}
            has a Reply-To header
          when reply-by-email is enabled with incoming address without %{key}
            has X-GitLab-Project headers
            has the characteristics of a threaded reply
            has a Reply-To header
        behaves like it should show Gmail Actions View Merge request link
          should have body including "View Merge request"
          behaves like it should have Gmail Actions links
            should have body including "ViewAction"
        behaves like an unsubscribeable thread
          has a List-Unsubscribe header in the correct format, and a body link
          behaves like an unsubscribeable thread with incoming address without %{key}
            has a List-Unsubscribe header in the correct format, and a body link
    for merge requests without assignee
      that are unapproved
        contains the new status

Projects > Push Rules
  reject_unsigned_commits rule
    unlicensed
      does not render the setting checkbox
    licensed
      renders the setting checkbox
      with GL.com plans
        when disabled
          does not render the setting checkbox
        when enabled
          renders the setting checkbox
  commit_committer_check rule
    unlicensed
      does not render the setting checkbox
    licensed
      renders the setting checkbox
      with GL.com plans
        when disabled
          does not render the setting checkbox
        when enabled
          renders the setting checkbox

Ci::Build
  .codequality
    when a job name is codequality
      should include #<Ci::Build id: 1, status: "pending", finished_at: nil, trace: nil, created_at: "2018-05-02 08:50:29"... 1, artifacts_file_store: nil, artifacts_metadata_store: nil, protected: false, failure_reason: nil>
    when a job name is codeclimate
      should include #<Ci::Build id: 2, status: "pending", finished_at: nil, trace: nil, created_at: "2018-05-02 08:50:29"... 2, artifacts_file_store: nil, artifacts_metadata_store: nil, protected: false, failure_reason: nil>
    when a job name is irrelevant
      should not include #<Ci::Build id: 3, status: "pending", finished_at: nil, trace: nil, created_at: "2018-05-02 08:50:29"... 3, artifacts_file_store: nil, artifacts_metadata_store: nil, protected: false, failure_reason: nil>
  #shared_runners_minutes_limit_enabled?
    for shared runner
      should be truthy
    with specific runner
      should be falsey
    without runner
      should be falsey
  updates pipeline minutes
    for event success
    for event drop
    for event cancel
  #stick_build_if_status_changed
    sticks the build if the status changed
  #variables
    when environment specific variable is defined
      when variable environment scope is available
        should include {:key => "ENV_KEY", :value => "environment", :public => false}
      when variable environment scope is not available
        should not include {:key => "ENV_KEY", :value => "environment", :public => false}
      when there is a plan for the group
        GITLAB_FEATURES should include the features for that plan
  #has_codeclimate_json?
    valid build
      should be truthy
    invalid build
      should be falsey
  #has_performance_json?
    valid build
      should be truthy
    invalid build
      should be falsey
  #has_sast_json?
    valid build
      should be truthy
    invalid build
      should be falsey
  #has_dependency_scanning_json?
    valid build
      should be truthy
    invalid build
      should be falsey
  #has_sast_container_json?
    valid build
      should be truthy
    invalid build
      should be falsey
  #has_dast_json?
    valid build
      should be truthy
    invalid build
      should be falsey

RemoteMirror
  URL validation
    with a valid URL
      should be valid
    with an invalid URL
      should not be valid
  encrypting credentials
    when setting URL for a first time
2018-05-02T15:24:41.029Z 130 TID-bla08 INFO: Removing remote remote_mirror_21 from project 1444
2018-05-02T15:24:41.035Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_21 from project 1444
      stores the URL without credentials
2018-05-02T15:24:41.206Z 130 TID-bla08 INFO: Removing remote remote_mirror_22 from project 1445
2018-05-02T15:24:41.211Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_22 from project 1445
      stores the credentials on a separate field
2018-05-02T15:24:41.376Z 130 TID-bla08 INFO: Removing remote remote_mirror_23 from project 1446
2018-05-02T15:24:41.383Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_23 from project 1446
      handles credentials with large content
    when updating the URL
2018-05-02T15:24:41.545Z 130 TID-bla08 INFO: Removing remote remote_mirror_24 from project 1447
2018-05-02T15:24:41.551Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_24 from project 1447
2018-05-02T15:24:41.564Z 130 TID-bla08 INFO: Removing remote remote_mirror_7f96f03770537d8bc3adb6bb3c321fb1 from project 1447
2018-05-02T15:24:41.570Z 130 TID-bla08 INFO: Remote remote_mirror_7f96f03770537d8bc3adb6bb3c321fb1 was successfully removed from project 1447
      allows a new URL without credentials
2018-05-02T15:24:41.733Z 130 TID-bla08 INFO: Removing remote remote_mirror_25 from project 1448
2018-05-02T15:24:41.738Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_25 from project 1448
2018-05-02T15:24:41.754Z 130 TID-bla08 INFO: Removing remote remote_mirror_d88ad509409e32291d13c60618be5a87 from project 1448
2018-05-02T15:24:41.760Z 130 TID-bla08 INFO: Remote remote_mirror_d88ad509409e32291d13c60618be5a87 was successfully removed from project 1448
      allows a new URL with credentials
2018-05-02T15:24:41.929Z 130 TID-bla08 INFO: Removing remote remote_mirror_26 from project 1449
2018-05-02T15:24:41.937Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_26 from project 1449
2018-05-02T15:24:41.953Z 130 TID-bla08 INFO: Removing remote remote_mirror_4b270e030e828b272383b8e6f4ffb3d9 from project 1449
2018-05-02T15:24:41.961Z 130 TID-bla08 INFO: Remote remote_mirror_4b270e030e828b272383b8e6f4ffb3d9 was successfully removed from project 1449
      updates the remote config if credentials changed
2018-05-02T15:24:42.202Z 130 TID-bla08 INFO: Removing remote remote_mirror_27 from project 1450
2018-05-02T15:24:42.209Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_27 from project 1450
2018-05-02T15:24:42.227Z 130 TID-bla08 INFO: Removing remote remote_mirror_707af8ad7719e600f076eb6280fcbd28 from project 1450
2018-05-02T15:24:42.233Z 130 TID-bla08 INFO: Remote remote_mirror_707af8ad7719e600f076eb6280fcbd28 was successfully removed from project 1450
      removes previous remote
  #remote_name
    when remote name is persisted in the database
2018-05-02T15:24:42.395Z 130 TID-bla08 INFO: Removing remote remote_mirror_28 from project 1451
2018-05-02T15:24:42.400Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_28 from project 1451
      returns remote name with random value
    when remote name is not persisted in the database
2018-05-02T15:24:42.566Z 130 TID-bla08 INFO: Removing remote remote_mirror_29 from project 1452
2018-05-02T15:24:42.572Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_29 from project 1452
      returns remote name with remote mirror id
    when remote is not persisted in the database
      returns nil
  #safe_url
    when URL contains credentials
2018-05-02T15:24:42.893Z 130 TID-bla08 INFO: Removing remote remote_mirror_30 from project 1454
2018-05-02T15:24:42.898Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_30 from project 1454
      masks the credentials
    when URL does not contain credentials
2018-05-02T15:24:43.300Z 130 TID-bla08 INFO: Removing remote remote_mirror_31 from project 1455
2018-05-02T15:24:43.306Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_31 from project 1455
      shows the full URL
  when remote mirror gets destroyed
2018-05-02T15:24:43.481Z 130 TID-bla08 INFO: Removing remote remote_mirror_32 from project 1456
2018-05-02T15:24:43.486Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_32 from project 1456
2018-05-02T15:24:43.491Z 130 TID-bla08 INFO: Removing remote remote_mirror_833a911b5b6e04104f952496a8ef396e from project 1456
2018-05-02T15:24:43.496Z 130 TID-bla08 INFO: Remote remote_mirror_833a911b5b6e04104f952496a8ef396e was successfully removed from project 1456
    removes remote
  stuck mirrors
2018-05-02T15:24:43.675Z 130 TID-bla08 INFO: Removing remote remote_mirror_33 from project 1457
2018-05-02T15:24:43.680Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_33 from project 1457
    includes mirrors stuck in started with no last_update_at set
  #sync
    repository mirrors not licensed
2018-05-02T15:24:43.685Z 130 TID-bla08 INFO: Removing remote remote_mirror_34 from project 1458
2018-05-02T15:24:43.685Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_34 from project 1458
      does not schedule RepositoryUpdateRemoteMirrorWorker
    with remote mirroring disabled
2018-05-02T15:24:43.866Z 130 TID-bla08 INFO: Removing remote remote_mirror_35 from project 1459
2018-05-02T15:24:43.866Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_35 from project 1459
      returns nil
    as a Geo secondary
2018-05-02T15:24:44.096Z 130 TID-bla08 INFO: Removing remote remote_mirror_36 from project 1460
2018-05-02T15:24:44.096Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_36 from project 1460
      returns nil
    with remote mirroring enabled
      with only protected branches enabled
        when it did not update in the last minute
2018-05-02T15:24:44.302Z 130 TID-bla08 INFO: Removing remote remote_mirror_37 from project 1461
2018-05-02T15:24:44.302Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_37 from project 1461
          schedules a RepositoryUpdateRemoteMirrorWorker to run now
        when it did update in the last minute
2018-05-02T15:24:44.483Z 130 TID-bla08 INFO: Removing remote remote_mirror_38 from project 1462
2018-05-02T15:24:44.483Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_38 from project 1462
          schedules a RepositoryUpdateRemoteMirrorWorker to run in the next minute
      with only protected branches disabled
        when it did not update in the last 5 minutes
2018-05-02T15:24:44.663Z 130 TID-bla08 INFO: Removing remote remote_mirror_39 from project 1463
2018-05-02T15:24:44.663Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_39 from project 1463
          schedules a RepositoryUpdateRemoteMirrorWorker to run now
        when it did update within the last 5 minutes
2018-05-02T15:24:44.842Z 130 TID-bla08 INFO: Removing remote remote_mirror_40 from project 1464
2018-05-02T15:24:44.842Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_40 from project 1464
          schedules a RepositoryUpdateRemoteMirrorWorker to run in the next 5 minutes
  #updated_since?
    when remote mirror does not have status failed
2018-05-02T15:24:45.075Z 130 TID-bla08 INFO: Removing remote remote_mirror_41 from project 1465
2018-05-02T15:24:45.075Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_41 from project 1465
      returns true when last update started after the timestamp
2018-05-02T15:24:45.298Z 130 TID-bla08 INFO: Removing remote remote_mirror_42 from project 1466
2018-05-02T15:24:45.298Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_42 from project 1466
      returns false when last update started before the timestamp
    when remote mirror has status failed
2018-05-02T15:24:45.563Z 130 TID-bla08 INFO: Removing remote remote_mirror_43 from project 1467
2018-05-02T15:24:45.563Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_43 from project 1467
      returns false when last update started after the timestamp
  no project
2018-05-02T15:24:45.910Z 130 TID-bla08 INFO: Removing remote remote_mirror_44 from project 1468
2018-05-02T15:24:45.915Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_44 from project 1468
    includes mirror with a project in pending_delete

PushRulesHelper
  global_setting: true, enabled_globally: true, enabled_in_project: false, current_user: :admin, help_text: :default_admin_help, invalid_text: nil
    has the correct help text
    has the correct help text
  global_setting: true, enabled_globally: false, enabled_in_project: false, current_user: :admin, help_text: :default_admin_help, invalid_text: nil
    has the correct help text
    has the correct help text
  global_setting: true, enabled_globally: true, enabled_in_project: true, current_user: :admin, help_text: :default_admin_help, invalid_text: nil
    has the correct help text
    has the correct help text
  global_setting: true, enabled_globally: false, enabled_in_project: true, current_user: :admin, help_text: :default_admin_help, invalid_text: nil
    has the correct help text
    has the correct help text
  global_setting: false, enabled_globally: true, enabled_in_project: nil, current_user: :admin, help_text: :setting_can_be_overridden, invalid_text: nil
    has the correct help text
    has the correct help text
  global_setting: false, enabled_globally: true, enabled_in_project: nil, current_user: :owner, help_text: :setting_can_be_overridden, invalid_text: nil
    has the correct help text
    has the correct help text
  global_setting: false, enabled_globally: true, enabled_in_project: nil, current_user: :owner, help_text: :requires_admin_contact, invalid_text: nil
    has the correct help text
    has the correct help text
  global_setting: false, enabled_globally: true, enabled_in_project: false, current_user: :admin, help_text: :setting_has_been_overridden, invalid_text: nil
    has the correct help text
    has the correct help text
  global_setting: false, enabled_globally: true, enabled_in_project: false, current_user: :owner, help_text: :setting_has_been_overridden, invalid_text: nil
    has the correct help text
    has the correct help text
  global_setting: false, enabled_globally: true, enabled_in_project: false, current_user: :owner, help_text: :requires_admin_contact, invalid_text: nil
    has the correct help text
    has the correct help text
  global_setting: false, enabled_globally: true, enabled_in_project: true, current_user: :owner, help_text: :setting_can_be_overridden, invalid_text: nil
    has the correct help text
    has the correct help text
  global_setting: false, enabled_globally: true, enabled_in_project: false, current_user: :owner, help_text: :setting_has_been_overridden, invalid_text: nil
    has the correct help text
    has the correct help text
  global_setting: false, enabled_globally: true, enabled_in_project: true, current_user: :owner, help_text: :requires_admin_contact, invalid_text: :setting_has_been_overridden
    has the correct help text
    has the correct help text
  global_setting: false, enabled_globally: true, enabled_in_project: false, current_user: :owner, help_text: :requires_admin_contact, invalid_text: :setting_can_be_overridden
    has the correct help text
    has the correct help text
  global_setting: false, enabled_globally: false, enabled_in_project: true, current_user: :admin, help_text: :base_help, invalid_text: :setting_can_be_overridden
    has the correct help text
    has the correct help text
  global_setting: false, enabled_globally: false, enabled_in_project: true, current_user: :admin, help_text: :base_help, invalid_text: :setting_has_been_overridden
    has the correct help text
    has the correct help text

User activates GitHub Service
  without a license
    is excluded from the integrations index
    renders 404 when trying to access service settings directly
  with valid license
    activates service
    with pipelines
      tests service before save

EpicIssues::UpdateService
  #execute
    when moving issues between different epics
      returns an error
      does not change the relative_position values
    moving issue to the first position
      when some positions are close to each other
        orders issues correctly
      when there is enough place between positions
        orders issues correctly
    moving issue to the third position
      when some positions are close to each other
        orders issues correctly
      when all positions are same
        orders affected 2 issues correctly
      when there is enough place between positions
        orders issues correctly
    moving issues to the last position
      when index of the last possition is correct
        orders issues correctly

Global elastic search
  I search through the issues and I see pagination
    has a pagination
  I search through the blobs
    finds files
  I search through the wiki blobs
    finds files
  I search through the commits
    finds commits

group epic roadmap
  when epics exist for the group
    roadmap page
      renders the filtered search bar correctly
      renders roadmap view
      renders all group epics within roadmap
    roadmap page with filter applied
      renders filtered search bar with applied filter token
      renders roadmap view with matching epic
  when no epics exist for the group
    roadmap page
      does not render the filtered search bar

API::ProjectPushRule ProjectPushRule
  GET /projects/:id/push_rule
    authorized user
      returns project push rule
    unauthorized user
      does not have access to project push rule
  POST /projects/:id/push_rule
    adds push rule to project with no file size
    returns 400 if no parameter is given
    authorized user
      adds push rule to project
    unauthorized user
      does not add push rule to project
  POST /projects/:id/push_rule
    with existing push rule
      does not add push rule to project
  PUT /projects/:id/push_rule
    updates an existing project push rule
    returns 400 if no parameter is given
  PUT /projects/:id/push_rule
    gets error on non existing project push rule
    does not update push rule for unauthorized user
  DELETE /projects/:id/push_rule
    authorized user
      deletes push rule from project
    unauthorized user
      returns a 403 error
  DELETE /projects/:id/push_rule
    for non existing push rule
      deletes push rule from project
      returns a 403 error if not authorized

Admin::AuditLogs
  unlicensed
    returns 404
  licensed
    has Audit Log button in head nav bar
    user events
      filters by user
    group events
      filters by group
    project events
      filters by project

API::ProjectMirror
  POST /projects/:id/mirror/pull
    when the project is not mirrored
      returns error
    when the project is mirrored
      when import state is
        none it triggers the pull mirroring operation
        failed it triggers the pull mirroring operation
        finished it triggers the pull mirroring operation
        scheduled does not trigger the pull mirroring operation and returns 200
        started does not trigger the pull mirroring operation and returns 200
      when user
        is unauthenticated
          returns authentication error
        is authenticated as developer
          returns forbidden error
        is authenticated as reporter
          returns forbidden error
        is authenticated as guest
          returns forbidden error
        is authenticated as master
          triggers the pull mirroring operation
        is authenticated as owner
          triggers the pull mirroring operation
      authenticating from GitHub signature
        when it's valid
          syncs the mirror
        when it's invalid
          doesn't sync the mirror
          with a public project
            returns a 401 status
          with an internal project
            returns a 404 status
          with a private project
            returns a 404 status

Assign labels to an epic
  when label is referenced
    creates new system note with label pointing to epics index page
  when labels icon is clicked on collapsed sidebar
    expands sidebar
    opens labels dropdown
    collapses sidebar when clicked outside

Projects::IssuesController
  GET #index
    behaves like unauthorized when external service denies access
      allows access when the authorization service allows it
      allows access when the authorization service denies it
  POST export_csv
    unlicensed
      returns 404
    globally licensed
      allows CSV export
      anonymous user
        redirects to the sign in page
    licensed by namespace
      allows CSV export
  issue weights
    licensed
      #index
        allows sorting by weight
        allows filtering by weight
      #update
        sets issue weight
      #create
        sets issue weight
    unlicensed
      #index
        ignores filtering by weight
      #update
        does not set issue weight
      #create
        does not set issue weight
  GET service_desk
    when Service Desk is available on the project
      adds an author filter for the support bot user
      does not allow any other author to be set
      supports other filters
      allows an assignee to be specified by id
    when Service Desk is not available on the project
      returns a 404

EpicsFinder
  #execute
    when epics feature is disabled
      raises an exception
    when epics feature is enabled
      without param
        raises an error when group_id param is missing
      when user can not read epics of a group
        raises an error when group_id param is missing
      with correct params
        returns all epics that belong to the given group
        by created_at
          returns all epics created before the given date
          returns all epics created after the given date
          returns all epics created within the given interval
        by search
          returns all epics that match the search
        by author
          returns all epics authored by the given user
        by label
          returns all epics with given label
        when subgroups are supported
          returns all epics that belong to the given group and its subgroups
        by timeframe
          returns epics which start in the timeframe
          returns epics which end in the timeframe
          returns epics which start before and end after the timeframe
  #row_count
    returns number of rows when epics are grouped

Groups > Pipeline Quota
  with no quota
    is not linked within the group settings dropdown
    shows correct group quota info
  with no projects using shared runners
    is not linked within the group settings dropdown
    shows correct group quota info
  minutes under quota
    is linked within the group settings tab
    shows correct group quota info
  minutes over quota
    is linked within the group settings tab
    shows correct group quota and projects info
  with shared_runner_minutes_on_root_namespace disabled
    when accessing group with subgroups
      does not show project of subgroup
  with shared_runner_minutes_on_root_namespace enabled
    when accessing subgroup
      does not show subproject
    when accesing root group
      does show projects of subgroup

Projects::MergeRequests::CreationsController
  POST #create
    the approvals_before_merge param
      when it is less than the one in the target project
        sets the param to nil
        creates the merge request
      when it is equal to the one in the target project
        sets the param to nil
        creates the merge request
      when it is greater than the one in the target project
        saves the param in the merge request
        creates the merge request
      when the target project is a fork of a deleted project
        uses the default from the target project
        creates the merge request

Milestones on EE
  burndown charts
    with the burndown chart feature available
      shows a burndown chart
      when a closed issue do not have closed events
        shows warning
      when all closed issues do not have closed events
        shows warning and hides burndown
      data is accurate
        does not show warning
      with due & start date not set
        shows a mention to fill in dates
    with the burndown chart feature disabled
      has a link to upgrade to Bronze when checking the namespace plan
      has a link to upgrade to starter on premise
    with the issuable weights feature disabled
      has a link to upgrade to Bronze when checking the namespace plan
      has a link to upgrade to starter on premise
  milestone summary
    shows the total weight when sum is greater than zero
    hides the total weight when sum is equal to zero

ProjectImportData
  validations
    should validate that :auth_method is either ‹nil›, ‹""›, ‹"password"›, or ‹"ssh_public_key"›
  #ssh_key_auth?
    import_url: "ssh://example.com", auth_method: "ssh_public_key", expected: true
      should eq true
    import_url: "ssh://example.com", auth_method: "password", expected: false
      should eq false
    import_url: "http://example.com", auth_method: "ssh_public_key", expected: false
      should eq false
    import_url: "http://example.com", auth_method: "password", expected: false
      should eq false
  #ssh_known_hosts_verified_by
    is a user when ssh_known_hosts_verified_by_id is a valid id
    is nil when ssh_known_hosts_verified_by_id is an invalid id
    is nil when ssh_known_hosts_verified_by_id is nil
  auth_method
    returns 'password' when nil
    returns 'password' when ""
  credential fields accessors
    should contain exactly :auth_method, :password, :ssh_known_hosts, :ssh_known_hosts_verified_at, :ssh_known_hosts_verified_by_id, :ssh_private_key, and :user
    field: :auth_method
      sets the value in the credentials hash
      sets a not-present value to nil
      returns the data in the credentials hash
    field: :password
      sets the value in the credentials hash
      sets a not-present value to nil
      returns the data in the credentials hash
    field: :ssh_known_hosts
      sets the value in the credentials hash
      sets a not-present value to nil
      returns the data in the credentials hash
    field: :ssh_known_hosts_verified_at
      sets the value in the credentials hash
      sets a not-present value to nil
      returns the data in the credentials hash
    field: :ssh_known_hosts_verified_by_id
      sets the value in the credentials hash
      sets a not-present value to nil
      returns the data in the credentials hash
    field: :ssh_private_key
      sets the value in the credentials hash
      sets a not-present value to nil
      returns the data in the credentials hash
    field: :user
      sets the value in the credentials hash
      sets a not-present value to nil
      returns the data in the credentials hash
  #ssh_import?
    import_url: "ssh://example.com", expected: true
      should eq true
    import_url: "git://example.com", expected: false
      should eq false
    import_url: "http://example.com", expected: false
      should eq false
    import_url: "https://example.com", expected: false
      should eq false
    import_url: nil, expected: nil
      should eq nil
  #ssh_known_hosts_fingerprints
    defers to SshHostKey#fingerprint_host_keys
  #ssh_public_key
    no SSH key
      should be nil
    with SSH key
      returns the public counterpart of the SSH private key
  #regenerate_ssh_private_key
    auth_method is password
      regenerates the SSH private key
    auth_method is ssh_public_key
      regenerates the SSH private key

Gitlab::Chat::Command
  #try_create_pipeline
    returns nil when the command is not valid
    tries to create the pipeline when a command is valid
  #create_pipeline
    creates the pipeline
    creates the chat data for the pipeline
    stores the chat name ID in the chat data
    stores the response URL in the chat data
    creates the environment variables for the pipeline

API::MergeRequestApprovals
  GET :id/merge_requests/:merge_request_iid/approvals
    retrieves the approval status
  POST :id/merge_requests/:merge_request_iid/approvals
    as a project admin
      behaves like user allowed to override approvals required
        when disable_overriding_approvers_per_merge_request is false on the project
          allows you to override approvals required
          does not allow approvals required under what the project requires
          when project approvals are not enabled
            does not allow you to override approvals required
        when disable_overriding_approvers_per_merge_request is true on the project
          does not allow you to override approvals required
    as a global admin
      behaves like user allowed to override approvals required
        when disable_overriding_approvers_per_merge_request is false on the project
          allows you to override approvals required
          does not allow approvals required under what the project requires
          when project approvals are not enabled
            does not allow you to override approvals required
        when disable_overriding_approvers_per_merge_request is true on the project
          does not allow you to override approvals required
    as a random user
      does not allow you to override approvals required
  PUT :id/merge_requests/:merge_request_iid/approvers
    as a project admin
      behaves like user allowed to change approvers
        when disable_overriding_approvers_per_merge_request is true on the project
          does not allow overriding approvers
        when disable_overriding_approvers_per_merge_request is false on the project
          allows overriding approvers
          removes approvers not in the payload
    as a global admin
      behaves like user allowed to change approvers
        when disable_overriding_approvers_per_merge_request is true on the project
          does not allow overriding approvers
        when disable_overriding_approvers_per_merge_request is false on the project
          allows overriding approvers
          removes approvers not in the payload
    as a random user
      does not allow overriding approvers
  POST :id/merge_requests/:merge_request_iid/approve
    as the author of the merge request
      returns a 401
    as a valid approver
      when the sha param is not set
        approves the merge request
      when the sha param is correct
        approves the merge request
      when the sha param is incorrect
        returns a 409
        does not approve the merge request
  POST :id/merge_requests/:merge_request_iid/unapprove
    as a user who has approved the merge request
      unapproves the merge request

ProjectsController
  POST create
    with licensed repository mirrors
      has mirror enabled in new project
    with unlicensed repository mirrors
      has mirror disabled in new project
  PUT #update
    updates EE attributes
    updates Merge Request Approvers attributes
    updates Issuable Default Templates attributes
    updates Service Desk attributes
    repository mirrors
      when licensed
        updates repository mirror attributes
      when unlicensed
        does not update repository mirror attributes
    external authaurization service attributes
      updates the project classification label
      does not update the project classification label when the feature is not available
    behaves like unauthorized when external service denies access
      allows access when the authorization service allows it
      allows access when the authorization service denies it
      updates when the service allows access
      does not update when the service rejects access

Projects::PushRulesController
  #update
    updates the push rule
    push rules unlicensed
      returns 404
    Updating reject_unsigned_commits rule
      as an admin
        updates the setting
      as a master user
        when global setting is disabled
          updates the setting
        when global setting is enabled
          does not update the setting
      as a developer user
        does not update the setting
    Updating commit_committer_check rule
      as an admin
        updates the setting
      as a master user
        when global setting is disabled
          updates the setting
        when global setting is enabled
          does not update the setting
      as a developer user
        does not update the setting

IssueLinks::ListService
  #execute
    user can see all issues
      ensures no N+1 queries are made
      returns related issues JSON
    referencing a public project issue
      presents issue
    referencing issue with removed relationships
      when referenced a deleted issue
        ignores issue
      when referenced an issue with deleted project
        ignores issue
      when referenced an issue with deleted namespace
        ignores issue
    user cannot see relations
      when user cannot see the referenced issue
        returns an empty list
      when user cannot see the issue that referenced
        returns an empty list
    remove relations
      user can admin related issues just on target project
        returns no destroy relation path
      user can admin related issues just on source project
        returns no destroy relation path
      when user can admin related issues on both projects
        returns related issue destroy relation path

EE::NotificationService
  with external authentication service
    sends email when the service is not enabled
    when the service is enabled
      does not send an email
      still delivers email to admins
  service desk issues
    a non-service-desk issue
      doesn't send the email
    a service-desk issue
      sends the email
      where the project has disabled the feature
        doesn't send the email
      when the license doesn't allow service desk
        doesn't send the email
      when the support bot has unsubscribed
        doesn't send the email
  mirror hard failed
    when the project has invited members
      sends email
    when user is owner
      sends email
      when owner is blocked
        does not send email
        when project belongs to group
          does not send email to the blocked owner
    when user is master
      sends email
    when user is not owner nor master
      does not send email
      when user is group owner
        sends email
      when user is group master
        sends email
  mirror user changed
    sends email

Merge request > User merges with Push Rules
  commit message is invalid
    displays error message after merge request is clicked
  author email is invalid
    displays error message after merge request is clicked

New Epic
  empty epic list
    when user who is not a group member views the epic list
      does not show the create button
    when user with owner views the epic list
      does show the create button
  has epics in list
    when user who is not a group member views the epic list
      does not show the create button
    when user with owner views the epic list
      does show the create button
      can create epic

Pipeline
  GET /:project/pipelines/:id/security
    with a sast artifact
      shows jobs tab pane as active
      shows security report section
    without sast artifact
      displays the pipeline graph

EE::DeploymentPlatform
  #deployment_platform
    when environment is specified
      when environment scope is exactly matched
        behaves like matching environment scope
          when multiple clusters license is available
            returns environment specific cluster
          when multiple clusters licence is unavailable
            returns a kubernetes platform
      when environment scope is matched by wildcard
        behaves like matching environment scope
          when multiple clusters license is available
            returns environment specific cluster
          when multiple clusters licence is unavailable
            returns a kubernetes platform
      when environment scope does not match
        behaves like not matching environment scope
          when multiple clusters license is available
            returns default cluster
          when multiple clusters license is unavailable
            returns a kubernetes platform
      when environment scope has _
        does not treat it as wildcard
        when environment name contains an underscore
          matches literally for _
      when environment scope has %
        does not treat it as wildcard
        when environment name contains a percent char
          matches literally for %
      when perfectly matched cluster exists
        returns perfectly matched cluster as highest precedence
    with multiple clusters and multiple environments
      should return the appropriate cluster

Namespace
  should have one namespace_statistics
  should belong to plan
  should delegate #shared_runners_minutes to #namespace_statistics object
  should delegate #shared_runners_seconds to #namespace_statistics object
  should delegate #shared_runners_seconds_last_reset to #namespace_statistics object
  scopes
    .with_plan
      plan is set
        returns namespaces with plan
      plan is not set
        plan is empty string
          returns no namespace
        plan is nil
          returns no namespace
  custom validations
    #validate_plan_name
      with a valid plan name
        is valid
      with an invalid plan name
        is invalid
    #validate_shared_runner_minutes_support
      when changing :shared_runners_minutes_limit
        when group is subgroup
          is invalid
        when group is root
          is valid
  #move_dir
    when running on a primary node
      logs the Geo::RepositoryRenamedEvent for each project inside namespace
  #feature_available?
    uses the global setting when running on premise
    only checks the plan once
    when checking namespace plan
      combines the global setting with the group setting when not running on premise
      when feature available on the plan
        when feature available for current group
          returns true
        when license is applied to parent group
          child group has feature available
      when feature not available in the plan
        returns false
    when the feature is temporarily available on the entire instance
      returns true when the feature is available globally
      returns `false` when the feature is not included in the global license
  #max_active_pipelines
    when there is no limit defined
      returns zero
    when free plan has limit defined
      returns a free plan limits
    when associated plan has no limit defined
      returns zero
    when limit is defined
      returns a number of maximum active pipelines
  #max_pipeline_size
    when there are no limits defined
      returns zero
    when free plan has limit defined
      returns a free plan limits
    when associated plan has no limits defined
      returns zero
    when limit is defined
      returns a number of maximum pipeline size
  #shared_runners_enabled?
    without projects
      should be falsey
    with project
      and disabled shared runners
        should be falsey
      and enabled shared runners
        should be truthy
  #actual_shared_runners_minutes_limit
    when no limit defined
      should be zero
    when application settings limit is set
      returns global limit
      when namespace limit is set
        returns namespace limit
  #shared_runner_minutes_supported?
    when is subgroup
      when shared_runner_minutes_on_root_namespace is disabled
        returns true
      when shared_runner_minutes_on_root_namespace is enabled
        returns false
    when is root
      returns true
  #shared_runners_minutes_limit_enabled?
    with project
      when no limit defined
        should be falsey
      when limit is defined
        should be truthy
        when is subgroup
          should be falsey
    without project
      should be falsey
  #shared_runners_enabled?
    subgroup with shared runners enabled project
      when shared_runner_minutes_on_root_namespace is disabled
        returns false
      when shared_runner_minutes_on_root_namespace is enabled
        returns true
    group with shared runners enabled project
      returns true
    group without projects
      returns false
  #shared_runners_minutes_used?
    with project
      when limit is defined
        when limit is used
          should be truthy
        when limit not yet used
          should be falsey
        when minutes are not yet set
          should be falsey
      without limit
        should be falsey
    without project
      should be falsey
  #actual_plan
    when namespace has a plan associated
      returns an associated plan
    when namespace does not have plan associated
      returns a free plan object
  #actual_plan_name
    when namespace has a plan associated
      returns an associated plan name
    when namespace does not have plan associated
      returns a free plan name

epics list
  when epics exist for the group
    shows the epics in the navigation sidebar
    renders the filtered search bar correctly
    renders the list correctly
    renders the epic detail correctly after clicking the link
  when no epics exist for the group
    renders the empty list page

Repository
  #after_sync
    expires repository cache
    does not call expire_branch_cache if repository does not exist
  Elastic search
    class method find_commits_by_message_with_elastic
      returns commits
    find_commits_by_message_with_elastic
      returns commits

Projects::IssueLinksController
  GET /*namespace_id/:project_id/issues/:issue_id/links
    returns JSON response
  POST /*namespace_id/:project_id/issues/:issue_id/links
    with success
      returns success JSON
    with failure
      when unauthorized
        returns 403
      when failing service result
        returns failure JSON
  DELETE /*namespace_id/:project_id/issues/:issue_id/link/:id
    when unauthorized
      when no authorization on current project
        returns 403
      when no authorization on the related issue project
        returns 404
    when authorized
      returns success JSON
    when non of issues of the link is not the issue requested in the path
      returns 404
      does not delete the link

API::LdapGroupLinks
  POST /groups/:id/ldap_group_links
    when unauthenticated
      returns authentication error
    when a less priviledged user
      does not allow less priviledged user to add LDAP group link
    when owner of the group
      returns ok and add ldap group link
      returns ok and add ldap group link even if no provider specified (PENDING: Temporarily skipped with xit)
      returns error if LDAP group link already exists
      returns a 400 error when cn is not given
      returns a 400 error when group access is not given
      returns a 422 error when group access is not known
  DELETE /groups/:id/ldap_group_links/:cn
    when unauthenticated
      returns authentication error
    when a less priviledged user
      does not remove the LDAP group link
    when owner of the group
      removes ldap group link
      returns 404 if LDAP group cn not used for a LDAP group link
  DELETE /groups/:id/ldap_group_links/:provider/:cn
    when unauthenticated
      returns authentication error
    when a less priviledged user
      does not remove the LDAP group link
    when owner of the group
      returns 404 if LDAP group cn not used for a LDAP group link for the specified provider
      removes ldap group link

Ci::RegisterJobService
  #execute
    for project with shared runners when global minutes limit is set
      allow to pick builds
        should be a kind of Ci::Build(id: integer, status: string, finished_at: datetime, trace: text, created_at: datetime, upda...file_store: integer, artifacts_metadata_store: integer, protected: boolean, failure_reason: integer)
      when over the global quota
        does not return a build
        when project is public
          does return the build
        when namespace limit is set to unlimited
          does return the build
        when namespace quota is bigger than a global one
          does return the build
      when group is subgroup
        when shared_runner_minutes_on_root_namespace is disabled
          does return a build
          when we are over limit on subnamespace
            does not return a build
        when shared_runner_minutes_on_root_namespace is enabled
          does return a build
          when we are over limit on subnamespace
            limit is ignored and build is returned
          when we are over limit on root namespace
            does not return a build

GithubService
  Associations
    should belong to project
  #owner
    is determined from the repo URL
  #repository_name
    is determined from the repo URL
  #api_url
    uses github.com by default
    with GitHub Enterprise repo URL
      is set to the Enterprise API URL
  #detailed_description
    links to mirroring settings
  #execute
    notifies GitHub of a status change
    uses StatusMessage to build message
    uses GitHub API to update status
    passes StatusMessage values to StatusNotifier
      sha
      status
      context
      target_url
      description
    with custom api endpoint
      hands custom api url to StatusNotifier
    without a license
      does nothing
  #can_test?
    is false if there are no pipelines
    is true if the project has a pipeline
  #test_data
    raises error if no pipeline found
    generates data for latest pipeline
  #test
    mentions creator in success message
    forwards failure message on error
    without a license
      fails gracefully

MergeRequestPolicy
  for a merge request within the same project
    when overwriting approvers is disabled on the project
      does not allow anyone to update approvers
    when overwriting approvers is enabled on the project
      allows only project developers and above to update the approvers
  for a merge request from a fork
    when overwriting approvers is disabled on the target project
      does not allow anyone to update approvers
    when overwriting approvers is disabled on the source project
      has no effect - project developers and above, as well as the author, can update the approvers
    when overwriting approvers is enabled on the target project
      allows project developers and above, as well as the author, to update the approvers
  with external authorization enabled
    can read the issue iid without accessing the external service

AuditEventService
  #for_member
    generates event
    handles deleted users
    has the IP address
    admin audit log licensed
      has the entity full path
  #security_event
    unlicensed
      does not create an event
    licensed
      creates an event
  #entity_audit_events_enabled??
    entity is a project
      returns false when project is unlicensed
      returns true when project is licensed
    entity is a group
      returns false when group is unlicensed
      returns true when group is licensed
    entity is a user
      returns false when unlicensed
      returns true when licensed with extended events
    auth event
      returns true when unlicensed
  #for_failed_login
    has the right type
    has the right author
    has the right IP address
    has the right auth method for OAUTH
  license
    has the audit_admin feature
      logs an audit event
      has the entity_path
    has the extended_audit_events feature
      logs an audit event
      has not the entity_path
    entity has the audit_events feature
      logs an audit event
      has not the entity_path
    has not any audit event feature
      does not log the audit event

JenkinsService
  Associations
    should belong to project
    should have one service_hook
  username validation
    when the service is active
      when password was not touched
        should not validate that :username cannot be empty/falsy
      when password was touched
        should validate that :username cannot be empty/falsy
    when the service is inactive
      should not validate that :username cannot be empty/falsy
  #hook_url
    when the jenkins_url has no relative path
      should eq "http://jenkins.example.com/project/my_project"
    when the jenkins_url has relative path
      should eq "http://organization.example.com/jenkins/project/my_project"
    userinfo is missing and username and password are set
      should eq "http://u%24ername:pas%24%20word@organization.example.com/jenkins/project/my_project"
    userinfo is provided and username and password are set
      should eq "http://username:password@organization.example.com/jenkins/project/my_project"
    userinfo is provided username and password are not set
      should eq "http://u:p@organization.example.com/jenkins/project/my_project"
  #test
    returns the right status
  #execute
    without a license key
      behaves like project with disabled Jenkins service
        does not invoke the Jenkins API
    with a license key
      when namespace plan check is not enabled
        behaves like project with enabled Jenkins service
          invokes the Jenkins API
      when namespace plan check is enabled
        when namespace does not have a plan
          behaves like project with disabled Jenkins service
            does not invoke the Jenkins API
        when namespace has a plan
          adds default web hook headers to the request
          request url contains properly serialized username and password
  Stored password invalidation
    when a password was previously set
      resets password if url changed
      resets password if username is blank
      does not reset password if username changed
      does not reset password if new url is set together with password, even if it's the same password
      resets password if url changed, even if setter called multiple times
    when no password was previously set
      saves password if new url is set together with password

Boards::Issues::ListService
  #execute
    when list_id is missing
      when board does not have a milestone
        returns opened issues without board labels applied
      when board have a milestone
        returns opened issues without board labels and milestone applied
        when milestone is predefined
          as upcoming
            returns open issue for backlog without board label
          as started
            returns open issue for backlog without board label

MergeRequests::MergeService
  #execute
    project has exceeded size limit
      returns the correct error message
  #hooks_validation_pass?
    returns true when valid
    commit message validation
      returns false and saves error when invalid
      behaves like hook validations are skipped when push rules unlicensed
        should be truthy
    authors email validation
      returns false and saves error when invalid
      behaves like hook validations are skipped when push rules unlicensed
        should be truthy
    fast forward merge request
      returns true when fast forward is enabled

Projects::PathLocksController
  POST #toggle
    when locking a file
      when LFS is enabled
        locks the file
        locks the file in LFS
      when LFS is not enabled
        locks the file
        doesn't lock the file in LFS
    when unlocking a file
      when LFS is enabled
        unlocks the file
        unlocks the file in LFS
    when LFS is not enabled
      unlocks the file

Admin::ApplicationSettingsController
  PUT #update
    updates the EE specific application settings
    updates the default_project_creation for string value
    mirror settings
      behaves like settings for licensed features
        does not update settings when licesed feature is not available
        updates settings when the feature is available
    external policy classification settings
      behaves like settings for licensed features
        does not update settings when licesed feature is not available
        updates settings when the feature is available
    additional email footer
      behaves like settings for licensed features
        does not update settings when licesed feature is not available
        updates settings when the feature is available

Reset namespace pipeline minutes
  for user namespace
    reset pipeline minutes button is visible
    when namespace has namespace statistics
      resets pipeline minutes
    when resetting pipeline minutes fails
      renders edit page with an error
  when creating a new group
    does not display reset pipeline minutes callout
  for group namespace
    reset pipeline minutes button is visible
    when namespace has namespace statistics
      resets pipeline minutes
    when resetting pipeline minutes fails
      renders edit page with an error

GeoNode
  associations
    should belong to oauth_application dependent => destroy
    should have many geo_node_namespace_links
    should have many namespaces through geo_node_namespace_links
  validations
    should validate that :selective_sync_type is either ‹nil›, ‹"namespaces"›, or ‹"shards"›
  default values
    attribute: :url, value: "http://localhost/"
      should eq "http://localhost/"
    attribute: :primary, value: false
      should eq false
    attribute: :repos_max_capacity, value: 25
      should eq 25
    attribute: :files_max_capacity, value: 10
      should eq 10
  prevent locking yourself out
    does not accept adding a non primary node with same details as current_node
  dependent models and attributes for GeoNode
    on create
      saves a corresponding oauth application if it is a secondary node
      when is a primary node
        has no oauth_application
        persists current clone_url_prefix
  cache expiration
    expires cache when saved
    expires cache when removed
  #repair
    creates an oauth application for a Geo secondary node
  #current?
    returns true when node is the current node
    returns false when node is not the current node
  #uri
    when all fields are filled
      returns an URI object
      includes schema, host, port and relative_url_root with a terminating /
    when required fields are not filled
      returns an URI object
  #url
    returns a string
    includes schema home port and relative_url with a terminating /
    defaults to existing HTTPS and relative URL with a terminating / if present
  #url=
    sets schema field based on url
    sets host field based on url
    sets port field based on specified by url
    when unspecified ports
      sets port 80 when http and no port is specified
      sets port 443 when https and no port is specified
  #geo_transfers_url
    returns api url based on node uri
  #geo_status_url
    returns api url based on node uri
  #snapshot_url
    returns snapshot URL based on node URI
    adds ?wiki=1 to the snapshot URL when the repository is a wiki
  #find_or_build_status
    returns a new status
  #oauth_callback_url
    returns oauth callback url based on node uri
    returns url that matches rails url_helpers generated one
  #oauth_logout_url
    returns oauth logout url based on node uri
    returns url that matches rails url_helpers generated one
  #missing_oauth_application?
    returns false when present
    returns true when it is not present
    on a primary node
      returns false
  #projects_include?
    returns true without selective sync
    selective sync by namespaces
      returns true when project belongs to one of the namespaces
      returns false when project does not belong to one of the namespaces
    selective sync by shards
      returns true when project belongs to one of the namespaces
      returns false when project does not belong to one of the namespaces
  #projects
    returns all projects without selective sync
    returns projects that belong to the namespaces with selective sync by namespace
    returns projects that belong to the shards with selective sync by shard
    returns nothing if an unrecognised selective sync type is used
  #selective_sync?
    returns true when selective sync is by namespaces
    returns true when selective sync is by shards
    returns false when selective sync is disabled

Projects::ApproversController
  #destroy
    on a merge request
      when the user cannot update approvers because they do not have access
        returns a 404
        does not destroy any approvers
      when the user cannot update approvers because of the project setting
        returns a 404
        does not destroy any approvers
      when the user can update approvers
        destroys the provided approver
    on a project
      when the user cannot update approvers because they do not have access
        returns a 404
        does not destroy any approvers
      when the user can update approvers
        destroys the provided approver

Projects::UpdateService#execute
  repository mirror
    when licensed
      updates the correct attributes
    when unlicensed
      does not update mirror attributes
  audit events
    #name
      does not log audit event if project operation fails
      if operation succeed
        logs an audit event if operation succeed
        logs the project info
    #path
      does not log audit event if project operation fails
      if operation succeed
        logs an audit event if operation succeed
        logs the project info
    #visibility
      does not log audit event if project operation fails
      if operation succeed
        logs an audit event if operation succeed
        logs the project info

Geo::RepositoryVerification::Primary::ShardWorker
  #perform
    performs Geo::RepositoryVerification::Primary::SingleWorker for each project
    performs Geo::RepositoryVerification::Primary::SingleWorker for verified projects updated recently
    performs Geo::RepositoryVerification::Primary::SingleWorker for projects missing repository verification
    performs Geo::RepositoryVerification::Primary::SingleWorker for projects missing wiki verification
    does not perform Geo::RepositoryVerification::Primary::SingleWorker when shard becomes unhealthy
    does not perform Geo::RepositoryVerification::Primary::SingleWorker when not running on a primary
    does not schedule jobs when number of scheduled jobs exceeds capacity
    does not perform Geo::RepositoryVerification::Primary::SingleWorker for projects on unhealthy shards
    resource loading
      handles multiple batches of projects needing verification
      handles multiple batches of projects needing verification, skipping failed repos

ProjectPolicy
  admin_mirror
    with remote mirror setting enabled
      with admin
        should be allowed :admin_mirror
      with owner
        should be allowed :admin_mirror
      with developer
        should be disallowed :admin_mirror
    with remote mirror setting disabled
      with admin
        should be allowed :admin_mirror
      with owner
        should be disallowed :admin_mirror
    with remote mirrors feature disabled
      with admin
        should be disallowed :admin_mirror
      with owner
        should be disallowed :admin_mirror
    with remote mirrors feature enabled
      with admin
        should be allowed :admin_mirror
      with owner
        should be allowed :admin_mirror
  reading a project
    allows access when a user has read access to the repo
    never checks the external service
    with an external authorization service
      allows access when the external service allows it
      does not check the external service for admins and allows access
      allows auditors
      prevents all but seeing a public project in a list when access is denied
      passes the full path to external authorization for logging purposes

Display system header and footer bar
  when authenticated
    when system header and footer are not configured
      behaves like system header is not configured
        does not show system header
      behaves like system footer is not configured
        does not show system footer
    when only system header is defined
      behaves like system header is configured
        shows system header
        shows the correct content
      behaves like system footer is not configured
        does not show system footer
    when only system footer is defined
      behaves like system header is not configured
        does not show system header
      behaves like system footer is configured
        shows system footer
        shows the correct content
    when system header and footer are defined
      behaves like system header is configured
        shows system header
        shows the correct content
      behaves like system footer is configured
        shows system footer
        shows the correct content
  when not authenticated
    when system header and footer are not configured
      behaves like system header is not configured
        does not show system header
      behaves like system footer is not configured
        does not show system footer
    when only system header is defined
      behaves like system header is configured
        shows system header
        shows the correct content
      behaves like system footer is not configured
        does not show system footer
    when only system footer is defined
      behaves like system header is not configured
        does not show system header
      behaves like system footer is configured
        shows system footer
        shows the correct content
    when system header and footer are defined
      behaves like system header is configured
        shows system header
        shows the correct content
      behaves like system footer is configured
        shows system footer
        shows the correct content

Geo::FileRegistryRemovalService
  #execute
    delegates log_error to the Geo logger
    with LFS object
      behaves like removes
        file from disk
        registry when file was deleted successfully
      migrated to object storage
        behaves like removes
          file from disk
          registry when file was deleted successfully
    with job artifact
      behaves like removes artifact
        file from disk
        registry when file was deleted successfully
      migrated to object storage
        behaves like removes artifact
          file from disk
          registry when file was deleted successfully
    with avatar
      behaves like removes
        file from disk
        registry when file was deleted successfully
      migrated to object storage
        behaves like removes
          file from disk
          registry when file was deleted successfully
    with attachment
      behaves like removes
        file from disk
        registry when file was deleted successfully
      migrated to object storage
        behaves like removes
          file from disk
          registry when file was deleted successfully
    with file
      behaves like removes
        file from disk
        registry when file was deleted successfully
      migrated to object storage
        behaves like removes
          file from disk
          registry when file was deleted successfully
    with namespace_file
      behaves like removes
        file from disk
        registry when file was deleted successfully
      migrated to object storage
        behaves like removes
          file from disk
          registry when file was deleted successfully
    with personal_file
      behaves like removes
        file from disk
        registry when file was deleted successfully
      migrated to object storage
        behaves like removes
          file from disk
          registry when file was deleted successfully

Projects::ApproverGroupsController
  #destroy
    on a merge request
      when the user cannot update approvers because they do not have access
        returns a 404
        does not destroy any approver groups
      when the user cannot update approvers because of the project setting
        returns a 404
        does not destroy any approver groups
      when the user can update approvers
        destroys the provided approver group
    on a project
      when the user cannot update approvers because they do not have access
        returns a 404
        does not destroy any approver groups
      when the user can update approvers
        destroys the provided approver

Edit group settings
  with webhook feature enabled
    shows the menu item
  with webhook feature enabled
    shows the menu item
  with project_creation_level feature enabled
    shows the selection menu
  with project_creation_level feature disabled
    shows the selection menu
  Member Lock setting
    without a license key
      is not visible
    with a license key
      is visible
      when current user is not the Owner
        is not visible

Projects::DestroyService
  when project is a mirror
    decrements capacity if mirror was scheduled
  when running on a primary node
    logs an event to the Geo event log
    does not log event to the Geo log if project deletion fails
  audit events
    does not log audit event if project operation fails
    if operation succeed
      logs an audit event if operation succeed
      logs the project info
  system hooks exception
    logs an audit event

User creates issue
  with weight set
    creates issue

Groups > Contribution Analytics
  visit Contribution Analytics page for group
    displays Contribution Analytics

RepositoryUpdateMirrorWorker
  #perform
    sets status as finished when update mirror service executes successfully
    sets status as failed when update mirror service executes with errors
    marks mirror as failed when an error occurs
    with another worker already running
      returns nil
    when worker was reset without cleanup
      sets status as finished when update mirror service executes successfully
    reschedule mirrors
      does not perform UpdateAllMirrorsWorker when we cannot obtain the lease
      does not perform UpdateAllMirrorsWorker when the lease already exists
      when we obtain the lease
        performs UpdateAllMirrorsWorker when reschedule_immediately? returns true
        does not perform UpdateAllMirrorsWorker when reschedule_immediately? returns false

AdminEmailsWorker
  recipients
    sending emails to members of a group only
      sends email to subscribed users
    sending emails to members of a project only
      sends email to subscribed users
    sending emails to users directly
      sends email to subscribed users

ProjectWiki
  searches wiki page

API::Geo
  GET /geo/transfers/attachment/1
    responds with 401 with invalid auth header
    attachment file exists
      responds with 200 with X-Sendfile
    attachment does not exist
      responds with 404
  GET /geo/transfers/avatar/1
    responds with 401 with invalid auth header
    avatar file exists
      responds with 200 with X-Sendfile
    avatar does not exist
      responds with 404
  GET /geo/transfers/file/1
    responds with 401 with invalid auth header
    when the Upload record exists
      when the file exists
        responds with 200 with X-Sendfile
      file does not exist
        responds with 404 and a specific geo code
    when the Upload record does not exist
      responds with 404
  GET /geo/transfers/lfs/1
    responds with 401 with invalid auth header
    LFS object exists
      file exists
        responds with 200 with X-Sendfile
      file does not exist
        responds with 404 and a specific geo code
    LFS object does not exist
      responds with 404
  GET /geo/status
    responds with 401 with invalid auth header
    responds with 401 when the db_key_base is wrong
    when requesting secondary node with valid auth header
      responds with 200
    when requesting primary node with valid auth header
      responds with 200

API::V3::LdapGroupLinks
  DELETE /groups/:id/ldap_group_links/:cn
    when unauthenticated
      returns authentication error
    when a less priviledged user
      does not remove the LDAP group link
    when owner of the group
      removes ldap group link
      returns 404 if LDAP group cn not used for a LDAP group link
  DELETE /groups/:id/ldap_group_links/:provider/:cn
    when unauthenticated
      returns authentication error
    when a less priviledged user
      does not remove the LDAP group link
    when owner of the group
      returns 404 if LDAP group cn not used for a LDAP group link for the specified provider
      removes ldap group link

label issues
  adds a new group label from sidebar

Groups::GroupMembersController
  with external authorization enabled
    GET #index
      is successful
    POST #create
      is successful
    PUT #update
      is successful
    DELETE #destroy
      is successful
    POST #destroy
      is successful
    POST #approve_request_access
      is successful
    DELETE #leave
      is successful
    POST #resend_invite
      is successful
    POST #override
      is successful

shared/issuable/_approvals.html.haml
  has no approvers
    shows empty approvers list
    can override approvers
      shows suggested approvers
      shows select approvers field
      shows select approver groups field
    can not override approvers
      hides suggested approvers
      hides select approvers field
      hides select approver groups field
  has approvers
    shows approver in table
    can override approvers
      shows remove button for approver
    can not override approvers
      hides remove button

Issue
  searches issues
  returns json with all needed elements
  behaves like no results when the user cannot read cross project
    returns the record if a single project was passed
    does not return anything when trying to search cross project

Group routing routing
  subgroup "boards"
    shows group show page
    shows boards index page
  legacy redirection
    analytics
      behaves like redirecting a legacy path
        redirects /groups/complex.group-namegit/analytics to /groups/complex.group-namegit/-/analytics when the resource does not exist
        does not redirect /groups/complex.group-namegit/analytics to /groups/complex.group-namegit/-/analytics when the resource exists
    boards
      behaves like redirecting a legacy path
        redirects /groups/complex.group-namegit/boards to /groups/complex.group-namegit/-/boards when the resource does not exist
        does not redirect /groups/complex.group-namegit/boards to /groups/complex.group-namegit/-/boards when the resource exists
    ldap
      behaves like redirecting a legacy path
        redirects /groups/complex.group-namegit/ldap to /groups/complex.group-namegit/-/ldap when the resource does not exist
        does not redirect /groups/complex.group-namegit/ldap to /groups/complex.group-namegit/-/ldap when the resource exists
    ldap_group_links
      behaves like redirecting a legacy path
        redirects /groups/complex.group-namegit/ldap_group_links to /groups/complex.group-namegit/-/ldap_group_links when the resource does not exist
        does not redirect /groups/complex.group-namegit/ldap_group_links to /groups/complex.group-namegit/-/ldap_group_links when the resource exists
    notification_setting
      behaves like redirecting a legacy path
        redirects /groups/complex.group-namegit/notification_setting to /groups/complex.group-namegit/-/notification_setting when the resource does not exist
        does not redirect /groups/complex.group-namegit/notification_setting to /groups/complex.group-namegit/-/notification_setting when the resource exists
    audit_events
      behaves like redirecting a legacy path
        redirects /groups/complex.group-namegit/audit_events to /groups/complex.group-namegit/-/audit_events when the resource does not exist
        does not redirect /groups/complex.group-namegit/audit_events to /groups/complex.group-namegit/-/audit_events when the resource exists
    pipeline_quota
      behaves like redirecting a legacy path
        redirects /groups/complex.group-namegit/pipeline_quota to /groups/complex.group-namegit/-/pipeline_quota when the resource does not exist
        does not redirect /groups/complex.group-namegit/pipeline_quota to /groups/complex.group-namegit/-/pipeline_quota when the resource exists
    hooks
      behaves like redirecting a legacy path
        redirects /groups/complex.group-namegit/hooks to /groups/complex.group-namegit/-/hooks when the resource does not exist
        does not redirect /groups/complex.group-namegit/hooks to /groups/complex.group-namegit/-/hooks when the resource exists
    multiple redirects
      follows multiple redirects
      redirects when the nested group does not exist
      does not redirect when the nested group exists

IssueLinks::DestroyService
  #execute
    when successfully removes an issue link
      removes related issue
      creates notes
      returns success message
    when failing to remove an issue link
      does not remove relation
      does not create notes
      returns error message

Issues::MoveService
  #rewrite_epic_issue
    issue assigned to epic
      updates epic issue reference
      ignores epic issue reference if user can not update the epic

KubernetesService
  when user configured kubernetes from Integration > Kubernetes
    behaves like same behavior between KubernetesService and Platform::Kubernetes
      #rollout_status
        with valid deployments
          creates a matching RolloutStatus
        with empty list of deployments
          creates a matching RolloutStatus
        not yet loaded deployments
          creates a matching RolloutStatus
  when user configured kubernetes from CI/CD > Clusters
    behaves like same behavior between KubernetesService and Platform::Kubernetes
      #rollout_status
        with valid deployments
          creates a matching RolloutStatus
        with empty list of deployments
          creates a matching RolloutStatus
        not yet loaded deployments
          creates a matching RolloutStatus

EpicIssues::ListService
  #execute
    when epics feature is disabled
      returns an empty array
    when epics feature is enabled
      owner can see all issues and destroy their associations
        returns related issues JSON
      user can see only some issues
        returns related issues JSON

Search::GroupService
  elasticsearch
    finding projects by name
      in parent group
        should contain exactly #<Project id:2079 group411/group410/inner_project_name_1>, #<Project id:2080 group411/group410/inner_project_name_2>, and #<Project id:2081 group411/outer_project_name>
      in subgroup
        should contain exactly #<Project id:2085 group413/group412/inner_project_name_1> and #<Project id:2086 group413/group412/inner_project_name_2>

Gitlab::Database::LoadBalancing::LoadBalancer
  #read
    yields a connection for a read
    marks hosts that are offline
    retries a query in the event of a serialization failure
    retries every host at most 3 times when a query conflict is raised
    uses the primary if no secondaries are available
  #read_write
    yields a connection for a write
    uses a retry with exponential backoffs
  #host
    returns the secondary host to use
    stores the host in a thread-local variable
  #release_host
    releases the host and its connection
  #release_primary_connection
    releases the connection to the primary
  #primary_write_location
    returns a String
    raises an error if the write location could not be retrieved
  #all_caught_up?
    returns true if all hosts caught up to the write location
    returns false if a host has not yet caught up
  #retry_with_backoff
    returns the value returned by the block
    re-raises errors not related to database connections
    retries the block when a connection error is raised
    re-raises the connection error if the retries did not succeed
  #connection_error?
    returns true for a connection error
    returns true for a wrapped connection error
    returns true for a wrapped connection error from a view
    returns true for deeply wrapped/nested errors
    returns true for an invalid encoding error
    returns false for errors not related to database connections
  #serialization_failure?
    returns for a serialization error
    returns true for a wrapped error

AutocompleteController
  GET users
    project members
      GET #users that can push to protected branches
        returns authorized users
      GET #users that can push code
        returns authorized users
      GET #users that can push to protected branches, including the current user
        returns authorized users
  groups
    while fetching all groups belonging to a project
      returns a single group
    while fetching all groups belonging to a project the current user cannot access
      should be not found
    while fetching all groups belonging to an invalid project ID
      should be not found

Geo::HashedStorageMigrationService
  #execute
    does not move project backed by hashed storage
    project backed by legacy storage
      moves the project repositories
      raises an error when project repository can not be moved
      raises an error when wiki repository can not be moved
  #async_execute
    starts the worker
    returns job id

ProjectMirrorEntity
  pull mirror
    password authentication
      represents the pull mirror
    SSH public-key authentication
      represents the pull mirror
  push mirror
2018-05-02T15:29:31.745Z 130 TID-bla08 INFO: Removing remote remote_mirror_45 from project 2103
2018-05-02T15:29:31.750Z 130 TID-bla08 ERROR: Could not remove remote remote_mirror_45 from project 2103
    represents the push mirror

Merge request > User sees approval widget
  when merge when discussions resolved is active
    does not show checking ability text

Gitlab::Ci::External::File::Local
  #valid?
    when is a valid local path
      should return true
    when is not a valid local path
      should return false
    when is not a yaml file
      should return false
  #content
    with a a valid file
      should return the content of the file
    with an invalid file
      should be nil
  #error_message
    should return an error message

Geo::RepositoryUpdatedEvent
  relationships
    should belong to project
  validations
    should validate that :project cannot be empty/falsy
  #source
    should define :source as an enum with [:repository, :wiki] and store the value in a column with an integer type

Admin sends notification
2nd Try error in ./ee/spec/features/admin/admin_sends_notification_spec.rb:17:
 RSpec::Core::MultipleExceptionError 

RSpec::Retry: 2nd try ./ee/spec/features/admin/admin_sends_notification_spec.rb:17
/builds/gitlab-org/gitlab-ee/ee/spec/features/admin/admin_sends_notification_spec.rb:19: warning: already initialized constant NOTIFICATION_TEXT
/builds/gitlab-org/gitlab-ee/ee/spec/features/admin/admin_sends_notification_spec.rb:19: warning: previous definition of NOTIFICATION_TEXT was here
3rd Try error in ./ee/spec/features/admin/admin_sends_notification_spec.rb:17:
 
expected: 1
     got: 5

(compared using eql?)
 
RSpec::Retry: 3rd try ./ee/spec/features/admin/admin_sends_notification_spec.rb:17
/builds/gitlab-org/gitlab-ee/ee/spec/features/admin/admin_sends_notification_spec.rb:19: warning: already initialized constant NOTIFICATION_TEXT
/builds/gitlab-org/gitlab-ee/ee/spec/features/admin/admin_sends_notification_spec.rb:19: warning: previous definition of NOTIFICATION_TEXT was here
RSpec::Retry: 4th try ./ee/spec/features/admin/admin_sends_notification_spec.rb:17
/builds/gitlab-org/gitlab-ee/ee/spec/features/admin/admin_sends_notification_spec.rb:19: warning: already initialized constant NOTIFICATION_TEXT
/builds/gitlab-org/gitlab-ee/ee/spec/features/admin/admin_sends_notification_spec.rb:19: warning: previous definition of NOTIFICATION_TEXT was here
  sends notification (FAILED - 1)
  HTML screenshot: file:///builds/gitlab-org/gitlab-ee/tmp/capybara/screenshot_2018-05-02-15-29-46.389.html
  Image screenshot: file:///builds/gitlab-org/gitlab-ee/tmp/capybara/screenshot_2018-05-02-15-29-46.389.png
Knapsack report was generated. Preview:
{
  "ee/spec/models/burndown_spec.rb": 375.0898690223694,
  "ee/spec/lib/gitlab/elastic/search_results_spec.rb": 89.7494866847992,
  "ee/spec/controllers/projects/merge_requests_controller_spec.rb": 48.041356325149536,
  "ee/spec/elastic_integration/global_search_spec.rb": 34.76005482673645,
  "ee/spec/features/issues/filtered_search/dropdown_weight_spec.rb": 37.158318519592285,
  "ee/spec/policies/group_policy_spec.rb": 26.143836498260498,
  "ee/spec/features/issues/form_spec.rb": 26.027339935302734,
  "ee/spec/features/search/elastic/project_search_spec.rb": 24.67595148086548,
  "ee/spec/features/boards/sidebar_spec.rb": 36.38293981552124,
  "ee/spec/features/merge_requests/squash_spec.rb": 27.503933429718018,
  "ee/spec/features/merge_request/user_approves_spec.rb": 15.332407474517822,
  "ee/spec/features/merge_request/user_sets_approvers_spec.rb": 22.247653484344482,
  "ee/spec/models/merge_request_spec.rb": 12.335455656051636,
  "ee/spec/features/projects/new_project_spec.rb": 14.702252864837646,
  "ee/spec/features/projects/merge_requests/user_approves_merge_request_spec.rb": 12.743454694747925,
  "ee/spec/features/issues/service_desk_spec.rb": 16.090914726257324,
  "ee/spec/controllers/boards/issues_controller_spec.rb": 9.030691385269165,
  "ee/spec/features/projects/settings/merge_requests_settings_spec.rb": 9.864329099655151,
  "ee/spec/services/geo/repository_sync_service_spec.rb": 8.2549147605896,
  "ee/spec/controllers/groups/epic_issues_controller_spec.rb": 7.508012533187866,
  "ee/spec/workers/elastic_indexer_worker_spec.rb": 11.78231406211853,
  "ee/spec/features/discussion_comments/epic_spec.rb": 13.109373092651367,
  "ee/spec/services/projects/update_remote_mirror_service_spec.rb": 7.65458607673645,
  "ee/spec/controllers/ldap/omniauth_callbacks_controller_spec.rb": 7.766350984573364,
  "ee/spec/controllers/groups/analytics_controller_spec.rb": 6.715375900268555,
  "ee/spec/services/projects/create_service_spec.rb": 65.56358432769775,
  "ee/spec/features/admin/admin_geo_nodes_spec.rb": 8.114001750946045,
  "ee/spec/mailers/notify_spec.rb": 8.18470549583435,
  "ee/spec/features/projects/push_rules_spec.rb": 9.417293071746826,
  "ee/spec/models/ci/build_spec.rb": 7.450213432312012,
  "ee/spec/models/remote_mirror_spec.rb": 5.322330713272095,
  "ee/spec/helpers/push_rules_helper_spec.rb": 9.464516162872314,
  "ee/spec/features/projects/services/user_activates_github_spec.rb": 6.881407976150513,
  "ee/spec/services/epic_issues/update_service_spec.rb": 5.928539276123047,
  "ee/spec/features/search/elastic/global_search_spec.rb": 7.547546148300171,
  "ee/spec/features/groups/group_roadmap_spec.rb": 6.97889518737793,
  "ee/spec/requests/api/project_push_rule_spec.rb": 4.676842212677002,
  "ee/spec/features/admin/admin_audit_logs_spec.rb": 6.188428163528442,
  "ee/spec/requests/api/project_mirror_spec.rb": 5.543070077896118,
  "ee/spec/features/epics/epic_labels_spec.rb": 5.999692440032959,
  "ee/spec/controllers/projects/issues_controller_spec.rb": 5.091524362564087,
  "ee/spec/finders/epics_finder_spec.rb": 5.445454120635986,
  "ee/spec/features/groups/pipeline_quota_spec.rb": 5.416158437728882,
  "ee/spec/controllers/projects/merge_requests/creations_controller_spec.rb": 4.72404146194458,
  "ee/spec/features/projects/milestones/milestone_spec.rb": 5.303261995315552,
  "ee/spec/models/project_import_data_spec.rb": 8.098426342010498,
  "ee/spec/lib/gitlab/chat/command_spec.rb": 4.352232933044434,
  "ee/spec/requests/api/merge_request_approvals_spec.rb": 4.181734085083008,
  "ee/spec/controllers/projects_controller_spec.rb": 4.483926296234131,
  "ee/spec/controllers/projects/push_rules_controller_spec.rb": 4.404677391052246,
  "ee/spec/services/issue_links/list_service_spec.rb": 5.341504812240601,
  "ee/spec/services/ee/notification_service_spec.rb": 4.416101694107056,
  "ee/spec/features/merge_request/user_merges_with_push_rules_spec.rb": 4.391493797302246,
  "ee/spec/features/epics/new_epic_spec.rb": 4.650759220123291,
  "ee/spec/features/projects/pipelines/pipeline_spec.rb": 4.214967966079712,
  "ee/spec/models/concerns/ee/deployment_platform_spec.rb": 3.9233808517456055,
  "ee/spec/models/namespace_spec.rb": 4.11854100227356,
  "ee/spec/features/epics/epics_list_spec.rb": 4.43137264251709,
  "ee/spec/models/repository_spec.rb": 3.620518922805786,
  "ee/spec/requests/projects/issue_links_controller_spec.rb": 3.371831178665161,
  "ee/spec/requests/api/ldap_group_links_spec.rb": 3.6920480728149414,
  "ee/spec/services/ci/register_job_service_spec.rb": 3.406644105911255,
  "ee/spec/models/project_services/github_service_spec.rb": 3.6870644092559814,
  "ee/spec/policies/merge_request_policy_spec.rb": 4.605401515960693,
  "ee/spec/services/audit_event_service_spec.rb": 3.2668185234069824,
  "ee/spec/models/project_services/jenkins_service_spec.rb": 3.2317121028900146,
  "ee/spec/services/boards/issues/list_service_spec.rb": 3.6131532192230225,
  "ee/spec/services/merge_requests/merge_service_spec.rb": 3.05918025970459,
  "ee/spec/requests/projects/path_locks_controller_spec.rb": 2.5278725624084473,
  "ee/spec/controllers/admin/application_settings_controller_spec.rb": 2.9629557132720947,
  "ee/spec/features/admin/admin_reset_pipeline_minutes_spec.rb": 2.866290330886841,
  "ee/spec/models/geo_node_spec.rb": 3.097580671310425,
  "ee/spec/controllers/projects/approvers_controller_spec.rb": 2.849379777908325,
  "ee/spec/services/projects/update_service_spec.rb": 2.219879150390625,
  "ee/spec/workers/geo/repository_verification/primary/shard_worker_spec.rb": 2.726644992828369,
  "ee/spec/policies/project_policy_spec.rb": 2.7903425693511963,
  "ee/spec/features/display_system_header_and_footer_bar_spec.rb": 2.744051694869995,
  "ee/spec/services/geo/file_registry_removal_service_spec.rb": 3.023852825164795,
  "ee/spec/controllers/projects/approver_groups_controller_spec.rb": 2.725897789001465,
  "ee/spec/features/groups/group_settings_spec.rb": 2.6311471462249756,
  "ee/spec/services/projects/destroy_service_spec.rb": 2.417842388153076,
  "ee/spec/features/projects/issues/user_creates_issue_spec.rb": 3.061816453933716,
  "ee/spec/features/groups/analytics_spec.rb": 2.72245192527771,
  "ee/spec/workers/repository_update_mirror_worker_spec.rb": 3.163198947906494,
  "ee/spec/workers/admin_emails_worker_spec.rb": 2.4495837688446045,
  "ee/spec/models/concerns/elastic/project_wiki_spec.rb": 2.2062017917633057,
  "ee/spec/requests/api/geo_spec.rb": 1.9630680084228516,
  "ee/spec/requests/api/v3/ldap_group_links_spec.rb": 1.8313560485839844,
  "ee/spec/features/boards/group_boards/user_edits_issues_spec.rb": 2.8028085231781006,
  "ee/spec/controllers/groups/group_members_controller_spec.rb": 2.107511281967163,
  "ee/spec/views/shared/issuable/_approvals.html.haml_spec.rb": 1.7978427410125732,
  "ee/spec/models/concerns/elastic/issue_spec.rb": 1.9382903575897217,
  "ee/spec/routing/group_routing_spec.rb": 2.0223007202148438,
  "ee/spec/services/issue_links/destroy_service_spec.rb": 1.9899778366088867,
  "ee/spec/services/ee/issues/move_service_spec.rb": 1.8424091339111328,
  "ee/spec/models/project_services/kubernetes_service_spec.rb": 1.783569574356079,
  "ee/spec/services/epic_issues/list_service_spec.rb": 1.6197073459625244,
  "ee/spec/services/search/group_service_spec.rb": 1.7559125423431396,
  "ee/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb": 1.7773735523223877,
  "ee/spec/controllers/autocomplete_controller_spec.rb": 1.5352764129638672,
  "ee/spec/services/geo/hashed_storage_migration_service_spec.rb": 1.167602777481079,
  "ee/spec/serializers/project_mirror_entity_spec.rb": 1.6572282314300537,
  "ee/spec/features/merge_request/user_sees_approval_widget_spec.rb": 1.688849925994873,
  "ee/spec/lib/gitlab/ci/external/file/local_spec.rb": 0.9615917205810547,
  "ee/spec/models/geo/repository_updated_event_spec.rb": 0.01826167106628418,
  "ee/spec/features/admin/admin_sends_notification_spec.rb": 10.916559219360352
}

Knapsack global time execution for tests: 21m 18s

Pending: (Failures listed here are expected and do not affect your suite's status)

  1) API::LdapGroupLinks POST /groups/:id/ldap_group_links when owner of the group returns ok and add ldap group link even if no provider specified
     # Temporarily skipped with xit
     # ./ee/spec/requests/api/ldap_group_links_spec.rb:55

Failures:

  1) Admin sends notification sends notification
     Failure/Error: expect(emails.count).to eql(group.users.count)

       expected: 1
            got: 7

       (compared using eql?)
     # ./ee/spec/features/admin/admin_sends_notification_spec.rb:47:in `block (2 levels) in <top (required)>'

Finished in 22 minutes 17 seconds (files took 31.51 seconds to load)
1439 examples, 1 failure, 1 pending

Failed examples:

rspec ./ee/spec/features/admin/admin_sends_notification_spec.rb:17 # Admin sends notification sends notification
! Generating reports is disabled. To enable it, please set the `FLAKY_RSPEC_GENERATE_REPORT=1` !

section_end:1525275002:build_script
section_start:1525275002:after_script
Running after script...
$ date
Wed May  2 15:30:02 UTC 2018
section_end:1525275003:after_script
section_start:1525275003:upload_artifacts
Uploading artifacts...
coverage/: found 5 matching files                  
knapsack/: found 6 matching files                  
rspec_flaky/: found 2 matching files               
tmp/capybara/: found 9 matching files              
Uploading artifacts to coordinator... ok            id=66076779 responseStatus=201 Created token=ZxyoNQBK
section_end:1525275006:upload_artifacts
ERROR: Job failed: exit code 1