Project

General

Profile

Download (11.1 KB) Statistics
| Branch: | Tag: | Revision:
require 'test_helper'

class PuppetClassImporterTest < ActiveSupport::TestCase
def setup
ProxyAPI::Puppet.any_instance.stubs(:environments).returns(["foreman-testing", "foreman-testing-1"])
ProxyAPI::Puppet.any_instance.stubs(:classes).returns(mocked_classes)
User.current = User.find_by :login => "foreman_admin"
end

test "should support providing proxy" do
proxy = smart_proxies(:puppetmaster)
klass = PuppetClassImporter.new(:proxy => ProxyAPI::Puppet.new(:url => proxy.url))
assert_kind_of ProxyAPI::Puppet, klass.send(:proxy)
end

test "should support providing url" do
proxy = smart_proxies(:puppetmaster)
klass = PuppetClassImporter.new(:url => proxy.url)
assert_kind_of ProxyAPI::Puppet, klass.send(:proxy)
end

describe '#changes' do
setup do
@proxy = smart_proxies(:puppetmaster)
end

context 'a sepecific environment is set' do
test "should contain only the specified environment in changes" do
importer = PuppetClassImporter.new(url: @proxy.url, env: 'foreman-testing')
changes = importer.changes['new']

assert_includes changes, 'foreman-testing'
refute_includes changes, 'foreman-testing-1'
end
end

context 'has ignored environments' do
test 'it returns them' do
importer = PuppetClassImporter.new(url: @proxy.url)
importer.stubs(:ignored_environments).returns(['ignored-env'])

assert_not_nil importer.changes['ignored']
assert_not_nil importer.changes['ignored']['ignored-env']
end
end
end

describe "#changes_for_environment" do
setup do
@proxy = smart_proxies(:puppetmaster)
end

test 'it calls for new, updated, obsolete and ignored classes' do
importer = PuppetClassImporter.new(url: @proxy.url)
environment_name = 'foreman-testing'
changes = { 'new' => { }, 'obsolete' => { }, 'updated' => { }, 'ignored' => { } }

importer.expects(:updated_classes_for).with(environment_name).once.returns({})
importer.expects(:new_classes_for).with(environment_name).once.returns({})
importer.expects(:removed_classes_for).with(environment_name).once.returns({})
importer.expects(:ignored_classes_for).with(environment_name).once.returns({})

importer.changes_for_environment(environment_name, changes)
end
end

describe '#ignored_classes_for' do
setup do
@proxy = smart_proxies(:puppetmaster)
classes = {
'ignored-class' => {},
'not-ignored-class' => {}
}
@proxy_api = ProxyAPI::Puppet.new(:url => @proxy.url)
@proxy_api.stubs(:classes).returns(classes)
@importer = PuppetClassImporter.new(proxy: @proxy_api)
@environment = 'foreman-testing'
end

test 'returns an array of classes' do
@importer.stubs(:ignored_classes).returns([Regexp.new(/^ignored-class$/)])
assert_equal ['ignored-class'], @importer.ignored_classes_for(@environment)
end

context 'has ignored environments' do
test 'it returns them' do
importer = PuppetClassImporter.new(url: @proxy.url)
importer.stubs(:ignored_environments).returns(['ignored-env'])

assert_not_nil importer.changes['ignored']
assert_not_nil importer.changes['ignored']['ignored-env']
end
end
end

describe "#changes_for_environment" do
setup do
@proxy = smart_proxies(:puppetmaster)
end

test 'it calls for new, updated, obsolete and ignored classes' do
importer = PuppetClassImporter.new(url: @proxy.url)
environment_name = 'foreman-testing'
changes = { 'new' => { }, 'obsolete' => { }, 'updated' => { }, 'ignored' => { } }

importer.expects(:updated_classes_for).with(environment_name).once.returns({})
importer.expects(:new_classes_for).with(environment_name).once.returns({})
importer.expects(:removed_classes_for).with(environment_name).once.returns({})
importer.expects(:ignored_classes_for).with(environment_name).once.returns({})

importer.changes_for_environment(environment_name, changes)
end
end

describe '#ignored_classes_for' do
setup do
@proxy = smart_proxies(:puppetmaster)
classes = {
'ignored-class' => {},
'not-ignored-class' => {}
}
@proxy_api = ProxyAPI::Puppet.new(:url => @proxy.url)
@proxy_api.stubs(:classes).returns(classes)
@importer = PuppetClassImporter.new(proxy: @proxy_api)
@environment = 'foreman-testing'
end

test 'returns an array of classes' do
@importer.stubs(:ignored_classes).returns([Regexp.new(/^ignored-class$/)])
assert_equal ['ignored-class'], @importer.ignored_classes_for(@environment)
end
end

describe '#ignored_boolean_environment_names?' do
setup do
@proxy = smart_proxies(:puppetmaster)
@proxy_api = ProxyAPI::Puppet.new(:url => @proxy.url)
@importer = PuppetClassImporter.new(proxy: @proxy_api)
end

test 'is true when an environment name is resulting in "true"' do
@importer.stubs(:ignored_environments).returns([true, 'test', 'another'])
assert @importer.ignored_boolean_environment_names?
end

test 'is true when an environment name is resulting in "false"' do
@importer.stubs(:ignored_environments).returns([false, 'test'])
assert @importer.ignored_boolean_environment_names?
end
end

test "should return list of envs" do
assert_kind_of Array, get_an_instance.db_environments
end

test "should return list of actual puppet envs" do
assert_kind_of Array, get_an_instance.actual_environments
end

test "should return list of classes" do
importer = get_an_instance
assert_kind_of ActiveRecord::Relation, importer.db_classes(importer.db_environments.first)
end

test "should return list of actual puppet classes" do
importer = get_an_instance
assert_kind_of Hash, importer.actual_classes(importer.actual_environments.first)
end

test "should obey config/ignored_environments.yml" do
as_admin do
hostgroups(:inherited).destroy # needs to be deleted first, since it has ancestry
Hostgroup.destroy_all # to satisfy FK contraints when deleting Environments
Environment.destroy_all
end

importer = get_an_instance
importer.stubs(:ignored_environments).returns(["foreman-testing"])
assert !importer.actual_environments.include?("foreman-testing")
end

test "should save parameter when importing with a different default_value" do
env = FactoryBot.build(:environment)
pc = FactoryBot.build(:puppetclass, :environments => [env])
lk = FactoryBot.build(:puppetclass_lookup_key, :as_smart_class_param, :default_value => 'first', :puppetclass => pc)

updated = get_an_instance.send(:update_classes_in_foreman, env.name,
{pc.name => {'updated' => [lk.key]}})
assert_not_nil updated
end

test "should change default_value when importing from 2 environments" do
envs = FactoryBot.create_list(:environment, 2)
pc = FactoryBot.create(:puppetclass, :environments => envs)

get_an_instance.send(:update_classes_in_foreman, envs.first.name,
{pc.name => {'new' => {'2_env_param' => 'first'}}})
assert_equal 'first', PuppetclassLookupKey.where(:key => '2_env_param').first.default_value

get_an_instance.send(:update_classes_in_foreman, envs.last.name,
{pc.name => {'updated' => {'2_env_param' => 'last'}}})
assert_equal 'last', PuppetclassLookupKey.where(:key => '2_env_param').first.default_value
end

context '#update_classes_in_foreman removes parameters' do
setup do
@envs = FactoryBot.create_list(:environment, 2)
@pc = FactoryBot.create(:puppetclass, :environments => @envs)
end

test 'from one environment' do
lks = FactoryBot.create_list(:puppetclass_lookup_key, 2, :as_smart_class_param, :puppetclass => @pc)
get_an_instance.send(:update_classes_in_foreman, @envs.first.name,
{@pc.name => {'obsolete' => [lks.first.key]}})
assert_equal [@envs.last], lks.first.environments
assert_equal @envs.to_a.sort, lks.last.environments.to_a.sort
end

test 'when overridden' do
lks = FactoryBot.create_list(:puppetclass_lookup_key, 2, :as_smart_class_param, :with_override, :puppetclass => @pc)
get_an_instance.send(:update_classes_in_foreman, @envs.first.name,
{@pc.name => {'obsolete' => [lks.first.key]}})
assert_equal [@envs.last], lks.first.environments
assert_equal @envs.to_a.sort, lks.last.environments.sort
end

test 'deletes the key from all environments' do
lks = FactoryBot.create_list(:puppetclass_lookup_key, 2, :as_smart_class_param, :with_override, :puppetclass => @pc)
lval = lks.first.lookup_values.first
get_an_instance.send(:update_classes_in_foreman, @envs.first.name,
{@pc.name => {'obsolete' => [lks.first.key]}})
get_an_instance.send(:update_classes_in_foreman, @envs.last.name,
{@pc.name => {'obsolete' => [lks.first.key]}})
refute PuppetclassLookupKey.find_by_id(lks.first.id)
refute LookupValue.find_by_id(lval.id)
assert_equal @envs.to_a.sort, lks.last.environments.to_a.sort
end
end

test "should detect correct environments for import" do
org_a = FactoryBot.build(:organization, :name => "OrgA")
loc_a = FactoryBot.build(:location, :name => "LocA")
org_b = FactoryBot.build(:organization, :name => "OrgB")
loc_b = FactoryBot.build(:location, :name => "LocB")
b_role = roles(:manager).clone :name => 'b_role'
b_role.add_permissions! [:destroy_external_parameters, :edit_external_parameters, :create_external_parameters, :view_external_parameters]
a_user = FactoryBot.create(:user, :organizations => [org_a], :locations => [loc_a], :roles => [roles(:manager)], :login => 'a_user')
b_user = FactoryBot.create(:user, :organizations => [org_b], :locations => [loc_b], :roles => [b_role], :login => 'b_user')
proxy = FactoryBot.build(:puppet_smart_proxy, :organizations => [org_a, org_b], :locations => [loc_a, loc_b])
importer = PuppetClassImporter.new(:url => proxy.url)
FactoryBot.create(:environment, :name => "env_a", :organizations => [org_a], :locations => [loc_a])
ProxyAPI::Puppet.any_instance.stubs(:environments).returns(['env_a', 'b_env_new'])
User.current = b_user
changes = importer.changes

assert changes['new']['b_env_new']
refute changes['new']['env_a']
refute changes['updated']['env_a']

changes['new']['b_env_new'] = changes['new']['b_env_new'].to_json

importer.obsolete_and_new(changes)
assert Environment.find_by(:name => 'b_env_new')
User.current = a_user
refute Environment.find_by(:name => 'b_env_new')
end

private

def get_an_instance
PuppetClassImporter.new :url => smart_proxies(:puppetmaster).url
end

def mocked_classes
pcs = [{
"apache::service" => {
"name" => "service",
"params" => { "port" => "80", "version" => "2.0" },
"module" => "apache"
}
}]
Hash[pcs.map { |k| [k.keys.first, Foreman::ImporterPuppetclass.new(k.values.first)] }]
end
end
(56-56/67)