diff --git a/pkg/hash/hash.go b/internal/k8sdeps/hash.go similarity index 94% rename from pkg/hash/hash.go rename to internal/k8sdeps/hash.go index 6ec1b13a6..fcdd353cb 100644 --- a/pkg/hash/hash.go +++ b/internal/k8sdeps/hash.go @@ -14,8 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Package hash generates hash strings from configmaps and secrets. -package hash +package k8sdeps import ( "crypto/sha256" @@ -26,8 +25,16 @@ import ( "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 -func Hash(m map[string]interface{}) (string, error) { +func (h *KustHash) Hash(m map[string]interface{}) (string, error) { u := unstructured.Unstructured{ Object: m, } diff --git a/pkg/hash/hash_test.go b/internal/k8sdeps/hash_test.go similarity index 99% rename from pkg/hash/hash_test.go rename to internal/k8sdeps/hash_test.go index 603956376..e0bf1d261 100644 --- a/pkg/hash/hash_test.go +++ b/internal/k8sdeps/hash_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package hash +package k8sdeps import ( "reflect" diff --git a/kustomize.go b/kustomize.go index 41dcb9043..4e2da5e85 100644 --- a/kustomize.go +++ b/kustomize.go @@ -29,7 +29,8 @@ func main() { if err := commands.NewDefaultCommand( k8sdeps.NewKustDecoder(), - k8sdeps.NewKustValidator()).Execute(); err != nil { + k8sdeps.NewKustValidator(), + k8sdeps.NewKustHash()).Execute(); err != nil { os.Exit(1) } os.Exit(0) diff --git a/pkg/commands/build/build.go b/pkg/commands/build/build.go index be97d46a4..854edb7f9 100644 --- a/pkg/commands/build/build.go +++ b/pkg/commands/build/build.go @@ -60,7 +60,7 @@ Use different transformer configurations by passing files to kustomize // NewCmdBuild creates a new build command. func NewCmdBuild( out io.Writer, fs fs.FileSystem, - decoder ifc.Decoder) *cobra.Command { + decoder ifc.Decoder, hash ifc.Hash) *cobra.Command { var o buildOptions var p string @@ -74,7 +74,7 @@ func NewCmdBuild( if err != nil { return err } - return o.RunBuild(out, fs, decoder) + return o.RunBuild(out, fs, decoder, hash) }, } cmd.Flags().StringVarP( @@ -119,7 +119,7 @@ func (o *buildOptions) Validate(args []string, p string, fs fs.FileSystem) error // RunBuild runs build command. func (o *buildOptions) RunBuild( out io.Writer, fSys fs.FileSystem, - decoder ifc.Decoder) error { + decoder ifc.Decoder, hash ifc.Hash) error { rootLoader, err := loader.NewLoader(o.kustomizationPath, "", fSys) if err != nil { return err @@ -128,7 +128,7 @@ func (o *buildOptions) RunBuild( kt, err := target.NewKustTarget( rootLoader, fSys, makeTransformerconfig(fSys, o.transformerconfigPaths), - decoder) + decoder, hash) if err != nil { return err } diff --git a/pkg/commands/build/build_test.go b/pkg/commands/build/build_test.go index 156fffb3e..f3c05328c 100644 --- a/pkg/commands/build/build_test.go +++ b/pkg/commands/build/build_test.go @@ -125,7 +125,7 @@ func runBuildTestCase(t *testing.T, testcaseName string, updateKustomizeExpected kustomizationPath: testcase.Filename, } buf := bytes.NewBuffer([]byte{}) - err = ops.RunBuild(buf, fSys, k8sdeps.NewKustDecoder()) + err = ops.RunBuild(buf, fSys, k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash()) switch { case err != nil && len(testcase.ExpectedError) == 0: t.Errorf("unexpected error: %v", err) diff --git a/pkg/commands/commands.go b/pkg/commands/commands.go index f4faca65d..61a95e05c 100644 --- a/pkg/commands/commands.go +++ b/pkg/commands/commands.go @@ -31,7 +31,7 @@ import ( // NewDefaultCommand returns the default (aka root) command for kustomize command. func NewDefaultCommand( - decoder ifc.Decoder, validator ifc.Validator) *cobra.Command { + decoder ifc.Decoder, validator ifc.Validator, hash ifc.Hash) *cobra.Command { fsys := fs.MakeRealFS() stdOut := os.Stdout @@ -47,7 +47,7 @@ See https://sigs.k8s.io/kustomize c.AddCommand( // TODO: Make consistent API for newCmd* functions. - build.NewCmdBuild(stdOut, fsys, decoder), + build.NewCmdBuild(stdOut, fsys, decoder, hash), edit.NewCmdEdit(fsys, validator), misc.NewCmdConfig(fsys), misc.NewCmdVersion(stdOut), diff --git a/pkg/ifc/ifc.go b/pkg/ifc/ifc.go index c71debf59..b5071c5b0 100644 --- a/pkg/ifc/ifc.go +++ b/pkg/ifc/ifc.go @@ -43,3 +43,8 @@ type Loader interface { // Cleanup cleans the loader Cleanup() error } + +// Hash interface provides function to compute hash of objects +type Hash interface { + Hash(m map[string]interface{}) (string, error) +} diff --git a/pkg/target/kusttarget.go b/pkg/target/kusttarget.go index 385237f80..2e67b9029 100644 --- a/pkg/target/kusttarget.go +++ b/pkg/target/kusttarget.go @@ -44,6 +44,7 @@ import ( type KustTarget struct { kustomization *types.Kustomization decoder ifc.Decoder + hash ifc.Hash ldr ifc.Loader fSys fs.FileSystem tcfg *transformerconfig.TransformerConfig @@ -53,7 +54,7 @@ type KustTarget struct { func NewKustTarget( ldr ifc.Loader, fSys fs.FileSystem, tcfg *transformerconfig.TransformerConfig, - d ifc.Decoder) (*KustTarget, error) { + d ifc.Decoder, h ifc.Hash) (*KustTarget, error) { content, err := ldr.Load(constants.KustomizationFileName) if err != nil { return nil, err @@ -71,6 +72,7 @@ func NewKustTarget( fSys: fSys, tcfg: tcfg, decoder: d, + hash: h, }, nil } @@ -97,7 +99,7 @@ func (kt *KustTarget) MakeCustomizedResMap() (resmap.ResMap, error) { // resolveRefsToGeneratedResources fixes all name references. 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 { 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)) 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 { errs.Append(errors.Wrap(err, "couldn't make target for "+path)) continue @@ -250,7 +252,7 @@ func (kt *KustTarget) loadBasesAsFlatList() ([]*KustTarget, error) { errs.Append(err) 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 { errs.Append(err) continue diff --git a/pkg/target/kusttarget_test.go b/pkg/target/kusttarget_test.go index 2c7a8351a..7f45fafe9 100644 --- a/pkg/target/kusttarget_test.go +++ b/pkg/target/kusttarget_test.go @@ -208,7 +208,7 @@ func TestResources1(t *testing.T) { fakeFs.Mkdir("/") kt, err := NewKustTarget( l, fakeFs, transformerconfig.MakeDefaultTransformerConfig(), - k8sdeps.NewKustDecoder()) + k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash()) if err != nil { t.Fatalf("unexpected construction error %v", err) } @@ -233,7 +233,7 @@ func TestResourceNotFound(t *testing.T) { fakeFs.Mkdir("/") kt, err := NewKustTarget( l, fakeFs, transformerconfig.MakeDefaultTransformerConfig(), - k8sdeps.NewKustDecoder()) + k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash()) if err != nil { t.Fatalf("Unexpected construction error %v", err) } @@ -256,7 +256,7 @@ func TestSecretTimeout(t *testing.T) { fakeFs.Mkdir("/") kt, err := NewKustTarget( l, fakeFs, transformerconfig.MakeDefaultTransformerConfig(), - k8sdeps.NewKustDecoder()) + k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash()) if err != nil { t.Fatalf("Unexpected construction error %v", err) } diff --git a/pkg/transformers/namehash.go b/pkg/transformers/namehash.go index b0be424b4..67c699d88 100644 --- a/pkg/transformers/namehash.go +++ b/pkg/transformers/namehash.go @@ -19,27 +19,29 @@ package transformers import ( "fmt" - "sigs.k8s.io/kustomize/pkg/hash" + "sigs.k8s.io/kustomize/pkg/ifc" "sigs.k8s.io/kustomize/pkg/resmap" "sigs.k8s.io/kustomize/pkg/resource" ) // nameHashTransformer contains the prefix and the path config for each field that // the name prefix will be applied. -type nameHashTransformer struct{} +type nameHashTransformer struct { + hash ifc.Hash +} var _ Transformer = &nameHashTransformer{} // NewNameHashTransformer construct a nameHashTransformer. -func NewNameHashTransformer() Transformer { - return &nameHashTransformer{} +func NewNameHashTransformer(h ifc.Hash) Transformer { + return &nameHashTransformer{hash: h} } // Transform appends hash to configmaps and secrets. func (o *nameHashTransformer) Transform(m resmap.ResMap) error { for _, res := range m { if res.IsGenerated() { - err := appendHash(res) + err := o.appendHash(res) if err != nil { return err } @@ -48,8 +50,8 @@ func (o *nameHashTransformer) Transform(m resmap.ResMap) error { return nil } -func appendHash(res *resource.Resource) error { - h, err := hash.Hash(res.Object) +func (o *nameHashTransformer) appendHash(res *resource.Resource) error { + h, err := o.hash.Hash(res.Object) if err != nil { return err } diff --git a/pkg/transformers/namehash_test.go b/pkg/transformers/namehash_test.go index 59b1909be..5f0ed98a5 100644 --- a/pkg/transformers/namehash_test.go +++ b/pkg/transformers/namehash_test.go @@ -20,6 +20,7 @@ import ( "reflect" "testing" + "sigs.k8s.io/kustomize/internal/k8sdeps" "sigs.k8s.io/kustomize/pkg/ifc" "sigs.k8s.io/kustomize/pkg/resid" "sigs.k8s.io/kustomize/pkg/resmap" @@ -149,7 +150,7 @@ func TestNameHashTransformer(t *testing.T) { }).SetBehavior(ifc.BehaviorCreate), } - tran := NewNameHashTransformer() + tran := NewNameHashTransformer(k8sdeps.NewKustHash()) tran.Transform(objs) if !reflect.DeepEqual(objs, expected) {