...
1
16
17 package hash
18
19 import (
20 "crypto/sha256"
21 "encoding/json"
22 "fmt"
23
24 "k8s.io/api/core/v1"
25 )
26
27
28
29 func ConfigMapHash(cm *v1.ConfigMap) (string, error) {
30 encoded, err := encodeConfigMap(cm)
31 if err != nil {
32 return "", err
33 }
34 h, err := encodeHash(hash(encoded))
35 if err != nil {
36 return "", err
37 }
38 return h, nil
39 }
40
41
42
43 func SecretHash(sec *v1.Secret) (string, error) {
44 encoded, err := encodeSecret(sec)
45 if err != nil {
46 return "", err
47 }
48 h, err := encodeHash(hash(encoded))
49 if err != nil {
50 return "", err
51 }
52 return h, nil
53 }
54
55
56
57 func encodeConfigMap(cm *v1.ConfigMap) (string, error) {
58
59 m := map[string]interface{}{
60 "kind": "ConfigMap",
61 "name": cm.Name,
62 "data": cm.Data,
63 }
64 if cm.Immutable != nil {
65 m["immutable"] = *cm.Immutable
66 }
67 if len(cm.BinaryData) > 0 {
68 m["binaryData"] = cm.BinaryData
69 }
70 data, err := json.Marshal(m)
71 if err != nil {
72 return "", err
73 }
74 return string(data), nil
75 }
76
77
78
79 func encodeSecret(sec *v1.Secret) (string, error) {
80 m := map[string]interface{}{
81 "kind": "Secret",
82 "type": sec.Type,
83 "name": sec.Name,
84 "data": sec.Data,
85 }
86 if sec.Immutable != nil {
87 m["immutable"] = *sec.Immutable
88 }
89
90 data, err := json.Marshal(m)
91 if err != nil {
92 return "", err
93 }
94 return string(data), nil
95 }
96
97
98
99
100
101
102
103
104
105 func encodeHash(hex string) (string, error) {
106 if len(hex) < 10 {
107 return "", fmt.Errorf("the hex string must contain at least 10 characters")
108 }
109 enc := []rune(hex[:10])
110 for i := range enc {
111 switch enc[i] {
112 case '0':
113 enc[i] = 'g'
114 case '1':
115 enc[i] = 'h'
116 case '3':
117 enc[i] = 'k'
118 case 'a':
119 enc[i] = 'm'
120 case 'e':
121 enc[i] = 't'
122 }
123 }
124 return string(enc), nil
125 }
126
127
128 func hash(data string) string {
129 return fmt.Sprintf("%x", sha256.Sum256([]byte(data)))
130 }
131
View as plain text