mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-21 19:01:49 +00:00
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
This commit is contained in:
commit
08ea3d2a4a
@ -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)
|
||||||
|
case err == nil:
|
||||||
|
// Compute a three way strategic merge patch to send to server.
|
||||||
|
patchType = types.StrategicMergePatchType
|
||||||
|
|
||||||
|
// Try to use openapi first if the openapi spec is available and can successfully calculate the patch.
|
||||||
|
// Otherwise, fall back to baked-in types.
|
||||||
|
if p.openapiSchema != nil {
|
||||||
|
if schema = p.openapiSchema.LookupResource(p.mapping.GroupVersionKind); schema != nil {
|
||||||
|
lookupPatchMeta = strategicpatch.PatchMetaFromOpenAPI{Schema: schema}
|
||||||
|
if openapiPatch, err := strategicpatch.CreateThreeWayMergePatch(original, modified, current, lookupPatchMeta, p.overwrite); err != nil {
|
||||||
|
fmt.Fprintf(errOut, "warning: error calculating patch from openapi spec: %v\n", err)
|
||||||
|
} else {
|
||||||
|
patchType = types.StrategicMergePatchType
|
||||||
|
patch = openapiPatch
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if patch == nil {
|
if patch == nil {
|
||||||
// Create the versioned struct from the type defined in the restmapping
|
|
||||||
// (which is the API version we'll be submitting the patch to)
|
|
||||||
versionedObject, err := scheme.Scheme.New(p.mapping.GroupVersionKind)
|
|
||||||
switch {
|
|
||||||
case runtime.IsNotRegisteredError(err):
|
|
||||||
// fall back to generic JSON merge patch
|
|
||||||
patchType = types.MergePatchType
|
|
||||||
preconditions := []mergepatch.PreconditionFunc{mergepatch.RequireKeyUnchanged("apiVersion"),
|
|
||||||
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)
|
|
||||||
case err == 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)
|
||||||
|
Loading…
Reference in New Issue
Block a user