2022-01-04 17:36:33 -08:00
|
|
|
package patch
|
2020-08-05 09:11:23 -07:00
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/go-logr/logr"
|
|
|
|
"sigs.k8s.io/kustomize/api/filters/patchstrategicmerge"
|
|
|
|
filtersutil "sigs.k8s.io/kustomize/kyaml/filtersutil"
|
|
|
|
yaml "sigs.k8s.io/kustomize/kyaml/yaml"
|
|
|
|
)
|
|
|
|
|
2020-11-17 13:07:30 -08:00
|
|
|
// ProcessStrategicMergePatch ...
|
2023-06-07 11:45:11 +02:00
|
|
|
func ProcessStrategicMergePatch(logger logr.Logger, overlay interface{}, resource resource) (resource, error) {
|
2020-08-05 09:11:23 -07:00
|
|
|
overlayBytes, err := json.Marshal(overlay)
|
|
|
|
if err != nil {
|
|
|
|
logger.Error(err, "failed to marshal resource")
|
2023-06-07 11:45:11 +02:00
|
|
|
return nil, err
|
2020-08-05 09:11:23 -07:00
|
|
|
}
|
2023-04-28 09:31:12 +02:00
|
|
|
patchedBytes, err := strategicMergePatch(logger, string(resource), string(overlayBytes))
|
2020-08-05 09:11:23 -07:00
|
|
|
if err != nil {
|
2023-04-28 09:31:12 +02:00
|
|
|
logger.Error(err, "failed to apply patchStrategicMerge")
|
2023-06-07 11:45:11 +02:00
|
|
|
return nil, err
|
2020-08-05 09:11:23 -07:00
|
|
|
}
|
2023-06-07 11:45:11 +02:00
|
|
|
return patchedBytes, nil
|
2020-08-05 09:11:23 -07:00
|
|
|
}
|
|
|
|
|
2021-07-23 20:53:37 +03:00
|
|
|
func strategicMergePatch(logger logr.Logger, base, overlay string) ([]byte, error) {
|
|
|
|
preprocessedYaml, err := preProcessStrategicMergePatch(logger, overlay, base)
|
2020-09-01 21:42:05 +05:30
|
|
|
if err != nil {
|
2021-09-13 18:59:28 +03:00
|
|
|
_, isConditionError := err.(ConditionError)
|
|
|
|
_, isGlobalConditionError := err.(GlobalConditionError)
|
|
|
|
|
|
|
|
if isConditionError || isGlobalConditionError {
|
|
|
|
if err = preprocessedYaml.UnmarshalJSON([]byte(`{}`)); err != nil {
|
|
|
|
return []byte{}, err
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return []byte{}, fmt.Errorf("failed to preProcess rule: %+v", err)
|
|
|
|
}
|
2020-09-01 21:42:05 +05:30
|
|
|
}
|
2020-12-23 17:48:00 -08:00
|
|
|
|
2022-01-23 05:54:22 -08:00
|
|
|
patchStr, _ := preprocessedYaml.String()
|
|
|
|
logger.V(3).Info("applying strategic merge patch", "patch", patchStr)
|
2020-08-05 09:11:23 -07:00
|
|
|
f := patchstrategicmerge.Filter{
|
2020-12-23 17:48:00 -08:00
|
|
|
Patch: preprocessedYaml,
|
2020-08-05 09:11:23 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
baseObj := buffer{Buffer: bytes.NewBufferString(base)}
|
2020-09-01 21:42:05 +05:30
|
|
|
err = filtersutil.ApplyToJSON(f, baseObj)
|
2020-08-05 09:11:23 -07:00
|
|
|
|
|
|
|
return baseObj.Bytes(), err
|
|
|
|
}
|
2020-09-01 21:42:05 +05:30
|
|
|
|
2021-07-23 20:53:37 +03:00
|
|
|
func preProcessStrategicMergePatch(logger logr.Logger, pattern, resource string) (*yaml.RNode, error) {
|
2020-09-01 21:42:05 +05:30
|
|
|
patternNode := yaml.MustParse(pattern)
|
|
|
|
resourceNode := yaml.MustParse(resource)
|
2021-09-13 18:59:28 +03:00
|
|
|
|
2024-03-12 10:25:00 +01:00
|
|
|
err := PreProcessPattern(logger, patternNode, resourceNode)
|
2021-09-13 18:59:28 +03:00
|
|
|
|
2020-09-01 21:42:05 +05:30
|
|
|
return patternNode, err
|
|
|
|
}
|