From 0a6ec1598c1eab33146c18e2413c0b6451e71fe3 Mon Sep 17 00:00:00 2001 From: Ewoud Kohl van Wijngaarden Date: Tue, 21 Jan 2020 18:29:03 +0100 Subject: [PATCH] Fixes #30723: Use Puppet 6.6 evaltrace for progress 9fc5fd3c41acfdd01ffbc6c929d00987691da5d4 disabled the progress bar monkey patch on Puppet 6. Puppet 6.6.0 started to mention the progress when evaluating resources which can be used to update the progress bar. --- lib/kafo/progress_bar.rb | 36 +++++++++++++-------- test/kafo/progress_bar_test.rb | 59 ++++++++++++++++++++++------------ 2 files changed, 61 insertions(+), 34 deletions(-) diff --git a/lib/kafo/progress_bar.rb b/lib/kafo/progress_bar.rb index cfe5eacb..8f8299c7 100644 --- a/lib/kafo/progress_bar.rb +++ b/lib/kafo/progress_bar.rb @@ -10,9 +10,9 @@ module Kafo # #finite_template and #infinite_template methods. Also you may find useful to # change more methods like #done_message or #print_error class ProgressBar - MONITOR_RESOURCE = %r{\w*MONITOR_RESOURCE ([^\]]+\])} - EVALTRACE_START = %r{/(.+\]): Starting to evaluate the resource} - EVALTRACE_END = %r{/(.+\]): Evaluated in [\d\.]+ seconds} + MONITOR_RESOURCE = %r{\w*MONITOR_RESOURCE (?[^\]]+\])} + EVALTRACE_START = %r{/(?.+\]): Starting to evaluate the resource( \((?\d+) of (?\d+)\))?} + EVALTRACE_END = %r{/(?.+\]): Evaluated in [\d\.]+ seconds} PREFETCH = %r{Prefetching .* resources for} def initialize @@ -37,12 +37,25 @@ def update(line) force_update = false if (line_monitor = MONITOR_RESOURCE.match(line)) - @resources << line_monitor[1] + @resources << line_monitor[:resource] @total = (@total == :unknown ? 1 : @total + 1) end if (line_start = EVALTRACE_START.match(line)) - if (known_resource = find_known_resource(line_start[1])) + if line_start[:total] + # Puppet 6.6 introduced progress in evaltrace + # Puppet counts 1-based where we count 0-based here + new_lines = line_start[:count].to_i - 1 + new_total = line_start[:total].to_i + if new_lines != @lines || @total != new_total + @lines = new_lines + @total = new_total + update_bar = true + force_update = true + end + end + + if (known_resource = find_resource(line_start[:resource])) line = known_resource update_bar = true force_update = true @@ -50,7 +63,7 @@ def update(line) end if (line_end = EVALTRACE_END.match(line)) && @total != :unknown && @lines < @total - if (known_resource = find_known_resource(line_end[1])) + if (known_resource = find_resource(line_end[:resource])) @resources.delete(known_resource) # ensure it's only counted once @lines += 1 end @@ -102,14 +115,9 @@ def infinite_template 'Installing...' end - def find_known_resource(resource) - loop do - return resource if @resources.include?(resource) - # continue to remove prefixes from /Stage[main]/Example/File[/etc/foo] until a resource name is found - break unless resource.include?('/') - resource = resource.sub %r{.*?/}, '' - end - nil + def find_resource(resource) + found = resource.match(%r{Stage.*\/(?.*\[.*\])$}) + found.nil? ? nil : found[:resource] end end diff --git a/test/kafo/progress_bar_test.rb b/test/kafo/progress_bar_test.rb index 2239a42c..6380eb56 100644 --- a/test/kafo/progress_bar_test.rb +++ b/test/kafo/progress_bar_test.rb @@ -5,30 +5,49 @@ module Kafo let(:bar) { ProgressBar.new.tap { |pb| pb.instance_variable_set(:@bar, powerbar) } } let(:powerbar) { MiniTest::Mock.new } - it "calls powerbar.show" do - powerbar.expect(:show, nil, [{:msg => 'Notify[test] ', :done => 0, :total => 2}, true]) - powerbar.expect(:show, nil, [{:msg => 'Prefetching example resources for example_type ', :done => 1, :total => 2}, true]) - powerbar.expect(:show, nil, [{:msg => 'File[/foo/bar] ', :done => 1, :total => 2}, true]) + describe 'Puppet 5' do + it "calls powerbar.show" do + powerbar.expect(:show, nil, [{:msg => 'Notify[test] ', :done => 0, :total => 2}, true]) + powerbar.expect(:show, nil, [{:msg => 'Prefetching example resources for example_type ', :done => 1, :total => 2}, true]) + powerbar.expect(:show, nil, [{:msg => 'File[/foo/bar] ', :done => 1, :total => 2}, true]) - bar.update('MONITOR_RESOURCE File[/foo/bar]') - bar.update('MONITOR_RESOURCE Notify[test]') - bar.update('/Stage[main]/Example/Notify[test]: Starting to evaluate the resource') - bar.update('/Stage[main]/Example/Notify[test]: Evaluated in 0.5 seconds') - bar.update('Prefetching example resources for example_type') - bar.update('/Stage[main]/Example/File[/foo/bar]: Starting to evaluate the resource') - bar.update('/Stage[main]/Example/File[/foo/bar]: Evaluated in 0.5 seconds') - powerbar.verify + bar.update('MONITOR_RESOURCE File[/foo/bar]') + bar.update('MONITOR_RESOURCE Notify[test]') + bar.update('/Stage[main]/Example/Notify[test]: Starting to evaluate the resource') + bar.update('/Stage[main]/Example/Notify[test]: Evaluated in 0.5 seconds') + bar.update('Prefetching example resources for example_type') + bar.update('/Stage[main]/Example/File[/foo/bar]: Starting to evaluate the resource') + bar.update('/Stage[main]/Example/File[/foo/bar]: Evaluated in 0.5 seconds') + powerbar.verify + end + + it 'handles an unknown total' do + powerbar.expect(:show, nil, [{:msg => 'Notify[test] ', :done => 0, :total => :unknown}, true]) + powerbar.expect(:show, nil, [{:msg => 'Prefetching example resources for example_type ', :done => 0, :total => :unknown}, true]) + powerbar.expect(:show, nil, [{:msg => 'File[/foo/bar] ', :done => 0, :total => :unknown}, true]) + + bar.update('/Stage[main]/Example/Notify[test]: Starting to evaluate the resource') + bar.update('/Stage[main]/Example/Notify[test]: Evaluated in 0.5 seconds') + bar.update('Prefetching example resources for example_type') + bar.update('/Stage[main]/Example/File[/foo/bar]: Starting to evaluate the resource') + bar.update('/Stage[main]/Example/File[/foo/bar]: Evaluated in 0.5 seconds') + powerbar.verify + end end - it 'handles an unknown total' do - powerbar.expect(:show, nil, [{:msg => 'Prefetching example resources for example_type ', :done => 0, :total => :unknown}, true]) + describe 'Puppet 6' do + it "calls powerbar.show" do + powerbar.expect(:show, nil, [{:msg => 'Notify[test] ', :done => 0, :total => 2}, true]) + powerbar.expect(:show, nil, [{:msg => 'Prefetching example resources for example_type ', :done => 1, :total => 2}, true]) + powerbar.expect(:show, nil, [{:msg => 'File[/foo/bar] ', :done => 1, :total => 2}, true]) - bar.update('/Stage[main]/Example/Notify[test]: Starting to evaluate the resource') - bar.update('/Stage[main]/Example/Notify[test]: Evaluated in 0.5 seconds') - bar.update('Prefetching example resources for example_type') - bar.update('/Stage[main]/Example/File[/foo/bar]: Starting to evaluate the resource') - bar.update('/Stage[main]/Example/File[/foo/bar]: Evaluated in 0.5 seconds') - powerbar.verify + bar.update('/Stage[main]/Example/Notify[test]: Starting to evaluate the resource (1 of 2)') + bar.update('/Stage[main]/Example/Notify[test]: Evaluated in 0.5 seconds') + bar.update('Prefetching example resources for example_type') + bar.update('/Stage[main]/Example/File[/foo/bar]: Starting to evaluate the resource (2 of 2)') + bar.update('/Stage[main]/Example/File[/foo/bar]: Evaluated in 0.5 seconds') + powerbar.verify + end end end end