Skip to content

Commit

Permalink
Fix renderer for subcommand all
Browse files Browse the repository at this point in the history
  • Loading branch information
nikhilsbhat committed Apr 3, 2023
1 parent 66e7d43 commit f25fcd3
Show file tree
Hide file tree
Showing 6 changed files with 206 additions and 68 deletions.
73 changes: 68 additions & 5 deletions pkg/deviation/deviation.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,24 @@ import (
"github.com/thoas/go-funk"
)

//nolint:varnamelen
const (
Failed = "FAILED"
Success = "SUCCESS"
Yes = "YES"
No = "NO"
)

type DriftedReleases struct {
// DriftedRelease holds drift information of the selected release/chart.
type DriftedRelease struct {
Chart string `json:"chart,omitempty" yaml:"chart,omitempty"`
Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"`
Release string `json:"release,omitempty" yaml:"release,omitempty"`
HasDrift bool `json:"has_drift,omitempty" yaml:"has_drift,omitempty"`
Deviations []Deviation `json:"deviations,omitempty" yaml:"deviations,omitempty"`
}

// Deviation holds drift information of all manifests from the selected release/chart.
type Deviation struct {
Deviations string `json:"deviations,omitempty" yaml:"deviations,omitempty"`
HasDrift bool `json:"has_drift,omitempty" yaml:"has_drift,omitempty"`
Expand All @@ -23,17 +31,70 @@ type Deviation struct {
ManifestPath string `json:"manifest_path,omitempty" yaml:"manifest_path,omitempty"`
}

type Deviations []Deviation
type (
Deviations []Deviation
DriftedReleases []DriftedRelease
)

// Drifted returns Yes if the release has Drifted.
func (dvn *DriftedRelease) Drifted() string {
if dvn.HasDrift {
return Yes
}

return No
}

// Status returns Failed if at least one of the release has Drifted.
func (dvn DriftedReleases) Status() string {
hasDrift := funk.Contains(dvn, func(dft DriftedRelease) bool {
return dft.HasDrift
})

if hasDrift {
return Failed
}

return Success
}

// Count returns total number of drifted release.
func (dvn DriftedReleases) Count() int {
var count int

for _, dft := range dvn {
if dft.HasDrift {
count++
}
}

return count
}

// Drifted returns Yes if at least one of the release has Drifted.
func (dvn *DriftedReleases) Drifted() string {
hasDrift := funk.Contains(*dvn, func(dft DriftedRelease) bool {
return dft.HasDrift
})

if hasDrift {
return Yes
}

return No
}

// Drifted returns Yes if at least one of the manifest from a release has Drifted.
func (dvn *Deviation) Drifted() string {
if dvn.HasDrift {
return "YES"
return Yes
}

return "NO"
return No
}

func (dvn Deviations) GetDriftAsMap(chart, release, time string) map[string]interface{} {
// GetDriftAsMap returns the map equivalent of drifted release configuration.
func (dvn *Deviations) GetDriftAsMap(chart, release, time string) map[string]interface{} {
return map[string]interface{}{
"drifts": dvn,
"total_drifts": dvn.Count(),
Expand All @@ -44,6 +105,7 @@ func (dvn Deviations) GetDriftAsMap(chart, release, time string) map[string]inte
}
}

// Status returns Failed if at least one of the manifest in release has Drifted.
func (dvn Deviations) Status() string {
hasDrift := funk.Contains(dvn, func(dft Deviation) bool {
return dft.HasDrift
Expand All @@ -56,6 +118,7 @@ func (dvn Deviations) Status() string {
return Success
}

// Count returns total number of drifts in release.
func (dvn Deviations) Count() int {
var count int

Expand Down
27 changes: 17 additions & 10 deletions pkg/diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,31 +7,38 @@ import (
"github.com/nikhilsbhat/helm-drift/pkg/deviation"
)

func (drift *Drift) Diff(driftedReleases deviation.DriftedReleases) (deviation.DriftedReleases, error) {
func (drift *Drift) Diff(driftedRelease deviation.DriftedRelease) (deviation.DriftedRelease, error) {
diffs := make([]deviation.Deviation, 0)

for _, devn := range driftedReleases.Deviations {
manifestPath := devn.ManifestPath
var drifted bool

for _, dvn := range driftedRelease.Deviations {
manifestPath := dvn.ManifestPath

drift.log.Debugf("calculating diff for %s", manifestPath)

arguments := []string{fmt.Sprintf("-f=%s", manifestPath)}

cmd := command.NewCommand("kubectl", drift.log)

cmd.SetKubeCmd(driftedReleases.Namespace, arguments...)
cmd.SetKubeCmd(driftedRelease.Namespace, arguments...)

dvn, err := cmd.RunKubeCmd(devn)
dft, err := cmd.RunKubeCmd(dvn)
if err != nil {
return driftedReleases, err
return driftedRelease, err
}

if dft.HasDrift {
drifted = dft.HasDrift
}

diffs = append(diffs, dvn)
diffs = append(diffs, dft)
}

driftedReleases.Deviations = diffs
driftedRelease.Deviations = diffs
driftedRelease.HasDrift = drifted

drift.log.Debug("ran diffs for all manifests successfully")
drift.log.Debugf("ran diffs for all manifests for release '%s' successfully", driftedRelease.Release)

return driftedReleases, nil
return driftedRelease, nil
}
6 changes: 4 additions & 2 deletions pkg/disk.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@ const (
manifestFilePermission = 0o644
)

func (drift *Drift) renderToDisk(manifests []string, releaseName, releaseNamespace any) (deviation.DriftedReleases, error) {
releaseDrifted := deviation.DriftedReleases{
func (drift *Drift) renderToDisk(manifests []string, chartName, releaseName, releaseNamespace any) (deviation.DriftedRelease, error) {
releaseDrifted := deviation.DriftedRelease{
Namespace: releaseNamespace.(string),
Release: releaseName.(string),
Chart: chartName.(string),
}

templatePath := filepath.Join(drift.TempPath, drift.release)
Expand Down
4 changes: 2 additions & 2 deletions pkg/drift.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ func (drift *Drift) GetDrift() error {

kubeKindTemplates := drift.getTemplates(chart)

deviations, err := drift.renderToDisk(kubeKindTemplates, drift.release, drift.namespace)
deviations, err := drift.renderToDisk(kubeKindTemplates, drift.chart, drift.release, drift.namespace)
if err != nil {
return err
}
Expand All @@ -97,7 +97,7 @@ func (drift *Drift) GetDrift() error {
}
}(drift)

var driftedReleases []deviation.DriftedReleases
var driftedReleases []deviation.DriftedRelease

out, err := drift.Diff(deviations)
if err != nil {
Expand Down
27 changes: 10 additions & 17 deletions pkg/drift_all.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package pkg

import (
"encoding/json"
"fmt"
"time"

"github.com/nikhilsbhat/helm-drift/pkg/deviation"
Expand All @@ -23,7 +21,7 @@ func (drift *Drift) GetAllDrift() error {
return err
}

charts, err := drift.getChartsFromReleases()
releases, err := drift.getChartsFromReleases()
if err != nil {
return err
}
Expand All @@ -34,12 +32,14 @@ func (drift *Drift) GetAllDrift() error {
}
}(drift)

chartsDeviations := make(map[string]deviation.DriftedReleases)
driftedReleases := make([]deviation.DriftedRelease, 0)

for _, chart := range charts {
kubeKindTemplates := drift.getTemplates([]byte(chart.Manifest))
for _, release := range releases {
drift.log.Debugf("identifying drifts for release '%s'", release.Name)

deviations, err := drift.renderToDisk(kubeKindTemplates, chart.Name, chart.Namespace)
kubeKindTemplates := drift.getTemplates([]byte(release.Manifest))

deviations, err := drift.renderToDisk(kubeKindTemplates, "", release.Name, release.Namespace)
if err != nil {
return err
}
Expand All @@ -50,22 +50,15 @@ func (drift *Drift) GetAllDrift() error {
}

if len(out.Deviations) == 0 {
drift.log.Infof("no drifts identified for relase '%s'", chart.Name)
drift.log.Infof("no drifts identified for relase '%s'", release.Name)

continue
}

chartsDeviations[chart.Name] = out
driftedReleases = append(driftedReleases, out)
}

drift.timeSpent = time.Since(startTime).Seconds()

jsonOut, err := json.MarshalIndent(chartsDeviations, "", " ")
if err != nil {
return err
}

fmt.Println(string(jsonOut))

return nil
return drift.render(driftedReleases)
}
Loading

0 comments on commit f25fcd3

Please sign in to comment.