Closed ionphractal closed 3 years ago
We have created an issue in Pivotal Tracker to manage this:
https://www.pivotaltracker.com/story/show/175378670
The labels on this github issue will be updated when the story is started.
Hi @ionphractal ,
Thanks for bringing this up to our attention and for the analysis of the code.
We have encountered this issue in the past but decide to fix it only on v3. There are plans to release a CF CLI version that uses the v3 endpoints on the create
and delete
commands soon 🤞🏽
I'll close this issue for now on the basis that's fixed on v3. Feel free to reopen it if you'd like to push for a fix on v2 or if there's something here that I have missed.
Thanks!
Issue
When using an asynchronous service broker which does not support cancellation of operations, a service instance becomes stuck in "create in progress" when the service instance is deleted before the creation succeeded.
Context
At some point CC started to support the cancellation of create operations: https://github.com/cloudfoundry/cloud_controller_ng/commit/ff4ee3dbc85a755e762fc8d5ec03f0caef1c64ca
The openservicebroker specification states that the broker can return
422 Unprocessable Entity
"if the Service Instance is being processed by some other operation and therefore cannot be deleted at this time". (https://github.com/openservicebrokerapi/servicebroker/blob/master/spec.md#deprovisioning)There may be some service brokers that can handle cancellation of creation but this cannot be ensured. So the Cloud Controller should handle these situations by disallowing the deprovisioning and allowing the provisioning to finish.
Steps to Reproduce
Requirements:
Steps:
cf create-service async-service plan test
cf delete-service test
Expected result
The delete command should fail and the service should become "create succeeded" at some point.
Current result
The CC returns
Server error, status code: 409, error code: 60016, message: An operation for service instance test is in progress.
and it logs a CF-AsyncServiceInstanceOperationInProgress backtrace in the log (see below).However, the service instance is stuck in "create in progress" forever because the broker_provided_operation column is emptied.
I've tried to delete the instance at the broker directly while being created and it returns 422 as expected.
Possible Fix
From the CC code it looks like the this line https://github.com/cloudfoundry/cloud_controller_ng/blob/569b0ba2035819668528613494eb470cef4aec1f/app/actions/services/service_instance_delete.rb#L86 calls the broker and throws an exception due to the 422 returned https://github.com/cloudfoundry/cloud_controller_ng/blob/569b0ba2035819668528613494eb470cef4aec1f/lib/services/service_brokers/v2/client.rb#L248
So after that there seems nothing to delete the operations.
I suspect the DeleterLock https://github.com/cloudfoundry/cloud_controller_ng/blob/569b0ba2035819668528613494eb470cef4aec1f/app/actions/services/service_instance_delete.rb#L81-L82
to just save a new empty operations record in the table because it destroys it first https://github.com/cloudfoundry/cloud_controller_ng/blob/569b0ba2035819668528613494eb470cef4aec1f/app/actions/services/locks/deleter_lock.rb#L15-L22
https://github.com/cloudfoundry/cloud_controller_ng/blob/569b0ba2035819668528613494eb470cef4aec1f/app/models/services/managed_service_instance.rb#L148-L153
But I don't have enough insight in the internals to propose anything here.