Add hash interface

This commit is contained in:
Jingfang Liu
2018-10-05 13:29:06 -07:00
parent 489f6e2e67
commit 5036a12a65
11 changed files with 45 additions and 27 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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),

View File

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

View File

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

View File

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

View File

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

View File

@@ -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) {