mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-05-18 09:51:39 +00:00
This PR - defines a patch conflict detector interface, - extracts implementations of the interface from the merginator code, making the merginator code independent of --enable_kyaml. - injects those implementations into kustomize as a function of --enable_kyaml. So, instead of using different merginators to combine resmaps, this pr allows the use of a single patch merge code path that uses different conflict detectors. So instead of debating how to merge, we're now only considering whether to warn on conflict detection in one transformer. This PR is in service of #3304, eliminating seven instances where --enable_kyaml was consulted. These were cases where conflict detection wasn't an issue (but merging patches was).
88 lines
2.5 KiB
Go
88 lines
2.5 KiB
Go
// Code generated by pluginator on PatchStrategicMergeTransformer; DO NOT EDIT.
|
|
// pluginator {unknown 1970-01-01T00:00:00Z }
|
|
|
|
package builtins
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"sigs.k8s.io/kustomize/api/resmap"
|
|
"sigs.k8s.io/kustomize/api/resource"
|
|
"sigs.k8s.io/kustomize/api/types"
|
|
"sigs.k8s.io/yaml"
|
|
)
|
|
|
|
type PatchStrategicMergeTransformerPlugin struct {
|
|
h *resmap.PluginHelpers
|
|
loadedPatches []*resource.Resource
|
|
Paths []types.PatchStrategicMerge `json:"paths,omitempty" yaml:"paths,omitempty"`
|
|
Patches string `json:"patches,omitempty" yaml:"patches,omitempty"`
|
|
}
|
|
|
|
func (p *PatchStrategicMergeTransformerPlugin) Config(
|
|
h *resmap.PluginHelpers, c []byte) (err error) {
|
|
p.h = h
|
|
err = yaml.Unmarshal(c, p)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if len(p.Paths) == 0 && p.Patches == "" {
|
|
return fmt.Errorf("empty file path and empty patch content")
|
|
}
|
|
if len(p.Paths) != 0 {
|
|
for _, onePath := range p.Paths {
|
|
// The following oddly attempts to interpret a path string as an
|
|
// actual patch (instead of as a path to a file containing a patch).
|
|
// All tests pass if this code is commented out. This code should
|
|
// be deleted; the user should use the Patches field which
|
|
// exists for this purpose (inline patch declaration).
|
|
res, err := p.h.ResmapFactory().RF().SliceFromBytes([]byte(onePath))
|
|
if err == nil {
|
|
p.loadedPatches = append(p.loadedPatches, res...)
|
|
continue
|
|
}
|
|
res, err = p.h.ResmapFactory().RF().SliceFromPatches(
|
|
p.h.Loader(), []types.PatchStrategicMerge{onePath})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
p.loadedPatches = append(p.loadedPatches, res...)
|
|
}
|
|
}
|
|
if p.Patches != "" {
|
|
res, err := p.h.ResmapFactory().RF().SliceFromBytes([]byte(p.Patches))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
p.loadedPatches = append(p.loadedPatches, res...)
|
|
}
|
|
|
|
if len(p.loadedPatches) == 0 {
|
|
return fmt.Errorf(
|
|
"patch appears to be empty; files=%v, Patch=%s", p.Paths, p.Patches)
|
|
}
|
|
return err
|
|
}
|
|
|
|
func (p *PatchStrategicMergeTransformerPlugin) Transform(m resmap.ResMap) error {
|
|
patches, err := p.h.ResmapFactory().Merge(p.loadedPatches)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, patch := range patches.Resources() {
|
|
target, err := m.GetById(patch.OrgId())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err = m.ApplySmPatch(
|
|
resource.MakeIdSet([]*resource.Resource{target}), patch); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func NewPatchStrategicMergeTransformerPlugin() resmap.TransformerPlugin {
|
|
return &PatchStrategicMergeTransformerPlugin{}
|
|
}
|