Skip to content

Commit

Permalink
(PUP-12083) Update soft limit warning for fact value length to includ…
Browse files Browse the repository at this point in the history
…e name

This commit updates the soft limit warning for fact value length to include
the fact name and updates the soft limit warning for fact name length to
include the length that was used to evaluate if the length exceeds the limit.
  • Loading branch information
AriaXLi committed Oct 31, 2024
1 parent e758d5c commit 5d6de1b
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 13 deletions.
19 changes: 10 additions & 9 deletions lib/puppet/configurer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -135,16 +135,16 @@ def warn_number_of_facts(size, max_number)
Puppet.warning _("The current total number of fact values: %{size} exceeds the fact values limit: %{max_size}") % { size: size, max_size: max_number }
end

def warn_fact_name_length(name, max_length)
Puppet.warning _("Fact %{name} with length: '%{length}' exceeds the length limit: %{limit}") % { name: name, length: name.to_s.bytesize, limit: max_length }
def warn_fact_name_length(name, max_length, fact_name_length)
Puppet.warning _("Fact %{name} with length: '%{length}' exceeds the length limit: %{limit}") % { name: name, length: fact_name_length, limit: max_length }
end

def warn_number_of_top_level_facts(size, max_number)
Puppet.warning _("The current number of top level facts: %{size} exceeds the top facts limit: %{max_size}") % { size: size, max_size: max_number }
end

def warn_fact_value_length(value, max_length)
Puppet.warning _("Fact value '%{value}' with the value length: '%{length}' exceeds the value length limit: %{max_length}") % { value: value, length: value.to_s.bytesize, max_length: max_length }
def warn_fact_value_length(name, value, max_length)
Puppet.warning _("Fact '%{name}' with value '%{value}' with the value length: '%{length}' exceeds the value length limit: %{max_length}") % { name: name, value: value, length: value.to_s.bytesize, max_length: max_length }
end

def warn_fact_payload_size(payload, max_size)
Expand All @@ -157,14 +157,14 @@ def check_fact_name_length(name, number_of_dots)

# rough byte size estimations of fact path as a postgresql btree index
size_as_btree_index = 8 + (number_of_dots * 2) + name.to_s.bytesize
warn_fact_name_length(name, max_length) if size_as_btree_index > max_length
warn_fact_name_length(name, max_length, size_as_btree_index) if size_as_btree_index > max_length
end

def check_fact_values_length(values)
def check_fact_values_length(name, values)
max_length = Puppet[:fact_value_length_soft_limit]
return if max_length.zero?

warn_fact_value_length(values, max_length) if values.to_s.bytesize > max_length
warn_fact_value_length(name, values, max_length) if values.to_s.bytesize > max_length
end

def check_top_level_number_limit(size)
Expand Down Expand Up @@ -204,8 +204,9 @@ def parse_fact_name_and_value_limits(object, path = [])
path.pop
end
else
check_fact_name_length(path.join(), path.size)
check_fact_values_length(object)
name = path.join('.')
check_fact_name_length(name, path.size - 1) # second param is number of dots in fact name
check_fact_values_length(name, object)
@number_of_facts += 1
end
end
Expand Down
16 changes: 12 additions & 4 deletions spec/unit/configurer_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@
}
Puppet::Node::Facts.indirection.save(facts)

expect(Puppet).to receive(:warning).with(/Fact value '.+' with the value length: '[1-9]*' exceeds the value length limit: [1-9]*/).twice
expect(Puppet).to receive(:warning).with(/Fact '.+\..+' with value '.+' with the value length: '[1-9]*' exceeds the value length limit: [1-9]*/).twice
configurer.run
end

Expand Down Expand Up @@ -288,16 +288,24 @@
end

it "should warn the user when the fact name length limits are exceeded" do
Puppet[:fact_name_length_soft_limit] = 1
Puppet[:fact_name_length_soft_limit] = 30
Puppet[:fact_value_length_soft_limit] = 0
Puppet[:top_level_facts_soft_limit] = 0
Puppet[:number_of_facts_soft_limit] = 0
Puppet[:payload_soft_limit] = 0

facts.values = {'my_new_fact_name' => 'my_new_fact_value'}
facts.values = { 'processors' => {
'cores' => 1,
'count' => 2,
'isa' => "i386",
'models' => [
"CPU1 @ 2.80GHz"
],
'physicalcount' => 4 }
}
Puppet::Node::Facts.indirection.save(facts)

expect(Puppet).to receive(:warning).with(/Fact .+ with length: '[1-9]*' exceeds the length limit: [1-9]*/)
expect(Puppet).to receive(:warning).with(/Fact .+\..+ with length: '[1-9]*' exceeds the length limit: [1-9]*/).twice
configurer.run
end

Expand Down

0 comments on commit 5d6de1b

Please sign in to comment.