Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix score when onlyOutputFailed is true #563

Merged
merged 4 commits into from
Jun 21, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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