Skip to content

Commit

Permalink
create DeploymentResult type
Browse files Browse the repository at this point in the history
  • Loading branch information
rbren committed May 2, 2019
1 parent 97e2c17 commit 1282359
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 34 deletions.
20 changes: 10 additions & 10 deletions pkg/dashboard/templates/dashboard.gohtml
Original file line number Diff line number Diff line change
Expand Up @@ -108,24 +108,23 @@

</div>

{{ range $namespace, $results := .AuditData.NamespacedResults }}
{{ range $namespace, $nsResult := .AuditData.NamespacedResults }}
<div class="card namespace">
<h3>Namespace: <strong>{{ $namespace }}</strong></h3>
<table class="expandable-table" cellspacing="0">
{{ range .DeploymentResults }}
<tr>
<td class="resource-info">
<div class="name"><span class="caret-expander"></span>Deployment: <strong>{{ .Name }}</strong></div>

{{ range .PodResults}}
<div class="name"><span class="caret-expander"></span>Deployment: <strong>{{ .Name }}</strong></div>
<div class="result-messages expandable-content">
<h4>Pod Spec:</h4>
<ul class="message-list">
{{ range $message := .Messages}}
{{ range $message := .PodResult.Messages}}
<li class="{{ .Type }}"><i class="{{ getIcon $message }}"></i> {{ .Message }}</li>
{{ end }}
</ul>
</div>
{{ range .ContainerResults}}
{{ range .PodResult.ContainerResults}}
<div class="result-messages expandable-content">
<h4>Container: {{ .Name }}</h4>
<ul class="message-list">
Expand All @@ -134,19 +133,20 @@
{{ end }}
</ul>
</div>
{{ end }} {{/* end range .ContainerResults */}}
{{ end }} {{/* end range .PodResults */}}
{{ end }} {{/* end range .PodResult.ContainerResults */}}
</div>
</td>
<td class="status-bar">
<div class="status">
<div class="failing">
<div class="warning" style="width: {{ getWarningWidth .Summary.Totals 200 }}px;">
<div class="passing" style="width: {{ getSuccessWidth .Summary.Totals 200 }}px;"></div>
<div class="warning" style="width: {{ getWarningWidth .PodResult.Summary.Totals 200 }}px;">
<div class="passing" style="width: {{ getSuccessWidth .PodResult.Summary.Totals 200 }}px;"></div>
</div>
</div>
</div>
</td>
</tr>
{{ end }} {{/* end range .DeploymentResults */}}
</table>
</div>
{{ end }} {{/* end range .AuditData.NamespacedResults */}}
Expand Down
28 changes: 15 additions & 13 deletions pkg/validator/deploy.go → pkg/validator/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,49 +20,51 @@ 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 {
return nsResults, err
}

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,
// then append to the ResourceResults to the existing data.
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
}
6 changes: 3 additions & 3 deletions pkg/validator/fullaudit.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand All @@ -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)
}
}

Expand Down
8 changes: 4 additions & 4 deletions pkg/validator/fullaudit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
12 changes: 9 additions & 3 deletions pkg/validator/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion pkg/webhook/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 1282359

Please sign in to comment.