From 4e93197ccf23789a1f7adbf9c9fd6046856220ca Mon Sep 17 00:00:00 2001 From: DmitriyLewen Date: Wed, 5 Feb 2025 16:37:57 +0600 Subject: [PATCH] refactor: use one buffer for all renderers --- pkg/report/table/licensing.go | 13 ++-------- pkg/report/table/misconfig.go | 8 ++----- pkg/report/table/misconfig_test.go | 6 +++-- pkg/report/table/secret.go | 8 ++----- pkg/report/table/secret_test.go | 6 +++-- pkg/report/table/table.go | 33 +++++++++++++------------- pkg/report/table/vulnerability.go | 7 +----- pkg/report/table/vulnerability_test.go | 6 +++-- 8 files changed, 36 insertions(+), 51 deletions(-) diff --git a/pkg/report/table/licensing.go b/pkg/report/table/licensing.go index fd8140b1efae..be9ca32381dc 100644 --- a/pkg/report/table/licensing.go +++ b/pkg/report/table/licensing.go @@ -25,8 +25,7 @@ type pkgLicenseRenderer struct { once *sync.Once } -func NewPkgLicenseRenderer(isTerminal bool, severities []dbTypes.Severity) *pkgLicenseRenderer { - buf := bytes.NewBuffer([]byte{}) +func NewPkgLicenseRenderer(buf *bytes.Buffer, isTerminal bool, severities []dbTypes.Severity) *pkgLicenseRenderer { return &pkgLicenseRenderer{ w: buf, tableWriter: newTableWriter(buf, isTerminal), @@ -36,10 +35,6 @@ func NewPkgLicenseRenderer(isTerminal bool, severities []dbTypes.Severity) *pkgL } } -func (r *pkgLicenseRenderer) Flush() string { - return r.w.String() -} - func (r *pkgLicenseRenderer) Render(result types.Result) { // Trivy doesn't currently support showing suppressed licenses // So just skip this result @@ -114,8 +109,7 @@ type fileLicenseRenderer struct { once *sync.Once } -func NewFileLicenseRenderer(isTerminal bool, severities []dbTypes.Severity) *fileLicenseRenderer { - buf := bytes.NewBuffer([]byte{}) +func NewFileLicenseRenderer(buf *bytes.Buffer, isTerminal bool, severities []dbTypes.Severity) *fileLicenseRenderer { return &fileLicenseRenderer{ w: buf, tableWriter: newTableWriter(buf, isTerminal), @@ -125,9 +119,6 @@ func NewFileLicenseRenderer(isTerminal bool, severities []dbTypes.Severity) *fil } } -func (r *fileLicenseRenderer) Flush() string { - return r.w.String() -} func (r *fileLicenseRenderer) Render(result types.Result) { // Trivy doesn't currently support showing suppressed licenses // So just skip this result diff --git a/pkg/report/table/misconfig.go b/pkg/report/table/misconfig.go index afe5b7dd3d6b..a19b1268c647 100644 --- a/pkg/report/table/misconfig.go +++ b/pkg/report/table/misconfig.go @@ -30,7 +30,7 @@ type misconfigRenderer struct { ansi bool } -func NewMisconfigRenderer(severities []dbTypes.Severity, trace, includeNonFailures, ansi bool) *misconfigRenderer { +func NewMisconfigRenderer(buf *bytes.Buffer, severities []dbTypes.Severity, trace, includeNonFailures, ansi bool) *misconfigRenderer { width, _, err := term.GetSize(0) if err != nil || width == 0 { width = 40 @@ -39,7 +39,7 @@ func NewMisconfigRenderer(severities []dbTypes.Severity, trace, includeNonFailur tml.DisableFormatting() } return &misconfigRenderer{ - w: bytes.NewBuffer([]byte{}), + w: buf, severities: severities, trace: trace, includeNonFailures: includeNonFailures, @@ -48,10 +48,6 @@ func NewMisconfigRenderer(severities []dbTypes.Severity, trace, includeNonFailur } } -func (r *misconfigRenderer) Flush() string { - return r.w.String() -} - func (r *misconfigRenderer) Render(result types.Result) { // Trivy doesn't currently support showing suppressed misconfigs // So just skip this result diff --git a/pkg/report/table/misconfig_test.go b/pkg/report/table/misconfig_test.go index fb80a9714d57..da08c60de99d 100644 --- a/pkg/report/table/misconfig_test.go +++ b/pkg/report/table/misconfig_test.go @@ -1,6 +1,7 @@ package table_test import ( + "bytes" "strings" "testing" @@ -344,9 +345,10 @@ See https://avd.aquasec.com/misconfig/avd-aws-0107 dbTypes.SeverityLow, dbTypes.SeverityMedium, dbTypes.SeverityHigh, dbTypes.SeverityCritical, } - renderer := table.NewMisconfigRenderer(severities, false, tt.includeNonFailures, false) + buf := bytes.NewBuffer([]byte{}) + renderer := table.NewMisconfigRenderer(buf, severities, false, tt.includeNonFailures, false) renderer.Render(tt.input) - assert.Equal(t, tt.want, strings.ReplaceAll(renderer.Flush(), "\r\n", "\n")) + assert.Equal(t, tt.want, strings.ReplaceAll(buf.String(), "\r\n", "\n")) }) } } diff --git a/pkg/report/table/secret.go b/pkg/report/table/secret.go index a57b9d06b24a..2ef556fe70f8 100644 --- a/pkg/report/table/secret.go +++ b/pkg/report/table/secret.go @@ -20,7 +20,7 @@ type secretRenderer struct { ansi bool } -func NewSecretRenderer(ansi bool, severities []dbTypes.Severity) *secretRenderer { +func NewSecretRenderer(buf *bytes.Buffer, ansi bool, severities []dbTypes.Severity) *secretRenderer { width, _, err := term.GetSize(0) if err != nil || width == 0 { width = 40 @@ -29,17 +29,13 @@ func NewSecretRenderer(ansi bool, severities []dbTypes.Severity) *secretRenderer tml.DisableFormatting() } return &secretRenderer{ - w: bytes.NewBuffer([]byte{}), + w: buf, severities: severities, width: width, ansi: ansi, } } -func (r *secretRenderer) Flush() string { - return r.w.String() -} - func (r *secretRenderer) Render(result types.Result) { // Trivy doesn't currently support showing suppressed secrets // So just skip this result diff --git a/pkg/report/table/secret_test.go b/pkg/report/table/secret_test.go index dc3a1faaa3de..c7eaca4462a7 100644 --- a/pkg/report/table/secret_test.go +++ b/pkg/report/table/secret_test.go @@ -1,6 +1,7 @@ package table_test import ( + "bytes" "strings" "testing" @@ -141,12 +142,13 @@ this is a title for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - renderer := table.NewSecretRenderer(false, []dbTypes.Severity{ + buf := bytes.NewBuffer([]byte{}) + renderer := table.NewSecretRenderer(buf, false, []dbTypes.Severity{ dbTypes.SeverityHigh, dbTypes.SeverityMedium, }) renderer.Render(tt.input) - assert.Equal(t, tt.want, strings.ReplaceAll(renderer.Flush(), "\r\n", "\n")) + assert.Equal(t, tt.want, strings.ReplaceAll(buf.String(), "\r\n", "\n")) }) } } diff --git a/pkg/report/table/table.go b/pkg/report/table/table.go index 4d815acc026e..1b0f0c29ec98 100644 --- a/pkg/report/table/table.go +++ b/pkg/report/table/table.go @@ -1,6 +1,7 @@ package table import ( + "bytes" "context" "fmt" "io" @@ -52,24 +53,28 @@ type Writer struct { type Renderer interface { Render(result types.Result) - Flush() string } type renderers struct { - vulnerabilityRenderer *vulnerabilityRenderer - misconfigRenderer *misconfigRenderer - secretRenderer *secretRenderer - pkgLicenseRenderer *pkgLicenseRenderer - fileLicenseRenderer *fileLicenseRenderer + // Use one buffer for all renderers + buf *bytes.Buffer + + vulnerabilityRenderer Renderer + misconfigRenderer Renderer + secretRenderer Renderer + pkgLicenseRenderer Renderer + fileLicenseRenderer Renderer } func (tw *Writer) initRenderers() { + buf := bytes.NewBuffer([]byte{}) tw.renderers = renderers{ - vulnerabilityRenderer: NewVulnerabilityRenderer(tw.isOutputToTerminal(), tw.Tree, tw.ShowSuppressed, tw.Severities), - misconfigRenderer: NewMisconfigRenderer(tw.Severities, tw.Trace, tw.IncludeNonFailures, tw.isOutputToTerminal()), - secretRenderer: NewSecretRenderer(tw.isOutputToTerminal(), tw.Severities), - pkgLicenseRenderer: NewPkgLicenseRenderer(tw.isOutputToTerminal(), tw.Severities), - fileLicenseRenderer: NewFileLicenseRenderer(tw.isOutputToTerminal(), tw.Severities), + buf: buf, + vulnerabilityRenderer: NewVulnerabilityRenderer(buf, tw.isOutputToTerminal(), tw.Tree, tw.ShowSuppressed, tw.Severities), + misconfigRenderer: NewMisconfigRenderer(buf, tw.Severities, tw.Trace, tw.IncludeNonFailures, tw.isOutputToTerminal()), + secretRenderer: NewSecretRenderer(buf, tw.isOutputToTerminal(), tw.Severities), + pkgLicenseRenderer: NewPkgLicenseRenderer(buf, tw.isOutputToTerminal(), tw.Severities), + fileLicenseRenderer: NewFileLicenseRenderer(buf, tw.isOutputToTerminal(), tw.Severities), } } @@ -90,11 +95,7 @@ func (tw *Writer) Write(_ context.Context, report types.Report) error { } func (tw *Writer) flush() { - _, _ = fmt.Fprint(tw.Output, tw.vulnerabilityRenderer.Flush()) - _, _ = fmt.Fprint(tw.Output, tw.misconfigRenderer.Flush()) - _, _ = fmt.Fprint(tw.Output, tw.secretRenderer.Flush()) - _, _ = fmt.Fprint(tw.Output, tw.pkgLicenseRenderer.Flush()) - _, _ = fmt.Fprint(tw.Output, tw.fileLicenseRenderer.Flush()) + _, _ = fmt.Fprint(tw.Output, tw.buf.String()) } func (tw *Writer) render(result types.Result) { diff --git a/pkg/report/table/vulnerability.go b/pkg/report/table/vulnerability.go index fdad9ffaa61c..c19aa0d103a2 100644 --- a/pkg/report/table/vulnerability.go +++ b/pkg/report/table/vulnerability.go @@ -54,8 +54,7 @@ type vulnerabilityRenderer struct { once *sync.Once } -func NewVulnerabilityRenderer(isTerminal, tree, suppressed bool, severities []dbTypes.Severity) *vulnerabilityRenderer { - buf := bytes.NewBuffer([]byte{}) +func NewVulnerabilityRenderer(buf *bytes.Buffer, isTerminal, tree, suppressed bool, severities []dbTypes.Severity) *vulnerabilityRenderer { if !isTerminal { tml.DisableFormatting() } @@ -69,10 +68,6 @@ func NewVulnerabilityRenderer(isTerminal, tree, suppressed bool, severities []db } } -func (r *vulnerabilityRenderer) Flush() string { - return r.w.String() -} - func (r *vulnerabilityRenderer) Render(result types.Result) { // There are 3 cases when we show the vulnerability table (or only target and `Total: 0...`): // When Result contains vulnerabilities; diff --git a/pkg/report/table/vulnerability_test.go b/pkg/report/table/vulnerability_test.go index a07eb0c1ddf1..5ac1310282d9 100644 --- a/pkg/report/table/vulnerability_test.go +++ b/pkg/report/table/vulnerability_test.go @@ -1,6 +1,7 @@ package table_test import ( + "bytes" "testing" "github.com/stretchr/testify/assert" @@ -507,12 +508,13 @@ Suppressed Vulnerabilities (Total: 1) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - r := table.NewVulnerabilityRenderer(false, true, tt.showSuppressed, []dbTypes.Severity{ + buf := bytes.NewBuffer([]byte{}) + r := table.NewVulnerabilityRenderer(buf, false, true, tt.showSuppressed, []dbTypes.Severity{ dbTypes.SeverityHigh, dbTypes.SeverityMedium, }) r.Render(tt.result) - assert.Equal(t, tt.want, r.Flush(), tt.name) + assert.Equal(t, tt.want, buf.String(), tt.name) }) } }