Project

General

Profile

« Previous | Next » 

Revision f1a2c140

Added by Dominic Cleal over 8 years ago

fixes #8521 - fix classes accessors, copy overrides on host clone

The various 'classes' accessors that are used in the UI for displaying
the Puppet classes tab only really worked for saved objects, so they're
changed to work better on an unsaved cloned object. Tests now check
all associations and UI accessors return consistent results for various
types of class associations.

View differences:

app/models/concerns/host_common.rb
end
def host_class_ids
is_a?(Host::Base) ? host_classes.pluck(:puppetclass_id) : []
(is_a?(Host::Base) ? host_classes : hostgroup_classes).map(&:puppetclass_id)
end
def all_puppetclass_ids
......
end
def individual_puppetclasses
puppetclasses - classes_in_groups
conditions = {:id => host_class_ids - cg_class_ids}
if environment
environment.puppetclasses.where(conditions)
else
Puppetclass.where(conditions)
end
end
def available_puppetclasses
......
end
def update_config_group_counters(record)
return unless persisted?
record.update_attribute(:hostgroups_count, cnt_hostgroups(record))
record.update_attribute(:hosts_count, cnt_hosts(record))
app/models/config_group.rb
has_many :config_group_classes
has_many :puppetclasses, :through => :config_group_classes, :dependent => :destroy
has_many :host_config_groups
has_many_hosts :through => :host_config_groups
has_many_hosts :through => :host_config_groups, :source => :host, :source_type => 'Host::Managed'
has_many :hostgroups, :through => :host_config_groups, :source => :host, :source_type => 'Hostgroup'
validates :name, :presence => true, :uniqueness => true
app/models/host/managed.rb
def clone
# do not copy system specific attributes
host = self.deep_clone(:include => [:host_config_groups, :host_classes, :host_parameters],
host = self.deep_clone(:include => [:config_groups, :host_config_groups, :host_classes, :host_parameters, :lookup_values],
:except => [:name, :mac, :ip, :uuid, :certname, :last_report])
self.interfaces.each do |nic|
host.interfaces << nic.clone
test/unit/host_test.rb
assert_equal classes, enc['classes']
end
test 'clone host including its relationships' do
host = FactoryGirl.create(:host, :with_config_group, :with_puppetclass, :with_parameter)
copy = host.clone
assert_equal host.host_classes.map(&:puppetclass_id), copy.host_classes.map(&:puppetclass_id)
assert_equal host.host_parameters.map(&:name), copy.host_parameters.map(&:name)
assert_equal host.host_parameters.map(&:value), copy.host_parameters.map(&:value)
assert_equal host.host_config_groups.map(&:config_group_id), copy.host_config_groups.map(&:config_group_id)
end
describe 'cloning' do
test 'relationships are copied' do
host = FactoryGirl.create(:host, :with_config_group, :with_puppetclass, :with_parameter)
copy = host.clone
assert_equal host.host_classes.map(&:puppetclass_id), copy.host_classes.map(&:puppetclass_id)
assert_equal host.host_parameters.map(&:name), copy.host_parameters.map(&:name)
assert_equal host.host_parameters.map(&:value), copy.host_parameters.map(&:value)
assert_equal host.host_config_groups.map(&:config_group_id), copy.host_config_groups.map(&:config_group_id)
end
test '#classes etc. on cloned host return the same' do
hostgroup = FactoryGirl.create(:hostgroup, :with_config_group, :with_puppetclass)
host = FactoryGirl.create(:host, :with_config_group, :with_puppetclass, :with_parameter, :hostgroup => hostgroup, :environment => hostgroup.environment)
copy = host.clone
assert_equal host.individual_puppetclasses.map(&:id), copy.individual_puppetclasses.map(&:id)
assert_equal host.classes_in_groups.map(&:id), copy.classes_in_groups.map(&:id)
assert_equal host.classes.map(&:id), copy.classes.map(&:id)
assert_equal host.available_puppetclasses.map(&:id), copy.available_puppetclasses.map(&:id)
end
test 'lookup values are copied' do
host = FactoryGirl.create(:host, :with_puppetclass)
FactoryGirl.create(:puppetclass_lookup_key, :as_smart_class_param, :with_override, :puppetclass => host.puppetclasses.first, :overrides => {host.lookup_value_matcher => 'test'})
copy = host.clone
assert_equal 1, copy.lookup_values.size
assert_equal host.lookup_values.map(&:value), copy.lookup_values.map(&:value)
end
test 'clone host should not copy name, system fields (mac, ip, etc)' do
host = FactoryGirl.create(:host, :with_config_group, :with_puppetclass, :with_parameter)
copy = host.clone
test/unit/hostgroup_test.rb
# nagios puppetclasses(:five) is also in config_groups(:one) Monitoring
hostgroup.puppetclasses << puppetclasses(:five)
assert_equal ['git', 'nagios'].sort, hostgroup.puppetclasses.map(&:name).sort
assert_equal ['git'], hostgroup.individual_puppetclasses.map(&:name)
assert_equal [], hostgroup.individual_puppetclasses.map(&:name)
end
test "available_puppetclasses should return all if no environment" do

Also available in: Unified diff