diff options
| author | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2019-01-28 13:37:09 +0100 |
|---|---|---|
| committer | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2019-01-29 12:46:50 +0100 |
| commit | d434af46f4e8f2f3d149bf15674098afe9710a4a (patch) | |
| tree | d59b70d40531b425e42eea96b7c996787c977996 /app/models/concerns | |
| parent | b8b2928f77f0a76c9560f7138c5c26e112fdc787 (diff) | |
| download | gitlab-ce-d434af46f4e8f2f3d149bf15674098afe9710a4a.tar.gz | |
Extract processable metadata to a separate concern
We extracted implementation of build/bridge metadata attributes to a
separate concern, because in EE `Ci::Bridge` also has metadata
attributes, and we want to build abstraction for storing values in build
metadata table.
Diffstat (limited to 'app/models/concerns')
| -rw-r--r-- | app/models/concerns/ci/metadatable.rb | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/app/models/concerns/ci/metadatable.rb b/app/models/concerns/ci/metadatable.rb new file mode 100644 index 00000000000..9eed9492b37 --- /dev/null +++ b/app/models/concerns/ci/metadatable.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +module Ci + ## + # This module implements methods that need to read and write + # metadata for CI/CD entities. + # + module Metadatable + extend ActiveSupport::Concern + + included do + has_one :metadata, class_name: 'Ci::BuildMetadata', + foreign_key: :build_id, + inverse_of: :build, + autosave: true + + delegate :timeout, to: :metadata, prefix: true, allow_nil: true + before_create :ensure_metadata + end + + def ensure_metadata + metadata || build_metadata(project: project) + end + + def degenerated? + self.options.blank? + end + + def degenerate! + self.class.transaction do + self.update!(options: nil, yaml_variables: nil) + self.metadata&.destroy + end + end + + def options + read_metadata_attribute(:options, :config_options, {}) + end + + def yaml_variables + read_metadata_attribute(:yaml_variables, :config_variables, []) + end + + def options=(value) + write_metadata_attribute(:options, :config_options, value) + end + + def yaml_variables=(value) + write_metadata_attribute(:yaml_variables, :config_variables, value) + end + + private + + def read_metadata_attribute(legacy_key, metadata_key, default_value = nil) + read_attribute(legacy_key) || metadata&.read_attribute(metadata_key) || default_value + end + + def write_metadata_attribute(legacy_key, metadata_key, value) + # save to metadata or this model depending on the state of feature flag + if Feature.enabled?(:ci_build_metadata_config) + ensure_metadata.write_attribute(metadata_key, value) + write_attribute(legacy_key, nil) + else + write_attribute(legacy_key, value) + metadata&.write_attribute(metadata_key, nil) + end + end + end +end |
