Skip to content

Commit

Permalink
initial mostly broken work on integration
Browse files Browse the repository at this point in the history
  • Loading branch information
robscott committed Jan 28, 2019
1 parent 53b40b9 commit d906742
Show file tree
Hide file tree
Showing 6 changed files with 117 additions and 53 deletions.
127 changes: 95 additions & 32 deletions pkg/dashboard/dashboard.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,18 @@ import (

type DashboardData struct {
ClusterSummary *validator.ResultSummary
NamespacedResults []validator.NamespacedResult
NamespacedResults map[string]*validator.NamespacedResult
}

var tmpl = template.Must(template.ParseFiles("pkg/dashboard/templates/charts.gohtml"))

func Render(w http.ResponseWriter, r *http.Request, c conf.Configuration) {
dashboardData := getDashboardData()
dashboardData, err := getDashboardData(c)
if err != nil {
http.Error(w, "Error Fetching Deploys", 500)
return
}

tmpl.Execute(w, dashboardData)
}

Expand All @@ -33,48 +38,106 @@ func RenderJSON(w http.ResponseWriter, r *http.Request, c conf.Configuration) {
}
log.Println("pods count:", len(pods.Items))
for _, pod := range pods.Items {
result := validator.ValidatePods(c, &pod.Spec, validator.Results{})
result := validator.ValidatePods(c, &pod.Spec)
results = append(results, result)
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(results)
}

func getDashboardData() DashboardData {
return DashboardData{
func getDashboardData(c conf.Configuration) (DashboardData, error) {
deploys, err := kube.AppsV1API.Deployments("").List(metav1.ListOptions{})
if err != nil {
return DashboardData{}, err
}

log.Println("deploys =======>", len(deploys.Items))

dashboardData := DashboardData{
ClusterSummary: &validator.ResultSummary{
Successes: 46,
Warnings: 8,
Failures: 5,
},
NamespacedResults: []validator.NamespacedResult{{
Namespace: "kube-system",
Results: []validator.ResourceResult{{
Name: "tiller",
Type: "Deployment",
Summary: &validator.ResultSummary{
Successes: 7,
Warnings: 3,
Failures: 2,
},
Messages: []validator.ResultMessage{{
Message: "Image Tag Specified",
Type: "success",
}, {
Message: "Liveness Probe Specified",
Type: "success",
}, {
Message: "Readiness Probe Specified",
Type: "success",
}, {
Message: "Container Running As Root",
Type: "warning",
}, {
Message: "Resource requests are not set",
}

for _, deploy := range deploys.Items {
validationFailures := validator.ValidateDeploys(c, &deploy)
resResult := validator.ResourceResult{
Name: deploy.Name,
Type: "Deployment",
}
for _, containerValidation := range validationFailures.InitContainerValidations {
for _, failure := range containerValidation.Failures {
dashboardData.ClusterSummary.Failures++
// rr := *resResult.Summary
// rr.Failures++
resResult.Messages = append(resResult.Messages, validator.ResultMessage{
Message: failure.Reason(),
Type: "failure",
})
}
}

for _, containerValidation := range validationFailures.ContainerValidations {
for _, failure := range containerValidation.Failures {
dashboardData.ClusterSummary.Failures++
// rr := *resResult.Summary
// rr.Failures++
resResult.Messages = append(resResult.Messages, validator.ResultMessage{
Message: failure.Reason(),
Type: "failure",
}},
}},
}},
})
}
}

log.Println("adding results to =======>", deploy.Namespace)
dashboardData.NamespacedResults[deploy.Namespace].Results = append(dashboardData.NamespacedResults[deploy.Namespace].Results, resResult)
log.Println("adding results to =======>", len(dashboardData.NamespacedResults[deploy.Namespace].Results))
}

return dashboardData, nil

// return DashboardData{
// ClusterSummary: &validator.ResultSummary{
// Successes: 46,
// Warnings: 8,
// Failures: 5,
// },
// NamespacedResults: {
// "kube-system": {
// Summary: &validator.ResultSummary{
// Successes: 7,
// Warnings: 3,
// Failures: 2,
// },
// Results: []validator.ResourceResult{{
// Name: "tiller",
// Type: "Deployment",
// Summary: &validator.ResultSummary{
// Successes: 7,
// Warnings: 3,
// Failures: 2,
// },
// Messages: []validator.ResultMessage{{
// Message: "Image Tag Specified",
// Type: "success",
// }, {
// Message: "Liveness Probe Specified",
// Type: "success",
// }, {
// Message: "Readiness Probe Specified",
// Type: "success",
// }, {
// Message: "Container Running As Root",
// Type: "warning",
// }, {
// Message: "Resource requests are not set",
// Type: "failure",
// }},
// }},
// }
// }},
// }, nil
}
28 changes: 14 additions & 14 deletions pkg/dashboard/templates/charts.gohtml
Original file line number Diff line number Diff line change
Expand Up @@ -22,38 +22,38 @@

<div class="dashboard-content">
<div class="charts">
<div class="cluster-score chart-section">
<h3>Overall Score:</h3>
<div style="width:510px; height: 400px; left: -100px; position: relative;">
<canvas id="clusterScoreChart"></canvas>
</div>
</div>
<div class="namespace-score chart-section">
<h3>Scores By Namespace:</h3>
<canvas id="namespaceScoreChart"></canvas>
<div class="cluster-score chart-section">
<h3>Overall Score:</h3>
<div style="width:510px; height: 400px; left: -100px; position: relative;">
<canvas id="clusterScoreChart"></canvas>
</div>
</div>
<div class="namespace-score chart-section">
<h3>Scores By Namespace:</h3>
<canvas id="namespaceScoreChart"></canvas>
</div>
</div>

{{ range .NamespacedResults }}
{{ range $namespace, $results := .NamespacedResults }}
<div class="namespace">
<h3>Namespace: <strong>{{ .Namespace }}</strong></h3>
<h3>Namespace: <strong>{{ $namespace }}</strong></h3>

<table class="namespace-content" cellspacing="0">
{{ range .Results }}
<tr>
<td>
<div class="name"><span class="caret-expander expanded"></span>{{ .Type }}: <strong>{{ .Name }}</strong></div>
<ul class="extra">
{{ range .Messages}}
{{ range $results.Messages}}
<li class="{{ .Type }}"><span>&#{{ .HTMLSpecialCharCode }};</span> {{ .Message }}</li>
{{ end }}
</ul>
</td>
<td class="status-bar">
<div class="status">
<div class="failing">
<div class="warning" style="width: {{ .Summary.WarningWidth 200 }}px;">
<div class="passing" style="width: {{ .Summary.SuccessWidth 200 }}px;"></div>
<div class="warning" style="width: {{ $results.Summary.WarningWidth 200 }}px;">
<div class="passing" style="width: {{ $results.Summary.SuccessWidth 200 }}px;"></div>
</div>
</div>
</div>
Expand Down
8 changes: 4 additions & 4 deletions pkg/validator/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,11 @@ func (v *Validator) Handle(ctx context.Context, req types.Request) types.Respons
case "Deployment":
deploy := appsv1.Deployment{}
err = v.decoder.Decode(req, &deploy)
results = ValidateDeploys(v.Config, &deploy, Results{})
results = ValidateDeploys(v.Config, &deploy)
case "Pod":
pod := corev1.Pod{}
err = v.decoder.Decode(req, &pod)
results = ValidatePods(v.Config, &pod.Spec, Results{})
results = ValidatePods(v.Config, &pod.Spec)
}
if err != nil {
return admission.ErrorResponse(http.StatusBadRequest, err)
Expand All @@ -64,7 +64,7 @@ func (v *Validator) Handle(ctx context.Context, req types.Request) types.Respons
}

// ValidateDeploys validates that each deployment conforms to the Fairwinds config.
func ValidateDeploys(conf conf.Configuration, deploy *appsv1.Deployment, results Results) Results {
func ValidateDeploys(conf conf.Configuration, deploy *appsv1.Deployment) Results {
pod := deploy.Spec.Template.Spec
return ValidatePods(conf, &pod, results)
return ValidatePods(conf, &pod)
}
3 changes: 1 addition & 2 deletions pkg/validator/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@ func DeployHandler(w http.ResponseWriter, r *http.Request, c conf.Configuration)
return
}
for _, deploy := range deploys.Items {
result := ValidateDeploys(c, &deploy, Results{})
results = append(results, result)
results = append(results, ValidateDeploys(c, &deploy))
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
Expand Down
3 changes: 2 additions & 1 deletion pkg/validator/pod.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ import (
var log = logf.Log.WithName("Fairwinds Validator")

// ValidatePods validates that each pod conforms to the Fairwinds config.
func ValidatePods(conf conf.Configuration, pod *corev1.PodSpec, results Results) Results {
func ValidatePods(conf conf.Configuration, pod *corev1.PodSpec) Results {
results := Results{}
for _, container := range pod.InitContainers {
results.InitContainerValidations = append(
results.InitContainerValidations,
Expand Down
1 change: 1 addition & 0 deletions pkg/validator/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package validator

type NamespacedResult struct {
Namespace string
Summary *ResultSummary
Results []ResourceResult
}

Expand Down

0 comments on commit d906742

Please sign in to comment.