@ -399,14 +399,25 @@ func createPatch(mapping *meta.RESTMapping, target, current runtime.Object) ([]b
return nil , types . StrategicMergePatchType , fmt . Errorf ( "serializing target configuration: %s" , err )
return nil , types . StrategicMergePatchType , fmt . Errorf ( "serializing target configuration: %s" , err )
}
}
// While different objects need different merge types, the parent function
// that calls this does not try to create a patch when the data (first
// returned object) is nil. We can skip calculating the the merge type as
// the returned merge type is ignored.
if apiequality . Semantic . DeepEqual ( oldData , newData ) {
if apiequality . Semantic . DeepEqual ( oldData , newData ) {
return nil , types . StrategicMergePatchType , nil
return nil , types . StrategicMergePatchType , nil
}
}
// Get a versioned object
// Get a versioned object
versionedObject , err := mapping . ConvertToVersion ( target , mapping . GroupVersionKind . GroupVersion ( ) )
versionedObject , err := mapping . ConvertToVersion ( target , mapping . GroupVersionKind . GroupVersion ( ) )
// Unstructured objects, such as CRDs, may not have an not registered error
// returned from ConvertToVersion. Anything that's unstructured should
// use the jsonpatch.CreateMergePatch. Strategic Merge Patch is not supported
// on objects like CRDs.
_ , isUnstructured := versionedObject . ( runtime . Unstructured )
switch {
switch {
case runtime . IsNotRegisteredError ( err ) :
case runtime . IsNotRegisteredError ( err ) , isUnstructured :
// fall back to generic JSON merge patch
// fall back to generic JSON merge patch
patch , err := jsonpatch . CreateMergePatch ( oldData , newData )
patch , err := jsonpatch . CreateMergePatch ( oldData , newData )
return patch , types . MergePatchType , err
return patch , types . MergePatchType , err