Skip to content

Commit 5ed1d43

Browse files
committed
(PUP-11683) Ignore invalid tasks when listing
Previously, if a task failed validation in someway, typically with bad metadata, then `Puppet::InfoService.tasks_per_environment` method would error, failing to return any task info. The desired behavior is to still list valid tasks in an environment, even if one task is invalid.
1 parent 7d28a45 commit 5ed1d43

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

lib/puppet/info_service/task_information_service.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,19 @@ class Puppet::InfoService::TaskInformationService
44
def self.tasks_per_environment(environment_name)
55
# get the actual environment object, raise error if the named env doesn't exist
66
env = Puppet.lookup(:environments).get!(environment_name)
7+
78
env.modules.map do |mod|
89
mod.tasks.map do |task|
9-
{:module => {:name => task.module.name}, :name => task.name, :metadata => task.metadata}
10+
# If any task is malformed continue to list other tasks in module
11+
begin
12+
task.validate
13+
{:module => {:name => task.module.name}, :name => task.name, :metadata => task.metadata}
14+
rescue Puppet::Module::Task::Error => err
15+
Puppet.log_exception(err, 'Failed to validate task')
16+
nil
17+
end
1018
end
11-
end.flatten
19+
end.flatten.compact
1220
end
1321

1422
def self.task_data(environment_name, module_name, task_name)

spec/unit/info_service_spec.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,27 @@
3333
end
3434
end
3535

36+
it "returns task data for valid tasks in an environment even if invalid tasks exist" do
37+
Puppet.override(:environments => env_loader) do
38+
@mod = PuppetSpec::Modules.create(mod_name, modpath, {:environment => env,
39+
:tasks => [['atask',
40+
{:name => 'atask.json',
41+
:content => metadata.to_json}],
42+
['btask',
43+
{:name => 'btask.json',
44+
:content => metadata.to_json}],
45+
['ctask',
46+
{:name => 'ctask.json',
47+
:content => metadata.to_json}]]})
48+
File.write("#{modpath}/#{mod_name}/tasks/atask.json", "NOT JSON")
49+
50+
expect(Puppet).to receive(:send_log).with(:err, 'Failed to validate task')
51+
52+
@tasks = Puppet::InfoService.tasks_per_environment(env_name)
53+
expect(@tasks.map{|t| t[:name]}).to contain_exactly('test1::btask', 'test1::ctask')
54+
end
55+
end
56+
3657
it "should throw EnvironmentNotFound if given a nonexistent environment" do
3758
expect{ Puppet::InfoService.tasks_per_environment('utopia') }.to raise_error(Puppet::Environments::EnvironmentNotFound)
3859
end

0 commit comments

Comments
 (0)