diff --git a/pkg/hash/hash.go b/pkg/hash/hash.go index bdd277bd2..6ec1b13a6 100644 --- a/pkg/hash/hash.go +++ b/pkg/hash/hash.go @@ -23,8 +23,34 @@ import ( "fmt" "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" ) +// Hash returns a hash of either a ConfigMap or a Secret +func Hash(m map[string]interface{}) (string, error) { + u := unstructured.Unstructured{ + Object: m, + } + kind := u.GetKind() + switch kind { + case "ConfigMap": + cm, err := unstructuredToConfigmap(u) + if err != nil { + return "", err + } + return ConfigMapHash(cm) + case "Secret": + sec, err := unstructuredToSecret(u) + + if err != nil { + return "", err + } + return SecretHash(sec) + default: + return "", fmt.Errorf("Type %s is supported for hashing in %v", kind, m) + } +} + // ConfigMapHash returns a hash of the ConfigMap. // The Data, Kind, and Name are taken into account. func ConfigMapHash(cm *v1.ConfigMap) (string, error) { @@ -113,3 +139,23 @@ func encodeHash(hex string) (string, error) { func hash(data string) string { return fmt.Sprintf("%x", sha256.Sum256([]byte(data))) } + +func unstructuredToConfigmap(u unstructured.Unstructured) (*v1.ConfigMap, error) { + marshaled, err := json.Marshal(u.Object) + if err != nil { + return nil, err + } + var out v1.ConfigMap + err = json.Unmarshal(marshaled, &out) + return &out, err +} + +func unstructuredToSecret(u unstructured.Unstructured) (*v1.Secret, error) { + marshaled, err := json.Marshal(u.Object) + if err != nil { + return nil, err + } + var out v1.Secret + err = json.Unmarshal(marshaled, &out) + return &out, err +} diff --git a/pkg/transformers/namehash.go b/pkg/transformers/namehash.go index 1ccc616c8..b0be424b4 100644 --- a/pkg/transformers/namehash.go +++ b/pkg/transformers/namehash.go @@ -17,11 +17,8 @@ limitations under the License. package transformers import ( - "encoding/json" "fmt" - "k8s.io/api/core/v1" - "sigs.k8s.io/kustomize/pkg/gvk" "sigs.k8s.io/kustomize/pkg/hash" "sigs.k8s.io/kustomize/pkg/resmap" "sigs.k8s.io/kustomize/pkg/resource" @@ -40,32 +37,19 @@ func NewNameHashTransformer() Transformer { // Transform appends hash to configmaps and secrets. func (o *nameHashTransformer) Transform(m resmap.ResMap) error { - for id, res := range m { + for _, res := range m { if res.IsGenerated() { - switch { - case id.Gvk().IsSelected(&gvk.Gvk{Version: "v1", Kind: "ConfigMap"}): - err := appendHashForConfigMap(res) - if err != nil { - return err - } - - case id.Gvk().IsSelected(&gvk.Gvk{Version: "v1", Kind: "Secret"}): - err := appendHashForSecret(res) - if err != nil { - return err - } + err := appendHash(res) + if err != nil { + return err } } } return nil } -func appendHashForConfigMap(res *resource.Resource) error { - cm, err := unstructuredToConfigmap(res) - if err != nil { - return err - } - h, err := hash.ConfigMapHash(cm) +func appendHash(res *resource.Resource) error { + h, err := hash.Hash(res.Object) if err != nil { return err } @@ -73,39 +57,3 @@ func appendHashForConfigMap(res *resource.Resource) error { res.SetName(nameWithHash) return nil } - -// TODO: Remove this function after we support hash unstructured objects -func unstructuredToConfigmap(res *resource.Resource) (*v1.ConfigMap, error) { - marshaled, err := json.Marshal(res) - if err != nil { - return nil, err - } - var out v1.ConfigMap - err = json.Unmarshal(marshaled, &out) - return &out, err -} - -func appendHashForSecret(res *resource.Resource) error { - secret, err := unstructuredToSecret(res) - if err != nil { - return err - } - h, err := hash.SecretHash(secret) - if err != nil { - return err - } - nameWithHash := fmt.Sprintf("%s-%s", res.GetName(), h) - res.SetName(nameWithHash) - return nil -} - -// TODO: Remove this function after we support hash unstructured objects -func unstructuredToSecret(res *resource.Resource) (*v1.Secret, error) { - marshaled, err := json.Marshal(res) - if err != nil { - return nil, err - } - var out v1.Secret - err = json.Unmarshal(marshaled, &out) - return &out, err -}