Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'qa/qa/specs/features/api/3_create')
-rw-r--r--qa/qa/specs/features/api/3_create/gitaly/automatic_failover_and_recovery_spec.rb93
-rw-r--r--qa/qa/specs/features/api/3_create/gitaly/backend_node_recovery_spec.rb65
-rw-r--r--qa/qa/specs/features/api/3_create/gitaly/changing_repository_storage_spec.rb94
-rw-r--r--qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb92
-rw-r--r--qa/qa/specs/features/api/3_create/gitaly/gitaly_mtls_spec.rb43
-rw-r--r--qa/qa/specs/features/api/3_create/gitaly/praefect_connectivity_spec.rb41
-rw-r--r--qa/qa/specs/features/api/3_create/gitaly/praefect_dataloss_spec.rb104
-rw-r--r--qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb71
-rw-r--r--qa/qa/specs/features/api/3_create/gitaly/praefect_repo_sync_spec.rb75
-rw-r--r--qa/qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb2
-rw-r--r--qa/qa/specs/features/api/3_create/repository/default_branch_name_setting_spec.rb2
-rw-r--r--qa/qa/specs/features/api/3_create/repository/files_spec.rb2
-rw-r--r--qa/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb16
-rw-r--r--qa/qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb2
-rw-r--r--qa/qa/specs/features/api/3_create/repository/storage_size_spec.rb2
-rw-r--r--qa/qa/specs/features/api/3_create/repository/tag_revision_trigger_prereceive_hook_spec.rb43
16 files changed, 36 insertions, 711 deletions
diff --git a/qa/qa/specs/features/api/3_create/gitaly/automatic_failover_and_recovery_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/automatic_failover_and_recovery_spec.rb
deleted file mode 100644
index 55ae0d215cf..00000000000
--- a/qa/qa/specs/features/api/3_create/gitaly/automatic_failover_and_recovery_spec.rb
+++ /dev/null
@@ -1,93 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Create' do
- context 'Gitaly automatic failover and recovery', :orchestrated, :gitaly_cluster do
- # Variables shared between contexts. They're used and shared between
- # contexts so they can't be `let` variables.
- praefect_manager = Service::PraefectManager.new
- project = nil
-
- let(:intial_commit_message) { 'Initial commit' }
- let(:first_added_commit_message) { 'first_added_commit_message to primary gitaly node' }
- let(:second_added_commit_message) { 'second_added_commit_message to failover node' }
-
- before(:context) do
- praefect_manager.start_all_nodes
-
- project = Resource::Project.fabricate! do |project|
- project.name = "gitaly_cluster"
- project.initialize_with_readme = true
- end
- # We need to ensure that the the project is replicated to all nodes before proceeding with this test
- praefect_manager.wait_for_replication(project.id)
- end
-
- it 'automatically fails over', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347830' do
- # stop other nodes, so we can control which node the commit is sent to
- praefect_manager.stop_secondary_node
- praefect_manager.stop_tertiary_node
-
- Resource::Repository::ProjectPush.fabricate! do |push|
- push.project = project
- push.commit_message = first_added_commit_message
- push.new_branch = false
- push.file_content = 'This file created on gitaly1 while gitaly2/gitaly3 not running'
- end
-
- praefect_manager.start_all_nodes
- praefect_manager.wait_for_replication(project.id)
-
- # Stop the primary node to trigger failover, and then wait
- # for Gitaly to be ready for writes again
- praefect_manager.stop_primary_node
- praefect_manager.wait_for_primary_node_health_check_failure
-
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.commit_message = second_added_commit_message
- commit.add_files([
- {
- file_path: "file-#{SecureRandom.hex(8)}",
- content: 'This is created on gitaly2/gitaly3 while gitaly1 is unavailable'
- }
- ])
- end
-
- # Confirm that we have access to the repo after failover,
- # including the commit we just added
- expect(project.commits.map { |commit| commit[:message].chomp })
- .to include(intial_commit_message)
- .and include(first_added_commit_message)
- .and include(second_added_commit_message)
- end
-
- context 'when recovering from dataloss after failover' do
- it 'automatically reconciles', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347831' do
- # Start the old primary node again
- praefect_manager.start_primary_node
- praefect_manager.wait_for_primary_node_health_check
-
- # Confirm automatic reconciliation
- expect(praefect_manager.replicated?(project.id)).to be true
-
- # Confirm that all commits are available after reconciliation
- expect(project.commits.map { |commit| commit[:message].chomp })
- .to include(intial_commit_message)
- .and include(first_added_commit_message)
- .and include(second_added_commit_message)
-
- # Restore the original primary node
- praefect_manager.start_all_nodes
-
- # Check that all commits are still available even though the primary
- # node was offline when one was made
- expect(project.commits.map { |commit| commit[:message].chomp })
- .to include(intial_commit_message)
- .and include(first_added_commit_message)
- .and include(second_added_commit_message)
- end
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/api/3_create/gitaly/backend_node_recovery_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/backend_node_recovery_spec.rb
deleted file mode 100644
index 25e860b4f6d..00000000000
--- a/qa/qa/specs/features/api/3_create/gitaly/backend_node_recovery_spec.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Create' do
- context 'Gitaly' do
- describe 'Backend node recovery', :orchestrated, :gitaly_cluster, :skip_live_env do
- let(:praefect_manager) { Service::PraefectManager.new }
- let(:project) do
- Resource::Project.fabricate! do |project|
- project.name = "gitaly_cluster"
- project.initialize_with_readme = true
- end
- end
-
- before do
- # Reset the cluster in case previous tests left it in a bad state
- praefect_manager.start_all_nodes
- end
-
- after do
- # Leave the cluster in a suitable state for subsequent tests
- praefect_manager.start_all_nodes
- end
-
- it 'recovers from dataloss', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347832' do
- # Create a new project with a commit and wait for it to replicate
- praefect_manager.wait_for_replication(project.id)
-
- # Stop the primary node to trigger failover, and then wait
- # for Gitaly to be ready for writes again
- praefect_manager.stop_primary_node
- praefect_manager.wait_for_primary_node_health_check_failure
-
- # Push a commit to the new primary
- Resource::Repository::ProjectPush.fabricate! do |push|
- push.project = project
- push.new_branch = false
- push.commit_message = 'pushed after failover'
- push.file_name = 'new_file'
- push.file_content = 'new file'
- end
-
- # Confirm that the commit is waiting to be replicated
- expect(praefect_manager).to be_replication_pending
-
- # Start the old primary node again
- praefect_manager.start_primary_node
- praefect_manager.wait_for_health_check_all_nodes
-
- # Wait for automatic replication
- praefect_manager.wait_for_replication(project.id)
-
- # Force switch to the old primary node
- # This ensures that the commit was replicated
- praefect_manager.stop_secondary_node
- praefect_manager.stop_tertiary_node
-
- # Confirm that both commits are available
- expect(project.commits.map { |commit| commit[:message].chomp })
- .to include("Initial commit").and include("pushed after failover")
- end
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/api/3_create/gitaly/changing_repository_storage_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/changing_repository_storage_spec.rb
deleted file mode 100644
index 5ee6dfdb8d8..00000000000
--- a/qa/qa/specs/features/api/3_create/gitaly/changing_repository_storage_spec.rb
+++ /dev/null
@@ -1,94 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Create' do
- describe 'Changing Gitaly repository storage', :requires_admin, except: { job: 'review-qa-*' } do
- praefect_manager = Service::PraefectManager.new
-
- shared_examples 'repository storage move' do
- it 'confirms a `finished` status after moving project repository storage' do
- expect(project).to have_file('README.md')
- expect { project.change_repository_storage(destination_storage[:name]) }.not_to raise_error
- expect { praefect_manager.verify_storage_move(source_storage, destination_storage, repo_type: :project) }.not_to raise_error
-
- Support::Retrier.retry_on_exception(sleep_interval: 5) do
- # For a short period of time after migrating, the repository can be 'read only' which may lead to errors
- # 'The repository is temporarily read-only. Please try again later.'
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.commit_message = 'Add new file'
- commit.add_files([
- { file_path: 'new_file', content: '# This is a new file' }
- ])
- end
- end
-
- expect(project).to have_file('README.md')
- expect(project).to have_file('new_file')
- end
- end
-
- context 'when moving from one Gitaly storage to another', :orchestrated, :repository_storage, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347827' do
- let(:source_storage) { { type: :gitaly, name: 'default' } }
- let(:destination_storage) { { type: :gitaly, name: QA::Runtime::Env.additional_repository_storage } }
- let(:project) do
- Resource::Project.fabricate_via_api! do |project|
- project.name = 'repo-storage-move-status'
- project.initialize_with_readme = true
- project.api_client = Runtime::API::Client.as_admin
- end
- end
-
- before do
- praefect_manager.gitlab = 'gitlab'
- end
-
- it_behaves_like 'repository storage move'
- end
-
- # Note: This test doesn't have the :orchestrated tag because it runs in the Test::Integration::Praefect
- # scenario with other tests that aren't considered orchestrated.
- # It also runs on staging using nfs-file07 as non-cluster storage and nfs-file22 as cluster/praefect storage
- context 'when moving from Gitaly to Gitaly Cluster', :requires_praefect, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347828' do
- let(:source_storage) { { type: :gitaly, name: QA::Runtime::Env.non_cluster_repository_storage } }
- let(:destination_storage) { { type: :praefect, name: QA::Runtime::Env.praefect_repository_storage } }
- let(:project) do
- Resource::Project.fabricate_via_api! do |project|
- project.name = 'repo-storage-move'
- project.initialize_with_readme = true
- project.repository_storage = source_storage[:name]
- project.api_client = Runtime::API::Client.as_admin
- end
- end
-
- before do
- praefect_manager.gitlab = 'gitlab-gitaly-cluster'
- end
-
- it_behaves_like 'repository storage move'
- end
-
- # Note: This test doesn't have the :orchestrated tag because it runs in the Test::Integration::Praefect
- # scenario with other tests that aren't considered orchestrated.
- # It also runs on staging using nfs-file07 as non-cluster storage and nfs-file22 as cluster/praefect storage
- context 'when moving from Gitaly Cluster to Gitaly', :requires_praefect, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/369204' do
- let(:source_storage) { { type: :praefect, name: QA::Runtime::Env.praefect_repository_storage } }
- let(:destination_storage) { { type: :gitaly, name: QA::Runtime::Env.non_cluster_repository_storage } }
- let(:project) do
- Resource::Project.fabricate_via_api! do |project|
- project.name = 'repo-storage-move'
- project.initialize_with_readme = true
- project.repository_storage = source_storage[:name]
- project.api_client = Runtime::API::Client.as_admin
- end
- end
-
- before do
- praefect_manager.gitlab = 'gitlab-gitaly-cluster'
- end
-
- it_behaves_like 'repository storage move'
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb
deleted file mode 100644
index 2b96c35415e..00000000000
--- a/qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb
+++ /dev/null
@@ -1,92 +0,0 @@
-# frozen_string_literal: true
-
-require 'parallel'
-
-module QA
- RSpec.describe 'Create' do
- context 'Gitaly' do
- describe 'Distributed reads', :orchestrated, :gitaly_cluster, :skip_live_env, :requires_admin do
- let(:number_of_reads_per_loop) { 9 }
- let(:praefect_manager) { Service::PraefectManager.new }
- let(:project) do
- Resource::Project.fabricate! do |project|
- project.name = "gitaly_cluster"
- project.initialize_with_readme = true
- end
- end
-
- before do
- praefect_manager.start_all_nodes
- praefect_manager.wait_for_replication(project.id)
- end
-
- it 'reads from each node', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347833' do
- pre_read_data = praefect_manager.query_read_distribution
-
- wait_for_reads_to_increase(project, number_of_reads_per_loop, pre_read_data)
-
- aggregate_failures "each gitaly node" do
- praefect_manager.query_read_distribution.each_with_index do |data, index|
- pre_read_count = praefect_manager.value_for_node(pre_read_data, data[:node])
- QA::Runtime::Logger.debug("Node: #{data[:node]}; before: #{pre_read_count}; now: #{data[:value]}")
- expect(data[:value]).to be > pre_read_count,
- "Read counts did not differ for node #{data[:node]}"
- end
- end
- end
-
- context 'when a node is unhealthy' do
- before do
- praefect_manager.stop_secondary_node
- end
-
- after do
- # Leave the cluster in a suitable state for subsequent tests
- praefect_manager.start_secondary_node
- end
-
- it 'does not read from the unhealthy node', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347834' do
- pre_read_data = praefect_manager.query_read_distribution
-
- read_from_project(project, number_of_reads_per_loop * 10)
-
- praefect_manager.wait_for_read_count_change(pre_read_data)
-
- post_read_data = praefect_manager.query_read_distribution
-
- aggregate_failures "each gitaly node" do
- expect(praefect_manager.value_for_node(post_read_data, 'gitaly1')).to be > praefect_manager.value_for_node(pre_read_data, 'gitaly1')
- expect(praefect_manager.value_for_node(post_read_data, 'gitaly2')).to eq praefect_manager.value_for_node(pre_read_data, 'gitaly2')
- expect(praefect_manager.value_for_node(post_read_data, 'gitaly3')).to be > praefect_manager.value_for_node(pre_read_data, 'gitaly3')
- end
- end
- end
-
- def read_from_project(project, number_of_reads)
- QA::Runtime::Logger.info('Reading from the repository')
- Parallel.each((1..number_of_reads)) do
- Git::Repository.perform do |repository|
- repository.uri = project.repository_http_location.uri
- repository.use_default_credentials
- repository.clone
- end
- end
- end
-
- def wait_for_reads_to_increase(project, number_of_reads, pre_read_data)
- diff_found = pre_read_data
-
- Support::Waiter.wait_until(sleep_interval: 5, raise_on_failure: false) do
- read_from_project(project, number_of_reads)
-
- praefect_manager.query_read_distribution.each_with_index do |data, index|
- diff_found[index] = {} unless diff_found[index]
- diff_found[index][:diff] = true if data[:value] > praefect_manager.value_for_node(pre_read_data, data[:node])
- end
- diff_found.all? { |node| node.key?(:diff) && node[:diff] }
- end
- end
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/api/3_create/gitaly/gitaly_mtls_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/gitaly_mtls_spec.rb
deleted file mode 100644
index 5000c273578..00000000000
--- a/qa/qa/specs/features/api/3_create/gitaly/gitaly_mtls_spec.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Create' do
- context 'Gitaly', :orchestrated, :mtls do
- describe 'Using mTLS' do
- let(:intial_commit_message) { 'Initial commit' }
- let(:first_added_commit_message) { 'commit over git' }
- let(:second_added_commit_message) { 'commit over api' }
-
- it 'pushes to gitaly', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347677' do
- project = Resource::Project.fabricate! do |project|
- project.name = "mTLS"
- project.initialize_with_readme = true
- end
-
- Resource::Repository::ProjectPush.fabricate! do |push|
- push.project = project
- push.new_branch = false
- push.commit_message = first_added_commit_message
- push.file_content = 'First commit'
- end
-
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.commit_message = second_added_commit_message
- commit.add_files([
- {
- file_path: "file-#{SecureRandom.hex(8)}",
- content: 'Second commit'
- }
- ])
- end
-
- expect(project.commits.map { |commit| commit[:message].chomp })
- .to include(intial_commit_message)
- .and include(first_added_commit_message)
- .and include(second_added_commit_message)
- end
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/api/3_create/gitaly/praefect_connectivity_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/praefect_connectivity_spec.rb
deleted file mode 100644
index 28469b99d04..00000000000
--- a/qa/qa/specs/features/api/3_create/gitaly/praefect_connectivity_spec.rb
+++ /dev/null
@@ -1,41 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Create' do
- context 'Praefect connectivity commands', :orchestrated, :gitaly_cluster do
- praefect_manager = Service::PraefectManager.new
-
- before do
- praefect_manager.start_all_nodes
- end
-
- context 'in a healthy environment' do
- it 'confirms healthy connection to database', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349937' do
- expect(praefect_manager.praefect_sql_ping_healthy?).to be true
- end
-
- it 'confirms healthy connection to gitaly nodes', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349938' do
- expect(praefect_manager.wait_for_dial_nodes_successful).to be true
- end
- end
-
- context 'in an unhealthy environment' do
- it 'diagnoses unhealthy connection to database', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349939' do
- praefect_manager.stop_node(praefect_manager.postgres)
- expect(praefect_manager.praefect_sql_ping_healthy?).to be false
- end
-
- it 'diagnoses connection issues to gitaly nodes', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349940' do
- praefect_manager.stop_node(praefect_manager.primary_node)
- praefect_manager.stop_node(praefect_manager.tertiary_node)
- expect(praefect_manager.praefect_dial_nodes_status?(praefect_manager.primary_node, false)).to be true
- expect(praefect_manager.praefect_dial_nodes_status?(praefect_manager.secondary_node)).to be true
- expect(praefect_manager.praefect_dial_nodes_status?(praefect_manager.tertiary_node, false)).to be true
-
- praefect_manager.stop_node(praefect_manager.secondary_node)
- expect(praefect_manager.praefect_dial_nodes_status?(praefect_manager.secondary_node, false)).to be true
- end
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/api/3_create/gitaly/praefect_dataloss_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/praefect_dataloss_spec.rb
deleted file mode 100644
index 5b02cc4646c..00000000000
--- a/qa/qa/specs/features/api/3_create/gitaly/praefect_dataloss_spec.rb
+++ /dev/null
@@ -1,104 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Create' do
- context 'Praefect dataloss commands', :orchestrated, :gitaly_cluster do
- let(:praefect_manager) { Service::PraefectManager.new }
-
- let(:project) do
- Resource::Project.fabricate! do |project|
- project.name = 'gitaly_cluster-dataloss-project'
- project.initialize_with_readme = true
- end
- end
-
- before do
- praefect_manager.start_all_nodes
- end
-
- it 'confirms that changes are synced across all storages', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352691' do
- expect { praefect_manager.praefect_dataloss_information(project.id) }
- .to(eventually_include('All repositories are fully available on all assigned storages!')
- .within(max_duration: 60))
- end
-
- it 'identifies how many changes are not in sync across storages', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352692' do
- # Ensure our test repository is replicated and in a consistent state prior to test
- praefect_manager.wait_for_project_synced_across_all_storages(project.id)
-
- # testing for gitaly2 'out of sync'
- praefect_manager.stop_secondary_node
-
- number_of_changes = 3
- 1.upto(number_of_changes) do |i|
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.branch = "newbranch-#{SecureRandom.hex(8)}"
- commit.start_branch = project.default_branch
- commit.commit_message = 'Add new file'
- commit.add_files([
- { file_path: "new_file-#{SecureRandom.hex(8)}.txt", content: 'new file' }
- ])
- end
- end
-
- # testing for gitaly3 'in sync' but marked unhealthy
- praefect_manager.stop_tertiary_node
-
- project_data_loss = praefect_manager.praefect_dataloss_information(project.id)
- aggregate_failures "validate dataloss identified" do
- expect(project_data_loss).to include('gitaly1, assigned host')
- expect(project_data_loss).to include("gitaly2 is behind by #{number_of_changes} changes or less, assigned host, unhealthy")
- expect(project_data_loss).to include('gitaly3, assigned host, unhealthy')
- end
- end
-
- it 'allows admin resolve scenario where data cannot be recovered', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352708' do
- # Ensure everything is in sync before begining test
- praefect_manager.wait_for_project_synced_across_all_storages(project.id)
-
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.commit_message = 'accept-dataloss-1'
- commit.add_files([
- { file_path: "new_file-#{SecureRandom.hex(8)}.txt", content: 'Add a commit to gitaly1,gitaly2,gitaly3' }
- ])
- end
-
- praefect_manager.wait_for_replication_to_node(project.id, praefect_manager.primary_node)
- praefect_manager.stop_primary_node
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.commit_message = 'accept-dataloss-2'
- commit.add_files([
- { file_path: "new_file-#{SecureRandom.hex(8)}.txt", content: 'Add a commit to gitaly2,gitaly3' }
- ])
- end
-
- praefect_manager.wait_for_replication_to_node(project.id, praefect_manager.secondary_node)
- praefect_manager.stop_secondary_node
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.commit_message = 'accept-dataloss-3'
- commit.add_files([
- { file_path: "new_file-#{SecureRandom.hex(8)}.txt", content: 'Add a commit to gitaly3' }
- ])
- end
-
- # Confirms that they want to accept dataloss, using gitaly2 as authoritative storage to use as a base
- praefect_manager.accept_dataloss_for_project(project.id, praefect_manager.secondary_node)
-
- # Restart nodes, and allow replication to apply dataloss changes
- praefect_manager.start_all_nodes
- praefect_manager.wait_for_project_synced_across_all_storages(project.id)
-
- # Validate that gitaly2 was accepted as the authorative storage
- aggregate_failures "validate correct set of commits available" do
- expect(project.commits.map { |commit| commit[:message].chomp }).to include('accept-dataloss-1')
- expect(project.commits.map { |commit| commit[:message].chomp }).to include('accept-dataloss-2')
- expect(project.commits.map { |commit| commit[:message].chomp }).not_to include('accept-dataloss-3')
- end
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb
deleted file mode 100644
index a53614960cd..00000000000
--- a/qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb
+++ /dev/null
@@ -1,71 +0,0 @@
-# frozen_string_literal: true
-
-require 'parallel'
-
-module QA
- RSpec.describe 'Create' do
- context 'Gitaly Cluster replication queue', :orchestrated, :gitaly_cluster, :skip_live_env do
- let(:praefect_manager) { Service::PraefectManager.new }
- let(:project) do
- Resource::Project.fabricate! do |project|
- project.name = "gitaly_cluster"
- project.initialize_with_readme = true
- end
- end
-
- before do
- praefect_manager.start_all_nodes
- end
-
- after do
- praefect_manager.start_all_nodes
- praefect_manager.clear_replication_queue
- end
-
- it 'allows replication of different repository after interruption', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347829' do
- # We want to fill the replication queue with 10 `in_progress` jobs,
- # while a lock has been acquired, which is when the problem occurred
- # as reported in https://gitlab.com/gitlab-org/gitaly/-/issues/2801
- #
- # We'll do this by creating 10 branches and pushing them all at once,
- # and then stop Praefect when a lock is acquired, set all the jobs
- # to `in_progress`, and create a job lock for each one.
- queue_size_target = 10
-
- # During normal operations we avoid create a replication event
- # https://gitlab.com/groups/gitlab-org/-/epics/7741
- praefect_manager.stop_secondary_node
- Git::Repository.perform do |repository|
- repository.uri = project.repository_http_location.uri
- repository.use_default_credentials
- repository.clone
- repository.configure_identity('GitLab QA', 'root@gitlab.com')
- 1.upto(queue_size_target) do |i|
- repository.checkout("branch#{i}", new_branch: true)
- repository.commit_file("file#{i}", SecureRandom.random_bytes(10000000), "Add file#{i}")
- end
- repository.push_all_branches
- end
- praefect_manager.start_secondary_node
-
- Support::Retrier.retry_until(max_duration: 60) do
- count = praefect_manager.replication_queue_lock_count
- QA::Runtime::Logger.debug("Lock count: #{count}")
- count >= 1
- end
-
- praefect_manager.stop_praefect
- praefect_manager.create_stalled_replication_queue
-
- praefect_manager.start_praefect
-
- # Create a new project, and check that replication occurs
- new_project = Resource::Project.fabricate! do |project|
- project.initialize_with_readme = true
- end
-
- expect(praefect_manager.replicated?(new_project.id, new_project.name)).to be true
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/api/3_create/gitaly/praefect_repo_sync_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/praefect_repo_sync_spec.rb
deleted file mode 100644
index 47be7e0620b..00000000000
--- a/qa/qa/specs/features/api/3_create/gitaly/praefect_repo_sync_spec.rb
+++ /dev/null
@@ -1,75 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Create' do
- context 'Praefect repository commands', :orchestrated, :gitaly_cluster do
- let(:praefect_manager) { Service::PraefectManager.new }
-
- let(:repo1) { { "relative_path" => "@hashed/repo1.git", "storage" => "gitaly1", "virtual_storage" => "default" } }
- let(:repo2) { { "relative_path" => "@hashed/path/to/repo2.git", "storage" => "gitaly3", "virtual_storage" => "default" } }
-
- before do
- praefect_manager.start_all_nodes
- praefect_manager.add_repo_to_disk(praefect_manager.primary_node, repo1["relative_path"])
- praefect_manager.add_repo_to_disk(praefect_manager.tertiary_node, repo2["relative_path"])
- end
-
- after do
- praefect_manager.remove_repo_from_disk(repo1["relative_path"])
- praefect_manager.remove_repo_from_disk(repo2["relative_path"])
- praefect_manager.remove_repository_from_praefect_database(repo1["relative_path"])
- praefect_manager.remove_repository_from_praefect_database(repo2["relative_path"])
- end
-
- it 'allows admin to manage difference between praefect database and disk state', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347606' do
- # Some repos are on disk that praefect is not aware of
- untracked_repositories = praefect_manager.list_untracked_repositories
- expect(untracked_repositories).to include(repo1)
- expect(untracked_repositories).to include(repo2)
-
- # admin manually adds the first repo to the praefect database
- praefect_manager.track_repository_in_praefect(repo1["relative_path"], repo1["storage"], repo1["virtual_storage"])
- untracked_repositories = praefect_manager.list_untracked_repositories
- expect(untracked_repositories).not_to include(repo1)
- expect(untracked_repositories).to include(repo2)
- expect(praefect_manager.repository_exists_on_node_disk?(praefect_manager.primary_node, repo1["relative_path"])).to be true
- expect(praefect_manager.praefect_database_tracks_repo?(repo1["relative_path"])).to be true
-
- # admin manually adds the second repo to the praefect database
- praefect_manager.track_repository_in_praefect(repo2["relative_path"], repo2["storage"], repo2["virtual_storage"])
- untracked_repositories = praefect_manager.list_untracked_repositories
- expect(untracked_repositories).not_to include(repo2)
- expect(praefect_manager.repository_exists_on_node_disk?(praefect_manager.tertiary_node, repo2["relative_path"])).to be true
- expect(praefect_manager.praefect_database_tracks_repo?(repo2["relative_path"])).to be true
-
- # admin ensures replication to other nodes occurs
- expect(praefect_manager.repository_replicated_to_disk?(praefect_manager.secondary_node, repo1["relative_path"])).to be true
- expect(praefect_manager.repository_replicated_to_disk?(praefect_manager.tertiary_node, repo1["relative_path"])).to be true
- expect(praefect_manager.repository_replicated_to_disk?(praefect_manager.primary_node, repo2["relative_path"])).to be true
- expect(praefect_manager.repository_replicated_to_disk?(praefect_manager.secondary_node, repo2["relative_path"])).to be true
-
- # admin chooses to remove the first repo completely from praefect and disk
- praefect_manager.remove_tracked_praefect_repository(repo1["relative_path"], repo1["virtual_storage"])
- expect(praefect_manager.repository_exists_on_node_disk?(praefect_manager.primary_node, repo1["relative_path"])).to be false
- expect(praefect_manager.repository_exists_on_node_disk?(praefect_manager.secondary_node, repo1["relative_path"])).to be false
- expect(praefect_manager.repository_exists_on_node_disk?(praefect_manager.tertiary_node, repo1["relative_path"])).to be false
- expect(praefect_manager.praefect_database_tracks_repo?(repo1["relative_path"])).to be false
-
- untracked_repositories = praefect_manager.list_untracked_repositories
- expect(untracked_repositories).not_to include(repo1)
- end
-
- it 'allows admin to control the number of replicas of data', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347566' do
- praefect_manager.track_repository_in_praefect(repo1['relative_path'], repo1['storage'], repo1['virtual_storage'])
-
- praefect_manager.set_replication_factor(repo1['relative_path'], repo1['virtual_storage'], 2)
- replication_storages = praefect_manager.get_replication_storages(repo1['relative_path'], repo1['virtual_storage'])
- expect(replication_storages).to have_attributes(size: 2)
-
- praefect_manager.set_replication_factor(repo1['relative_path'], repo1['virtual_storage'], 3)
- replication_storages = praefect_manager.get_replication_storages(repo1['relative_path'], repo1['virtual_storage'])
- expect(replication_storages).to eq(%w(gitaly1 gitaly2 gitaly3))
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb b/qa/qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb
index c06912e0367..9d47872a774 100644
--- a/qa/qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb
+++ b/qa/qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'Create a new project from a template' do
+ describe 'Create a new project from a template', product_group: :source_code do
let(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'templated-project'
diff --git a/qa/qa/specs/features/api/3_create/repository/default_branch_name_setting_spec.rb b/qa/qa/specs/features/api/3_create/repository/default_branch_name_setting_spec.rb
index cba563ef85a..123a4a625ab 100644
--- a/qa/qa/specs/features/api/3_create/repository/default_branch_name_setting_spec.rb
+++ b/qa/qa/specs/features/api/3_create/repository/default_branch_name_setting_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'Default branch name instance setting', :requires_admin, :skip_live_env do
+ describe 'Default branch name instance setting', :requires_admin, :skip_live_env, product_group: :source_code do
before(:context) do
Runtime::ApplicationSettings.set_application_settings(default_branch_name: 'main')
end
diff --git a/qa/qa/specs/features/api/3_create/repository/files_spec.rb b/qa/qa/specs/features/api/3_create/repository/files_spec.rb
index 151fd0fffe3..71bd03fab17 100644
--- a/qa/qa/specs/features/api/3_create/repository/files_spec.rb
+++ b/qa/qa/specs/features/api/3_create/repository/files_spec.rb
@@ -4,7 +4,7 @@ require 'airborne'
module QA
RSpec.describe 'Create' do
- describe 'API basics' do
+ describe 'API basics', product_group: :source_code do
before(:context) do
@api_client = Runtime::API::Client.new(:gitlab)
end
diff --git a/qa/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb b/qa/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb
index 6f175272d91..a211eb6042d 100644
--- a/qa/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb
+++ b/qa/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb
@@ -5,7 +5,8 @@ require 'digest'
module QA
RSpec.describe 'Create' do
- describe 'Compare archives of different user projects with the same name and check they\'re different' do
+ describe 'Compare archives of different user projects with the same name and check they\'re different',
+ product_group: :source_code do
include Support::API
let(:project_name) { "project-archive-download-#{SecureRandom.hex(8)}" }
@@ -52,12 +53,11 @@ module QA
project.api_client = api_client
end
- Resource::Repository::ProjectPush.fabricate! do |push|
- push.project = project
- push.file_name = 'README.md'
- push.file_content = '# This is a test project'
- push.commit_message = 'Add README.md'
- push.user = user
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = project
+ commit.add_files([{ file_path: 'README.md', content: '# This is a test project' }])
+ commit.commit_message = 'Add README.md'
+ commit.api_client = api_client
end
project
@@ -65,7 +65,7 @@ module QA
def download_project_archive_via_api(api_client, project, type = 'tar.gz')
get_project_archive_zip = Runtime::API::Request.new(api_client, project.api_get_archive_path(type))
- project_archive_download = get(get_project_archive_zip.url, raw_response: true)
+ project_archive_download = Support::API.get(get_project_archive_zip.url, raw_response: true)
expect(project_archive_download.code).to eq(200)
project_archive_download.file
diff --git a/qa/qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb b/qa/qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb
index 1a2a1679cca..1d41184df98 100644
--- a/qa/qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb
+++ b/qa/qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'PostReceive idempotent' do
+ describe 'PostReceive idempotent', product_group: :source_code do
# Tests that a push does not result in multiple changes from repeated PostReceive executions.
# One of the consequences would be duplicate push events
diff --git a/qa/qa/specs/features/api/3_create/repository/storage_size_spec.rb b/qa/qa/specs/features/api/3_create/repository/storage_size_spec.rb
index 406ff191f95..df3b5a4e7fb 100644
--- a/qa/qa/specs/features/api/3_create/repository/storage_size_spec.rb
+++ b/qa/qa/specs/features/api/3_create/repository/storage_size_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'Repository Usage Quota', :skip_live_env, feature_flag: {
+ describe 'Repository Usage Quota', :skip_live_env, product_group: :source_code, feature_flag: {
name: 'gitaly_revlist_for_repo_size',
scope: :global
} do
diff --git a/qa/qa/specs/features/api/3_create/repository/tag_revision_trigger_prereceive_hook_spec.rb b/qa/qa/specs/features/api/3_create/repository/tag_revision_trigger_prereceive_hook_spec.rb
index 98612d84b21..b34b4208337 100644
--- a/qa/qa/specs/features/api/3_create/repository/tag_revision_trigger_prereceive_hook_spec.rb
+++ b/qa/qa/specs/features/api/3_create/repository/tag_revision_trigger_prereceive_hook_spec.rb
@@ -2,29 +2,32 @@
module QA
RSpec.describe 'Create' do
- let(:project) do
- Resource::Project.fabricate_via_api! do |project|
- project.initialize_with_readme = true
+ describe 'Prereceive hook', product_group: :source_code do
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.initialize_with_readme = true
+ end
end
- end
- context 'when creating a tag for a ref' do
- context 'when it triggers a prereceive hook configured with a custom error' do
- before do
- # The configuration test prereceive hook must match a specific naming pattern
- # In this test we create a project with a different name and then change the path.
- # Otherwise we wouldn't be able create any commits to be tagged due to the hook.
- project.change_path("project-reject-prereceive-#{SecureRandom.hex(8)}")
- end
+ context 'when creating a tag for a ref' do
+ context 'when it triggers a prereceive hook configured with a custom error' do
+ before do
+ # The configuration test prereceive hook must match a specific naming pattern
+ # In this test we create a project with a different name and then change the path.
+ # Otherwise we wouldn't be able create any commits to be tagged due to the hook.
+ project.change_path("project-reject-prereceive-#{SecureRandom.hex(8)}")
+ end
- it 'returns a custom server hook error',
- :skip_live_env,
- except: { job: 'review-qa-*' },
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/369053' do
- expect { project.create_repository_tag('v1.2.3') }.to raise_error
- .with_message(
- /rejecting prereceive hook for projects with GL_PROJECT_PATH matching pattern reject-prereceive/
- )
+ it 'returns a custom server hook error',
+ :skip_live_env,
+ except: { job: 'review-qa-*' },
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/369053' do
+ expect { project.create_repository_tag('v1.2.3') }
+ .to raise_error
+ .with_message(
+ /rejecting prereceive hook for projects with GL_PROJECT_PATH matching pattern reject-prereceive/
+ )
+ end
end
end
end