Skip to content

Commit 622370b

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

File tree

8 files changed

+104
-27
lines changed

8 files changed

+104
-27
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: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,28 +86,33 @@ func releaseCmd() *cobra.Command {
8686
}
8787

8888
func (d *release) differentiateHelm3() error {
89-
releaseResponse1, err := getRelease(d.releases[0], "")
89+
namespace := os.Getenv("HELM_NAMESPACE")
90+
excludes := []string{helm3TestHook, helm2TestSuccessHook}
91+
if d.includeTests {
92+
excludes = []string{}
93+
}
94+
releaseResponse1, err := getRelease(d.releases[0], namespace)
9095
if err != nil {
9196
return err
9297
}
93-
releaseChart1, err := getChart(d.releases[0], "")
98+
releaseChart1, err := getChart(d.releases[0], namespace)
9499
if err != nil {
95100
return err
96101
}
97102

98-
releaseResponse2, err := getRelease(d.releases[1], "")
103+
releaseResponse2, err := getRelease(d.releases[1], namespace)
99104
if err != nil {
100105
return err
101106
}
102-
releaseChart2, err := getChart(d.releases[1], "")
107+
releaseChart2, err := getChart(d.releases[1], namespace)
103108
if err != nil {
104109
return err
105110
}
106111

107112
if releaseChart1 == releaseChart2 {
108113
seenAnyChanges := diff.Releases(
109-
manifest.Parse(string(releaseResponse1), ""),
110-
manifest.Parse(string(releaseResponse2), ""),
114+
manifest.Parse(string(releaseResponse1), namespace, excludes...),
115+
manifest.Parse(string(releaseResponse2), namespace, excludes...),
111116
d.suppressedKinds,
112117
d.outputContext,
113118
os.Stdout)

cmd/revision.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,23 +96,28 @@ func revisionCmd() *cobra.Command {
9696
}
9797

9898
func (d *revision) differentiateHelm3() error {
99+
namespace := os.Getenv("HELM_NAMESPACE")
100+
excludes := []string{helm3TestHook, helm2TestSuccessHook}
101+
if d.includeTests {
102+
excludes = []string{}
103+
}
99104
switch len(d.revisions) {
100105
case 1:
101-
releaseResponse, err := getRelease(d.release, "")
106+
releaseResponse, err := getRelease(d.release, namespace)
102107

103108
if err != nil {
104109
return err
105110
}
106111

107112
revision, _ := strconv.Atoi(d.revisions[0])
108-
revisionResponse, err := getRevision(d.release, revision, "")
113+
revisionResponse, err := getRevision(d.release, revision, namespace)
109114
if err != nil {
110115
return err
111116
}
112117

113118
diff.Manifests(
114-
manifest.Parse(string(revisionResponse), ""),
115-
manifest.Parse(string(releaseResponse), ""),
119+
manifest.Parse(string(revisionResponse), namespace, excludes...),
120+
manifest.Parse(string(releaseResponse), namespace, excludes...),
116121
d.suppressedKinds,
117122
d.outputContext,
118123
os.Stdout)
@@ -124,19 +129,19 @@ func (d *revision) differentiateHelm3() error {
124129
revision1, revision2 = revision2, revision1
125130
}
126131

127-
revisionResponse1, err := getRevision(d.release, revision1, "")
132+
revisionResponse1, err := getRevision(d.release, revision1, namespace)
128133
if err != nil {
129134
return prettyError(err)
130135
}
131136

132-
revisionResponse2, err := getRevision(d.release, revision2, "")
137+
revisionResponse2, err := getRevision(d.release, revision2, namespace)
133138
if err != nil {
134139
return prettyError(err)
135140
}
136141

137142
seenAnyChanges := diff.Manifests(
138-
manifest.Parse(string(revisionResponse1), ""),
139-
manifest.Parse(string(revisionResponse2), ""),
143+
manifest.Parse(string(revisionResponse1), namespace, excludes...),
144+
manifest.Parse(string(revisionResponse2), namespace, excludes...),
140145
d.suppressedKinds,
141146
d.outputContext,
142147
os.Stdout)

cmd/rollback.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,24 +88,29 @@ func rollbackCmd() *cobra.Command {
8888
}
8989

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

9499
if err != nil {
95100
return err
96101
}
97102

98103
// get manifest of the release to rollback
99104
revision, _ := strconv.Atoi(d.revisions[0])
100-
revisionResponse, err := getRevision(d.release, revision, "")
105+
revisionResponse, err := getRevision(d.release, revision, namespace)
101106
if err != nil {
102107
return err
103108
}
104109

105110
// create a diff between the current manifest and the version of the manifest that a user is intended to rollback
106111
seenAnyChanges := diff.Manifests(
107-
manifest.Parse(string(releaseResponse), ""),
108-
manifest.Parse(string(revisionResponse), ""),
112+
manifest.Parse(string(releaseResponse), namespace, excludes...),
113+
manifest.Parse(string(revisionResponse), namespace, excludes...),
109114
d.suppressedKinds,
110115
d.outputContext,
111116
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)