blob: 1dc8231987b2e803c8ce0f72e66db705de27a019 [file] [log] [blame]
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<div class="workflow-step-outer">
<div class="workflow-step-status-indicators handy"
ui-sref="main.inspect.activities.detail({applicationId: workflow.applicationId, entityId: workflow.entityId, activityId: stepContext.taskId, workflowId })"
>
<span ng-if="isCurrentAndActive" class="running-status">
<brooklyn-status-icon value="STARTING"></brooklyn-status-icon>
</span>
<span ng-if="stepCurrentSuccess" class="color-succeeded" title="{{ stepCurrentSuccess }}">
<i class="fa fa-check-circle"></i>
</span>
<span ng-if="stepCurrentWarning" class="color-cancelled" title="{{ stepCurrentWarning }}">
<i class="fa fa-exclamation-circle"></i>
</span>
<span ng-if="stepCurrentError" class="color-failed" title="{{ stepCurrentError }}">
<i class="fa fa-times-circle"></i>
</span>
</div>
<div class="workflow-step workflow-{{workflowId}}" id="workflow-step-{{stepIindex}}" ng-class="vm.getWorkflowStepClasses(stepIndex)">
<div class="rhs-icons">
<div ng-if="isFocusTask" class="workflow-step-pill focus-step label-info" title="This step instance is for the task currently selected in the activity view.">
selected
</div>
<div ng-if="stepTitle.id && isFocusTask" class="workflow-step-pill step-id">
<i class="fa fa-id-card-o"></i>
{{ stepTitle.id }}
</div>
<div ng-if="stepTitle.id && !isFocusTask && stepContext.taskId" class="workflow-step-pill step-id handy"
title="Select this task"
ui-sref="main.inspect.activities.detail({applicationId: workflow.applicationId, entityId: workflow.entityId, activityId: stepContext.taskId, workflowId })">
<i class="fa fa-id-card-o"></i>
{{ stepTitle.id }}
</div>
<div ng-if="!stepTitle.id && !isFocusTask && stepContext.taskId" class="workflow-step-pill step-id handy hover-only"
title="Select this task"
ui-sref="main.inspect.activities.detail({applicationId: workflow.applicationId, entityId: workflow.entityId, activityId: stepContext.taskId, workflowId })">
<i class="fa fa-id-card-o"></i>
</div>
<div ng-click="vm.toggleExpandState()" class="expand-toggle">
<i ng-class="expanded ? 'fa fa-chevron-up' : 'fa fa-chevron-down'"></i>
</div>
</div>
<div class="step-block-title">
<span class="step-index">{{ stepTitle.index }}</span>
<span ng-if="stepTitle.name" class="step-name">
{{ stepTitle.name}}
</span>
<span ng-if="stepTitle.code && !stepTitle.name" class="step-title-code">{{ stepTitle.code }}</span>
<span ng-if="stepTitle.leftCodeAlternative && !stepTitle.name" class="step-left-extra">{{ stepTitle.leftCodeAlternative}}</span>
</div>
<div ng-if="expanded" class="step-details">
<div class="space-above">
<div>
<span ng-if="!osi.countStarted" class="space-above">
This step has not been run<span ng-if="isRunning"> yet</span>.
{{ stepCurrentError ? 'There was an error prior to running this step. More information can be found in the Details panel on the task for the workflow.' : '' }}
</span>
<span ng-if="osi.countStarted">
<span ng-if="osi.countCompleted == osi.countStarted">
<span ng-if="osi.countCompleted > 1">
This step has run
<span ng-if="osi.countCompleted == 2">
twice,
</span>
<span ng-if="osi.countCompleted > 2">
{{ osi.countCompleted }} times,
</span>
most recently
</span>
<span ng-if="osi.countCompleted == 1">
This step ran
</span>
</span>
<span ng-if="osi.countCompleted != osi.countStarted">
<span ng-if="isCurrentAndActive">
<span ng-if="osi.countCompleted == osi.countStarted - 1">
This step is currently running
</span>
<span ng-if="osi.countCompleted <= osi.countStarted - 2">
This step has had errors previously and is currently running
</span>
</span>
<span ng-if="!isCurrentAndActive">
<span ng-if="osi.countStarted == 1">
This step had errors. It ran
</span>
<span ng-if="osi.countStarted >= 2 && osi.countCompleted==0">
This step has had errors on all previous runs, including the last run,
</span>
<span ng-if="osi.countStarted >= 2 && osi.countCompleted>0">
This step has had errors on some previous runs. It most recently ran
</span>
</span>
</span>
<span ng-if="isFocusTask">
<span ng-if="isWrappingStepTaskOuter || isWrappingStepTaskInner">
in task <span class="monospace">{{ outerStepContext.taskId }}</span>
selecting <span
ng-if="otherMetadata['Switch match']"><b> {{ otherMetadata['Switch match'] }}</b> in </span>
task <span class="monospace">{{ innerStepContext.taskId }}</span>,
currently loaded on this page.
</span>
<span ng-if="!(isWrappingStepTaskOuter || isWrappingStepTaskInner)">
in task <span class="monospace">{{ stepContext.taskId }}</span> which is the one currently loaded on this page.
</span>
The other sections on this page pertain specifically to this step.
</span>
<span ng-if="!isFocusTask">
in <button type="button" class="btn inline-button-small"
ui-sref="main.inspect.activities.detail({applicationId: workflow.applicationId, entityId: workflow.entityId, activityId: stepContext.taskId, workflowId })"
>task <span class="monospace">{{ stepContext.taskId }}</span></button>.
</span>
</span>
</div>
<div ng-if="isErrorHandler" class="space-above">
The error handler for this step is the task currently loaded on this page.
The other sections on this page pertain specifically to the error handler for this step.
</div>
<div ng-if="stepContext.errorHandlerTaskId && !isErrorHandler" class="space-above">
The error here triggered a handler in
<button type="button" class="btn inline-button-small"
ui-sref="main.inspect.activities.detail({applicationId: workflow.applicationId, entityId: workflow.entityId, activityId: stepContext.errorHandlerTaskId, workflowId})"
><span class="monospace">task {{stepContext.errorHandlerTaskId}}</span></button
><span ng-if="stepCurrentWarning"> which successfully completed</span
><span ng-if="stepCurrentError"> which threw an error</span
><span ng-if="isCurrentAndActive"> which is running</span
>.
</div>
<div ng-if="!isWrappingStepTaskOuter && !isWrappingStepTaskInner && isFocusStep && !isFocusTask && !isErrorHandler" class="space-above">
<b>The task currently loaded on this page (<span class="monospace">{{ task.id }}</span>) is for a previous run of this step.</b>
</div>
<div ng-if="!workflow.runIsOld">
<div ng-if="stepContext.subWorkflows && stepContext.subWorkflows.length" class="space-above">
<span ng-if="stepContext.subWorkflows.length==1" class="space-above">
This step ran
<button type="button" class="btn inline-button-small"
ui-sref="main.inspect.activities.detail({applicationId: stepContext.subWorkflows[0].applicationId, entityId: stepContext.subWorkflows[0].entityId, activityId: stepContext.subWorkflows[0].workflowId, workflowLatestRun: true})">
<span ng-if="vm.hasInterestingWorkflowNameFromReference(stepContext.subWorkflows[0])">
1 nested workflow: {{ vm.getWorkflowNameFromReference(stepContext.subWorkflows[0]) }}
</span>
<span ng-if="!vm.hasInterestingWorkflowNameFromReference(stepContext.subWorkflows[0])">
1 nested workflow <span class="monospace">{{ stepContext.subWorkflows[0].workflowId }}</span>
</span>
</button>.
</span>
<span ng-if="stepContext.subWorkflows.length>1" class="space-above">
This step ran
<div class="btn-group" uib-dropdown ng-if="stepContext.subWorkflows.length>1">
<button id="nested-workflow-dropdown-button" type="button" class="btn inline-button-small" uib-dropdown-toggle>
{{ stepContext.subWorkflows.length }} nested workflow{{ stepContext.subWorkflows.length>1 ? 's' : '' }} <span class="caret"></span>
</button>
<ul class="dropdown-menu" uib-dropdown-menu role="menu" aria-labelledby="nested-workflow-dropdown-button" style="width: auto; max-width: 40em;">
<li role="menuitem" ng-repeat="sub in stepContext.subWorkflows" id="sub-workflow-{{ sub.workflowId }}">
<a href="" ui-sref="main.inspect.activities.detail({applicationId: sub.applicationId, entityId: sub.entityId, activityId: sub.workflowId, workflowLatestRun: true})" style="padding-left: 9px; padding-right: 9px;">
<span ng-if="vm.hasInterestingWorkflowNameFromReference(stepContext.subWorkflows[0])">{{
vm.getWorkflowNameFromReference(sub, "") }}</span>
<span ng-if="!vm.hasInterestingWorkflowNameFromReference(stepContext.subWorkflows[0])" class="monospace">{{
sub.workflowId }}</span>
</a></li>
</ul>
</div>.
</span>
</div>
</div>
<div class="more-space-above">
<div class="data-row" ng-if="uniqueSubworkflow">
<workflow-steps nested="true" workflow="uniqueSubworkflow" style="flex: 1 1 auto; margin-left: -2em; margin-top: -24px; margin-right: -1em;"/>
</div>
<div class="data-row" ng-if="stepContext.error"><div class="A">Error</div> <div class="B {{ vm.classForCodeMaybeMultiline(stepContext.error) }}">{{ vm.yamlOrPrimitive(stepContext.error) }}</div></div>
<div class="data-row" ng-if="showStepDefinitionInBody"><div class="A">Step Definition</div> <div class="B {{ vm.classForCodeMaybeMultiline(step) }}">{{ vm.yamlOrPrimitive(step) }}</div></div>
<div ng-if="!isFocusStep || isFocusTask">
<div class="data-row" ng-if="otherMetadata" ng-repeat="(key,value) in otherMetadata" id="$key">
<div class="A">{{ key }}</div> <div class="B {{ vm.classForCodeMaybeMultiline(value) }}">{{ vm.yamlOrPrimitive(value) }}</div>
</div>
<div class="data-row" ng-if="stepContext.output"><div class="A">Output</div> <div class="B {{ vm.classForCodeMaybeMultiline(stepContext.output) }}">{{ vm.yaml(stepContext.output) }}</div></div>
<div class="data-row" ng-if="osi.workflowScratchUpdates"><div class="A">Variables Updated</div> <div class="B {{ vm.classForCodeMaybeMultiline(osi.workflowScratchUpdates) }}">{{ vm.yaml(osi.workflowScratchUpdates) }}</div></div>
</div>
</div>
</div>
<div class="more-space-above" ng-if="vm.nonEmpty(stepContext) || vm.nonEmpty(step) || vm.nonEmpty(osi)"
style="margin-bottom: {{ addlTitle ? '9px' : '6px' }};">
<div class="btn-group right" uib-dropdown>
<button id="extra-data-button" type="button" class="btn btn-sm btn-select-dropdown pull-right" uib-dropdown-toggle
style="padding: 2px 6px; {{ addlTitle ? 'width: 100%; ' : '' }} text-align: right;">
{{ addlTitle ? 'Showing '+addlTitle : 'More Information' }}
<span class="caret" style="{{ addlTitle ? 'rotate: 180deg;' : '' }}"></span>
</button>
<ul class="dropdown-menu pull-right workflow-dropdown-small" uib-dropdown-menu role="menu" aria-labelledby="extra-data-button">
<li role="menuitem" ng-if="!showStepDefinitionInBody"> <a href="" ng-click="vm.showAdditional('Step Definition', 'step_defn', vm.yamlOrPrimitive(step))" ng-class="{'selected' : addlMode === 'step_defn'}">
<i class="fa fa-check check"></i>
Step Definition</a> </li>
<li role="menuitem" > <a href="" ng-click="vm.showAdditional('Context Variables', 'vars', null)" ng-class="{'selected' : addlMode === 'vars'}">
<i class="fa fa-check check"></i>
Context Variables</a> </li>
<li role="menuitem" > <a href="" ng-click="vm.showAdditional('Additional Step Info', 'metadata', null)" ng-class="{'selected' : addlMode === 'summary'}">
<i class="fa fa-check check"></i>
Additional Step Info</a> </li>
<li role="menuitem" > <a href="" ng-click="vm.showAdditional('Step Record YAML', 'osi', osi)" ng-class="{'selected' : addlMode === 'osi'}">
<i class="fa fa-check check"></i>
Step Record YAML</a> </li>
<li role="menuitem" > <a href="" ng-click="vm.showAdditional(null, null)" ng-class="{'selected' : addlMode === null}">
<i class="fa fa-check check"></i>
Hide Additional Info</a> </li>
</ul>
</div>
<div ng-if="addlMode === 'vars'">
<div class="data-row" ng-if="vm.getOutputAndScratchForStep(stepIndex).output">
<div class="A">Output of previous</div>
<div class="B {{ vm.classForCodeMaybeMultiline(vm.getOutputAndScratchForStep(stepIndex).output) }}">{{
vm.yamlOrPrimitive(vm.getOutputAndScratchForStep(stepIndex).output) }}</div>
</div>
<div class="data-row" ng-if="vm.getOutputAndScratchForStep(stepIndex).workflowScratch">
<div class="A">Workflow scratch</div>
<div class="B {{ vm.classForCodeMaybeMultiline(vm.getOutputAndScratchForStep(stepIndex).workflowScratch) }}">{{
vm.yamlOrPrimitive(vm.getOutputAndScratchForStep(stepIndex).workflowScratch) }}</div>
</div>
<div class="data-row" ng-if="workflow.data.input">
<div class="A">Workflow input</div>
<div class="B {{ vm.classForCodeMaybeMultiline(workflow.data.input) }}">{{
vm.yamlOrPrimitive(workflow.data.input) }}</div>
</div>
<div class="data-row" ng-if="!vm.getOutputAndScratchForStep(stepIndex).output && !vm.getOutputAndScratchForStep(stepIndex).workflowScratch && !workflow.data.input">
<div class="A">No context variables set</div>
</div>
</div>
<div ng-if="addlMode === 'metadata'">
<div class="data-row" ng-if="step.name"><div class="A">Name</div> <div class="B">{{ step.name }}</div></div>
<div class="data-row" ng-if="step.id"><div class="A">ID</div> <div class="B fixed-width">{{ step.id }}</div></div>
<div class="data-row"><div class="A">Step Number</div> <div class="B">{{ stepIndex+1 }}</div></div>
<div ng-if="!isFocusStep || isFocusTask">
<!-- only show these if not looking at an earlier run of a step -->
<div class="data-row more-space-above" ng-if="stepContext.input"><div class="A">All Input</div> <div class="B multiline-code">{{ vm.yaml(stepContext.input) }}</div></div>
</div>
<div class="data-row more-space-above">
<div class="A"><span ng-if="isCurrentAndActive">CURRENTLY EXECUTING</span><span ng-if="!isCurrentAndActive"><span ng-if="osi.countStarted > 1">LAST </span>EXECUTED</span> IN</div>
<div class="B">
<span ng-if="isFocusTask">
task <span class="monospace">{{ stepContext.taskId }}</span>
</span>
<span ng-if="!isFocusTask">
<a ui-sref="main.inspect.activities.detail({applicationId: workflow.applicationId, entityId: workflow.entityId, activityId: stepContext.taskId, workflowId })"
>task <span class="monospace">{{ stepContext.taskId }}</span></a>
</span>
</div>
</div>
<div ng-if="!isFocusStep || isFocusTask">
<!-- only show these if not looking at an earlier run of a step -->
<div class="data-row"><div class="A">Preceeded by</div> <div class="B">
<span ng-if="osi.previousTaskId">
Step {{ osi.previous[0]+1 }}
(<a ui-sref="main.inspect.activities.detail({applicationId: workflow.applicationId, entityId: workflow.entityId, activityId: osi.previousTaskId, workflowId })"
>task <span class="monospace">{{ osi.previousTaskId }}</span></a>)
</span>
<span ng-if="!osi.previousTaskId">(workflow start)</span>
</div></div>
<div class="data-row" ng-if="!isCurrentMaybeInactive"><div class="A">Followed by</div> <div class="B">
<span ng-if="osi.nextTaskId">
Step {{ osi.next[0]+1 }}
(<a ui-sref="main.inspect.activities.detail({applicationId: workflow.applicationId, entityId: workflow.entityId, activityId: osi.nextTaskId, workflowId })"
>task <span class="monospace">{{ osi.nextTaskId }}</span></a>)
</span>
<span ng-if="!osi.nextTaskId">(workflow end)</span>
</div></div>
</div>
<div ng-if="osi.countStarted > 1 && osi.countStarted > osi.countCompleted" class="space-above">
<div class="data-row more-space-above"><div class="A">Runs</div> <div class="B"><b>{{ osi.countStarted }}</b></div></div>
<div class="data-row"><div class="A">Succeeded</div> <div class="B">{{ osi.countCompleted }}</div></div>
<div class="data-row"><div class="A">Failed</div> <div class="B">{{ osi.countStarted - osi.countCompleted - (isCurrentAndActive ? 1 : 0) }}</div></div>
</div>
</div>
<pre ng-if="addlData" class="more-space-above">{{ addlData }}</pre>
</div>
</div>
</div>
</div>