Skip to content

Commit

Permalink
Merge pull request #9514 from AriaXLi/PUP-12083/fact_name_in_soft_lim…
Browse files Browse the repository at this point in the history
…it_warnings

(PUP-12083) Update soft limit warning for fact value length and fact name length
  • Loading branch information
mhashizume authored Nov 5, 2024
2 parents 13dcf5a + 2754ee2 commit 7685918
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 23 deletions.
25 changes: 13 additions & 12 deletions lib/puppet/configurer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -135,36 +135,37 @@ 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 fact name 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)
Puppet.warning _("Payload with the current size of: '%{payload}' exceeds the payload size limit: %{max_size}") % { payload: payload, max_size: max_size }
Puppet.warning _("Payload with the current size of: %{payload} exceeds the payload size limit: %{max_size}") % { payload: payload, max_size: max_size }
end

def check_fact_name_length(name, number_of_dots)
def check_fact_name_length(fact_path, number_of_dots)
max_length = Puppet[:fact_name_length_soft_limit]
return if max_length.zero?

name_without_dots = fact_path.join()
# 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
size_as_btree_index = 8 + (number_of_dots * 2) + name_without_dots.to_s.bytesize
warn_fact_name_length(fact_path.join('.'), 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 +205,8 @@ 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)
check_fact_name_length(path, path.size)
check_fact_values_length(path.join('.'), object)
@number_of_facts += 1
end
end
Expand Down
18 changes: 7 additions & 11 deletions spec/unit/configurer_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -203,17 +203,11 @@
Puppet[:payload_soft_limit] = 0

facts.values = { 'processors' => {
'cores' => 1,
'count' => 2,
'isa' => "i386",
'models' => [
"CPU1 @ 2.80GHz"
],
'physicalcount' => 4 }
'isa' => "i386" }
}
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 processors.isa with value i386 with the value length: 4 exceeds the value length limit: 1/)
configurer.run
end

Expand All @@ -235,7 +229,7 @@
}
Puppet::Node::Facts.indirection.save(facts)

expect(Puppet).to receive(:warning).with(/Payload with the current size of: '\d*' exceeds the payload size limit: \d*/)
expect(Puppet).to receive(:warning).with(/Payload with the current size of: \d* exceeds the payload size limit: \d*/)
configurer.run
end

Expand Down Expand Up @@ -294,10 +288,12 @@
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' => {
'isa' => "i386" }
}
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 processors.isa with length: 25 exceeds the fact name length limit: 1/)
configurer.run
end

Expand Down

0 comments on commit 7685918

Please sign in to comment.