96 lines
1.6 KiB
Go
96 lines
1.6 KiB
Go
package state
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"hash/fnv"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/davecgh/go-spew/spew"
|
|
"k8s.io/apimachinery/pkg/util/rand"
|
|
|
|
"github.com/helmfile/helmfile/pkg/envvar"
|
|
)
|
|
|
|
func createTempValuesFile(release *ReleaseSpec, data any) (*os.File, error) {
|
|
p, err := tempValuesFilePath(release, data)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
f, err := os.Create(*p)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return f, nil
|
|
}
|
|
|
|
func tempValuesFilePath(release *ReleaseSpec, data any) (*string, error) {
|
|
id, err := generateValuesID(release, data)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
workDir := os.Getenv(envvar.TempDir)
|
|
if workDir == "" {
|
|
workDir, err = os.MkdirTemp(os.TempDir(), "helmfile")
|
|
} else {
|
|
err = os.MkdirAll(workDir, os.FileMode(0700))
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
d := filepath.Join(workDir, id)
|
|
|
|
_, err = os.Stat(d)
|
|
if err != nil && !errors.Is(err, os.ErrNotExist) {
|
|
return nil, err
|
|
}
|
|
|
|
return &d, nil
|
|
}
|
|
|
|
func generateValuesID(release *ReleaseSpec, data any) (string, error) {
|
|
var id []string
|
|
|
|
if release.Namespace != "" {
|
|
id = append(id, release.Namespace)
|
|
}
|
|
|
|
id = append(id, release.Name, "values")
|
|
|
|
hash, err := HashObject([]any{release, data})
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
id = append(id, hash)
|
|
|
|
return strings.Join(id, "-"), nil
|
|
}
|
|
|
|
func HashObject(obj any) (string, error) {
|
|
hash := fnv.New32a()
|
|
|
|
hash.Reset()
|
|
|
|
printer := spew.ConfigState{
|
|
Indent: " ",
|
|
SortKeys: true,
|
|
DisableMethods: true,
|
|
SpewKeys: true,
|
|
}
|
|
_, err := printer.Fprintf(hash, "%#v", obj)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
sum := fmt.Sprint(hash.Sum32())
|
|
|
|
return rand.SafeEncodeString(sum), nil
|
|
}
|