mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-06-14 10:30:59 +00:00
Add hash interface
This commit is contained in:
@@ -14,8 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Package hash generates hash strings from configmaps and secrets.
|
package k8sdeps
|
||||||
package hash
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
@@ -26,8 +25,16 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// KustHash compute hash for unstructured objects
|
||||||
|
type KustHash struct{}
|
||||||
|
|
||||||
|
// NewKustHash returns a KustHash object
|
||||||
|
func NewKustHash() *KustHash {
|
||||||
|
return &KustHash{}
|
||||||
|
}
|
||||||
|
|
||||||
// Hash returns a hash of either a ConfigMap or a Secret
|
// Hash returns a hash of either a ConfigMap or a Secret
|
||||||
func Hash(m map[string]interface{}) (string, error) {
|
func (h *KustHash) Hash(m map[string]interface{}) (string, error) {
|
||||||
u := unstructured.Unstructured{
|
u := unstructured.Unstructured{
|
||||||
Object: m,
|
Object: m,
|
||||||
}
|
}
|
||||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package hash
|
package k8sdeps
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"reflect"
|
"reflect"
|
||||||
@@ -29,7 +29,8 @@ func main() {
|
|||||||
|
|
||||||
if err := commands.NewDefaultCommand(
|
if err := commands.NewDefaultCommand(
|
||||||
k8sdeps.NewKustDecoder(),
|
k8sdeps.NewKustDecoder(),
|
||||||
k8sdeps.NewKustValidator()).Execute(); err != nil {
|
k8sdeps.NewKustValidator(),
|
||||||
|
k8sdeps.NewKustHash()).Execute(); err != nil {
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ Use different transformer configurations by passing files to kustomize
|
|||||||
// NewCmdBuild creates a new build command.
|
// NewCmdBuild creates a new build command.
|
||||||
func NewCmdBuild(
|
func NewCmdBuild(
|
||||||
out io.Writer, fs fs.FileSystem,
|
out io.Writer, fs fs.FileSystem,
|
||||||
decoder ifc.Decoder) *cobra.Command {
|
decoder ifc.Decoder, hash ifc.Hash) *cobra.Command {
|
||||||
var o buildOptions
|
var o buildOptions
|
||||||
var p string
|
var p string
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ func NewCmdBuild(
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return o.RunBuild(out, fs, decoder)
|
return o.RunBuild(out, fs, decoder, hash)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
cmd.Flags().StringVarP(
|
cmd.Flags().StringVarP(
|
||||||
@@ -119,7 +119,7 @@ func (o *buildOptions) Validate(args []string, p string, fs fs.FileSystem) error
|
|||||||
// RunBuild runs build command.
|
// RunBuild runs build command.
|
||||||
func (o *buildOptions) RunBuild(
|
func (o *buildOptions) RunBuild(
|
||||||
out io.Writer, fSys fs.FileSystem,
|
out io.Writer, fSys fs.FileSystem,
|
||||||
decoder ifc.Decoder) error {
|
decoder ifc.Decoder, hash ifc.Hash) error {
|
||||||
rootLoader, err := loader.NewLoader(o.kustomizationPath, "", fSys)
|
rootLoader, err := loader.NewLoader(o.kustomizationPath, "", fSys)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -128,7 +128,7 @@ func (o *buildOptions) RunBuild(
|
|||||||
kt, err := target.NewKustTarget(
|
kt, err := target.NewKustTarget(
|
||||||
rootLoader, fSys,
|
rootLoader, fSys,
|
||||||
makeTransformerconfig(fSys, o.transformerconfigPaths),
|
makeTransformerconfig(fSys, o.transformerconfigPaths),
|
||||||
decoder)
|
decoder, hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ func runBuildTestCase(t *testing.T, testcaseName string, updateKustomizeExpected
|
|||||||
kustomizationPath: testcase.Filename,
|
kustomizationPath: testcase.Filename,
|
||||||
}
|
}
|
||||||
buf := bytes.NewBuffer([]byte{})
|
buf := bytes.NewBuffer([]byte{})
|
||||||
err = ops.RunBuild(buf, fSys, k8sdeps.NewKustDecoder())
|
err = ops.RunBuild(buf, fSys, k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash())
|
||||||
switch {
|
switch {
|
||||||
case err != nil && len(testcase.ExpectedError) == 0:
|
case err != nil && len(testcase.ExpectedError) == 0:
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ import (
|
|||||||
|
|
||||||
// NewDefaultCommand returns the default (aka root) command for kustomize command.
|
// NewDefaultCommand returns the default (aka root) command for kustomize command.
|
||||||
func NewDefaultCommand(
|
func NewDefaultCommand(
|
||||||
decoder ifc.Decoder, validator ifc.Validator) *cobra.Command {
|
decoder ifc.Decoder, validator ifc.Validator, hash ifc.Hash) *cobra.Command {
|
||||||
fsys := fs.MakeRealFS()
|
fsys := fs.MakeRealFS()
|
||||||
stdOut := os.Stdout
|
stdOut := os.Stdout
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ See https://sigs.k8s.io/kustomize
|
|||||||
|
|
||||||
c.AddCommand(
|
c.AddCommand(
|
||||||
// TODO: Make consistent API for newCmd* functions.
|
// TODO: Make consistent API for newCmd* functions.
|
||||||
build.NewCmdBuild(stdOut, fsys, decoder),
|
build.NewCmdBuild(stdOut, fsys, decoder, hash),
|
||||||
edit.NewCmdEdit(fsys, validator),
|
edit.NewCmdEdit(fsys, validator),
|
||||||
misc.NewCmdConfig(fsys),
|
misc.NewCmdConfig(fsys),
|
||||||
misc.NewCmdVersion(stdOut),
|
misc.NewCmdVersion(stdOut),
|
||||||
|
|||||||
@@ -43,3 +43,8 @@ type Loader interface {
|
|||||||
// Cleanup cleans the loader
|
// Cleanup cleans the loader
|
||||||
Cleanup() error
|
Cleanup() error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hash interface provides function to compute hash of objects
|
||||||
|
type Hash interface {
|
||||||
|
Hash(m map[string]interface{}) (string, error)
|
||||||
|
}
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ import (
|
|||||||
type KustTarget struct {
|
type KustTarget struct {
|
||||||
kustomization *types.Kustomization
|
kustomization *types.Kustomization
|
||||||
decoder ifc.Decoder
|
decoder ifc.Decoder
|
||||||
|
hash ifc.Hash
|
||||||
ldr ifc.Loader
|
ldr ifc.Loader
|
||||||
fSys fs.FileSystem
|
fSys fs.FileSystem
|
||||||
tcfg *transformerconfig.TransformerConfig
|
tcfg *transformerconfig.TransformerConfig
|
||||||
@@ -53,7 +54,7 @@ type KustTarget struct {
|
|||||||
func NewKustTarget(
|
func NewKustTarget(
|
||||||
ldr ifc.Loader, fSys fs.FileSystem,
|
ldr ifc.Loader, fSys fs.FileSystem,
|
||||||
tcfg *transformerconfig.TransformerConfig,
|
tcfg *transformerconfig.TransformerConfig,
|
||||||
d ifc.Decoder) (*KustTarget, error) {
|
d ifc.Decoder, h ifc.Hash) (*KustTarget, error) {
|
||||||
content, err := ldr.Load(constants.KustomizationFileName)
|
content, err := ldr.Load(constants.KustomizationFileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -71,6 +72,7 @@ func NewKustTarget(
|
|||||||
fSys: fSys,
|
fSys: fSys,
|
||||||
tcfg: tcfg,
|
tcfg: tcfg,
|
||||||
decoder: d,
|
decoder: d,
|
||||||
|
hash: h,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,7 +99,7 @@ func (kt *KustTarget) MakeCustomizedResMap() (resmap.ResMap, error) {
|
|||||||
|
|
||||||
// resolveRefsToGeneratedResources fixes all name references.
|
// resolveRefsToGeneratedResources fixes all name references.
|
||||||
func (kt *KustTarget) resolveRefsToGeneratedResources(m resmap.ResMap) (resmap.ResMap, error) {
|
func (kt *KustTarget) resolveRefsToGeneratedResources(m resmap.ResMap) (resmap.ResMap, error) {
|
||||||
err := transformers.NewNameHashTransformer().Transform(m)
|
err := transformers.NewNameHashTransformer(kt.hash).Transform(m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -221,7 +223,7 @@ func (kt *KustTarget) loadCustomizedBases() (resmap.ResMap, *interror.Kustomizat
|
|||||||
errs.Append(errors.Wrap(err, "couldn't make ldr for "+path))
|
errs.Append(errors.Wrap(err, "couldn't make ldr for "+path))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
target, err := NewKustTarget(ldr, kt.fSys, kt.tcfg, kt.decoder)
|
target, err := NewKustTarget(ldr, kt.fSys, kt.tcfg, kt.decoder, kt.hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs.Append(errors.Wrap(err, "couldn't make target for "+path))
|
errs.Append(errors.Wrap(err, "couldn't make target for "+path))
|
||||||
continue
|
continue
|
||||||
@@ -250,7 +252,7 @@ func (kt *KustTarget) loadBasesAsFlatList() ([]*KustTarget, error) {
|
|||||||
errs.Append(err)
|
errs.Append(err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
target, err := NewKustTarget(ldr, kt.fSys, kt.tcfg, kt.decoder)
|
target, err := NewKustTarget(ldr, kt.fSys, kt.tcfg, kt.decoder, kt.hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs.Append(err)
|
errs.Append(err)
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ func TestResources1(t *testing.T) {
|
|||||||
fakeFs.Mkdir("/")
|
fakeFs.Mkdir("/")
|
||||||
kt, err := NewKustTarget(
|
kt, err := NewKustTarget(
|
||||||
l, fakeFs, transformerconfig.MakeDefaultTransformerConfig(),
|
l, fakeFs, transformerconfig.MakeDefaultTransformerConfig(),
|
||||||
k8sdeps.NewKustDecoder())
|
k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected construction error %v", err)
|
t.Fatalf("unexpected construction error %v", err)
|
||||||
}
|
}
|
||||||
@@ -233,7 +233,7 @@ func TestResourceNotFound(t *testing.T) {
|
|||||||
fakeFs.Mkdir("/")
|
fakeFs.Mkdir("/")
|
||||||
kt, err := NewKustTarget(
|
kt, err := NewKustTarget(
|
||||||
l, fakeFs, transformerconfig.MakeDefaultTransformerConfig(),
|
l, fakeFs, transformerconfig.MakeDefaultTransformerConfig(),
|
||||||
k8sdeps.NewKustDecoder())
|
k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Unexpected construction error %v", err)
|
t.Fatalf("Unexpected construction error %v", err)
|
||||||
}
|
}
|
||||||
@@ -256,7 +256,7 @@ func TestSecretTimeout(t *testing.T) {
|
|||||||
fakeFs.Mkdir("/")
|
fakeFs.Mkdir("/")
|
||||||
kt, err := NewKustTarget(
|
kt, err := NewKustTarget(
|
||||||
l, fakeFs, transformerconfig.MakeDefaultTransformerConfig(),
|
l, fakeFs, transformerconfig.MakeDefaultTransformerConfig(),
|
||||||
k8sdeps.NewKustDecoder())
|
k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Unexpected construction error %v", err)
|
t.Fatalf("Unexpected construction error %v", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,27 +19,29 @@ package transformers
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"sigs.k8s.io/kustomize/pkg/hash"
|
"sigs.k8s.io/kustomize/pkg/ifc"
|
||||||
"sigs.k8s.io/kustomize/pkg/resmap"
|
"sigs.k8s.io/kustomize/pkg/resmap"
|
||||||
"sigs.k8s.io/kustomize/pkg/resource"
|
"sigs.k8s.io/kustomize/pkg/resource"
|
||||||
)
|
)
|
||||||
|
|
||||||
// nameHashTransformer contains the prefix and the path config for each field that
|
// nameHashTransformer contains the prefix and the path config for each field that
|
||||||
// the name prefix will be applied.
|
// the name prefix will be applied.
|
||||||
type nameHashTransformer struct{}
|
type nameHashTransformer struct {
|
||||||
|
hash ifc.Hash
|
||||||
|
}
|
||||||
|
|
||||||
var _ Transformer = &nameHashTransformer{}
|
var _ Transformer = &nameHashTransformer{}
|
||||||
|
|
||||||
// NewNameHashTransformer construct a nameHashTransformer.
|
// NewNameHashTransformer construct a nameHashTransformer.
|
||||||
func NewNameHashTransformer() Transformer {
|
func NewNameHashTransformer(h ifc.Hash) Transformer {
|
||||||
return &nameHashTransformer{}
|
return &nameHashTransformer{hash: h}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Transform appends hash to configmaps and secrets.
|
// Transform appends hash to configmaps and secrets.
|
||||||
func (o *nameHashTransformer) Transform(m resmap.ResMap) error {
|
func (o *nameHashTransformer) Transform(m resmap.ResMap) error {
|
||||||
for _, res := range m {
|
for _, res := range m {
|
||||||
if res.IsGenerated() {
|
if res.IsGenerated() {
|
||||||
err := appendHash(res)
|
err := o.appendHash(res)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -48,8 +50,8 @@ func (o *nameHashTransformer) Transform(m resmap.ResMap) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func appendHash(res *resource.Resource) error {
|
func (o *nameHashTransformer) appendHash(res *resource.Resource) error {
|
||||||
h, err := hash.Hash(res.Object)
|
h, err := o.hash.Hash(res.Object)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"sigs.k8s.io/kustomize/internal/k8sdeps"
|
||||||
"sigs.k8s.io/kustomize/pkg/ifc"
|
"sigs.k8s.io/kustomize/pkg/ifc"
|
||||||
"sigs.k8s.io/kustomize/pkg/resid"
|
"sigs.k8s.io/kustomize/pkg/resid"
|
||||||
"sigs.k8s.io/kustomize/pkg/resmap"
|
"sigs.k8s.io/kustomize/pkg/resmap"
|
||||||
@@ -149,7 +150,7 @@ func TestNameHashTransformer(t *testing.T) {
|
|||||||
}).SetBehavior(ifc.BehaviorCreate),
|
}).SetBehavior(ifc.BehaviorCreate),
|
||||||
}
|
}
|
||||||
|
|
||||||
tran := NewNameHashTransformer()
|
tran := NewNameHashTransformer(k8sdeps.NewKustHash())
|
||||||
tran.Transform(objs)
|
tran.Transform(objs)
|
||||||
|
|
||||||
if !reflect.DeepEqual(objs, expected) {
|
if !reflect.DeepEqual(objs, expected) {
|
||||||
|
|||||||
Reference in New Issue
Block a user