Merge pull request #418 from Liujingfang1/hash

combine HashComfigMap and HashSecret to Hash
This commit is contained in:
Jeff Regan
2018-10-05 12:58:31 -07:00
committed by GitHub
2 changed files with 52 additions and 58 deletions

View File

@@ -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
}

View File

@@ -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
}