Merge pull request #87559 from daohoangson/openapi/delete_return_type

Openapi/delete return type
This commit is contained in:
Kubernetes Prow Robot 2020-02-07 05:56:12 -08:00 committed by GitHub
commit e128f6f4c9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 52 additions and 33 deletions

View File

@ -21623,13 +21623,13 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim"
}
},
"202": {
"description": "Accepted",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeClaim"
}
},
"401": {
@ -22422,13 +22422,13 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.core.v1.Pod"
}
},
"202": {
"description": "Accepted",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.core.v1.Pod"
}
},
"401": {
@ -24402,13 +24402,13 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.core.v1.PodTemplate"
}
},
"202": {
"description": "Accepted",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.core.v1.PodTemplate"
}
},
"401": {
@ -26000,13 +26000,13 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota"
}
},
"202": {
"description": "Accepted",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.core.v1.ResourceQuota"
}
},
"401": {
@ -27402,13 +27402,13 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccount"
}
},
"202": {
"description": "Accepted",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.core.v1.ServiceAccount"
}
},
"401": {
@ -31231,13 +31231,13 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume"
}
},
"202": {
"description": "Accepted",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolume"
}
},
"401": {
@ -75126,13 +75126,13 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy"
}
},
"202": {
"description": "Accepted",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.policy.v1beta1.PodSecurityPolicy"
}
},
"401": {
@ -90997,13 +90997,13 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.storage.v1.CSINode"
}
},
"202": {
"description": "Accepted",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.storage.v1.CSINode"
}
},
"401": {
@ -91584,13 +91584,13 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.storage.v1.StorageClass"
}
},
"202": {
"description": "Accepted",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.storage.v1.StorageClass"
}
},
"401": {
@ -92171,13 +92171,13 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment"
}
},
"202": {
"description": "Accepted",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.storage.v1.VolumeAttachment"
}
},
"401": {
@ -93627,13 +93627,13 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.storage.v1alpha1.VolumeAttachment"
}
},
"202": {
"description": "Accepted",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.storage.v1alpha1.VolumeAttachment"
}
},
"401": {
@ -94463,13 +94463,13 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSIDriver"
}
},
"202": {
"description": "Accepted",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSIDriver"
}
},
"401": {
@ -95050,13 +95050,13 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINode"
}
},
"202": {
"description": "Accepted",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.storage.v1beta1.CSINode"
}
},
"401": {
@ -95637,13 +95637,13 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.storage.v1beta1.StorageClass"
}
},
"202": {
"description": "Accepted",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.storage.v1beta1.StorageClass"
}
},
"401": {
@ -96224,13 +96224,13 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment"
}
},
"202": {
"description": "Accepted",
"schema": {
"$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Status"
"$ref": "#/definitions/io.k8s.api.storage.v1beta1.VolumeAttachment"
}
},
"401": {

View File

@ -291,12 +291,17 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
var versionedDeleteOptions runtime.Object
var versionedDeleterObject interface{}
deleteReturnsDeletedObject := false
if isGracefulDeleter {
versionedDeleteOptions, err = a.group.Creater.New(optionsExternalVersion.WithKind("DeleteOptions"))
if err != nil {
return nil, err
}
versionedDeleterObject = indirectArbitraryPointer(versionedDeleteOptions)
if mayReturnFullObjectDeleter, ok := storage.(rest.MayReturnFullObjectDeleter); ok {
deleteReturnsDeletedObject = mayReturnFullObjectDeleter.DeleteReturnsDeletedObject()
}
}
versionedStatusPtr, err := a.group.Creater.New(optionsExternalVersion.WithKind("Status"))
@ -769,15 +774,19 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
if isSubresource {
doc = "delete " + subresource + " of" + article + kind
}
deleteReturnType := versionedStatus
if deleteReturnsDeletedObject {
deleteReturnType = producedObject
}
handler := metrics.InstrumentRouteFunc(action.Verb, group, version, resource, subresource, requestScope, metrics.APIServerComponent, restfulDeleteResource(gracefulDeleter, isGracefulDeleter, reqScope, admit))
route := ws.DELETE(action.Path).To(handler).
Doc(doc).
Param(ws.QueryParameter("pretty", "If 'true', then the output is pretty printed.")).
Operation("delete"+namespaced+kind+strings.Title(subresource)+operationSuffix).
Produces(append(storageMeta.ProducesMIMETypes(action.Verb), mediaTypes...)...).
Writes(versionedStatus).
Returns(http.StatusOK, "OK", versionedStatus).
Returns(http.StatusAccepted, "Accepted", versionedStatus)
Writes(deleteReturnType).
Returns(http.StatusOK, "OK", deleteReturnType).
Returns(http.StatusAccepted, "Accepted", deleteReturnType)
if isGracefulDeleter {
route.Reads(versionedDeleterObject)
route.ParameterNamed("body").Required(false)

View File

@ -975,6 +975,11 @@ func (e *Store) Delete(ctx context.Context, name string, deleteValidation rest.V
return out, true, err
}
// DeleteReturnsDeletedObject implements the rest.MayReturnFullObjectDeleter interface
func (e *Store) DeleteReturnsDeletedObject() bool {
return e.ReturnDeletedObject
}
// DeleteCollection removes all items returned by List with a given ListOptions from storage.
//
// DeleteCollection is currently NOT atomic. It can happen that only subset of objects

View File

@ -161,6 +161,11 @@ type GracefulDeleter interface {
Delete(ctx context.Context, name string, deleteValidation ValidateObjectFunc, options *metav1.DeleteOptions) (runtime.Object, bool, error)
}
// MayReturnFullObjectDeleter may return deleted object (instead of a simple status) on deletion.
type MayReturnFullObjectDeleter interface {
DeleteReturnsDeletedObject() bool
}
// CollectionDeleter is an object that can delete a collection
// of RESTful resources.
type CollectionDeleter interface {