diff options
Diffstat (limited to 'app/models/terraform/state.rb')
-rw-r--r-- | app/models/terraform/state.rb | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/app/models/terraform/state.rb b/app/models/terraform/state.rb index c50b9da1310..419fffcb666 100644 --- a/app/models/terraform/state.rb +++ b/app/models/terraform/state.rb @@ -5,27 +5,34 @@ module Terraform include UsageStatistics include FileStoreMounter - DEFAULT = '{"version":1}'.freeze HEX_REGEXP = %r{\A\h+\z}.freeze UUID_LENGTH = 32 belongs_to :project belongs_to :locked_by_user, class_name: 'User' + has_many :versions, class_name: 'Terraform::StateVersion', foreign_key: :terraform_state_id + has_one :latest_version, -> { ordered_by_version_desc }, class_name: 'Terraform::StateVersion', foreign_key: :terraform_state_id + + scope :versioning_not_enabled, -> { where(versioning_enabled: false) } + validates :project_id, presence: true validates :uuid, presence: true, uniqueness: true, length: { is: UUID_LENGTH }, format: { with: HEX_REGEXP, message: 'only allows hex characters' } default_value_for(:uuid, allows_nil: false) { SecureRandom.hex(UUID_LENGTH / 2) } + default_value_for(:versioning_enabled, true) mount_file_store_uploader StateUploader - default_value_for(:file) { CarrierWaveStringFile.new(DEFAULT) } - def file_store super || StateUploader.default_store end + def latest_file + versioning_enabled ? latest_version&.file : file + end + def local? file_store == ObjectStorage::Store::LOCAL end @@ -33,6 +40,17 @@ module Terraform def locked? self.lock_xid.present? end + + def update_file!(data, version:) + if versioning_enabled? + new_version = versions.build(version: version) + new_version.assign_attributes(created_by_user: locked_by_user, file: data) + new_version.save! + else + self.file = data + save! + end + end end end |