diff --git a/src/common/utils/clair/utils.go b/src/common/utils/clair/utils.go index 5bb71d802..cf3552994 100644 --- a/src/common/utils/clair/utils.go +++ b/src/common/utils/clair/utils.go @@ -59,8 +59,13 @@ func UpdateScanOverview(digest, layerName string, l ...*log.Logger) error { logger.Errorf("Failed to get result from Clair, error: %v", err) return err } + compOverview, sev := transformVuln(res) + return dao.UpdateImgScanOverview(digest, layerName, sev, compOverview) +} + +func transformVuln(clairVuln *models.ClairLayerEnvelope) (*models.ComponentsOverview, models.Severity) { vulnMap := make(map[models.Severity]int) - features := res.Layer.Features + features := clairVuln.Layer.Features totalComponents := len(features) var temp models.Severity for _, f := range features { @@ -85,9 +90,8 @@ func UpdateScanOverview(digest, layerName string, l ...*log.Logger) error { } compSummary = append(compSummary, entry) } - compOverview := &models.ComponentsOverview{ + return &models.ComponentsOverview{ Total: totalComponents, Summary: compSummary, - } - return dao.UpdateImgScanOverview(digest, layerName, overallSev, compOverview) + }, overallSev } diff --git a/src/common/utils/clair/utils_test.go b/src/common/utils/clair/utils_test.go index f478c38f8..2775561d1 100644 --- a/src/common/utils/clair/utils_test.go +++ b/src/common/utils/clair/utils_test.go @@ -14,6 +14,10 @@ package clair import ( + "encoding/json" + "io/ioutil" + "path" + "runtime" "testing" "github.com/stretchr/testify/assert" @@ -33,3 +37,41 @@ func TestParseServerity(t *testing.T) { assert.Equal(v, ParseClairSev(k)) } } + +func TestTransformVuln(t *testing.T) { + var clairVuln = &models.ClairLayerEnvelope{} + assert := assert.New(t) + empty := []byte(`{"Layer":{"Features":[]}}`) + loadVuln(empty, clairVuln) + output, o := transformVuln(clairVuln) + assert.Equal(0, output.Total) + assert.Equal(models.SevNone, o) + _, f, _, ok := runtime.Caller(0) + if !ok { + panic("Failed to get current directory") + } + curDir := path.Dir(f) + real, err := ioutil.ReadFile(path.Join(curDir, "test/total-12.json")) + if err != nil { + panic(err) + } + loadVuln(real, clairVuln) + output, o = transformVuln(clairVuln) + assert.Equal(12, output.Total) + assert.Equal(models.SevHigh, o) + hit := false + for _, s := range output.Summary { + if s.Sev == int(models.SevHigh) { + assert.Equal(3, s.Count, "There should be 3 components with High severity") + hit = true + } + } + assert.True(hit, "Not found entry for high severity in summary list") +} + +func loadVuln(input []byte, data *models.ClairLayerEnvelope) { + err := json.Unmarshal(input, data) + if err != nil { + panic(err) + } +}