diff --git a/backend/go-app/walkoff.go b/backend/go-app/walkoff.go index b9dd860a..5d0df55c 100644 --- a/backend/go-app/walkoff.go +++ b/backend/go-app/walkoff.go @@ -681,7 +681,7 @@ func handleGetStreamResults(resp http.ResponseWriter, request *http.Request) { // Finds the child nodes of a node in execution and returns them // Used if e.g. a node in a branch is exited, and all children have to be stopped func findChildNodes(workflowExecution WorkflowExecution, nodeId string) []string { - log.Printf("\nNODE TO FIX: %s\n\n", nodeId) + //log.Printf("\nNODE TO FIX: %s\n\n", nodeId) allChildren := []string{nodeId} // 1. Find children of this specific node @@ -690,6 +690,21 @@ func findChildNodes(workflowExecution WorkflowExecution, nodeId string) []string if branch.SourceID == nodeId { log.Printf("Children: %s", branch.DestinationID) allChildren = append(allChildren, branch.DestinationID) + + childNodes := findChildNodes(workflowExecution, branch.DestinationID) + for _, bottomChild := range childNodes { + found := false + for _, topChild := range allChildren { + if topChild == bottomChild { + found = true + break + } + } + + if !found { + allChildren = append(allChildren, bottomChild) + } + } } } @@ -884,6 +899,31 @@ func handleWorkflowQueue(resp http.ResponseWriter, request *http.Request) { workflowExecution.Results = append(workflowExecution.Results, actionResult) } + // FIXME: Have a check for skippednodes and their parents + for resultIndex, result := range workflowExecution.Results { + if result.Status != "SKIPPED" { + continue + } + + // Checks if all parents are skipped or failed. Otherwise removes them from the results + for _, branch := range workflowExecution.Workflow.Branches { + if branch.DestinationID == result.Action.ID { + for _, subresult := range workflowExecution.Results { + if subresult.Action.ID == branch.SourceID { + if subresult.Status != "SKIPPED" && subresult.Status != "FAILURE" { + log.Printf("SUBRESULT PARENT STATUS: %s", subresult.Status) + log.Printf("Should remove resultIndex: %d", resultIndex) + + workflowExecution.Results = append(workflowExecution.Results[:resultIndex], workflowExecution.Results[resultIndex+1:]...) + + break + } + } + } + } + } + } + extraInputs := 0 for _, result := range workflowExecution.Results { if result.Action.Name == "User Input" && result.Action.AppName == "User Input" { @@ -893,7 +933,6 @@ func handleWorkflowQueue(resp http.ResponseWriter, request *http.Request) { log.Printf("LENGTH: %d - %d", len(workflowExecution.Results), len(workflowExecution.Workflow.Actions)) - //log.Printf("Checking results %d vs %d", len(workflowExecution.Results), len(workflowExecution.Workflow.Actions)+extraInputs) if len(workflowExecution.Results) == len(workflowExecution.Workflow.Actions)+extraInputs { finished := true lastResult := "" @@ -906,8 +945,29 @@ func handleWorkflowQueue(resp http.ResponseWriter, request *http.Request) { break } + // FIXME: Check if ALL parents are skipped or if its just one. Otherwise execute it if result.Status == "SKIPPED" { skippedNodes = true + + // Checks if all parents are skipped or failed. Otherwise removes them from the results + for _, branch := range workflowExecution.Workflow.Branches { + if branch.DestinationID == result.Action.ID { + for _, subresult := range workflowExecution.Results { + if subresult.Action.ID == branch.SourceID { + if subresult.Status != "SKIPPED" && subresult.Status != "FAILURE" { + //log.Printf("SUBRESULT PARENT STATUS: %s", subresult.Status) + //log.Printf("Should remove resultIndex: %d", resultIndex) + finished = false + break + } + } + } + } + + if !finished { + break + } + } } lastResult = result.Result diff --git a/frontend/src/AngularWorkflow.js b/frontend/src/AngularWorkflow.js index fa3d349e..1d653d2d 100644 --- a/frontend/src/AngularWorkflow.js +++ b/frontend/src/AngularWorkflow.js @@ -325,6 +325,14 @@ const AngularWorkflow = (props) => { incomingEdges.addClass('success-highlight') currentnode.addClass('executing-highlight') break + case "SKIPPED": + currentnode.removeClass('not-executing-highlight') + currentnode.removeClass('success-highlight') + currentnode.removeClass('failure-highlight') + currentnode.removeClass('awaiting-data-highlight') + currentnode.removeClass('executing-highlight') + currentnode.addClass('skipped-highlight') + break case "WAITING": currentnode.removeClass('not-executing-highlight') currentnode.removeClass('success-highlight') diff --git a/frontend/src/defaultCytoscapeStyle.js b/frontend/src/defaultCytoscapeStyle.js index 869dd6d7..2b57403c 100644 --- a/frontend/src/defaultCytoscapeStyle.js +++ b/frontend/src/defaultCytoscapeStyle.js @@ -113,6 +113,16 @@ const data = [{ 'background-color': '#77b0d0', }, }, + { + selector: '.skipped-highlight', + css: { + 'background-color': 'grey', + 'border-color': 'grey', + 'border-width': '8px', + 'transition-property': 'background-color', + 'transition-duration': '0.5s', + }, + }, { selector: '.success-highlight', css: { diff --git a/functions/onprem/worker/worker.go b/functions/onprem/worker/worker.go index 460693fe..d1908669 100644 --- a/functions/onprem/worker/worker.go +++ b/functions/onprem/worker/worker.go @@ -502,9 +502,9 @@ func handleExecution(client *http.Client, req *http.Request, workflowExecution W nextActions = []string{startAction} } else { for _, item := range workflowExecution.Results { + // FIXME: Check whether the item should be visited or not visited = append(visited, item.Action.ID) nextActions = children[item.Action.ID] - // FIXME: check if nextActions items are finished? } }