private void fetchLogs(Closure closure, Runnable operation) { if (closure.resourceLinks == null || closure.resourceLinks.size() <= 0) { return; } String resourceLink = closure.resourceLinks.iterator().next(); String containerId = UriUtils.getLastPathSegment(resourceLink); String logsURI = ManagementUriParts.CONTAINER_LOGS + "?id=" + containerId; sendRequest(Operation .createGet(this, logsURI) .setCompletion((op, ex) -> { if (ex != null) { logWarning("Failed to fetch logs for closure! %s Reason: %s", closure.documentSelfLink, ex.getMessage()); } else { logInfo("Logs fetched successfully for closure: %s", closure.documentSelfLink); LogServiceState logState = op.getBody(LogServiceState.class); byte[] fetchedLogs = shrinkToMaxAllowedSize(logState.logs); if (shouldUpdateLogs(closure.logs, fetchedLogs)) { closure.logs = fetchedLogs; sendSelfPatch(closure); } operation.run(); } })); }
protected void notifyCallerService(Closure closureState) { if (closureState.serviceTaskCallback.isEmpty()) { return; } if (closureState.serviceTaskCallback.isExternal()) { sendRequestStateToExternalUrl(closureState.serviceTaskCallback.serviceSelfLink, closureState); } else { ClosureCallbackCompleteResponse callbackResponse = new ClosureCallbackCompleteResponse(); if (closureState.state == TaskStage.FINISHED) { callbackResponse.copy(closureState.serviceTaskCallback.getFinishedResponse()); } else { callbackResponse .copy(closureState.serviceTaskCallback.getFailedResponse(new Exception( closureState.errorMsg))); } sendRequest( Operation.createPatch(this, closureState.serviceTaskCallback.serviceSelfLink) .setBody(callbackResponse) .setCompletion((o, e) -> { if (e != null) { logWarning("Notifying parent task %s failed: %s", o.getUri(), Utils.toString(e)); } })); } }
private void initializeTask(Operation post, Closure closure) { sendRequest(Operation .createGet(this, closure.descriptionLink) .setCompletion((op, ex) -> { if (ex != null) { logWarning("Failed to fetch closure definition closure! Reason: %s", ex.getMessage()); post.fail(new Exception("Unable to fetch script source.")); } else { initTask(closure, op); this.setState(post, closure); post.setBody(closure).complete(); } })); }
sendRequest(Operation .createGet(this, closure.descriptionLink) .setCompletion((op, ex) -> {
protected void sendSelfPatch(Closure body) { sendRequest(Operation .createPatch(getUri()) .setBody(body) .setCompletion((o, ex) -> { if (ex != null) { logWarning("Self patch failed: %s", Utils.toString(ex)); } })); }
private void handleMaintenance(Operation post, Closure closure) { sendRequest(Operation .createGet(this, closure.descriptionLink) .setCompletion((o, e) -> { if (e != null) { logWarning("Failed to fetch closure definition. Reason: %s", Utils.toString(e)); sendRequest(Operation .createDelete(getUri()) .setCompletion((dop, dex) -> { if (dex != null) { logWarning("Self delete failed: %s", Utils.toString(dex)); } })); post.fail(new Exception("Unable to fetch closure definition: " + e .getMessage())); } else { ClosureDescription taskDef = o.getBody(ClosureDescription.class); processMaintenance(post, closure, taskDef); } })); }
@Override public void handlePut(Operation put) { Closure reqClosure = put.getBody(Closure.class); Closure closure = this.getState(put); sendRequest(Operation .createGet(this, closure.documentSelfLink) .setCompletion((op, ex) -> { if (ex != null) { logWarning("Failed to execute closure! Reason: %s", ex.getMessage()); put.fail(new Exception("Unable to fetch closure state.")); } else { Closure currentState = op.getBody(Closure.class); if (reqClosure.inputs != null) { currentState.inputs.putAll(reqClosure.inputs); } this.setState(put, currentState); put.setBody(currentState).complete(); } })); }
@Override public void handlePeriodicMaintenance(Operation post) { if (getProcessingStage() != ProcessingStage.AVAILABLE) { logWarning("Skipping maintenance since service is not available: %s ", getUri()); return; } sendRequest(Operation .createGet(getUri()) .setCompletion((op, ex) -> { if (ex != null) { logWarning("Failed to fetch closure state. Reason: %s", ex.getMessage()); post.fail(new Exception("Unable to fetch closure state.")); } else { Closure closure = op.getBody(Closure.class); handleMaintenance(post, closure); } })); }
private void sendRequestStateToExternalUrl(String callbackReference, Closure state) { // send put with the RequestState as the body logInfo("Calling callback URI: %s", callbackReference); try { URI callbackUri = URI.create(callbackReference); sendRequest(Operation.createPost(callbackUri) .setBody(state) .forceRemote() .setCompletion((op, ex) -> { if (ex != null) { logSevere("Failure calling callback '%s' for registry state: %s", op.getUri(), Utils.toString(ex)); } })); } catch (Exception e) { logSevere(e); } }
private void callWebhook(String webHookUriStr, Closure closure) { logInfo("Calling execution container for closure: %s", closure.documentSelfLink); URI webHookUri = UriUtils.buildUri(webHookUriStr); sendRequest(Operation .createPost(webHookUri) .setExpiration(Utils.fromNowMicrosUtc(TimeUnit.SECONDS .toMicros(ClosureProps.DEFAULT_WEB_HOOK_EXPIRATION_TIMEOUT))) .setBody(closure) .setCompletion((op, ex) -> { if (ex != null) { logWarning("Unable to send closure state to: %s. Reason: %s", webHookUriStr, Utils.toString(ex)); } else { logInfo("Successfully sent closure state to: %s", webHookUri); } })); }
private void createRequestTracker(ClosureTaskState state) { sendRequest(Operation.createPost(this, ManagementUriParts.REQUEST_STATUS) .setBodyNoCloning(fromTask(state)) .setCompletion((o, e) -> { if (e != null) { logWarning("Failed to create request tracker for: " + state.documentSelfLink, e); return; } state.requestTrackerLink = o.getBody(TaskStatusState.class).documentSelfLink; logInfo("Created request tracker: %s", state.requestTrackerLink); updateRequestTracker(state, ClosureProps.RETRIES_COUNT); })); }
protected void updateRequestStatus(Closure closure) { ClosureTaskState state = fromClosure(closure); String requestStatusLink = ManagementUriParts.REQUEST_STATUS + "/" + getSelfId(); sendRequest(Operation .createGet(getHost(), requestStatusLink) .setCompletion((op, ex) -> { if (ex != null) { if (op.getStatusCode() == 404) { createRequestTracker(state); } else { logWarning("Unable to update request status for:" + closure .documentSelfLink, ex); } } else { state.requestTrackerLink = requestStatusLink; updateRequestTracker(state, ClosureProps.RETRIES_COUNT); } })); }
protected void updateRequestTracker(ClosureTaskState state, int retryCount) { if (state != null && state.requestTrackerLink != null) { sendRequest(Operation .createPatch(this, state.requestTrackerLink) .setBody(fromTask(state))
}); if (isDone(closure)) { sendRequest(Operation .createGet(this, closure.descriptionLink) .setCompletion((op, ex) -> {