Merge pull request #279 from mengqiy/overlay_transformer

error out when a patch has not matching object
This commit is contained in:
k8s-ci-robot 2018-02-12 17:04:49 -08:00 committed by GitHub
commit a7ffe0b3ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 23 additions and 30 deletions

View File

@ -43,39 +43,32 @@ func NewOverlayTransformer(overlay types.KObject) (Transformer, error) {
// Transform apply the overlay on top of the base resources.
func (o *OverlayTransformer) Transform(baseResourceMap types.KObject) error {
// Strategic merge the resources exist in both base and overlay.
for gvkn, base := range baseResourceMap {
for gvkn, overlay := range o.overlay {
// Merge overlay with base resource.
if overlay, found := o.overlay[gvkn]; found {
versionedObj, err := scheme.Scheme.New(gvkn.GVK)
if err != nil {
switch {
case runtime.IsNotRegisteredError(err):
return fmt.Errorf("failed to find schema for %#v (which may be a CRD type): %v", gvkn.GVK, err)
default:
return err
}
}
// TODO: Change this to use the new Merge package.
// Store the name of the base object, because this name may have been munged.
// Apply this name to the StrategicMergePatched object.
baseName := base.GetName()
merged, err := strategicpatch.StrategicMergeMapPatch(
base.UnstructuredContent(),
overlay.UnstructuredContent(),
versionedObj)
if err != nil {
return err
}
base.SetName(baseName)
baseResourceMap[gvkn].Object = merged
delete(o.overlay, gvkn)
base, found := baseResourceMap[gvkn]
if !found {
return fmt.Errorf("failed to find an object with %#v to apply the patch", gvkn.GVK)
}
}
// If there are resources in overlay that are not defined in base, just add it to base.
if len(o.overlay) > 0 {
for gvkn, jsonObj := range o.overlay {
baseResourceMap[gvkn] = jsonObj
versionedObj, err := scheme.Scheme.New(gvkn.GVK)
if err != nil {
if runtime.IsNotRegisteredError(err) {
return fmt.Errorf("failed to find schema for %#v (which may be a CRD type): %v", gvkn.GVK, err)
}
return err
}
// TODO: Change this to use the new Merge package.
// Store the name of the base object, because this name may have been munged.
// Apply this name to the StrategicMergePatched object.
baseName := base.GetName()
merged, err := strategicpatch.StrategicMergeMapPatch(
base.UnstructuredContent(),
overlay.UnstructuredContent(),
versionedObj)
if err != nil {
return err
}
base.SetName(baseName)
baseResourceMap[gvkn].Object = merged
}
return nil
}