Skip to content

Commit

Permalink
fix score when onlyOutputFailed is true (FairwindsOps#563)
Browse files Browse the repository at this point in the history
* fix score when onlyOutputFailed is true

* fix tests

* remove return
  • Loading branch information
rbren committed Jun 21, 2021
1 parent 88b57f9 commit a43a0fe
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 46 deletions.
37 changes: 19 additions & 18 deletions cmd/polaris/audit.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import (
"os"
"os/exec"

conf "github.com/fairwindsops/polaris/pkg/config"
"github.com/fairwindsops/polaris/pkg/kube"
"github.com/fairwindsops/polaris/pkg/validator"
"github.com/sirupsen/logrus"
Expand Down Expand Up @@ -76,7 +75,19 @@ var auditCmd = &cobra.Command{
}
}

auditData := runAndReportAudit(cmd.Context(), config, auditPath, resourceToAudit, auditOutputFile, auditOutputURL, auditOutputFormat, useColor)
k, err := kube.CreateResourceProvider(context.TODO(), auditPath, resourceToAudit, config)
if err != nil {
logrus.Errorf("Error fetching Kubernetes resources %v", err)
os.Exit(1)
}

auditData, err := validator.RunAudit(config, k)
if err != nil {
logrus.Errorf("Error while running audit on resources: %v", err)
os.Exit(1)
}

outputAudit(auditData, auditOutputFile, auditOutputURL, auditOutputFormat, useColor, onlyShowFailedTests)

summary := auditData.GetSummary()
score := summary.GetScore()
Expand Down Expand Up @@ -123,26 +134,17 @@ func ProcessHelmTemplates(helmChart string) (string, error) {
return dir, nil
}

func runAndReportAudit(ctx context.Context, c conf.Configuration, auditPath, workload, outputFile, outputURL, outputFormat string, useColor bool) validator.AuditData {
// Create a kubernetes client resource provider
k, err := kube.CreateResourceProvider(ctx, auditPath, workload, c)
if err != nil {
logrus.Errorf("Error fetching Kubernetes resources %v", err)
os.Exit(1)
func outputAudit(auditData validator.AuditData, outputFile, outputURL, outputFormat string, useColor bool, onlyShowFailedTests bool) {
if onlyShowFailedTests {
auditData = auditData.RemoveSuccessfulResults()
}
var auditData validator.AuditData
auditData, err = validator.RunAudit(c, k, onlyShowFailedTests)

if err != nil {
logrus.Errorf("Error while running audit on resources: %v", err)
os.Exit(1)
}

var outputBytes []byte
var err error
if outputFormat == "score" {
outputBytes = []byte(fmt.Sprintf("%d\n", auditData.GetSummary().GetScore()))
} else if outputFormat == "yaml" {
jsonBytes, err := json.Marshal(auditData)
var jsonBytes []byte
jsonBytes, err = json.Marshal(auditData)
if err == nil {
outputBytes, err = yaml.JSONToYAML(jsonBytes)
}
Expand Down Expand Up @@ -201,5 +203,4 @@ func runAndReportAudit(ctx context.Context, c conf.Configuration, auditPath, wor
}
}
}
return auditData
}
4 changes: 2 additions & 2 deletions pkg/dashboard/dashboard.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ func GetRouter(c config.Configuration, auditPath string, port int, basePath stri
}

var auditDataObj validator.AuditData
auditDataObj, err = validator.RunAudit(adjustedConf, k, false)
auditDataObj, err = validator.RunAudit(adjustedConf, k)
if err != nil {
http.Error(w, "Error Fetching Deployments", http.StatusInternalServerError)
return
Expand Down Expand Up @@ -214,7 +214,7 @@ func GetRouter(c config.Configuration, auditPath string, port int, basePath stri
}

var auditData validator.AuditData
auditData, err = validator.RunAudit(adjustedConf, k, false)
auditData, err = validator.RunAudit(adjustedConf, k)
if err != nil {
logrus.Errorf("Error getting audit data: %v", err)
http.Error(w, "Error running audit", 500)
Expand Down
5 changes: 1 addition & 4 deletions pkg/validator/fullaudit.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import (
)

// RunAudit runs a full Polaris audit and returns an AuditData object
func RunAudit(config conf.Configuration, kubeResources *kube.ResourceProvider, onlyShowFailedTests bool) (AuditData, error) {
func RunAudit(config conf.Configuration, kubeResources *kube.ResourceProvider) (AuditData, error) {
displayName := config.DisplayName
if displayName == "" {
displayName = kubeResources.SourceName
Expand All @@ -42,9 +42,6 @@ func RunAudit(config conf.Configuration, kubeResources *kube.ResourceProvider, o
Results: results,
}
auditData.Score = auditData.GetSummary().GetScore()
if onlyShowFailedTests {
auditData.RemoveSuccessfulResults()
}
return auditData, nil
}

Expand Down
2 changes: 1 addition & 1 deletion pkg/validator/fullaudit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func TestGetTemplateData(t *testing.T) {
score := uint(0)

var actualAudit AuditData
actualAudit, err = RunAudit(c, resources, false)
actualAudit, err = RunAudit(c, resources)
assert.Equal(t, err, nil, "error should be nil")
assert.Equal(t, score, actualAudit.Score, "")
assert.EqualValues(t, sum, actualAudit.GetSummary())
Expand Down
51 changes: 31 additions & 20 deletions pkg/validator/output.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"time"

"github.com/fatih/color"
"github.com/thoas/go-funk"

"github.com/fairwindsops/polaris/pkg/config"
)
Expand Down Expand Up @@ -52,10 +53,12 @@ type AuditData struct {
}

// RemoveSuccessfulResults remove all test that have passed.
func (res *AuditData) RemoveSuccessfulResults() {
for _, auditDataResult := range res.Results {
auditDataResult.removeSuccessfulResults()
}
func (res AuditData) RemoveSuccessfulResults() AuditData {
resCopy := res
resCopy.Results = funk.Map(res.Results, func(auditDataResult Result) Result {
return auditDataResult.removeSuccessfulResults()
}).([]Result)
return resCopy
}

// ClusterInfo contains Polaris results as well as some high-level stats
Expand All @@ -80,12 +83,14 @@ type ResultMessage struct {
// ResultSet contiains the results for a set of checks
type ResultSet map[string]ResultMessage

func (res ResultSet) removeSuccessfulResults() {
func (res ResultSet) removeSuccessfulResults() ResultSet {
newResults := ResultSet{}
for k, resultMessage := range res {
if resultMessage.Success {
delete(res, k)
if !resultMessage.Success {
newResults[k] = resultMessage
}
}
return newResults
}

// Result provides results for a Kubernetes object
Expand All @@ -98,9 +103,14 @@ type Result struct {
CreatedTime time.Time
}

func (res *Result) removeSuccessfulResults() {
res.Results.removeSuccessfulResults()
res.PodResult.removeSuccessfulResults()
func (res Result) removeSuccessfulResults() Result {
resCopy := res
resCopy.Results = res.Results.removeSuccessfulResults()
if res.PodResult != nil {
podCopy := res.PodResult.removeSuccessfulResults()
resCopy.PodResult = &podCopy
}
return resCopy
}

// PodResult provides a list of validation messages for each pod.
Expand All @@ -110,14 +120,13 @@ type PodResult struct {
ContainerResults []ContainerResult
}

func (res *PodResult) removeSuccessfulResults() {
if res == nil {
return
}
res.Results.removeSuccessfulResults()
for _, containerResult := range res.ContainerResults {
containerResult.removeSuccessfulResults()
}
func (res PodResult) removeSuccessfulResults() PodResult {
resCopy := PodResult{}
resCopy.Results = res.Results.removeSuccessfulResults()
resCopy.ContainerResults = funk.Map(res.ContainerResults, func(containerResult ContainerResult) ContainerResult {
return containerResult.removeSuccessfulResults()
}).([]ContainerResult)
return resCopy
}

// ContainerResult provides a list of validation messages for each container.
Expand All @@ -126,8 +135,10 @@ type ContainerResult struct {
Results ResultSet
}

func (res *ContainerResult) removeSuccessfulResults() {
res.Results.removeSuccessfulResults()
func (res ContainerResult) removeSuccessfulResults() ContainerResult {
resCopy := res
resCopy.Results = res.Results.removeSuccessfulResults()
return resCopy
}

func fillString(id string, l int) string {
Expand Down
3 changes: 2 additions & 1 deletion pkg/validator/summary.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ func (cs CountSummary) GetScore() uint {
if total == 0 {
return uint(100)
}
return uint((float64(cs.Successes*2) / float64(total)) * 100)
score := uint((float64(cs.Successes*2) / float64(total)) * 100)
return score
}

// AddSummary adds two CountSummaries together
Expand Down

0 comments on commit a43a0fe

Please sign in to comment.