Project

General

Profile

Download (5.46 KB) Statistics
| Branch: | Tag: | Revision:
086ec942 Ohad Levy
class Hostgroup < ActiveRecord::Base
acfbc458 Marek Hulan
has_ancestry :orphan_strategy => :restrict
include Authorizable
611f5bff Amos Benari
include Taxonomix
e5d3f34e Ohad Levy
include HostCommon
7ff50dd8 Joseph Magen
include NestedAncestryCommon
e2d3654e Joseph Mitchell Magen
ff8cc704 Joseph Mitchell Magen
before_destroy EnsureNotUsedBy.new(:hosts)
644f7f22 Ohad Levy
has_many :hostgroup_classes, :dependent => :destroy
has_many :puppetclasses, :through => :hostgroup_classes
28d1dd18 Daniel Lobato
has_many :user_hostgroups, :dependent => :destroy
has_many :users, :through => :user_hostgroups
1fa008a4 Joseph Magen
validates :name, :format => { :with => /\A(\S+\s?)+\Z/, :message => N_("can't be blank or contain trailing white spaces.")}
aa1796f3 Paul Kelly
has_many :group_parameters, :dependent => :destroy, :foreign_key => :reference_id
bd46fa41 Ohad Levy
accepts_nested_attributes_for :group_parameters, :reject_if => lambda { |a| a[:value].blank? }, :allow_destroy => true
3f77babd Joseph Mitchell Magen
has_many_hosts
7d993b41 Joseph Mitchell Magen
has_many :template_combinations, :dependent => :destroy
c764d9ec Ohad Levy
has_many :config_templates, :through => :template_combinations
50541c05 Ohad Levy
before_save :remove_duplicated_nested_class
36f93e4d Ohad Levy
e5d3f34e Ohad Levy
alias_attribute :os, :operatingsystem
fe4629de rbirnie
has_many :trends, :as => :trendable, :class_name => "ForemanTrend"
086ec942 Ohad Levy
34897490 Joseph Magen
nested_attribute_for :compute_profile_id, :environment_id, :domain_id, :puppet_proxy_id, :puppet_ca_proxy_id,
:operatingsystem_id, :architecture_id, :medium_id, :ptable_id, :subnet_id

611f5bff Amos Benari
# with proc support, default_scope can no longer be chained
# include all default scoping here
4b9d1fa7 Stephen Benjamin
default_scope lambda {
with_taxonomy_scope do
832c0925 Joseph Magen
order("hostgroups.title")
4b9d1fa7 Stephen Benjamin
end
}
611f5bff Amos Benari
b80fa6f1 Ohad Levy
scoped_search :on => :name, :complete_value => :true
be933d8a Ohad Levy
scoped_search :in => :group_parameters, :on => :value, :on_key=> :name, :complete_value => true, :only_explicit => true, :rename => :params
b80fa6f1 Ohad Levy
scoped_search :in => :hosts, :on => :name, :complete_value => :true, :rename => "host"
scoped_search :in => :puppetclasses, :on => :name, :complete_value => true, :rename => :class, :operators => ['= ', '~ ']
scoped_search :in => :environment, :on => :name, :complete_value => :true, :rename => :environment
acfbc458 Marek Hulan
scoped_search :on => :id, :complete_value => :true
b80fa6f1 Ohad Levy
if SETTINGS[:unattended]
scoped_search :in => :architecture, :on => :name, :complete_value => :true, :rename => :architecture
scoped_search :in => :operatingsystem, :on => :name, :complete_value => true, :rename => :os
scoped_search :in => :medium, :on => :name, :complete_value => :true, :rename => "medium"
scoped_search :in => :config_templates, :on => :name, :complete_value => :true, :rename => "template"
end

54358a76 Greg Sutcliffe
# returns reports for hosts in the User's filter set
scope :my_groups, lambda {
user = User.current
f2c78d4a Joseph Magen
unless user.admin?
89776bd5 Ohad Levy
conditions = sanitize_sql_for_conditions([" (hostgroups.id in (?))", user.hostgroup_ids])
54358a76 Greg Sutcliffe
conditions.sub!(/\s*\(\)\s*/, "")
conditions.sub!(/^(?:\(\))?\s?(?:and|or)\s*/, "")
conditions.sub!(/\(\s*(?:or|and)\s*\(/, "((")
end
f2c78d4a Joseph Magen
where(conditions)
54358a76 Greg Sutcliffe
}

e5d3f34e Ohad Levy
class Jail < Safemode::Jail
218bd6e0 Justin Sherrill
allow :name, :diskLayout, :puppetmaster, :operatingsystem, :architecture,
b4c2016a Ohad Levy
:environment, :ptable, :url_for_boot, :params, :puppetproxy
e5d3f34e Ohad Levy
end

9fd7478e Paul Kelly
#TODO: add a method that returns the valid os for a hostgroup
086ec942 Ohad Levy
9fd7478e Paul Kelly
def all_puppetclasses
4d4b84f6 Ohad Levy
classes
end

9fd7478e Paul Kelly
def hostgroup
self
end
e5d3f34e Ohad Levy
def diskLayout
d56112fb Joseph Mitchell Magen
ptable.layout.gsub("\r","")
e5d3f34e Ohad Levy
end

4d4b84f6 Ohad Levy
def classes
2aabb456 Ohad Levy
Puppetclass.joins(:hostgroups).where(:hostgroups => {:id => path_ids})
end

def puppetclass_ids
65f764d6 Dominic Cleal
classes.reorder('').pluck('puppetclasses.id')
4d4b84f6 Ohad Levy
end

0f9df583 Amos Benari
def inherited_lookup_value key
ancestors.reverse.each do |hg|
if(v = LookupValue.where(:lookup_key_id => key.id, :id => hg.lookup_values).first)
return v.value, hg.to_label
end
end if key.path_elements.flatten.include?("hostgroup") && Setting["host_group_matchers_inheritance"]
return key.default_value, _("Default value")
end

4d4b84f6 Ohad Levy
# returns self and parent parameters as a hash
298756ca Amos Benari
def parameters include_source = false
4d4b84f6 Ohad Levy
hash = {}
ids = ancestor_ids
ids << id unless new_record? or self.frozen?
2aabb456 Ohad Levy
# need to pull out the hostgroups to ensure they are sorted first,
# otherwise we might be overwriting the hash in the wrong order.
f2c78d4a Joseph Magen
groups = ids.size == 1 ? [self] : Hostgroup.includes(:group_parameters).sort_by_ancestry(Hostgroup.find(ids))
2aabb456 Ohad Levy
groups.each do |hg|
2de7832d Ohad Levy
hg.group_parameters.each {|p| hash[p.name] = include_source ? {:value => p.value, :source => N_('hostgroup').to_sym} : p.value }
4d4b84f6 Ohad Levy
end
hash
end

e5d3f34e Ohad Levy
def params
parameters = {}
# read common parameters
1fa008a4 Joseph Magen
CommonParameter.scoped.each {|p| parameters.update Hash[p.name => p.value] }
e5d3f34e Ohad Levy
# read OS parameters
1fa008a4 Joseph Magen
operatingsystem.os_parameters.each {|p| parameters.update Hash[p.name => p.value] } if operatingsystem
e5d3f34e Ohad Levy
# read group parameters only if a host belongs to a group
1fa008a4 Joseph Magen
parameters.update self.parameters if hostgroup
e5d3f34e Ohad Levy
parameters
end

f00eaf07 Ohad Levy
# no need to store anything in the db if the password is our default
def root_pass
d56112fb Joseph Mitchell Magen
read_attribute(:root_pass) || nested_root_pw || Setting[:root_pass]
f00eaf07 Ohad Levy
end

d5707b63 Ohad Levy
private

7acc469b Amos Benari
def lookup_value_match
"hostgroup=#{to_label}"
end

f00eaf07 Ohad Levy
def nested_root_pw
66a9a696 Ohad Levy
Hostgroup.sort_by_ancestry(ancestors).reverse.each do |a|
f00eaf07 Ohad Levy
return a.root_pass unless a.root_pass.blank?
2aabb456 Ohad Levy
end if ancestry.present?
f00eaf07 Ohad Levy
nil
end

50541c05 Ohad Levy
def remove_duplicated_nested_class
self.puppetclasses -= ancestors.map(&:puppetclasses).flatten
end

1fa008a4 Joseph Magen
# overwrite method in taxonomix, since hostgroup has ancestry
def used_taxonomy_ids(type)
return [] if new_record? && parent_id.blank?
Host::Base.where(:hostgroup_id => self.path_ids).pluck(type).compact.uniq
end

086ec942 Ohad Levy
end