diff --git a/go.mod b/go.mod index 21260544..63ab33b1 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.17 require ( github.com/armosec/armoapi-go v0.0.41 github.com/armosec/k8s-interface v0.0.56 - github.com/armosec/opa-utils v0.0.97 + github.com/armosec/opa-utils v0.0.99 github.com/armosec/rbac-utils v0.0.12 github.com/armosec/utils-go v0.0.3 github.com/briandowns/spinner v1.18.0 @@ -19,6 +19,7 @@ require ( github.com/satori/go.uuid v1.2.0 github.com/spf13/cobra v1.2.1 github.com/stretchr/testify v1.7.0 + go.uber.org/zap v1.19.1 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.22.2 k8s.io/apimachinery v0.22.2 @@ -77,7 +78,6 @@ require ( go.opencensus.io v0.23.0 // indirect go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.19.1 // indirect golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect golang.org/x/net v0.0.0-20210825183410-e898025ed96a // indirect golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1 // indirect diff --git a/go.sum b/go.sum index 05b941f4..c2c78393 100644 --- a/go.sum +++ b/go.sum @@ -95,8 +95,8 @@ github.com/armosec/k8s-interface v0.0.50/go.mod h1:vHxGWqD/uh6+GQb9Sqv7OGMs+Rvc2 github.com/armosec/k8s-interface v0.0.56 h1:7dOgc3qZaI7ReLRZcJa2JZKk0rliyYi05l1vuHc6gcE= github.com/armosec/k8s-interface v0.0.56/go.mod h1:vHxGWqD/uh6+GQb9Sqv7OGMs+Rvc2dsFVc0XtgRh1ZU= github.com/armosec/opa-utils v0.0.64/go.mod h1:6tQP8UDq2EvEfSqh8vrUdr/9QVSCG4sJfju1SXQOn4c= -github.com/armosec/opa-utils v0.0.97 h1:KPjRZdsAC9EObo17QxiW+s5KWmF6vNFu+VQSOgFv5uk= -github.com/armosec/opa-utils v0.0.97/go.mod h1:BNTjeianyXlflJMz3bZM0GimBWqmzirUf1whWR6Os04= +github.com/armosec/opa-utils v0.0.99 h1:ZuoIPg6vbgO4J09xJZDO/yIRD59odwmK2Bm55uTvkU8= +github.com/armosec/opa-utils v0.0.99/go.mod h1:BNTjeianyXlflJMz3bZM0GimBWqmzirUf1whWR6Os04= github.com/armosec/rbac-utils v0.0.1/go.mod h1:pQ8CBiij8kSKV7aeZm9FMvtZN28VgA7LZcYyTWimq40= github.com/armosec/rbac-utils v0.0.12 h1:uJpMGDyLAX129PrKHp6NPNB6lVRhE0OZIwV6ywzSDrs= github.com/armosec/rbac-utils v0.0.12/go.mod h1:Ex/IdGWhGv9HZq6Hs8N/ApzCKSIvpNe/ETqDfnuyah0= diff --git a/opaprocessor/processorhandler.go b/opaprocessor/processorhandler.go index d9c53fbc..e1a4d73c 100644 --- a/opaprocessor/processorhandler.go +++ b/opaprocessor/processorhandler.go @@ -6,6 +6,7 @@ import ( "time" "github.com/armosec/kubescape/cautils" + ksscore "github.com/armosec/kubescape/score" "github.com/armosec/opa-utils/objectsenvelopes" "github.com/armosec/opa-utils/reporthandling" "github.com/armosec/opa-utils/reporthandling/apis" @@ -71,6 +72,9 @@ func (opaHandler *OPAProcessorHandler) ProcessRulesListenner() { // edit results opap.updateResults() + //TODO: review this location + scorewrapper := ksscore.NewScoreWrapper(opaSessionObj) + scorewrapper.Calculate(ksscore.EPostureReportV2) // report *opaHandler.reportResults <- opaSessionObj } diff --git a/resultshandling/results.go b/resultshandling/results.go index 82628862..1c4ff560 100644 --- a/resultshandling/results.go +++ b/resultshandling/results.go @@ -33,17 +33,7 @@ func (resultsHandler *ResultsHandler) HandleResults(scanInfo *cautils.ScanInfo) fmt.Println(err) } - // TODO - get score from table - var score float32 = 0 - if opaSessionObj.PostureReport != nil { - for i := range opaSessionObj.PostureReport.FrameworkReports { - score += opaSessionObj.PostureReport.FrameworkReports[i].Score - } - score /= float32(len(opaSessionObj.PostureReport.FrameworkReports)) - resultsHandler.printerObj.Score(score) - } - - return score + return opaSessionObj.Report.SummaryDetails.Score } // CalculatePostureScore calculate final score diff --git a/score/score.go b/score/score.go new file mode 100644 index 00000000..6e78d858 --- /dev/null +++ b/score/score.go @@ -0,0 +1,43 @@ +package score + +import ( + "fmt" + + "github.com/armosec/opa-utils/score" + + "github.com/armosec/kubescape/cautils" +) + +/* provides a wrapper for scoreUtils, since there's no common interface between postureReportV1 and PostureReportV2 +and the need of concrete objects + I've decided to create scoreWrapper that will allow calculating score regardless (as long as opaSessionObj is there) +*/ +type ScoreWrapper struct { + scoreUtil *score.ScoreUtil + opaSessionObj *cautils.OPASessionObj +} + +type PostureReportVersion string + +const ( + EPostureReportV1 PostureReportVersion = "v1" + EPostureReportV2 PostureReportVersion = "V2" +) + +func (su *ScoreWrapper) Calculate(reportVersion PostureReportVersion) error { + switch reportVersion { + case EPostureReportV1: + return su.scoreUtil.Calculate(su.opaSessionObj.PostureReport.FrameworkReports) + case EPostureReportV2: + return su.scoreUtil.CalculatePostureReportV2(su.opaSessionObj.Report) + } + + return fmt.Errorf("unsupported score calculator") +} + +func NewScoreWrapper(opaSessionObj *cautils.OPASessionObj) *ScoreWrapper { + return &ScoreWrapper{ + scoreUtil: score.NewScore(opaSessionObj.AllResources), + opaSessionObj: opaSessionObj, + } +} diff --git a/score/score_test.go b/score/score_test.go new file mode 100644 index 00000000..323f8eed --- /dev/null +++ b/score/score_test.go @@ -0,0 +1 @@ +package score