foreman/app/models/lookup_value.rb @ 09ce8a63
0265427b | Ohad Levy | class LookupValue < ActiveRecord::Base
|
|
acfbc458 | Marek Hulan | include Authorizable
|
|
ae4998bc | Tomer Brisker | include CounterCacheFix
|
|
3034e8e2 | Ori Rabin | validates_lengths_from_database
|
|
971fee79 | Dominic Cleal | audited :associated_with => :lookup_key, :allow_mass_assignment => true
|
|
f8d94608 | Amos Benari | belongs_to :lookup_key, :counter_cache => true
|
|
09ce8a63 | Ori Rabin | validates :match, :presence => true, :uniqueness => {:scope => :lookup_key_id}, :format => LookupKey::VALUE_REGEX
|
|
ee6fc204 | Tom Caspy | validate :value_present?
|
|
9afa092e | Ohad Levy | delegate :key, :to => :lookup_key
|
|
before_validation :sanitize_match
|
|||
92eb3d7c | Ori Rabin | before_validation :validate_and_cast_value, :unless => Proc.new{|p| p.use_puppet_default }
|
|
bd48d5c9 | Joseph Magen | validate :validate_list, :validate_regexp, :ensure_fqdn_exists, :ensure_hostgroup_exists
|
|
06909647 | Joseph Mitchell Magen | attr_accessor :host_or_hostgroup
|
|
c6b42368 | Tom Caspy | attr_writer :managed_id, :hostgroup_id
|
|
f8d94608 | Amos Benari | ||
serialize :value
|
|||
9158ff3c | Dominic Cleal | attr_name :match
|
|
0265427b | Ohad Levy | ||
f2c78d4a | Joseph Magen | scope :default, lambda { where(:match => "default").limit(1) }
|
|
9afa092e | Ohad Levy | ||
a7f78b19 | Ohad Levy | scoped_search :on => :value, :complete_value => true, :default_order => true
|
|
scoped_search :on => :match, :complete_value => true
|
|||
scoped_search :in => :lookup_key, :on => :key, :rename => :lookup_key, :complete_value => true
|
|||
ee6fc204 | Tom Caspy | def value_present?
|
|
111b0459 | Daniel Lobato | self.errors.add(:value, :blank) if value.nil?
|
|
ee6fc204 | Tom Caspy | end
|
|
3059cea1 | Tom Caspy | def value=(val)
|
|
if val.is_a?(HashWithIndifferentAccess)
|
|||
super(val.deep_to_hash)
|
|||
else
|
|||
super
|
|||
end
|
|||
end
|
|||
a7f78b19 | Ohad Levy | def name
|
|
9158ff3c | Dominic Cleal | match
|
|
a7f78b19 | Ohad Levy | end
|
|
f8d94608 | Amos Benari | def value_before_type_cast
|
|
f8a56f5b | Marek Hulan | return self.value if lookup_key.nil? || lookup_key.contains_erb?(self.value)
|
|
f8d94608 | Amos Benari | lookup_key.value_before_type_cast self.value
|
|
end
|
|||
9afa092e | Ohad Levy | ||
f8d94608 | Amos Benari | private
|
|
9afa092e | Ohad Levy | #TODO check multi match with matchers that have space (hostgroup = web servers,environment = production)
|
|
def sanitize_match
|
|||
self.match = match.split(LookupKey::KEY_DELM).map {|s| s.split(LookupKey::EQ_DELM).map(&:strip).join(LookupKey::EQ_DELM)}.join(LookupKey::KEY_DELM) unless match.blank?
|
|||
end
|
|||
f8d94608 | Amos Benari | def validate_and_cast_value
|
|
cfc2bb66 | Stephen Benjamin | return true if self.marked_for_destruction? or !self.value.is_a? String
|
|
f8d94608 | Amos Benari | begin
|
|
f8a56f5b | Marek Hulan | unless self.lookup_key.contains_erb?(value)
|
|
self.value = lookup_key.cast_validate_value self.value
|
|||
end
|
|||
f8d94608 | Amos Benari | true
|
|
cfc2bb66 | Stephen Benjamin | rescue StandardError, SyntaxError => e
|
|
01e78260 | Ivan Nečas | Foreman::Logging.exception("Error while parsing #{ lookup_key }", e)
|
|
bfbf7ed8 | Lukas Zapletal | errors.add(:value, _("is invalid %s") % lookup_key.key_type)
|
|
f8d94608 | Amos Benari | false
|
|
end
|
|||
end
|
|||
9afa092e | Ohad Levy | def validate_regexp
|
|
f8a56f5b | Marek Hulan | return true if (lookup_key.validator_type != 'regexp' || (lookup_key.contains_erb?(value) && Setting[:interpolate_erb_in_parameters]))
|
|
valid = (value =~ /#{lookup_key.validator_rule}/)
|
|||
errors.add(:value, _("is invalid")) unless valid
|
|||
valid
|
|||
9afa092e | Ohad Levy | end
|
|
def validate_list
|
|||
f8a56f5b | Marek Hulan | return true if (lookup_key.validator_type != 'list' || (lookup_key.contains_erb?(value) && Setting[:interpolate_erb_in_parameters]))
|
|
valid = lookup_key.validator_rule.split(LookupKey::KEY_DELM).map(&:strip).include?(value)
|
|||
errors.add(:value, _("%{value} is not one of %{rules}") % { :value => value, :rules => lookup_key.validator_rule }) unless valid
|
|||
valid
|
|||
a7f78b19 | Ohad Levy | end
|
|
bd48d5c9 | Joseph Magen | def ensure_fqdn_exists
|
|
d936284f | Shlomi Zadok | md = ensure_matcher(/fqdn=(.*)/)
|
|
return md if md == true || md == false
|
|||
eb414b8b | Ori Rabin | fqdn = md[1].split(LookupKey::KEY_DELM)[0]
|
|
return true if Host.unscoped.find_by_name(fqdn) || host_or_hostgroup.try(:new_record?)
|
|||
4098e93b | Dominic Cleal | errors.add(:match, _("%{match} does not match an existing host") % { :match => "fqdn=#{fqdn}" }) and return false
|
|
bd48d5c9 | Joseph Magen | end
|
|
def ensure_hostgroup_exists
|
|||
d936284f | Shlomi Zadok | md = ensure_matcher(/hostgroup=(.*)/)
|
|
return md if md == true || md == false
|
|||
eb414b8b | Ori Rabin | hostgroup = md[1].split(LookupKey::KEY_DELM)[0]
|
|
return true if Hostgroup.unscoped.find_by_name(hostgroup) || Hostgroup.unscoped.find_by_title(hostgroup) || host_or_hostgroup.try(:new_record?)
|
|||
4098e93b | Dominic Cleal | errors.add(:match, _("%{match} does not match an existing host group") % { :match => "hostgroup=#{hostgroup}" }) and return false
|
|
bd48d5c9 | Joseph Magen | end
|
|
d936284f | Shlomi Zadok | ||
def ensure_matcher(match_type)
|
|||
return false if match.blank?
|
|||
matcher = match.match(match_type)
|
|||
return true unless matcher
|
|||
matcher
|
|||
end
|
|||
0265427b | Ohad Levy | end
|