diff options
Diffstat (limited to 'qa/qa/specs/features/api/3_create')
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 |