diff --git a/pkg/dashboard/templates/dashboard.gohtml b/pkg/dashboard/templates/dashboard.gohtml index db5b60241..0fd0dadf8 100644 --- a/pkg/dashboard/templates/dashboard.gohtml +++ b/pkg/dashboard/templates/dashboard.gohtml @@ -108,24 +108,23 @@ - {{ range $namespace, $results := .AuditData.NamespacedResults }} + {{ range $namespace, $nsResult := .AuditData.NamespacedResults }}

Namespace: {{ $namespace }}

+ {{ range .DeploymentResults }} + {{ end }} {{/* end range .DeploymentResults */}}
-
Deployment: {{ .Name }}
- - {{ range .PodResults}} +
Deployment: {{ .Name }}

Pod Spec:

    - {{ range $message := .Messages}} + {{ range $message := .PodResult.Messages}}
  • {{ .Message }}
  • {{ end }}
- {{ range .ContainerResults}} + {{ range .PodResult.ContainerResults}}

Container: {{ .Name }}

    @@ -134,19 +133,20 @@ {{ end }}
- {{ end }} {{/* end range .ContainerResults */}} - {{ end }} {{/* end range .PodResults */}} + {{ end }} {{/* end range .PodResult.ContainerResults */}} +
-
-
+
+
{{ end }} {{/* end range .AuditData.NamespacedResults */}} diff --git a/pkg/validator/deploy.go b/pkg/validator/deployment.go similarity index 60% rename from pkg/validator/deploy.go rename to pkg/validator/deployment.go index d800430bb..2583462f6 100644 --- a/pkg/validator/deploy.go +++ b/pkg/validator/deployment.go @@ -20,17 +20,19 @@ import ( appsv1 "k8s.io/api/apps/v1" ) -// ValidateDeploy validates a single deployment, returns a PodResult. -func ValidateDeploy(conf conf.Configuration, deploy *appsv1.Deployment) PodResult { +// ValidateDeployment validates a single deployment, returns a PodResult. +func ValidateDeployment(conf conf.Configuration, deploy *appsv1.Deployment) DeploymentResult { pod := deploy.Spec.Template.Spec podResult := ValidatePod(conf, &pod) - podResult.Name = deploy.Name - return podResult + return DeploymentResult{ + Name: deploy.Name, + PodResult: podResult, + } } -// ValidateDeploys validates that each deployment conforms to the Fairwinds config, +// ValidateDeployments validates that each deployment conforms to the Fairwinds config, // returns a list of ResourceResults organized by namespace. -func ValidateDeploys(config conf.Configuration, k8sAPI *kube.API) (NamespacedResults, error) { +func ValidateDeployments(config conf.Configuration, k8sAPI *kube.API) (NamespacedResults, error) { nsResults := NamespacedResults{} deploys, err := k8sAPI.GetDeploys() if err != nil { @@ -38,14 +40,14 @@ func ValidateDeploys(config conf.Configuration, k8sAPI *kube.API) (NamespacedRes } for _, deploy := range deploys.Items { - podResult := ValidateDeploy(config, &deploy) - nsResults = addResult(podResult, nsResults, deploy.Namespace) + deploymentResult := ValidateDeployment(config, &deploy) + nsResults = addResult(deploymentResult, nsResults, deploy.Namespace) } return nsResults, nil } -func addResult(podResult PodResult, nsResults NamespacedResults, nsName string) NamespacedResults { +func addResult(deploymentResult DeploymentResult, nsResults NamespacedResults, nsName string) NamespacedResults { nsResult := &NamespaceResult{} // If there is already data stored for this namespace name, @@ -53,16 +55,16 @@ func addResult(podResult PodResult, nsResults NamespacedResults, nsName string) switch nsResults[nsName] { case nil: nsResult = &NamespaceResult{ - Summary: &ResultSummary{}, - PodResults: []PodResult{}, + Summary: &ResultSummary{}, + DeploymentResults: []DeploymentResult{}, } nsResults[nsName] = nsResult default: nsResult = nsResults[nsName] } - nsResult.PodResults = append(nsResult.PodResults, podResult) - nsResult.Summary.appendResults(*podResult.Summary) + nsResult.DeploymentResults = append(nsResult.DeploymentResults, deploymentResult) + nsResult.Summary.appendResults(*deploymentResult.PodResult.Summary) return nsResults } diff --git a/pkg/validator/fullaudit.go b/pkg/validator/fullaudit.go index 86ae90f5f..7fa5c2b21 100644 --- a/pkg/validator/fullaudit.go +++ b/pkg/validator/fullaudit.go @@ -35,7 +35,7 @@ func RunAudit(config conf.Configuration, kubeAPI *kube.API) (AuditData, error) { // TODO: Once we are validating more than deployments, // we will need to merge the namespaceResults that get returned // from each validation. - nsResults, err := ValidateDeploys(config, kubeAPI) + nsResults, err := ValidateDeployments(config, kubeAPI) if err != nil { return AuditData{}, err } @@ -44,8 +44,8 @@ func RunAudit(config conf.Configuration, kubeAPI *kube.API) (AuditData, error) { // Aggregate all summary counts to get a clusterwide count. for _, nsRes := range nsResults { - for _, pr := range nsRes.PodResults { - clusterResults.appendResults(*pr.Summary) + for _, dr := range nsRes.DeploymentResults { + clusterResults.appendResults(*dr.PodResult.Summary) } } diff --git a/pkg/validator/fullaudit_test.go b/pkg/validator/fullaudit_test.go index 686413d6b..033c965df 100644 --- a/pkg/validator/fullaudit_test.go +++ b/pkg/validator/fullaudit_test.go @@ -42,8 +42,8 @@ func TestGetTemplateData(t *testing.T) { assert.Equal(t, err, nil, "error should be nil") assert.EqualValues(t, sum, actualAudit.ClusterSummary.Results) - assert.Equal(t, 1, len(actualAudit.NamespacedResults["test"].PodResults), "should be equal") - assert.Equal(t, 1, len(actualAudit.NamespacedResults["test"].PodResults), "should be equal") - assert.Equal(t, 1, len(actualAudit.NamespacedResults["test"].PodResults[0].ContainerResults), "should be equal") - assert.Equal(t, 6, len(actualAudit.NamespacedResults["test"].PodResults[0].ContainerResults[0].Messages), "should be equal") + assert.Equal(t, 1, len(actualAudit.NamespacedResults["test"].DeploymentResults), "should be equal") + assert.Equal(t, 1, len(actualAudit.NamespacedResults["test"].DeploymentResults), "should be equal") + assert.Equal(t, 1, len(actualAudit.NamespacedResults["test"].DeploymentResults[0].PodResult.ContainerResults), "should be equal") + assert.Equal(t, 6, len(actualAudit.NamespacedResults["test"].DeploymentResults[0].PodResult.ContainerResults[0].Messages), "should be equal") } diff --git a/pkg/validator/types.go b/pkg/validator/types.go index d531750cc..2c35f18bb 100644 --- a/pkg/validator/types.go +++ b/pkg/validator/types.go @@ -33,9 +33,9 @@ type NamespacedResults map[string]*NamespaceResult // NamespaceResult groups container results by parent resource. type NamespaceResult struct { - Name string - Summary *ResultSummary - PodResults []PodResult + Name string + Summary *ResultSummary + DeploymentResults []DeploymentResult } // CountSummary provides a high level overview of success, warnings, and errors. @@ -73,6 +73,12 @@ func (rs *ResultSummary) appendResults(toAppend ResultSummary) { } } +// DeploymentResult provides a wrapper around a PodResult +type DeploymentResult struct { + Name string + PodResult PodResult +} + // ContainerResult provides a list of validation messages for each container. type ContainerResult struct { Name string diff --git a/pkg/webhook/validator.go b/pkg/webhook/validator.go index 466f876a2..c665fc0c9 100644 --- a/pkg/webhook/validator.go +++ b/pkg/webhook/validator.go @@ -94,7 +94,8 @@ func (v *Validator) Handle(ctx context.Context, req types.Request) types.Respons case "Deployment": deploy := appsv1.Deployment{} err = v.decoder.Decode(req, &deploy) - podResult = validator.ValidateDeploy(v.Config, &deploy) + deployResult := validator.ValidateDeployment(v.Config, &deploy) + podResult = deployResult.PodResult case "Pod": pod := corev1.Pod{} err = v.decoder.Decode(req, &pod)