diff --git a/lib/puppet/configurer.rb b/lib/puppet/configurer.rb index 617cd482cdc..ec31c7a21c2 100644 --- a/lib/puppet/configurer.rb +++ b/lib/puppet/configurer.rb @@ -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) @@ -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 diff --git a/spec/unit/configurer_spec.rb b/spec/unit/configurer_spec.rb index 289b6ddc8da..b0cd91cad43 100644 --- a/spec/unit/configurer_spec.rb +++ b/spec/unit/configurer_spec.rb @@ -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 @@ -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/).twice configurer.run end