@Override public Service createServiceInstance() throws Throwable { return new ClosureRemovalTaskService(); } }
@Override protected void handleStartedStagePatch(ClosureRemovalTaskState state) { switch (state.taskSubStage) { case CREATED: removeResources(state, null); break; case REMOVING_RESOURCE_STATES: break; case COMPLETED: complete(); break; case ERROR: completeWithError(); break; default: break; } }
private void removeResources(ClosureRemovalTaskState state, String subTaskLink) { if (subTaskLink == null) { // count 2 * resourceLinks (to keep track of each removal operation starting and ending) createCounterSubTask(state, state.resourceLinks.size(), (link) -> removeResources(state, link)); return; } try { for (String resourceLink : state.resourceLinks) { sendRequest(Operation .createGet(this, resourceLink) .setCompletion( (o, e) -> { if (e != null) { failTask("Failed retrieving closure state: " + resourceLink, e); return; } Closure closure = o.getBody(Closure.class); doDeleteResource(state, subTaskLink, closure); })); } proceedTo(SubStage.REMOVING_RESOURCE_STATES); } catch (Throwable e) { failTask("Unexpected exception while deleting resources", e); } }
new ServiceDocumentQuery<Closure>(getHost(), Closure.class) .query(compositeQueryTask, (r) -> { if (r.hasException()) { logSevere("Failed to retrieve closures, sharing the same" + " closureDescription: %s -%s", r.getDocumentSelfLink(), r.getException()); skipHostPortProfileNotFoundException); Operation delClosureOpr = deleteClosure(closure.documentSelfLink); Operation deleteClosureDescription = deleteClosureDescription(closure, skipDeleteDescriptionOperationException); operations.add(deleteClosureDescription); failTask("Failed deleting closure resources: " + Utils.toString(exs), null); return; completeSubTasksCounter(subTaskLink, null); }).sendWith(this);