diff --git a/app/models/terraform/state_version.rb b/app/models/terraform/state_version.rb index d5e315d18a151c7823bd87cc68bb03148d703d23..eff4448540191ed144891b73c1b21484c1956014 100644 --- a/app/models/terraform/state_version.rb +++ b/app/models/terraform/state_version.rb @@ -14,5 +14,11 @@ class StateVersion < ApplicationRecord mount_file_store_uploader VersionedStateUploader delegate :project_id, :uuid, to: :terraform_state, allow_nil: true + + def local? + file_store == ObjectStorage::Store::LOCAL + end end end + +Terraform::StateVersion.prepend_if_ee('EE::Terraform::StateVersion') diff --git a/config/initializers_before_autoloader/000_inflections.rb b/config/initializers_before_autoloader/000_inflections.rb index a34b75d038247fbbad58aec649f27263cb886923..f9d1eedde4e183459f335d551d59e1309d8fb5dc 100644 --- a/config/initializers_before_autoloader/000_inflections.rb +++ b/config/initializers_before_autoloader/000_inflections.rb @@ -24,11 +24,12 @@ project_auto_devops project_registry project_statistics + snippet_repository_registry system_note_metadata terraform_state_registry + terraform_state_version_registry vulnerabilities_feedback vulnerability_feedback - snippet_repository_registry ) inflect.acronym 'EE' inflect.acronym 'CSP' diff --git a/doc/administration/monitoring/prometheus/gitlab_metrics.md b/doc/administration/monitoring/prometheus/gitlab_metrics.md index 370c72458fabae2cbf4d0692c5ef97d05cb9ee5e..df40455d89e3bb425be4d5bd5fa4df41abc7bec8 100644 --- a/doc/administration/monitoring/prometheus/gitlab_metrics.md +++ b/doc/administration/monitoring/prometheus/gitlab_metrics.md @@ -190,6 +190,12 @@ configuration option in `gitlab.yml`. These metrics are served from the | `geo_terraform_states_synced` | Gauge | 13.3 | Number of syncable terraform states synced on secondary | `url` | | `geo_terraform_states_failed` | Gauge | 13.3 | Number of syncable terraform states failed to sync on secondary | `url` | | `geo_terraform_states_registry` | Gauge | 13.3 | Number of terraform states in the registry | `url` | +| `geo_terraform_state_versions` | Gauge | 13.5 | Number of terraform state versions on primary | `url` | +| `geo_terraform_state_versions_checksummed` | Gauge | 13.5 | Number of terraform state versions checksummed on primary | `url` | +| `geo_terraform_state_versions_checksum_failed` | Gauge | 13.5 | Number of terraform state versions failed to calculate the checksum on primary | `url` | +| `geo_terraform_state_versions_synced` | Gauge | 13.5 | Number of syncable terraform state versions synced on secondary | `url` | +| `geo_terraform_state_versions_failed` | Gauge | 13.5 | Number of syncable terraform state versions failed to sync on secondary | `url` | +| `geo_terraform_state_versions_registry` | Gauge | 13.5 | Number of terraform state versions in the registry | `url` | | `global_search_bulk_cron_queue_size` | Gauge | 12.10 | Number of database records waiting to be synchronized to Elasticsearch | | | `global_search_awaiting_indexing_queue_size` | Gauge | 13.2 | Number of database updates waiting to be synchronized to Elasticsearch while indexing is paused | | | `geo_merge_request_diffs` | Gauge | 13.4 | Number of merge request diffs on primary | `url` | diff --git a/doc/api/geo_nodes.md b/doc/api/geo_nodes.md index 8d2052f73733efa69c628bc90fa0a8c260f7dcd5..ce58982d407d7ba21eee980da1a21c751bd679e6 100644 --- a/doc/api/geo_nodes.md +++ b/doc/api/geo_nodes.md @@ -465,7 +465,13 @@ Example response: "terraform_states_checksum_failed_count": 0, "terraform_states_registry_count": 10, "terraform_states_synced_count": 6, - "terraform_states_failed_count": 3 + "terraform_states_failed_count": 3, + "terraform_state_versions_count": 10, + "terraform_state_versions_checksummed_count": 10, + "terraform_state_versions_checksum_failed_count": 0, + "terraform_state_versions_registry_count": 10, + "terraform_state_versions_synced_count": 6, + "terraform_state_versions_failed_count": 3, "snippet_repositories_count": 10, "snippet_repositories_checksummed_count": 10, "snippet_repositories_checksum_failed_count": 0, diff --git a/ee/app/models/ee/terraform/state_version.rb b/ee/app/models/ee/terraform/state_version.rb new file mode 100644 index 0000000000000000000000000000000000000000..a2e0597d72c126eb9f984a11fa9dce8e9deff9a8 --- /dev/null +++ b/ee/app/models/ee/terraform/state_version.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module EE + module Terraform + module StateVersion + extend ActiveSupport::Concern + + prepended do + include ::Gitlab::Geo::ReplicableModel + with_replicator Geo::TerraformStateVersionReplicator + + scope :with_files_stored_locally, -> { where(file_store: ::ObjectStorage::Store::LOCAL) } + scope :project_id_in, ->(ids) { joins(:terraform_state).where('terraform_states.project_id': ids) } + end + + class_methods do + def replicables_for_geo_node(node = ::Gitlab::Geo.current_node) + selective_sync_scope(node).merge(object_storage_scope(node)) + end + + private + + def object_storage_scope(node) + return all if node.sync_object_storage? + + with_files_stored_locally + end + + def selective_sync_scope(node) + return all unless node.selective_sync? + + project_id_in(node.projects) + end + end + + def log_geo_deleted_event + # Keep empty for now. Should be addressed in future + # by https://gitlab.com/gitlab-org/gitlab/-/issues/232917 + end + end + end +end diff --git a/ee/app/models/geo/terraform_state_version_registry.rb b/ee/app/models/geo/terraform_state_version_registry.rb new file mode 100644 index 0000000000000000000000000000000000000000..f31d687436ca6cd86a035813e6b613c48b55fd2b --- /dev/null +++ b/ee/app/models/geo/terraform_state_version_registry.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +class Geo::TerraformStateVersionRegistry < Geo::BaseRegistry + include Geo::ReplicableRegistry + + MODEL_CLASS = ::Terraform::StateVersion + MODEL_FOREIGN_KEY = :terraform_state_version_id + + belongs_to :terraform_state_version, class_name: 'Terraform::StateVersion' +end diff --git a/ee/app/replicators/geo/terraform_state_version_replicator.rb b/ee/app/replicators/geo/terraform_state_version_replicator.rb new file mode 100644 index 0000000000000000000000000000000000000000..2d4b01fd0327b5e908056267d7a1d19ca4a6eb07 --- /dev/null +++ b/ee/app/replicators/geo/terraform_state_version_replicator.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module Geo + class TerraformStateVersionReplicator < Gitlab::Geo::Replicator + include ::Geo::BlobReplicatorStrategy + + def carrierwave_uploader + model_record.file + end + + def self.model + ::Terraform::StateVersion + end + + # Remove with https://gitlab.com/gitlab-org/gitlab/-/issues/249176 + def self.replication_enabled_by_default? + false + end + end +end diff --git a/ee/app/workers/geo/secondary/registry_consistency_worker.rb b/ee/app/workers/geo/secondary/registry_consistency_worker.rb index 3fcbce48a6f111236ce0b9229dd1daa201068ffc..1409272844acaa4088e6f9c265cf0fea4fc485f4 100644 --- a/ee/app/workers/geo/secondary/registry_consistency_worker.rb +++ b/ee/app/workers/geo/secondary/registry_consistency_worker.rb @@ -24,6 +24,7 @@ class RegistryConsistencyWorker Geo::PackageFileRegistry, Geo::ProjectRegistry, Geo::TerraformStateRegistry, + Geo::TerraformStateVersionRegistry, Geo::UploadRegistry ].freeze diff --git a/ee/config/feature_flags/development/geo_terraform_state_replication.yml b/ee/config/feature_flags/development/geo_terraform_state_replication.yml index 554b5e1d7dbba85e0abfb5594dcc517d3cab99e9..aa166ec8da44cec173e7b0c3aff9e9fc7ca1bfc7 100644 --- a/ee/config/feature_flags/development/geo_terraform_state_replication.yml +++ b/ee/config/feature_flags/development/geo_terraform_state_replication.yml @@ -1,7 +1,7 @@ --- name: geo_terraform_state_replication -introduced_by_url: -rollout_issue_url: -group: +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36594 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/254623 +group: group::geo type: development default_enabled: false diff --git a/ee/config/feature_flags/development/geo_terraform_state_version_replication.yml b/ee/config/feature_flags/development/geo_terraform_state_version_replication.yml new file mode 100644 index 0000000000000000000000000000000000000000..fcedeb73cac842b2b051fde1077e47df29bc2b35 --- /dev/null +++ b/ee/config/feature_flags/development/geo_terraform_state_version_replication.yml @@ -0,0 +1,7 @@ +--- +name: geo_terraform_state_version_replication +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42529 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/254622 +group: group::geo +type: development +default_enabled: false diff --git a/ee/lib/gitlab/geo.rb b/ee/lib/gitlab/geo.rb index be73586230b3603049c8bc72b1f87a5477585830..57fd0e01fc1bdcab725c6f68e5c1f5f3062cb306 100644 --- a/ee/lib/gitlab/geo.rb +++ b/ee/lib/gitlab/geo.rb @@ -23,6 +23,7 @@ module Geo ::Geo::MergeRequestDiffReplicator, ::Geo::PackageFileReplicator, ::Geo::TerraformStateReplicator, + ::Geo::TerraformStateVersionReplicator, ::Geo::SnippetRepositoryReplicator ].freeze diff --git a/ee/spec/factories/geo/terraform_state_version_registry.rb b/ee/spec/factories/geo/terraform_state_version_registry.rb new file mode 100644 index 0000000000000000000000000000000000000000..76086a54374817d8cda055a807806fd4660453fb --- /dev/null +++ b/ee/spec/factories/geo/terraform_state_version_registry.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :geo_terraform_state_version_registry, class: 'Geo::TerraformStateVersionRegistry' do + association :terraform_state_version, factory: :terraform_state_version + state { Geo::TerraformStateVersionRegistry.state_value(:pending) } + + trait :synced do + state { Geo::TerraformStateVersionRegistry.state_value(:synced) } + last_synced_at { 5.days.ago } + end + + trait :failed do + state { Geo::TerraformStateVersionRegistry.state_value(:failed) } + last_synced_at { 1.day.ago } + retry_count { 2 } + last_sync_failure { 'Random error' } + end + + trait :started do + state { Geo::TerraformStateVersionRegistry.state_value(:started) } + last_synced_at { 1.day.ago } + retry_count { 0 } + end + end +end diff --git a/ee/spec/fixtures/api/schemas/public_api/v4/geo_node_status.json b/ee/spec/fixtures/api/schemas/public_api/v4/geo_node_status.json index d94f96d39e83bb0fab0ac04cb0d87ea71073ca76..b1358bfd33bc2a31f3796e73ed428527b644560b 100644 --- a/ee/spec/fixtures/api/schemas/public_api/v4/geo_node_status.json +++ b/ee/spec/fixtures/api/schemas/public_api/v4/geo_node_status.json @@ -70,6 +70,14 @@ "terraform_states_failed_count", "terraform_states_synced_count", "terraform_states_synced_in_percentage", + "terraform_state_versions_count", + "terraform_state_versions_checksum_failed_count", + "terraform_state_versions_checksummed_in_percentage", + "terraform_state_versions_checksummed_count", + "terraform_state_versions_registry_count", + "terraform_state_versions_failed_count", + "terraform_state_versions_synced_count", + "terraform_state_versions_synced_in_percentage", "snippet_repositories_count", "snippet_repositories_checksum_failed_count", "snippet_repositories_checksummed_in_percentage", @@ -183,6 +191,14 @@ "terraform_states_synced_count": { "type": ["integer", "null"] }, "terraform_states_synced_in_percentage": { "type": "string" }, "terraform_states_checksummed_in_percentage": { "type": "string" }, + "terraform_state_versions_count": { "type": ["integer", "null"] }, + "terraform_state_versions_checksummed_count": { "type": ["integer", "null"] }, + "terraform_state_versions_checksum_failed_count": { "type": ["integer", "null"] }, + "terraform_state_versions_registry_count": { "type": ["integer", "null"] }, + "terraform_state_versions_failed_count": { "type": ["integer", "null"] }, + "terraform_state_versions_synced_count": { "type": ["integer", "null"] }, + "terraform_state_versions_synced_in_percentage": { "type": "string" }, + "terraform_state_versions_checksummed_in_percentage": { "type": "string" }, "snippet_repositories_count": { "type": ["integer", "null"] }, "snippet_repositories_checksummed_count": { "type": ["integer", "null"] }, "snippet_repositories_checksum_failed_count": { "type": ["integer", "null"] }, diff --git a/ee/spec/models/ee/terraform/state_spec.rb b/ee/spec/models/ee/terraform/state_spec.rb index 62d1aec04c38196ab6f155cec438693d1132e057..aa06dca964ba5cb66a265c85f208923c3f6c5215 100644 --- a/ee/spec/models/ee/terraform/state_spec.rb +++ b/ee/spec/models/ee/terraform/state_spec.rb @@ -17,8 +17,8 @@ expect(described_class.with_files_stored_locally).to have_attributes(count: 5) end - it 'excludes states with local storage' do - stub_terraform_state_object_storage(Terraform::StateUploader) + it 'excludes states without local storage' do + stub_terraform_state_object_storage create_list(:terraform_state, 5, :with_file) @@ -54,7 +54,7 @@ before do stub_current_geo_node(secondary) - stub_terraform_state_object_storage(Terraform::StateUploader) if terraform_object_storage_enabled + stub_terraform_state_object_storage if terraform_object_storage_enabled create_list(:terraform_state, 5, :with_file, project: project) create_list(:terraform_state, 5, :with_file, project: create(:project)) @@ -70,7 +70,7 @@ before do stub_current_geo_node(secondary) - stub_terraform_state_object_storage(Terraform::StateUploader) + stub_terraform_state_object_storage create_list(:terraform_state, 5, project: project) end diff --git a/ee/spec/models/ee/terraform/state_version_spec.rb b/ee/spec/models/ee/terraform/state_version_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..4cb1aa629d2fc3cf03c9f348bd4845ffc3329a3b --- /dev/null +++ b/ee/spec/models/ee/terraform/state_version_spec.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Terraform::StateVersion do + using RSpec::Parameterized::TableSyntax + include EE::GeoHelpers + + let_it_be(:group) { create(:group) } + let_it_be(:project) { create(:project, group: group) } + + describe '.with_files_stored_locally' do + it 'includes states with local storage' do + create_list(:terraform_state_version, 5) + + expect(described_class.with_files_stored_locally).to have_attributes(count: 5) + end + + it 'excludes states without local storage' do + stub_terraform_state_version_object_storage + + create_list(:terraform_state_version, 5) + + expect(described_class.with_files_stored_locally).to have_attributes(count: 0) + end + end + + describe '.replicables_for_geo_node' do + where(:selective_sync_enabled, :object_storage_sync_enabled, :terraform_object_storage_enabled, :synced_states) do + true | true | true | 5 + true | true | false | 5 + true | false | true | 0 + true | false | false | 5 + false | false | false | 10 + false | false | true | 0 + false | true | true | 10 + false | true | false | 10 + true | true | false | 5 + end + + with_them do + let(:secondary) do + node = build(:geo_node, sync_object_storage: object_storage_sync_enabled) + + if selective_sync_enabled + node.selective_sync_type = 'namespaces' + node.namespaces = [group] + end + + node.save! + node + end + + before do + stub_current_geo_node(secondary) + stub_terraform_state_version_object_storage if terraform_object_storage_enabled + + create_list(:terraform_state_version, 5, terraform_state: create(:terraform_state, project: project)) + create_list(:terraform_state_version, 5, terraform_state: create(:terraform_state, project: create(:project))) + end + + it 'returns the proper number of terraform states' do + expect(Terraform::StateVersion.replicables_for_geo_node.count).to eq(synced_states) + end + end + end +end diff --git a/ee/spec/models/geo/terraform_state_version_registry_spec.rb b/ee/spec/models/geo/terraform_state_version_registry_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..1e9af786d964dc8beb8fe38426f9229422022f56 --- /dev/null +++ b/ee/spec/models/geo/terraform_state_version_registry_spec.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Geo::TerraformStateVersionRegistry, :geo, type: :model do + let_it_be(:registry) { create(:geo_terraform_state_version_registry) } + + specify 'factory is valid' do + expect(registry).to be_valid + end + + include_examples 'a Geo framework registry' +end diff --git a/ee/spec/models/geo_node_status_spec.rb b/ee/spec/models/geo_node_status_spec.rb index 797bb9a6e056d7f228ca819dafda9357040060b6..70f3dfe34e975c177505fc4618c9fba308d9d125 100644 --- a/ee/spec/models/geo_node_status_spec.rb +++ b/ee/spec/models/geo_node_status_spec.rb @@ -1147,10 +1147,11 @@ end where(:replicator, :model_factory, :registry_factory) do - Geo::MergeRequestDiffReplicator | :external_merge_request_diff | :geo_merge_request_diff_registry - Geo::PackageFileReplicator | :package_file | :geo_package_file_registry - Geo::TerraformStateReplicator | :terraform_state | :geo_terraform_state_registry - Geo::SnippetRepositoryReplicator | :snippet_repository | :geo_snippet_repository_registry + Geo::MergeRequestDiffReplicator | :external_merge_request_diff | :geo_merge_request_diff_registry + Geo::PackageFileReplicator | :package_file | :geo_package_file_registry + Geo::TerraformStateReplicator | :terraform_state | :geo_terraform_state_registry + Geo::TerraformStateVersionReplicator | :terraform_state_version | :geo_terraform_state_version_registry + Geo::SnippetRepositoryReplicator | :snippet_repository | :geo_snippet_repository_registry end with_them do diff --git a/ee/spec/replicators/geo/terraform_state_version_replicator_spec.rb b/ee/spec/replicators/geo/terraform_state_version_replicator_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..5a9b4a9802834e1aad0e37163897cf772b9b539f --- /dev/null +++ b/ee/spec/replicators/geo/terraform_state_version_replicator_spec.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Geo::TerraformStateVersionReplicator do + let(:model_record) { build(:terraform_state_version) } + + it_behaves_like 'a blob replicator' +end diff --git a/ee/spec/services/geo/registry_consistency_service_spec.rb b/ee/spec/services/geo/registry_consistency_service_spec.rb index a6528390d4466dc616b2b4d43efee4618d4fa11b..f4403374f2fadced2337ad4984ddd73875f7a241 100644 --- a/ee/spec/services/geo/registry_consistency_service_spec.rb +++ b/ee/spec/services/geo/registry_consistency_service_spec.rb @@ -19,7 +19,8 @@ def model_class_factory_name(registry_class) { Geo::DesignRegistry => :project_with_design, Geo::MergeRequestDiffRegistry => :external_merge_request_diff, Geo::PackageFileRegistry => :package_file_with_file, - Geo::TerraformStateRegistry => :legacy_terraform_state } + Geo::TerraformStateRegistry => :legacy_terraform_state, + Geo::TerraformStateVersionRegistry => :terraform_state_version } .fetch(registry_class, default_factory_name) end diff --git a/ee/spec/workers/geo/secondary/registry_consistency_worker_spec.rb b/ee/spec/workers/geo/secondary/registry_consistency_worker_spec.rb index fd83f020fe221dc224c06d2e64b412f3242aaa7b..17a1a232bc8763c65f7797947cec8622340c392f 100644 --- a/ee/spec/workers/geo/secondary/registry_consistency_worker_spec.rb +++ b/ee/spec/workers/geo/secondary/registry_consistency_worker_spec.rb @@ -85,7 +85,8 @@ lfs_object = create(:lfs_object) merge_request_diff = create(:merge_request_diff, :external) package_file = create(:conan_package_file, :conan_package) - terraform_state = create(:terraform_state, :with_file, project: project) + terraform_state = create(:legacy_terraform_state, project: project) + terraform_state_version = create(:terraform_state_version) upload = create(:upload) expect(Geo::ContainerRepositoryRegistry.where(container_repository_id: container_repository.id).count).to eq(0) @@ -96,6 +97,7 @@ expect(Geo::PackageFileRegistry.where(package_file_id: package_file.id).count).to eq(0) expect(Geo::ProjectRegistry.where(project_id: project.id).count).to eq(0) expect(Geo::TerraformStateRegistry.where(terraform_state_id: terraform_state.id).count).to eq(0) + expect(Geo::TerraformStateVersionRegistry.where(terraform_state_version_id: terraform_state_version.id).count).to eq(0) expect(Geo::UploadRegistry.where(file_id: upload.id).count).to eq(0) subject.perform @@ -108,6 +110,7 @@ expect(Geo::PackageFileRegistry.where(package_file_id: package_file.id).count).to eq(1) expect(Geo::ProjectRegistry.where(project_id: project.id).count).to eq(1) expect(Geo::TerraformStateRegistry.where(terraform_state_id: terraform_state.id).count).to eq(1) + expect(Geo::TerraformStateVersionRegistry.where(terraform_state_version_id: terraform_state_version.id).count).to eq(1) expect(Geo::UploadRegistry.where(file_id: upload.id).count).to eq(1) end diff --git a/spec/factories/terraform/state_version.rb b/spec/factories/terraform/state_version.rb index d1bd78215e3afa6c422c316b32841c6695920718..b45bd01fd3c9abe35639cee77e9cd6f471dea242 100644 --- a/spec/factories/terraform/state_version.rb +++ b/spec/factories/terraform/state_version.rb @@ -7,5 +7,13 @@ sequence(:version) file { fixture_file_upload('spec/fixtures/terraform/terraform.tfstate', 'application/json') } + + trait(:checksummed) do + verification_checksum { 'abc' } + end + + trait(:checksum_failure) do + verification_failure { 'Could not calculate the checksum' } + end end end diff --git a/spec/models/terraform/state_spec.rb b/spec/models/terraform/state_spec.rb index 01ae80a61d1231abad4682607daa02c937c2c8db..5c3958da7bfc63cf8a270ea9053ab3d037a68fbf 100644 --- a/spec/models/terraform/state_spec.rb +++ b/spec/models/terraform/state_spec.rb @@ -15,7 +15,7 @@ it { is_expected.to validate_presence_of(:project_id) } before do - stub_terraform_state_object_storage(Terraform::StateUploader) + stub_terraform_state_object_storage end describe '#file' do @@ -43,7 +43,7 @@ context 'when file is stored locally' do before do - stub_terraform_state_object_storage(Terraform::StateUploader, enabled: false) + stub_terraform_state_object_storage(enabled: false) end it_behaves_like 'mounted file in local store' diff --git a/spec/models/terraform/state_version_spec.rb b/spec/models/terraform/state_version_spec.rb index 72dd29e157148f703a4d107efcc980196a9521c2..cc5ea87159d12536abd755cbd582411582ac46a6 100644 --- a/spec/models/terraform/state_version_spec.rb +++ b/spec/models/terraform/state_version_spec.rb @@ -29,7 +29,7 @@ subject { create(:terraform_state_version) } before do - stub_terraform_state_object_storage(Terraform::StateUploader) + stub_terraform_state_object_storage end describe '#file' do diff --git a/spec/requests/api/terraform/state_spec.rb b/spec/requests/api/terraform/state_spec.rb index 8d128bd911f9bf71e9a5d569daee8c7b941c9c28..aff41ff5974a162f200d9967e355d4c6a796d8e7 100644 --- a/spec/requests/api/terraform/state_spec.rb +++ b/spec/requests/api/terraform/state_spec.rb @@ -18,7 +18,7 @@ let(:state_path) { "/projects/#{project_id}/terraform/state/#{state_name}" } before do - stub_terraform_state_object_storage(Terraform::StateUploader) + stub_terraform_state_object_storage end describe 'GET /projects/:id/terraform/state/:name' do diff --git a/spec/support/helpers/stub_object_storage.rb b/spec/support/helpers/stub_object_storage.rb index 476b7d34ee56f49aeef49f49d5cb7c7704b55e77..786407f164e50d8e9734f21079af923e683d5b07 100644 --- a/spec/support/helpers/stub_object_storage.rb +++ b/spec/support/helpers/stub_object_storage.rb @@ -82,9 +82,16 @@ def stub_uploads_object_storage(uploader = described_class, **params) **params) end - def stub_terraform_state_object_storage(uploader = described_class, **params) + def stub_terraform_state_object_storage(**params) stub_object_storage_uploader(config: Gitlab.config.terraform_state.object_store, - uploader: uploader, + uploader: Terraform::VersionedStateUploader, + remote_directory: 'terraform', + **params) + end + + def stub_terraform_state_version_object_storage(**params) + stub_object_storage_uploader(config: Gitlab.config.terraform_state.object_store, + uploader: Terraform::StateUploader, remote_directory: 'terraform', **params) end