diff --git a/pkg/transformers/patch.go b/internal/k8sdeps/patch/patch.go similarity index 85% rename from pkg/transformers/patch.go rename to internal/k8sdeps/patch/patch.go index ad0abca4e..a9b03233e 100644 --- a/pkg/transformers/patch.go +++ b/internal/k8sdeps/patch/patch.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package transformers +package patch import ( "encoding/json" @@ -26,21 +26,35 @@ import ( "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/kustomize/pkg/resmap" "sigs.k8s.io/kustomize/pkg/resource" + "sigs.k8s.io/kustomize/pkg/transformers" ) +// patchTransformerFactory makes patch transformer +type patchTransformerFactory struct{} + +// NewPatchTransformerFactory makes a new patchTransformerFactory +func NewPatchTransformerFactory() *patchTransformerFactory { + return &patchTransformerFactory{} +} + +// MakePatchTransformer makes a new patch transformer +func (p *patchTransformerFactory) MakePatchTransformer(slice []*resource.Resource, rf *resource.Factory) (transformers.Transformer, error) { + return NewPatchTransformer(slice, rf) +} + // patchTransformer applies patches. type patchTransformer struct { patches []*resource.Resource rf *resource.Factory } -var _ Transformer = &patchTransformer{} +var _ transformers.Transformer = &patchTransformer{} // NewPatchTransformer constructs a patchTransformer. func NewPatchTransformer( - slice []*resource.Resource, rf *resource.Factory) (Transformer, error) { + slice []*resource.Resource, rf *resource.Factory) (transformers.Transformer, error) { if len(slice) == 0 { - return NewNoOpTransformer(), nil + return transformers.NewNoOpTransformer(), nil } return &patchTransformer{patches: slice, rf: rf}, nil } diff --git a/pkg/transformers/patch_test.go b/internal/k8sdeps/patch/patch_test.go similarity index 97% rename from pkg/transformers/patch_test.go rename to internal/k8sdeps/patch/patch_test.go index 1b6f09fb4..9ff854b39 100644 --- a/pkg/transformers/patch_test.go +++ b/internal/k8sdeps/patch/patch_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package transformers +package patch import ( "reflect" @@ -22,14 +22,18 @@ import ( "testing" "sigs.k8s.io/kustomize/internal/k8sdeps" + "sigs.k8s.io/kustomize/pkg/gvk" "sigs.k8s.io/kustomize/pkg/resid" "sigs.k8s.io/kustomize/pkg/resmap" "sigs.k8s.io/kustomize/pkg/resource" ) +var rf = resource.NewFactory( + k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder())) +var deploy = gvk.Gvk{Group: "apps", Version: "v1", Kind: "Deployment"} +var foo = gvk.Gvk{Group: "example.com", Version: "v1", Kind: "Foo"} + func TestOverlayRun(t *testing.T) { - rf := resource.NewFactory( - k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder())) base := resmap.ResMap{ resid.NewResId(deploy, "deploy1"): rf.FromMap( map[string]interface{}{ diff --git a/pkg/transformers/patchconflictdetector.go b/internal/k8sdeps/patch/patchconflictdetector.go similarity index 99% rename from pkg/transformers/patchconflictdetector.go rename to internal/k8sdeps/patch/patchconflictdetector.go index a766b8ff1..1879171ea 100644 --- a/pkg/transformers/patchconflictdetector.go +++ b/internal/k8sdeps/patch/patchconflictdetector.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package transformers +package patch import ( "encoding/json" diff --git a/kustomize.go b/kustomize.go index 8720e01e8..621b499a1 100644 --- a/kustomize.go +++ b/kustomize.go @@ -21,6 +21,7 @@ import ( "github.com/golang/glog" "sigs.k8s.io/kustomize/internal/k8sdeps" + "sigs.k8s.io/kustomize/internal/k8sdeps/patch" "sigs.k8s.io/kustomize/pkg/commands" ) @@ -29,6 +30,7 @@ func main() { if err := commands.NewDefaultCommand( k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder()), + patch.NewPatchTransformerFactory(), k8sdeps.NewKustDecoder(), k8sdeps.NewKustValidator(), k8sdeps.NewKustHash()).Execute(); err != nil { diff --git a/pkg/commands/build/build.go b/pkg/commands/build/build.go index f9b43cafc..04fa2bccf 100644 --- a/pkg/commands/build/build.go +++ b/pkg/commands/build/build.go @@ -27,6 +27,7 @@ import ( "sigs.k8s.io/kustomize/pkg/constants" "sigs.k8s.io/kustomize/pkg/fs" "sigs.k8s.io/kustomize/pkg/ifc" + "sigs.k8s.io/kustomize/pkg/ifc/patch" "sigs.k8s.io/kustomize/pkg/loader" "sigs.k8s.io/kustomize/pkg/resource" "sigs.k8s.io/kustomize/pkg/target" @@ -63,6 +64,7 @@ Use different transformer configurations by passing files to kustomize func NewCmdBuild( out io.Writer, fs fs.FileSystem, kf ifc.KunstructuredFactory, + ptf patch.PatchTransformerFactory, decoder ifc.Decoder, hash ifc.Hash) *cobra.Command { var o buildOptions var p string @@ -77,7 +79,7 @@ func NewCmdBuild( if err != nil { return err } - return o.RunBuild(out, fs, kf, decoder, hash) + return o.RunBuild(out, fs, kf, ptf, decoder, hash) }, } cmd.Flags().StringVarP( @@ -123,6 +125,7 @@ func (o *buildOptions) Validate(args []string, p string, fs fs.FileSystem) error func (o *buildOptions) RunBuild( out io.Writer, fSys fs.FileSystem, kf ifc.KunstructuredFactory, + ptf patch.PatchTransformerFactory, decoder ifc.Decoder, hash ifc.Hash) error { rootLoader, err := loader.NewLoader(o.kustomizationPath, "", fSys) if err != nil { @@ -132,6 +135,7 @@ func (o *buildOptions) RunBuild( kt, err := target.NewKustTarget( rootLoader, fSys, resmap.NewFactory(resource.NewFactory(kf)), + ptf, makeTransformerconfig(fSys, o.transformerconfigPaths), decoder, hash) if err != nil { diff --git a/pkg/commands/build/build_test.go b/pkg/commands/build/build_test.go index 0c0f95e78..958469f1f 100644 --- a/pkg/commands/build/build_test.go +++ b/pkg/commands/build/build_test.go @@ -27,6 +27,7 @@ import ( "github.com/ghodss/yaml" "sigs.k8s.io/kustomize/internal/k8sdeps" + "sigs.k8s.io/kustomize/internal/k8sdeps/patch" "sigs.k8s.io/kustomize/pkg/commands/kustfile" "sigs.k8s.io/kustomize/pkg/constants" "sigs.k8s.io/kustomize/pkg/fs" @@ -131,6 +132,7 @@ func runBuildTestCase(t *testing.T, testcaseName string, updateKustomizeExpected err = ops.RunBuild( buf, fSys, k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder()), + patch.NewPatchTransformerFactory(), k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash()) switch { case err != nil && len(testcase.ExpectedError) == 0: diff --git a/pkg/commands/commands.go b/pkg/commands/commands.go index cec2eaa79..68252ca17 100644 --- a/pkg/commands/commands.go +++ b/pkg/commands/commands.go @@ -27,11 +27,13 @@ import ( "sigs.k8s.io/kustomize/pkg/commands/misc" "sigs.k8s.io/kustomize/pkg/fs" "sigs.k8s.io/kustomize/pkg/ifc" + "sigs.k8s.io/kustomize/pkg/ifc/patch" ) // NewDefaultCommand returns the default (aka root) command for kustomize command. func NewDefaultCommand( - kf ifc.KunstructuredFactory, decoder ifc.Decoder, + kf ifc.KunstructuredFactory, ptf patch.PatchTransformerFactory, + decoder ifc.Decoder, validator ifc.Validator, hash ifc.Hash) *cobra.Command { fsys := fs.MakeRealFS() stdOut := os.Stdout @@ -48,7 +50,7 @@ See https://sigs.k8s.io/kustomize c.AddCommand( // TODO: Make consistent API for newCmd* functions. - build.NewCmdBuild(stdOut, fsys, kf, decoder, hash), + build.NewCmdBuild(stdOut, fsys, kf, ptf, decoder, hash), edit.NewCmdEdit(fsys, validator), misc.NewCmdConfig(fsys), misc.NewCmdVersion(stdOut), diff --git a/pkg/ifc/patch/patch.go b/pkg/ifc/patch/patch.go new file mode 100644 index 000000000..6d188cabf --- /dev/null +++ b/pkg/ifc/patch/patch.go @@ -0,0 +1,28 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package patch holds miscellaneous interfaces used by kustomize. +package patch + +import ( + "sigs.k8s.io/kustomize/pkg/resource" + "sigs.k8s.io/kustomize/pkg/transformers" +) + +// PatchTransformerFactory makes patch transformer. +type PatchTransformerFactory interface { + MakePatchTransformer(slice []*resource.Resource, rf *resource.Factory) (transformers.Transformer, error) +} diff --git a/pkg/target/kusttarget.go b/pkg/target/kusttarget.go index 37eee3202..16e0a3a39 100644 --- a/pkg/target/kusttarget.go +++ b/pkg/target/kusttarget.go @@ -31,6 +31,7 @@ import ( "sigs.k8s.io/kustomize/pkg/constants" "sigs.k8s.io/kustomize/pkg/crds" "sigs.k8s.io/kustomize/pkg/fs" + "sigs.k8s.io/kustomize/pkg/ifc/patch" interror "sigs.k8s.io/kustomize/pkg/internal/error" patchtransformer "sigs.k8s.io/kustomize/pkg/patch/transformer" "sigs.k8s.io/kustomize/pkg/resmap" @@ -49,12 +50,14 @@ type KustTarget struct { fSys fs.FileSystem rf *resmap.Factory tcfg *transformerconfig.TransformerConfig + ptf patch.PatchTransformerFactory } // NewKustTarget returns a new instance of KustTarget primed with a Loader. func NewKustTarget( ldr ifc.Loader, fSys fs.FileSystem, rf *resmap.Factory, + ptf patch.PatchTransformerFactory, tcfg *transformerconfig.TransformerConfig, d ifc.Decoder, h ifc.Hash) (*KustTarget, error) { content, err := ldr.Load(constants.KustomizationFileName) @@ -76,6 +79,7 @@ func NewKustTarget( tcfg: tcfg, decoder: d, hash: h, + ptf: ptf, }, nil } @@ -227,7 +231,7 @@ func (kt *KustTarget) loadCustomizedBases() (resmap.ResMap, *interror.Kustomizat continue } target, err := NewKustTarget( - ldr, kt.fSys, kt.rf, kt.tcfg, kt.decoder, kt.hash) + ldr, kt.fSys, kt.rf, kt.ptf, kt.tcfg, kt.decoder, kt.hash) if err != nil { errs.Append(errors.Wrap(err, "couldn't make target for "+path)) continue @@ -257,7 +261,7 @@ func (kt *KustTarget) loadBasesAsFlatList() ([]*KustTarget, error) { continue } target, err := NewKustTarget( - ldr, kt.fSys, kt.rf, kt.tcfg, kt.decoder, kt.hash) + ldr, kt.fSys, kt.rf, kt.ptf, kt.tcfg, kt.decoder, kt.hash) if err != nil { errs.Append(err) continue @@ -273,7 +277,7 @@ func (kt *KustTarget) loadBasesAsFlatList() ([]*KustTarget, error) { // newTransformer makes a Transformer that does everything except resolve generated names. func (kt *KustTarget) newTransformer(patches []*resource.Resource) (transformers.Transformer, error) { var r []transformers.Transformer - t, err := transformers.NewPatchTransformer(patches, kt.rf.RF()) + t, err := kt.ptf.MakePatchTransformer(patches, kt.rf.RF()) if err != nil { return nil, err } diff --git a/pkg/target/kusttarget_test.go b/pkg/target/kusttarget_test.go index e989f2786..3825e54ee 100644 --- a/pkg/target/kusttarget_test.go +++ b/pkg/target/kusttarget_test.go @@ -24,6 +24,7 @@ import ( corev1 "k8s.io/api/core/v1" "sigs.k8s.io/kustomize/internal/k8sdeps" + "sigs.k8s.io/kustomize/internal/k8sdeps/patch" "sigs.k8s.io/kustomize/pkg/constants" "sigs.k8s.io/kustomize/pkg/fs" "sigs.k8s.io/kustomize/pkg/gvk" @@ -210,7 +211,8 @@ func TestResources1(t *testing.T) { fakeFs := fs.MakeFakeFS() fakeFs.Mkdir("/") kt, err := NewKustTarget( - l, fakeFs, rf, transformerconfig.MakeDefaultTransformerConfig(), + l, fakeFs, rf, patch.NewPatchTransformerFactory(), + transformerconfig.MakeDefaultTransformerConfig(), k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash()) if err != nil { t.Fatalf("unexpected construction error %v", err) @@ -235,7 +237,8 @@ func TestResourceNotFound(t *testing.T) { fakeFs := fs.MakeFakeFS() fakeFs.Mkdir("/") kt, err := NewKustTarget( - l, fakeFs, rf, transformerconfig.MakeDefaultTransformerConfig(), + l, fakeFs, rf, patch.NewPatchTransformerFactory(), + transformerconfig.MakeDefaultTransformerConfig(), k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash()) if err != nil { t.Fatalf("Unexpected construction error %v", err) @@ -258,7 +261,8 @@ func TestSecretTimeout(t *testing.T) { fakeFs := fs.MakeFakeFS() fakeFs.Mkdir("/") kt, err := NewKustTarget( - l, fakeFs, rf, transformerconfig.MakeDefaultTransformerConfig(), + l, fakeFs, rf, patch.NewPatchTransformerFactory(), + transformerconfig.MakeDefaultTransformerConfig(), k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash()) if err != nil { t.Fatalf("Unexpected construction error %v", err) diff --git a/pkg/transformers/labelsandannotations_test.go b/pkg/transformers/labelsandannotations_test.go index f86ddb357..c65a14df6 100644 --- a/pkg/transformers/labelsandannotations_test.go +++ b/pkg/transformers/labelsandannotations_test.go @@ -34,7 +34,6 @@ var cmap = gvk.Gvk{Version: "v1", Kind: "ConfigMap"} var ns = gvk.Gvk{Version: "v1", Kind: "Namespace"} var deploy = gvk.Gvk{Group: "apps", Version: "v1", Kind: "Deployment"} var statefulset = gvk.Gvk{Group: "apps", Version: "v1", Kind: "StatefulSet"} -var foo = gvk.Gvk{Group: "example.com", Version: "v1", Kind: "Foo"} var crd = gvk.Gvk{Group: "apiwctensions.k8s.io", Version: "v1beta1", Kind: "CustomResourceDefinition"} var job = gvk.Gvk{Group: "batch", Version: "v1", Kind: "Job"} var cronjob = gvk.Gvk{Group: "batch", Version: "v1beta1", Kind: "CronJob"}