Skip to content

Commit

Permalink
Use the stable directory for storing temporary charts and values files
Browse files Browse the repository at this point in the history
so that helmfile-diff output becomes stables and terraform plan doesn't break.
See roboll/helmfile#1622 for more information.
  • Loading branch information
mumoshu committed Jan 1, 2021
1 parent 49352e1 commit 389eee7
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 0 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ go 1.13

require (
github.com/Masterminds/semver v1.5.0
github.com/davecgh/go-spew v1.1.1
github.com/hashicorp/terraform-plugin-sdk v1.0.0
github.com/mitchellh/go-linereader v0.0.0-20190213213312-1b945b3263eb
github.com/mumoshu/shoal v0.2.14
Expand Down
25 changes: 25 additions & 0 deletions pkg/helmfile/hash.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package helmfile

import (
"fmt"
"github.com/davecgh/go-spew/spew"
"hash/fnv"
)

func HashObject(obj interface{}) (string, error) {
hash := fnv.New32a()

hash.Reset()

printer := spew.ConfigState{
Indent: " ",
SortKeys: true,
DisableMethods: true,
SpewKeys: true,
}
printer.Fprintf(hash, "%#v", obj)

sum := fmt.Sprint(hash.Sum32())

return SafeEncodeString(sum), nil
}
24 changes: 24 additions & 0 deletions pkg/helmfile/release_set.go
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,30 @@ func runDiff(fs *ReleaseSet, conf DiffConfig) (*State, error) {
return nil, err
}

// Use the stable directory for storing temporary charts and values files
// so that helmfile-diff output becomes stables and terraform plan doesn't break.
// See https://github.com/roboll/helmfile/pull/1622

hash, err := HashObject(fs)
if err != nil {
return nil, xerrors.Errorf("computing hash of object: %w", err)
}

tempDir := filepath.Join(".terraform", "helmfile", fmt.Sprintf("temp-%s", hash))

if info, _ := os.Stat(tempDir); info != nil {
if err := os.RemoveAll(tempDir); err != nil {
return nil, xerrors.Errorf("removing stable temp directory %s: %w", tempDir, err)
}
}

if err := os.MkdirAll(tempDir, 0755); err != nil {
return nil, xerrors.Errorf("creating temp directory for helmfile and chartify %s: %w", tempDir, err)
}

cmd.Env = append(cmd.Env, "HELMFILE_TEMPDIR="+tempDir)
cmd.Env = append(cmd.Env, "CHARTIFY_TEMPDIR="+tempDir)

if conf.Kubeconfig != "" {
cmd.Env = append(cmd.Env, "KUBECONFIG="+conf.Kubeconfig)
}
Expand Down
30 changes: 30 additions & 0 deletions pkg/helmfile/safe_encode_string.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
Copyright 2015 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// See k8s.io/apimachinery/pkg/util/rand/rand.go
package helmfile

const (
// We omit vowels from the set of available characters to reduce the chances
// of "bad words" being formed.
alphanums = "bcdfghjklmnpqrstvwxz2456789"
)

// SafeEncodeString encodes s using the same characters as rand.String. This reduces the chances of bad words and
// ensures that strings generated from hash functions appear consistent throughout the API.
func SafeEncodeString(s string) string {
r := make([]byte, len(s))
for i, b := range []rune(s) {
r[i] = alphanums[(int(b) % len(alphanums))]
}
return string(r)
}

0 comments on commit 389eee7

Please sign in to comment.