add verbose option to scan-images

Signed-off-by: Matthias Bertschy <matthias.bertschy@gmail.com>
This commit is contained in:
Matthias Bertschy
2026-01-26 08:03:50 +01:00
parent bd49251234
commit f70d81d7c4
7 changed files with 69 additions and 19 deletions

View File

@@ -55,13 +55,13 @@ func NewPrettyPrinter(verboseMode bool, formatVersion string, attackTree bool, v
func (pp *PrettyPrinter) SetMainPrinter() { func (pp *PrettyPrinter) SetMainPrinter() {
switch pp.scanType { switch pp.scanType {
case cautils.ScanTypeCluster: case cautils.ScanTypeCluster:
pp.mainPrinter = prettyprinter.NewClusterPrinter(pp.writer) pp.mainPrinter = prettyprinter.NewClusterPrinter(pp.writer, pp.verboseMode)
case cautils.ScanTypeRepo: case cautils.ScanTypeRepo:
pp.mainPrinter = prettyprinter.NewRepoPrinter(pp.writer, pp.inputPatterns) pp.mainPrinter = prettyprinter.NewRepoPrinter(pp.writer, pp.inputPatterns, pp.verboseMode)
case cautils.ScanTypeImage: case cautils.ScanTypeImage:
pp.mainPrinter = prettyprinter.NewImagePrinter(pp.writer, pp.verboseMode) pp.mainPrinter = prettyprinter.NewImagePrinter(pp.writer, pp.verboseMode)
case cautils.ScanTypeWorkload: case cautils.ScanTypeWorkload:
pp.mainPrinter = prettyprinter.NewWorkloadPrinter(pp.writer) pp.mainPrinter = prettyprinter.NewWorkloadPrinter(pp.writer, pp.verboseMode)
default: default:
pp.mainPrinter = prettyprinter.NewSummaryPrinter(pp.writer, pp.verboseMode) pp.mainPrinter = prettyprinter.NewSummaryPrinter(pp.writer, pp.verboseMode)
} }

View File

@@ -14,20 +14,30 @@ import (
type ClusterPrinter struct { type ClusterPrinter struct {
writer *os.File writer *os.File
categoriesTablePrinter configurationprinter.TablePrinter categoriesTablePrinter configurationprinter.TablePrinter
imageTablePrinter imageprinter.TablePrinter
verboseMode bool
} }
func NewClusterPrinter(writer *os.File) *ClusterPrinter { func NewClusterPrinter(writer *os.File, verboseMode bool) *ClusterPrinter {
return &ClusterPrinter{ return &ClusterPrinter{
writer: writer, writer: writer,
categoriesTablePrinter: configurationprinter.NewClusterPrinter(), categoriesTablePrinter: configurationprinter.NewClusterPrinter(),
imageTablePrinter: imageprinter.NewTableWriter(),
verboseMode: verboseMode,
} }
} }
var _ MainPrinter = &ClusterPrinter{} var _ MainPrinter = &ClusterPrinter{}
func (cp *ClusterPrinter) PrintImageScanning(summary *imageprinter.ImageScanSummary) { func (cp *ClusterPrinter) PrintImageScanning(summary *imageprinter.ImageScanSummary) {
printImageScanningSummary(cp.writer, *summary, false) if cp.verboseMode {
printImagesCommands(cp.writer, *summary) cp.imageTablePrinter.PrintImageScanningTable(cp.writer, *summary)
cautils.SimpleDisplay(cp.writer, "\n")
}
printImageScanningSummary(cp.writer, *summary, cp.verboseMode)
if !cp.verboseMode {
printImagesCommands(cp.writer, *summary)
}
} }
func (cp *ClusterPrinter) PrintConfigurationsScanning(summaryDetails *reportsummary.SummaryDetails, sortedControlIDs [][]string, topWorkloadsByScore []reporthandling.IResource) { func (cp *ClusterPrinter) PrintConfigurationsScanning(summaryDetails *reportsummary.SummaryDetails, sortedControlIDs [][]string, topWorkloadsByScore []reporthandling.IResource) {

View File

@@ -42,17 +42,21 @@ func TestClusterScan_getWorkloadScanCommand(t *testing.T) {
func TestNewClusterPrinter(t *testing.T) { func TestNewClusterPrinter(t *testing.T) {
// Test case 1: Valid writer // Test case 1: Valid writer
cp := NewClusterPrinter(os.Stdout) cp := NewClusterPrinter(os.Stdout, false)
assert.NotNil(t, cp) assert.NotNil(t, cp)
assert.Equal(t, os.Stdout, cp.writer) assert.Equal(t, os.Stdout, cp.writer)
assert.NotNil(t, cp.categoriesTablePrinter) assert.NotNil(t, cp.categoriesTablePrinter)
assert.NotNil(t, cp.imageTablePrinter)
assert.False(t, cp.verboseMode)
// Test case 2: Nil writer // Test case 2: Nil writer
var writer *os.File var writer *os.File
cp = NewClusterPrinter(writer) cp = NewClusterPrinter(writer, true)
assert.NotNil(t, cp) assert.NotNil(t, cp)
assert.Nil(t, cp.writer) assert.Nil(t, cp.writer)
assert.NotNil(t, cp.categoriesTablePrinter) assert.NotNil(t, cp.categoriesTablePrinter)
assert.NotNil(t, cp.imageTablePrinter)
assert.True(t, cp.verboseMode)
} }
func TestPrintNextSteps(t *testing.T) { func TestPrintNextSteps(t *testing.T) {
@@ -63,7 +67,7 @@ func TestPrintNextSteps(t *testing.T) {
} }
defer f.Close() defer f.Close()
cp := NewClusterPrinter(f) cp := NewClusterPrinter(f, false)
// Redirect stderr to the temporary file // Redirect stderr to the temporary file
oldStderr := os.Stderr oldStderr := os.Stderr
@@ -88,7 +92,7 @@ func TestPrintNextSteps(t *testing.T) {
} }
func TestGetWorkloadScanCommand(t *testing.T) { func TestGetWorkloadScanCommand(t *testing.T) {
cp := NewClusterPrinter(os.Stdout) cp := NewClusterPrinter(os.Stdout, false)
assert.NotNil(t, cp) assert.NotNil(t, cp)
assert.Equal(t, os.Stdout, cp.writer) assert.Equal(t, os.Stdout, cp.writer)
assert.NotNil(t, cp.categoriesTablePrinter) assert.NotNil(t, cp.categoriesTablePrinter)

View File

@@ -3,6 +3,7 @@ package prettyprinter
import ( import (
"os" "os"
"github.com/kubescape/kubescape/v3/core/cautils"
"github.com/kubescape/kubescape/v3/core/pkg/resultshandling/printer/v2/prettyprinter/tableprinter/configurationprinter" "github.com/kubescape/kubescape/v3/core/pkg/resultshandling/printer/v2/prettyprinter/tableprinter/configurationprinter"
"github.com/kubescape/kubescape/v3/core/pkg/resultshandling/printer/v2/prettyprinter/tableprinter/imageprinter" "github.com/kubescape/kubescape/v3/core/pkg/resultshandling/printer/v2/prettyprinter/tableprinter/imageprinter"
"github.com/kubescape/opa-utils/reporthandling" "github.com/kubescape/opa-utils/reporthandling"
@@ -15,6 +16,7 @@ type SummaryPrinter struct {
writer *os.File writer *os.File
verboseMode bool verboseMode bool
summaryTablePrinter configurationprinter.TablePrinter summaryTablePrinter configurationprinter.TablePrinter
imageTablePrinter imageprinter.TablePrinter
} }
func NewSummaryPrinter(writer *os.File, verboseMode bool) *SummaryPrinter { func NewSummaryPrinter(writer *os.File, verboseMode bool) *SummaryPrinter {
@@ -22,12 +24,21 @@ func NewSummaryPrinter(writer *os.File, verboseMode bool) *SummaryPrinter {
writer: writer, writer: writer,
verboseMode: verboseMode, verboseMode: verboseMode,
summaryTablePrinter: configurationprinter.NewFrameworkPrinter(verboseMode), summaryTablePrinter: configurationprinter.NewFrameworkPrinter(verboseMode),
imageTablePrinter: imageprinter.NewTableWriter(),
} }
} }
var _ MainPrinter = &RepoPrinter{} func (sp *SummaryPrinter) PrintImageScanning(summary *imageprinter.ImageScanSummary) {
if sp.verboseMode {
func (sp *SummaryPrinter) PrintImageScanning(*imageprinter.ImageScanSummary) {} sp.imageTablePrinter.PrintImageScanningTable(sp.writer, *summary)
cautils.SimpleDisplay(sp.writer, "\n")
}
printImageScanningSummary(sp.writer, *summary, sp.verboseMode)
if !sp.verboseMode {
printImagesCommands(sp.writer, *summary)
}
printTopComponents(sp.writer, *summary)
}
func (sp *SummaryPrinter) PrintNextSteps() {} func (sp *SummaryPrinter) PrintNextSteps() {}

View File

@@ -15,6 +15,7 @@ func TestNewSummaryPrinter(t *testing.T) {
assert.Equal(t, os.Stdout, printer.writer) assert.Equal(t, os.Stdout, printer.writer)
assert.Equal(t, verbose, printer.verboseMode) assert.Equal(t, verbose, printer.verboseMode)
assert.NotNil(t, printer.summaryTablePrinter) assert.NotNil(t, printer.summaryTablePrinter)
assert.NotNil(t, printer.imageTablePrinter)
// Test case 2: Valid writer and non-verbose mode // Test case 2: Valid writer and non-verbose mode
verbose = false verbose = false
@@ -23,6 +24,7 @@ func TestNewSummaryPrinter(t *testing.T) {
assert.Equal(t, os.Stdout, printer.writer) assert.Equal(t, os.Stdout, printer.writer)
assert.Equal(t, verbose, printer.verboseMode) assert.Equal(t, verbose, printer.verboseMode)
assert.NotNil(t, printer.summaryTablePrinter) assert.NotNil(t, printer.summaryTablePrinter)
assert.NotNil(t, printer.imageTablePrinter)
// Test case 3: Nil writer and verbose mode // Test case 3: Nil writer and verbose mode
var writer *os.File var writer *os.File
@@ -32,6 +34,7 @@ func TestNewSummaryPrinter(t *testing.T) {
assert.Nil(t, printer.writer) assert.Nil(t, printer.writer)
assert.Equal(t, verbose, printer.verboseMode) assert.Equal(t, verbose, printer.verboseMode)
assert.NotNil(t, printer.summaryTablePrinter) assert.NotNil(t, printer.summaryTablePrinter)
assert.NotNil(t, printer.imageTablePrinter)
// Test case 4: Nil writer and non-verbose mode // Test case 4: Nil writer and non-verbose mode
verbose = false verbose = false
@@ -40,6 +43,7 @@ func TestNewSummaryPrinter(t *testing.T) {
assert.Nil(t, printer.writer) assert.Nil(t, printer.writer)
assert.Equal(t, verbose, printer.verboseMode) assert.Equal(t, verbose, printer.verboseMode)
assert.NotNil(t, printer.summaryTablePrinter) assert.NotNil(t, printer.summaryTablePrinter)
assert.NotNil(t, printer.imageTablePrinter)
} }
func TestGetVerboseMode(t *testing.T) { func TestGetVerboseMode(t *testing.T) {

View File

@@ -15,20 +15,30 @@ import (
type RepoPrinter struct { type RepoPrinter struct {
writer *os.File writer *os.File
categoriesTablePrinter configurationprinter.TablePrinter categoriesTablePrinter configurationprinter.TablePrinter
imageTablePrinter imageprinter.TablePrinter
verboseMode bool
} }
func NewRepoPrinter(writer *os.File, inputPatterns []string) *RepoPrinter { func NewRepoPrinter(writer *os.File, inputPatterns []string, verboseMode bool) *RepoPrinter {
return &RepoPrinter{ return &RepoPrinter{
writer: writer, writer: writer,
categoriesTablePrinter: configurationprinter.NewRepoPrinter(inputPatterns), categoriesTablePrinter: configurationprinter.NewRepoPrinter(inputPatterns),
imageTablePrinter: imageprinter.NewTableWriter(),
verboseMode: verboseMode,
} }
} }
var _ MainPrinter = &RepoPrinter{} var _ MainPrinter = &RepoPrinter{}
func (rp *RepoPrinter) PrintImageScanning(summary *imageprinter.ImageScanSummary) { func (rp *RepoPrinter) PrintImageScanning(summary *imageprinter.ImageScanSummary) {
printImageScanningSummary(rp.writer, *summary, false) if rp.verboseMode {
printImagesCommands(rp.writer, *summary) rp.imageTablePrinter.PrintImageScanningTable(rp.writer, *summary)
cautils.SimpleDisplay(rp.writer, "\n")
}
printImageScanningSummary(rp.writer, *summary, rp.verboseMode)
if !rp.verboseMode {
printImagesCommands(rp.writer, *summary)
}
printTopComponents(rp.writer, *summary) printTopComponents(rp.writer, *summary)
} }

View File

@@ -3,6 +3,7 @@ package prettyprinter
import ( import (
"os" "os"
"github.com/kubescape/kubescape/v3/core/cautils"
"github.com/kubescape/kubescape/v3/core/pkg/resultshandling/printer/v2/prettyprinter/tableprinter/configurationprinter" "github.com/kubescape/kubescape/v3/core/pkg/resultshandling/printer/v2/prettyprinter/tableprinter/configurationprinter"
"github.com/kubescape/kubescape/v3/core/pkg/resultshandling/printer/v2/prettyprinter/tableprinter/imageprinter" "github.com/kubescape/kubescape/v3/core/pkg/resultshandling/printer/v2/prettyprinter/tableprinter/imageprinter"
"github.com/kubescape/opa-utils/reporthandling" "github.com/kubescape/opa-utils/reporthandling"
@@ -12,20 +13,30 @@ import (
type WorkloadPrinter struct { type WorkloadPrinter struct {
writer *os.File writer *os.File
categoriesTablePrinter configurationprinter.TablePrinter categoriesTablePrinter configurationprinter.TablePrinter
imageTablePrinter imageprinter.TablePrinter
verboseMode bool
} }
func NewWorkloadPrinter(writer *os.File) *WorkloadPrinter { func NewWorkloadPrinter(writer *os.File, verboseMode bool) *WorkloadPrinter {
return &WorkloadPrinter{ return &WorkloadPrinter{
writer: writer, writer: writer,
categoriesTablePrinter: configurationprinter.NewWorkloadPrinter(), categoriesTablePrinter: configurationprinter.NewWorkloadPrinter(),
imageTablePrinter: imageprinter.NewTableWriter(),
verboseMode: verboseMode,
} }
} }
var _ MainPrinter = &WorkloadPrinter{} var _ MainPrinter = &WorkloadPrinter{}
func (wp *WorkloadPrinter) PrintImageScanning(summary *imageprinter.ImageScanSummary) { func (wp *WorkloadPrinter) PrintImageScanning(summary *imageprinter.ImageScanSummary) {
printImageScanningSummary(wp.writer, *summary, false) if wp.verboseMode {
printImagesCommands(wp.writer, *summary) wp.imageTablePrinter.PrintImageScanningTable(wp.writer, *summary)
cautils.SimpleDisplay(wp.writer, "\n")
}
printImageScanningSummary(wp.writer, *summary, wp.verboseMode)
if !wp.verboseMode {
printImagesCommands(wp.writer, *summary)
}
} }
func (wp *WorkloadPrinter) PrintNextSteps() { func (wp *WorkloadPrinter) PrintNextSteps() {