in frontend/pkg/frontend/frontend.go [627:682]
func (f *Frontend) ArmResourceDelete(writer http.ResponseWriter, request *http.Request) {
const operationRequest = database.OperationRequestDelete
ctx := request.Context()
logger := LoggerFromContext(ctx)
resourceID, err := ResourceIDFromContext(ctx)
if err != nil {
logger.Error(err.Error())
arm.WriteInternalServerError(writer)
return
}
resourceDoc, err := f.dbClient.GetResourceDoc(ctx, resourceID)
if err != nil {
// For resource not found errors on deletion, ARM requires
// us to simply return 204 No Content and no response body.
if errors.Is(err, database.ErrNotFound) {
writer.WriteHeader(http.StatusNoContent)
} else {
logger.Error(err.Error())
arm.WriteInternalServerError(writer)
}
return
}
// CheckForProvisioningStateConflict does not log conflict errors
// but does log unexpected errors like database failures.
cloudError := f.CheckForProvisioningStateConflict(ctx, operationRequest, resourceDoc)
if cloudError != nil {
arm.WriteCloudError(writer, cloudError)
return
}
operationID, cloudError := f.DeleteResource(ctx, resourceDoc)
if cloudError != nil {
// For resource not found errors on deletion, ARM requires
// us to simply return 204 No Content and no response body.
if cloudError.StatusCode == http.StatusNotFound {
writer.WriteHeader(http.StatusNoContent)
} else {
arm.WriteCloudError(writer, cloudError)
}
return
}
pk := database.NewPartitionKey(resourceID.SubscriptionID)
err = f.ExposeOperation(writer, request, pk, operationID)
if err != nil {
logger.Error(err.Error())
arm.WriteInternalServerError(writer)
return
}
writer.WriteHeader(http.StatusAccepted)
}