Unverified Commit 08ea3d2a authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

Merge pull request #56719 from mengqiy/apply_openapi

Automatic merge from submit-queue (batch tested with PRs 52013, 56719). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. Build patch from openapi only for registered types Address the concern in https://github.com/kubernetes/kubernetes/pull/51321#pullrequestreview-80212182. fixes kubernetes/kubectl#156 ```release-note NONE ``` /assign @apelisse
parents 36ea6de4 ed0dcb74
...@@ -604,42 +604,44 @@ func (p *patcher) patchSimple(obj runtime.Object, modified []byte, source, names ...@@ -604,42 +604,44 @@ func (p *patcher) patchSimple(obj runtime.Object, modified []byte, source, names
var lookupPatchMeta strategicpatch.LookupPatchMeta var lookupPatchMeta strategicpatch.LookupPatchMeta
var schema oapi.Schema var schema oapi.Schema
createPatchErrFormat := "creating patch with:\noriginal:\n%s\nmodified:\n%s\ncurrent:\n%s\nfor:" createPatchErrFormat := "creating patch with:\noriginal:\n%s\nmodified:\n%s\ncurrent:\n%s\nfor:"
// Try to use openapi first if the openapi spec is available and can successfully calculate the patch.
// Otherwise, fall back to baked-in types. // Create the versioned struct from the type defined in the restmapping
if p.openapiSchema != nil { // (which is the API version we'll be submitting the patch to)
if schema = p.openapiSchema.LookupResource(p.mapping.GroupVersionKind); schema != nil { versionedObject, err := scheme.Scheme.New(p.mapping.GroupVersionKind)
lookupPatchMeta = strategicpatch.PatchMetaFromOpenAPI{Schema: schema} switch {
if openapiPatch, err := strategicpatch.CreateThreeWayMergePatch(original, modified, current, lookupPatchMeta, p.overwrite); err != nil { case runtime.IsNotRegisteredError(err):
fmt.Fprintf(errOut, "warning: error calculating patch from openapi spec: %v\n", err) // fall back to generic JSON merge patch
} else { patchType = types.MergePatchType
patchType = types.StrategicMergePatchType preconditions := []mergepatch.PreconditionFunc{mergepatch.RequireKeyUnchanged("apiVersion"),
patch = openapiPatch mergepatch.RequireKeyUnchanged("kind"), mergepatch.RequireMetadataKeyUnchanged("name")}
patch, err = jsonmergepatch.CreateThreeWayJSONMergePatch(original, modified, current, preconditions...)
if err != nil {
if mergepatch.IsPreconditionFailed(err) {
return nil, nil, fmt.Errorf("%s", "At least one of apiVersion, kind and name was changed")
} }
return nil, nil, cmdutil.AddSourceToErr(fmt.Sprintf(createPatchErrFormat, original, modified, current), source, err)
} }
} case err != nil:
return nil, nil, cmdutil.AddSourceToErr(fmt.Sprintf("getting instance of versioned object for %v:", p.mapping.GroupVersionKind), source, err)
if patch == nil { case err == nil:
// Create the versioned struct from the type defined in the restmapping // Compute a three way strategic merge patch to send to server.
// (which is the API version we'll be submitting the patch to) patchType = types.StrategicMergePatchType
versionedObject, err := scheme.Scheme.New(p.mapping.GroupVersionKind)
switch { // Try to use openapi first if the openapi spec is available and can successfully calculate the patch.
case runtime.IsNotRegisteredError(err): // Otherwise, fall back to baked-in types.
// fall back to generic JSON merge patch if p.openapiSchema != nil {
patchType = types.MergePatchType if schema = p.openapiSchema.LookupResource(p.mapping.GroupVersionKind); schema != nil {
preconditions := []mergepatch.PreconditionFunc{mergepatch.RequireKeyUnchanged("apiVersion"), lookupPatchMeta = strategicpatch.PatchMetaFromOpenAPI{Schema: schema}
mergepatch.RequireKeyUnchanged("kind"), mergepatch.RequireMetadataKeyUnchanged("name")} if openapiPatch, err := strategicpatch.CreateThreeWayMergePatch(original, modified, current, lookupPatchMeta, p.overwrite); err != nil {
patch, err = jsonmergepatch.CreateThreeWayJSONMergePatch(original, modified, current, preconditions...) fmt.Fprintf(errOut, "warning: error calculating patch from openapi spec: %v\n", err)
if err != nil { } else {
if mergepatch.IsPreconditionFailed(err) { patchType = types.StrategicMergePatchType
return nil, nil, fmt.Errorf("%s", "At least one of apiVersion, kind and name was changed") patch = openapiPatch
} }
return nil, nil, cmdutil.AddSourceToErr(fmt.Sprintf(createPatchErrFormat, original, modified, current), source, err)
} }
case err != nil: }
return nil, nil, cmdutil.AddSourceToErr(fmt.Sprintf("getting instance of versioned object for %v:", p.mapping.GroupVersionKind), source, err)
case err == nil: if patch == nil {
// Compute a three way strategic merge patch to send to server.
patchType = types.StrategicMergePatchType
lookupPatchMeta, err = strategicpatch.NewPatchMetaFromStruct(versionedObject) lookupPatchMeta, err = strategicpatch.NewPatchMetaFromStruct(versionedObject)
if err != nil { if err != nil {
return nil, nil, cmdutil.AddSourceToErr(fmt.Sprintf(createPatchErrFormat, original, modified, current), source, err) return nil, nil, cmdutil.AddSourceToErr(fmt.Sprintf(createPatchErrFormat, original, modified, current), source, err)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment