Skip to content

Commit 2448af6

Browse files
Support --include-tests in helm3 mode
Signed-off-by: Jonas Rutishauser <[email protected]>
1 parent a990cba commit 2448af6

File tree

8 files changed

+107
-36
lines changed

8 files changed

+107
-36
lines changed

cmd/helpers.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ const (
1616
tlsCaCertDefault = "$HELM_HOME/ca.pem"
1717
tlsCertDefault = "$HELM_HOME/cert.pem"
1818
tlsKeyDefault = "$HELM_HOME/key.pem"
19+
20+
helm2TestSuccessHook = "test-success"
21+
helm3TestHook = "test"
1922
)
2023

2124
var (

cmd/release.go

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,7 @@ func releaseCmd() *cobra.Command {
7373
releaseCmd.Flags().BoolP("suppress-secrets", "q", false, "suppress secrets in the output")
7474
releaseCmd.Flags().StringArrayVar(&diff.suppressedKinds, "suppress", []string{}, "allows suppression of the values listed in the diff output")
7575
releaseCmd.Flags().IntVarP(&diff.outputContext, "context", "C", -1, "output NUM lines of context around changes")
76-
if !isHelm3() {
77-
releaseCmd.Flags().BoolVar(&diff.includeTests, "include-tests", false, "enable the diffing of the helm test hooks")
78-
}
76+
releaseCmd.Flags().BoolVar(&diff.includeTests, "include-tests", false, "enable the diffing of the helm test hooks")
7977
releaseCmd.SuggestionsMinimumDistance = 1
8078

8179
if !isHelm3() {
@@ -86,28 +84,33 @@ func releaseCmd() *cobra.Command {
8684
}
8785

8886
func (d *release) differentiateHelm3() error {
89-
releaseResponse1, err := getRelease(d.releases[0], "")
87+
namespace := os.Getenv("HELM_NAMESPACE")
88+
excludes := []string{helm3TestHook, helm2TestSuccessHook}
89+
if d.includeTests {
90+
excludes = []string{}
91+
}
92+
releaseResponse1, err := getRelease(d.releases[0], namespace)
9093
if err != nil {
9194
return err
9295
}
93-
releaseChart1, err := getChart(d.releases[0], "")
96+
releaseChart1, err := getChart(d.releases[0], namespace)
9497
if err != nil {
9598
return err
9699
}
97100

98-
releaseResponse2, err := getRelease(d.releases[1], "")
101+
releaseResponse2, err := getRelease(d.releases[1], namespace)
99102
if err != nil {
100103
return err
101104
}
102-
releaseChart2, err := getChart(d.releases[1], "")
105+
releaseChart2, err := getChart(d.releases[1], namespace)
103106
if err != nil {
104107
return err
105108
}
106109

107110
if releaseChart1 == releaseChart2 {
108111
seenAnyChanges := diff.Releases(
109-
manifest.Parse(string(releaseResponse1), ""),
110-
manifest.Parse(string(releaseResponse2), ""),
112+
manifest.Parse(string(releaseResponse1), namespace, excludes...),
113+
manifest.Parse(string(releaseResponse2), namespace, excludes...),
111114
d.suppressedKinds,
112115
d.outputContext,
113116
os.Stdout)

cmd/revision.go

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,7 @@ func revisionCmd() *cobra.Command {
8383
revisionCmd.Flags().BoolP("suppress-secrets", "q", false, "suppress secrets in the output")
8484
revisionCmd.Flags().StringArrayVar(&diff.suppressedKinds, "suppress", []string{}, "allows suppression of the values listed in the diff output")
8585
revisionCmd.Flags().IntVarP(&diff.outputContext, "context", "C", -1, "output NUM lines of context around changes")
86-
if !isHelm3() {
87-
revisionCmd.Flags().BoolVar(&diff.includeTests, "include-tests", false, "enable the diffing of the helm test hooks")
88-
}
86+
revisionCmd.Flags().BoolVar(&diff.includeTests, "include-tests", false, "enable the diffing of the helm test hooks")
8987
revisionCmd.SuggestionsMinimumDistance = 1
9088

9189
if !isHelm3() {
@@ -96,23 +94,28 @@ func revisionCmd() *cobra.Command {
9694
}
9795

9896
func (d *revision) differentiateHelm3() error {
97+
namespace := os.Getenv("HELM_NAMESPACE")
98+
excludes := []string{helm3TestHook, helm2TestSuccessHook}
99+
if d.includeTests {
100+
excludes = []string{}
101+
}
99102
switch len(d.revisions) {
100103
case 1:
101-
releaseResponse, err := getRelease(d.release, "")
104+
releaseResponse, err := getRelease(d.release, namespace)
102105

103106
if err != nil {
104107
return err
105108
}
106109

107110
revision, _ := strconv.Atoi(d.revisions[0])
108-
revisionResponse, err := getRevision(d.release, revision, "")
111+
revisionResponse, err := getRevision(d.release, revision, namespace)
109112
if err != nil {
110113
return err
111114
}
112115

113116
diff.Manifests(
114-
manifest.Parse(string(revisionResponse), ""),
115-
manifest.Parse(string(releaseResponse), ""),
117+
manifest.Parse(string(revisionResponse), namespace, excludes...),
118+
manifest.Parse(string(releaseResponse), namespace, excludes...),
116119
d.suppressedKinds,
117120
d.outputContext,
118121
os.Stdout)
@@ -124,19 +127,19 @@ func (d *revision) differentiateHelm3() error {
124127
revision1, revision2 = revision2, revision1
125128
}
126129

127-
revisionResponse1, err := getRevision(d.release, revision1, "")
130+
revisionResponse1, err := getRevision(d.release, revision1, namespace)
128131
if err != nil {
129132
return prettyError(err)
130133
}
131134

132-
revisionResponse2, err := getRevision(d.release, revision2, "")
135+
revisionResponse2, err := getRevision(d.release, revision2, namespace)
133136
if err != nil {
134137
return prettyError(err)
135138
}
136139

137140
seenAnyChanges := diff.Manifests(
138-
manifest.Parse(string(revisionResponse1), ""),
139-
manifest.Parse(string(revisionResponse2), ""),
141+
manifest.Parse(string(revisionResponse1), namespace, excludes...),
142+
manifest.Parse(string(revisionResponse2), namespace, excludes...),
140143
d.suppressedKinds,
141144
d.outputContext,
142145
os.Stdout)

cmd/rollback.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,7 @@ func rollbackCmd() *cobra.Command {
7575
rollbackCmd.Flags().BoolP("suppress-secrets", "q", false, "suppress secrets in the output")
7676
rollbackCmd.Flags().StringArrayVar(&diff.suppressedKinds, "suppress", []string{}, "allows suppression of the values listed in the diff output")
7777
rollbackCmd.Flags().IntVarP(&diff.outputContext, "context", "C", -1, "output NUM lines of context around changes")
78-
if !isHelm3() {
79-
rollbackCmd.Flags().BoolVar(&diff.includeTests, "include-tests", false, "enable the diffing of the helm test hooks")
80-
}
78+
rollbackCmd.Flags().BoolVar(&diff.includeTests, "include-tests", false, "enable the diffing of the helm test hooks")
8179
rollbackCmd.SuggestionsMinimumDistance = 1
8280

8381
if !isHelm3() {
@@ -88,24 +86,29 @@ func rollbackCmd() *cobra.Command {
8886
}
8987

9088
func (d *rollback) backcastHelm3() error {
89+
namespace := os.Getenv("HELM_NAMESPACE")
90+
excludes := []string{helm3TestHook, helm2TestSuccessHook}
91+
if d.includeTests {
92+
excludes = []string{}
93+
}
9194
// get manifest of the latest release
92-
releaseResponse, err := getRelease(d.release, "")
95+
releaseResponse, err := getRelease(d.release, namespace)
9396

9497
if err != nil {
9598
return err
9699
}
97100

98101
// get manifest of the release to rollback
99102
revision, _ := strconv.Atoi(d.revisions[0])
100-
revisionResponse, err := getRevision(d.release, revision, "")
103+
revisionResponse, err := getRevision(d.release, revision, namespace)
101104
if err != nil {
102105
return err
103106
}
104107

105108
// create a diff between the current manifest and the version of the manifest that a user is intended to rollback
106109
seenAnyChanges := diff.Manifests(
107-
manifest.Parse(string(releaseResponse), ""),
108-
manifest.Parse(string(revisionResponse), ""),
110+
manifest.Parse(string(releaseResponse), namespace, excludes...),
111+
manifest.Parse(string(revisionResponse), namespace, excludes...),
109112
d.suppressedKinds,
110113
d.outputContext,
111114
os.Stdout)

cmd/upgrade.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,7 @@ func newChartCommand() *cobra.Command {
9191
f.BoolVar(&diff.resetValues, "reset-values", false, "reset the values to the ones built into the chart and merge in any new values")
9292
f.BoolVar(&diff.allowUnreleased, "allow-unreleased", false, "enables diffing of releases that are not yet deployed via Helm")
9393
f.BoolVar(&diff.noHooks, "no-hooks", false, "disable diffing of hooks")
94-
if !isHelm3() {
95-
f.BoolVar(&diff.includeTests, "include-tests", false, "enable the diffing of the helm test hooks")
96-
}
94+
f.BoolVar(&diff.includeTests, "include-tests", false, "enable the diffing of the helm test hooks")
9795
f.BoolVar(&diff.devel, "devel", false, "use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored.")
9896
f.StringArrayVar(&diff.suppressedKinds, "suppress", []string{}, "allows suppression of the values listed in the diff output")
9997
f.IntVarP(&diff.outputContext, "context", "C", -1, "output NUM lines of context around changes")
@@ -141,9 +139,18 @@ func (d *diffCmd) runHelm3() error {
141139
}
142140
releaseManifest = append(releaseManifest, hooks...)
143141
}
144-
currentSpecs = manifest.Parse(string(releaseManifest), d.namespace)
142+
if d.includeTests {
143+
currentSpecs = manifest.Parse(string(releaseManifest), d.namespace)
144+
} else {
145+
currentSpecs = manifest.Parse(string(releaseManifest), d.namespace, helm3TestHook, helm2TestSuccessHook)
146+
}
147+
}
148+
var newSpecs map[string]*manifest.MappingResult
149+
if d.includeTests {
150+
newSpecs = manifest.Parse(string(installManifest), d.namespace)
151+
} else {
152+
newSpecs = manifest.Parse(string(installManifest), d.namespace, helm3TestHook, helm2TestSuccessHook)
145153
}
146-
newSpecs := manifest.Parse(string(installManifest), d.namespace)
147154

148155
seenAnyChanges := diff.Manifests(currentSpecs, newSpecs, d.suppressedKinds, d.outputContext, os.Stdout)
149156

manifest/parse.go

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ import (
1111
"k8s.io/helm/pkg/proto/hapi/release"
1212
)
1313

14+
const (
15+
hookAnnotation = "helm.sh/hook"
16+
)
17+
1418
var yamlSeperator = []byte("\n---\n")
1519

1620
// MappingResult to store result of diff
@@ -24,8 +28,9 @@ type metadata struct {
2428
APIVersion string `yaml:"apiVersion"`
2529
Kind string
2630
Metadata struct {
27-
Namespace string
28-
Name string
31+
Namespace string
32+
Name string
33+
Annotations map[string]string
2934
}
3035
}
3136

@@ -78,7 +83,7 @@ func ParseRelease(release *release.Release, includeTests bool) map[string]*Mappi
7883
}
7984

8085
// Parse parses manifest strings into MappingResult
81-
func Parse(manifest string, defaultNamespace string) map[string]*MappingResult {
86+
func Parse(manifest string, defaultNamespace string, excludedHooks ...string) map[string]*MappingResult {
8287
scanner := bufio.NewScanner(strings.NewReader(manifest))
8388
scanner.Split(scanYamlSpecs)
8489
//Allow for tokens (specs) up to 1M in size
@@ -100,7 +105,10 @@ func Parse(manifest string, defaultNamespace string) map[string]*MappingResult {
100105

101106
//Skip content without any metadata. It is probably a template that
102107
//only contains comments in the current state.
103-
if (metadata{}) == parsedMetadata {
108+
if parsedMetadata.APIVersion == "" && parsedMetadata.Kind == "" {
109+
continue
110+
}
111+
if isHook(parsedMetadata, excludedHooks...) {
104112
continue
105113
}
106114

@@ -124,6 +132,15 @@ func Parse(manifest string, defaultNamespace string) map[string]*MappingResult {
124132
return result
125133
}
126134

135+
func isHook(metadata metadata, hooks ...string) bool {
136+
for _, hook := range hooks {
137+
if metadata.Metadata.Annotations[hookAnnotation] == hook {
138+
return true
139+
}
140+
}
141+
return false
142+
}
143+
127144
func isTestHook(hookEvents []release.Hook_Event) bool {
128145
for _, event := range hookEvents {
129146
if event == release.Hook_RELEASE_TEST_FAILURE || event == release.Hook_RELEASE_TEST_SUCCESS {

manifest/parse_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,26 @@ func TestPodNamespace(t *testing.T) {
3939
)
4040
}
4141

42+
func TestPodHook(t *testing.T) {
43+
spec, err := ioutil.ReadFile("testdata/pod_hook.yaml")
44+
require.NoError(t, err)
45+
46+
require.Equal(t,
47+
[]string{"default, nginx, Pod (v1)"},
48+
foundObjects(Parse(string(spec), "default")),
49+
)
50+
51+
require.Equal(t,
52+
[]string{"default, nginx, Pod (v1)"},
53+
foundObjects(Parse(string(spec), "default", "test-success")),
54+
)
55+
56+
require.Equal(t,
57+
[]string{},
58+
foundObjects(Parse(string(spec), "default", "test")),
59+
)
60+
}
61+
4262
func TestDeployV1(t *testing.T) {
4363
spec, err := ioutil.ReadFile("testdata/deploy_v1.yaml")
4464
require.NoError(t, err)

manifest/testdata/pod_hook.yaml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
---
3+
# Source: nginx/pod.yaml
4+
apiVersion: v1
5+
kind: Pod
6+
metadata:
7+
name: nginx
8+
annotations:
9+
helm.sh/hook: test
10+
spec:
11+
containers:
12+
- name: nginx
13+
image: nginx:1.7.9
14+
ports:
15+
- containerPort: 80

0 commit comments

Comments
 (0)