foreman/app/models/lookup_keys/lookup_key.rb @ 9d43fc71
4deab2f3 | Lukas Zapletal | class LookupKey < ApplicationRecord
|
|
a03e5341 | Marek Hulan | audited :associated_with => :audit_class
|
|
acfbc458 | Marek Hulan | include Authorizable
|
|
e4ae4a69 | Ori Rabin | include HiddenValue
|
|
60cf5a37 | Shimon Shtein | include Classification
|
|
9afa092e | Ohad Levy | ||
4c4f30bc | Tomer Brisker | KEY_TYPES = [N_("string"), N_("boolean"), N_("integer"), N_("real"), N_("array"), N_("hash"), N_("yaml"), N_("json")]
|
|
VALIDATOR_TYPES = [N_("regexp"), N_("list") ]
|
|||
f8d94608 | Amos Benari | ||
9afa092e | Ohad Levy | KEY_DELM = ","
|
|
EQ_DELM = "="
|
|||
9d43fc71 | Michael Moll | VALUE_REGEX = /\A[^#{KEY_DELM}]+#{EQ_DELM}[^#{KEY_DELM}]+(#{KEY_DELM}[^#{KEY_DELM}]+#{EQ_DELM}[^#{KEY_DELM}]+)*\Z/
|
|
9afa092e | Ohad Levy | ||
3034e8e2 | Ori Rabin | validates_lengths_from_database
|
|
971fee79 | Dominic Cleal | ||
f8d94608 | Amos Benari | serialize :default_value
|
|
9afa092e | Ohad Levy | has_many :lookup_values, :dependent => :destroy, :inverse_of => :lookup_key
|
|
8e53b7c9 | Ori Rabin | accepts_nested_attributes_for :lookup_values,
|
|
09ce8a63 | Ori Rabin | :reject_if => :reject_invalid_lookup_values,
|
|
8e53b7c9 | Ori Rabin | :allow_destroy => true
|
|
f8d94608 | Amos Benari | ||
98e79eff | Ori Rabin | alias_attribute :value, :default_value
|
|
3034e8e2 | Ori Rabin | ||
f2c78d4a | Joseph Magen | validates :key, :presence => true
|
|
cba97ace | Joseph Magen | validates :validator_type, :inclusion => { :in => VALIDATOR_TYPES, :message => N_("invalid")}, :allow_blank => true, :allow_nil => true
|
|
validates :key_type, :inclusion => {:in => KEY_TYPES, :message => N_("invalid")}, :allow_blank => true, :allow_nil => true
|
|||
0265427b | Ohad Levy | validates_associated :lookup_values
|
|
9afa092e | Ohad Levy | before_save :sanitize_path
|
|
3b656b8d | Joseph Mitchell Magen | attr_name :key
|
|
9afa092e | Ohad Levy | ||
6b4b489f | Ori Rabin | def self.inherited(child)
|
|
child.instance_eval do
|
|||
ed67b8c9 | Dominic Cleal | scoped_search :on => :key, :aliases => [:parameter], :complete_value => true, :default_order => true
|
|
6b4b489f | Ori Rabin | scoped_search :on => :override, :complete_value => {:true => true, :false => false}
|
|
scoped_search :on => :merge_overrides, :complete_value => {:true => true, :false => false}
|
|||
scoped_search :on => :merge_default, :complete_value => {:true => true, :false => false}
|
|||
scoped_search :on => :avoid_duplicates, :complete_value => {:true => true, :false => false}
|
|||
end
|
|||
8f14d696 | Shlomi Zadok | super
|
|
6b4b489f | Ori Rabin | end
|
|
9afa092e | Ohad Levy | ||
e4ae4a69 | Ori Rabin | def self.hidden_value
|
|
HIDDEN_VALUE
|
|||
end
|
|||
bb3572ff | Daniel Lobato | default_scope -> { order('lookup_keys.key') }
|
|
f2c78d4a | Joseph Magen | ||
bb3572ff | Daniel Lobato | scope :override, -> { where(:override => true) }
|
|
9afa092e | Ohad Levy | ||
21bf889a | Joseph Mitchell Magen | # new methods for API instead of revealing db names
|
|
alias_attribute :parameter, :key
|
|||
alias_attribute :variable, :key
|
|||
alias_attribute :parameter_type, :key_type
|
|||
alias_attribute :variable_type, :key_type
|
|||
alias_attribute :override_value_order, :path
|
|||
bbf64d99 | Joseph Magen | alias_attribute :override_values, :lookup_values
|
|
alias_attribute :override_value_ids, :lookup_value_ids
|
|||
21bf889a | Joseph Mitchell Magen | ||
# to prevent errors caused by find_resource from override_values controller
|
|||
def self.find_by_name(str)
|
|||
nil
|
|||
end
|
|||
d4b8428f | amirfefer | def reject_invalid_lookup_values(attributes)
|
|
attributes[:match].empty?
|
|||
end
|
|||
6b4b489f | Ori Rabin | def audit_class
|
|
self
|
|||
21bf889a | Joseph Mitchell Magen | end
|
|
6b4b489f | Ori Rabin | def to_label
|
|
"#{audit_class}::#{key}"
|
|||
21bf889a | Joseph Mitchell Magen | end
|
|
ea4eec44 | Ori Rabin | def supports_merge?
|
|
['array', 'hash'].include?(key_type)
|
|||
end
|
|||
def supports_uniq?
|
|||
key_type == 'array'
|
|||
end
|
|||
9afa092e | Ohad Levy | def to_param
|
|
ea740cfe | Ori Rabin | # to_param is used in views to create a link to the lookup_key.
|
|
# If the key has whitespace in it the link will break so this replaced the whitespace.
|
|||
3cd8c84b | Michael Moll | search_key = key.tr(' ', '_') unless key.nil?
|
|
ea740cfe | Ori Rabin | Parameterizable.parameterize("#{id}-#{search_key}")
|
|
0265427b | Ohad Levy | end
|
|
b28fdce4 | Ohad Levy | def to_s
|
|
key
|
|||
end
|
|||
9afa092e | Ohad Levy | def path
|
|
74275f51 | Michael Moll | path = self[:path]
|
|
20b2ec5b | Michael Moll | path.presence || array2path(Setting["Default_variables_Lookup_Path"])
|
|
9afa092e | Ohad Levy | end
|
|
def path=(v)
|
|||
77a8080a | Ohad Levy | return unless v
|
|
3cd8c84b | Michael Moll | using_default = v.tr("\r", "") == array2path(Setting["Default_variables_Lookup_Path"])
|
|
74275f51 | Michael Moll | self[:path] = using_default ? nil : v
|
|
f8d94608 | Amos Benari | end
|
|
def default_value_before_type_cast
|
|||
74275f51 | Michael Moll | return self[:default_value] if errors[:default_value].present?
|
|
f8d94608 | Amos Benari | value_before_type_cast default_value
|
|
end
|
|||
5f029ed6 | Daniel Lobato | def value_before_type_cast(val)
|
|
6a7e5074 | Tomer Brisker | return val if val.nil? || val.contains_erb?
|
|
75bd351e | Ohad Levy | case key_type.to_sym
|
|
801a90d1 | Stephen Benjamin | when :json, :array
|
|
57000497 | Tomer Brisker | val = JSON.dump(val)
|
|
f8d94608 | Amos Benari | when :yaml, :hash
|
|
val = YAML.dump val
|
|||
d076d573 | Joseph Mitchell Magen | val.sub!(/\A---\s*$\n/, '')
|
|
85021506 | Michael Moll | end if key_type.present?
|
|
f8d94608 | Amos Benari | val
|
|
end
|
|||
71291a46 | Dmitri Dolguikh | def path_elements
|
|
path.split.map do |paths|
|
|||
paths.split(KEY_DELM).map do |element|
|
|||
element
|
|||
end
|
|||
end
|
|||
end
|
|||
6501082f | Tomer Brisker | def overridden?(obj)
|
|
return false unless obj.respond_to? :lookup_values
|
|||
overridden_value(obj).present?
|
|||
end
|
|||
# check if obj has a lookupvalue that relates to this key and return it
|
|||
# we cannot search the database, in case the lookup value hasn't been saved yet
|
|||
def overridden_value(obj)
|
|||
obj.lookup_values.detect do |lookup_value|
|
|||
lookup_value.lookup_key_id == self.id
|
|||
end
|
|||
0575b5b0 | Tom Caspy | end
|
|
6b4b489f | Ori Rabin | def puppet?
|
|
false
|
|||
end
|
|||
ffdcc07d | Tomer Brisker | def sorted_values
|
|
prio = path.split
|
|||
lookup_values.sort_by{|val| prio.index(val.path)}
|
|||
end
|
|||
9afa092e | Ohad Levy | private
|
|
def sanitize_path
|
|||
3cd8c84b | Michael Moll | self.path = path.tr("\s", "").downcase if path.present?
|
|
9afa092e | Ohad Levy | end
|
|
5f029ed6 | Daniel Lobato | def array2path(array)
|
|
bfbf7ed8 | Lukas Zapletal | raise ::Foreman::Exception.new(N_("invalid path")) unless array.is_a?(Array)
|
|
9afa092e | Ohad Levy | array.map do |sub_array|
|
|
sub_array.is_a?(Array) ? sub_array.join(KEY_DELM) : sub_array
|
|||
end.join("\n")
|
|||
end
|
|||
9f88e8a1 | Tom Caspy | def cast_default_value
|
|
6a7e5074 | Tomer Brisker | return true if default_value.nil? || default_value.contains_erb?
|
|
f8d94608 | Amos Benari | begin
|
|
9f88e8a1 | Tom Caspy | Foreman::Parameters::Caster.new(self, :attribute_name => :default_value, :to => key_type).cast!
|
|
f8d94608 | Amos Benari | rescue
|
|
bfbf7ed8 | Lukas Zapletal | errors.add(:default_value, _("is invalid"))
|
|
f8d94608 | Amos Benari | end
|
|
4db14e17 | Tom Caspy | true
|
|
f8d94608 | Amos Benari | end
|
|
5f029ed6 | Daniel Lobato | def load_yaml_or_json(value)
|
|
f8d94608 | Amos Benari | return value unless value.is_a? String
|
|
begin
|
|||
JSON.load value
|
|||
rescue
|
|||
YAML.load value
|
|||
end
|
|||
end
|
|||
9f88e8a1 | Tom Caspy | def validate_default_value
|
|
Foreman::Parameters::Validator.new(self,
|
|||
:type => validator_type,
|
|||
:validate_with => validator_rule,
|
|||
:getter => :default_value).validate!
|
|||
9afa092e | Ohad Levy | end
|
|
ea4eec44 | Ori Rabin | def disable_merge_overrides
|
|
if merge_overrides && !supports_merge?
|
|||
self.errors.add(:merge_overrides, _("can only be set for array or hash"))
|
|||
end
|
|||
end
|
|||
def disable_avoid_duplicates
|
|||
if avoid_duplicates && (!merge_overrides || !supports_uniq?)
|
|||
self.errors.add(:avoid_duplicates, _("can only be set for arrays that have merge_overrides set to true"))
|
|||
end
|
|||
end
|
|||
8347a5ef | Ori Rabin | ||
def disable_merge_default
|
|||
if merge_default && !merge_overrides
|
|||
self.errors.add(:merge_default, _("can only be set when merge overrides is set"))
|
|||
end
|
|||
end
|
|||
c2ae41a8 | Tomer Brisker | ||
def skip_strip_attrs
|
|||
['default_value']
|
|||
end
|
|||
0265427b | Ohad Levy | end
|
|
afe87279 | Marek Hulán | ||
require_dependency 'puppetclass_lookup_key'
|
|||
require_dependency 'variable_lookup_key'
|