You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2022/11/04 17:14:09 UTC
[brooklyn-ui] 04/04: show workflow for ui-based scripts, to be able to re-run it
This is an automated email from the ASF dual-hosted git repository.
heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-ui.git
commit ea0d991f0d903fd0f6ad0a02b29c95e6ed33e400
Author: Alex Heneveld <al...@cloudsoft.io>
AuthorDate: Wed Nov 2 21:06:43 2022 +0000
show workflow for ui-based scripts, to be able to re-run it
---
.../workflow/workflow-steps.directive.js | 2 +-
ui-modules/app-inspector/app/index.js | 3 ++-
.../inspect/activities/activities.controller.js | 2 +-
.../inspect/activities/detail/detail.controller.js | 26 ++++++++++++++++++----
.../inspect/activities/detail/detail.template.html | 4 ++++
.../app/views/main/inspect/inspect.controller.js | 21 ++++++++++++++---
.../main/inspect/run-workflow-modal.template.html | 2 +-
.../utils/user-management/user-management.js | 1 -
ui-modules/utils/yaml-editor/yaml-editor.js | 6 ++++-
9 files changed, 54 insertions(+), 13 deletions(-)
diff --git a/ui-modules/app-inspector/app/components/workflow/workflow-steps.directive.js b/ui-modules/app-inspector/app/components/workflow/workflow-steps.directive.js
index ab49d345..35021841 100644
--- a/ui-modules/app-inspector/app/components/workflow/workflow-steps.directive.js
+++ b/ui-modules/app-inspector/app/components/workflow/workflow-steps.directive.js
@@ -163,7 +163,7 @@ function makeArrows(workflow, steps) {
function stepY(n) {
if (n==-1) return 'start/end';
- if (!steps || n<0 || n>=steps.length) {
+ if (!steps || n<0 || n>=steps.length || _.isNil(n)) {
console.log("workflow arrow bounds error", steps, n);
return null;
}
diff --git a/ui-modules/app-inspector/app/index.js b/ui-modules/app-inspector/app/index.js
index d8c00ebf..9dbfd95f 100755
--- a/ui-modules/app-inspector/app/index.js
+++ b/ui-modules/app-inspector/app/index.js
@@ -36,6 +36,7 @@ import brYamlEditor from "brooklyn-ui-utils/yaml-editor/yaml-editor";
import brWebNotifications from 'brooklyn-ui-utils/web-notifications/web-notifications';
import brExpandablePanel from 'brooklyn-ui-utils/expandable-panel/expandable-panel';
import brLogbook from 'brooklyn-ui-utils/logbook/logbook';
+import serverApi from 'brooklyn-ui-utils/api/brooklyn/server';
import "angular-xeditable";
import apiProvider from "components/providers/api.provider";
@@ -71,7 +72,7 @@ const IS_PRODUCTION = process.env.NODE_ENV === 'production' || false;
angular.module('brooklynAppInspector', [ngResource, ngCookies, ngSanitize, uiRouter, brCore, brUtilsGeneral,
dropdownNested,
brServerStatus, brIconGenerator, brInterstitialSpinner, brooklynModuleLinks, brSensitiveField, brooklynUserManagement,
- brYamlEditor, brWebNotifications, brExpandablePanel, 'xeditable', brLogbook, apiProvider, entityTree, loadingState,
+ brYamlEditor, brWebNotifications, brExpandablePanel, 'xeditable', brLogbook, apiProvider, entityTree, loadingState, serverApi,
configSensorTable, entityEffector, entityPolicy, breadcrumbNavigation, taskList, taskSunburst, stream, adjunctsList,
workflowSteps, workflowStep,
managementDetail, brandAngularJs])
diff --git a/ui-modules/app-inspector/app/views/main/inspect/activities/activities.controller.js b/ui-modules/app-inspector/app/views/main/inspect/activities/activities.controller.js
index 449504e6..eb00c68b 100644
--- a/ui-modules/app-inspector/app/views/main/inspect/activities/activities.controller.js
+++ b/ui-modules/app-inspector/app/views/main/inspect/activities/activities.controller.js
@@ -195,7 +195,7 @@ function ActivitiesController($scope, $state, $stateParams, $log, $timeout, enti
export function makeTaskStubFromWorkflowRecord(wf, wft) {
const result = {
id: wft.taskId,
- displayName: wf.name + (wft.reasonForReplay && wft.reasonForReplay!="initial run" ? " ("+wft.reasonForReplay+")" : ""),
+ displayName: wf.name + (wft.reasonForReplay && wft.reasonForReplay!="Initial run" ? " ("+wft.reasonForReplay+")" : ""),
entityId: (wf.entity || {}).id,
isError: wft.isError===false ? false : true,
currentStatus: _.isNil(wft.isError) ? "Unavailable" : wft.status,
diff --git a/ui-modules/app-inspector/app/views/main/inspect/activities/detail/detail.controller.js b/ui-modules/app-inspector/app/views/main/inspect/activities/detail/detail.controller.js
index 6589760f..86fa0e6f 100644
--- a/ui-modules/app-inspector/app/views/main/inspect/activities/detail/detail.controller.js
+++ b/ui-modules/app-inspector/app/views/main/inspect/activities/detail/detail.controller.js
@@ -142,7 +142,10 @@ function DetailController($scope, $state, $stateParams, $location, $log, $uibMod
});
}
- $scope.actions.workflowReplays = [];
+ let osi = vm.model.workflow.data.oldStepInfo;
+ vm.model.workflow.finishedWithNoSteps = ((osi["-2"] || {}).previous || [])[0] == -1;
+
+ $scope.actions.workflowReplays = [];
if (vm.model.workflow.data.status !== 'RUNNING') {
$scope.actions.workflowReplays = [];
@@ -170,8 +173,8 @@ function DetailController($scope, $state, $stateParams, $location, $log, $uibMod
if (replayableFromStart) {
let w1 = 'Restart', w2 = '(not resumable)';
if (stepIndex<0 || (_.isNil(stepIndex) && vm.model.workflow.data.replayableLastStep==-2)) { w1 = 'Run'; w2 = 'again'; }
- else if (_.isNil(stepIndex)) { w2 = '(did not start)'; }
else if (replayableContinuing) w2 = '';
+ else if (_.isNil(stepIndex)) { w2 = '(did not start)'; }
$scope.actions.workflowReplays.push({targetId: 'start', reason: 'Restart workflow from UI',
label: w1+' '+(stepIndex>=0 ? 'workflow ' : '')+w2});
@@ -212,6 +215,21 @@ function DetailController($scope, $state, $stateParams, $location, $log, $uibMod
if (vm.model.workflow.data.status === 'RUNNING') wResponse.interval(1000);
observers.push(wResponse.subscribe(processWorkflowData));
+ function initFromWorkflowFirstReplayTask(task) {
+ if (task) {
+ const workflowYaml = (task.tags || []).find(t => t.workflow_yaml);
+ if (workflowYaml) {
+ $scope.workflow_yaml = workflowYaml.workflow_yaml;
+ }
+ }
+ }
+
+ if ($scope.workflowId === activityId) initFromWorkflowFirstReplayTask(vm.model.activity);
+ else activityApi.activity($scope.workflowId).then((response)=> {
+ initFromWorkflowFirstReplayTask(response.data);
+ });
+
+
}).catch(error => {
if (optimistic) {
vm.model.workflow.loading = null;
@@ -318,13 +336,13 @@ function DetailController($scope, $state, $stateParams, $location, $log, $uibMod
}
vm.isNonEmpty = Utils.isNonEmpty;
- vm.yaml = jsyaml.dump;
+ vm.yaml = (o) => typeof o === 'string' ? o : jsyaml.dump(o);
vm.openInRunModel = function (workflowYaml) {
$uibModal.open({
animation: true,
template: runWorkflowModalTemplate,
- controller: ['$scope', '$http', '$uibModalInstance', 'applicationId', 'entityId', 'workflowYaml', runWorkflowController],
+ controller: ['$scope', '$http', '$uibModalInstance', 'serverApi', 'applicationId', 'entityId', 'workflowYaml', runWorkflowController],
size: 'lg',
resolve: {
applicationId: ()=>(applicationId),
diff --git a/ui-modules/app-inspector/app/views/main/inspect/activities/detail/detail.template.html b/ui-modules/app-inspector/app/views/main/inspect/activities/detail/detail.template.html
index 04a68636..1fe8b110 100644
--- a/ui-modules/app-inspector/app/views/main/inspect/activities/detail/detail.template.html
+++ b/ui-modules/app-inspector/app/views/main/inspect/activities/detail/detail.template.html
@@ -255,6 +255,10 @@
></a></b>.
</div>
+ <div ng-if="vm.model.workflow.finishedWithNoSteps" class="workflow-preface-para">
+ The workflow did not run any steps; if this is unexpected, check the conditions on the steps.
+ </div>
+
<div ng-if="vm.model.workflow.data.errorHandlerTaskId" class="workflow-preface-para">
<span ng-if="vm.model.activityId==vm.model.workflow.data.errorHandlerTaskId">
This is the page for the error handler for this workflow.
diff --git a/ui-modules/app-inspector/app/views/main/inspect/inspect.controller.js b/ui-modules/app-inspector/app/views/main/inspect/inspect.controller.js
index 61dd014f..896374e3 100644
--- a/ui-modules/app-inspector/app/views/main/inspect/inspect.controller.js
+++ b/ui-modules/app-inspector/app/views/main/inspect/inspect.controller.js
@@ -80,7 +80,7 @@ export function inspectController($scope, $state, $stateParams, $uibModal, brSna
$uibModal.open({
animation: true,
template: runWorkflowModalTemplate,
- controller: ['$scope', '$http', '$uibModalInstance', 'applicationId', 'entityId', runWorkflowController],
+ controller: ['$scope', '$http', '$uibModalInstance', 'serverApi', 'applicationId', 'entityId', runWorkflowController],
size: 'lg',
resolve: {
applicationId: ()=>(applicationId),
@@ -144,12 +144,27 @@ export function addChildController($scope, $http, $uibModalInstance, application
}
}
-export function runWorkflowController($scope, $http, $uibModalInstance, applicationId, entityId, workflowYaml) {
- $scope.workflowYaml = workflowYaml || 'steps:\n - ';
+export function runWorkflowController($scope, $http, $uibModalInstance, serverApi, applicationId, entityId, workflowYaml) {
+ $scope.workflowYaml = workflowYaml;
$scope.errorMessage = null;
$scope.running = false;
$scope.runWorkflow = runWorkflow;
+ if (!$scope.workflowYaml) {
+ function initWorkflowYaml() {
+ if (!$scope.workflowYaml) {
+ $scope.workflowYaml = 'name: Workflow via UI' + ($scope.user ? ' ' + $scope.user : '') + '\n' + 'steps:\n - ';
+ }
+ }
+ serverApi.getUser().then((response) => {
+ $scope.user = response.data;
+ initWorkflowYaml();
+ }).catch((response) => {
+ $scope.user = null;
+ initWorkflowYaml();
+ });
+ }
+
function runWorkflow() {
$scope.running = true;
$scope.errorMessage = null;
diff --git a/ui-modules/app-inspector/app/views/main/inspect/run-workflow-modal.template.html b/ui-modules/app-inspector/app/views/main/inspect/run-workflow-modal.template.html
index 9bb3e654..83860e0a 100644
--- a/ui-modules/app-inspector/app/views/main/inspect/run-workflow-modal.template.html
+++ b/ui-modules/app-inspector/app/views/main/inspect/run-workflow-modal.template.html
@@ -25,7 +25,7 @@
<div ng-if="errorMessage" class="alert alert-danger" role="alert">
<strong>Error</strong> {{errorMessage}}
</div>
- <br-yaml-editor value="workflowYaml" enable-auto-complete></br-yaml-editor>
+ <br-yaml-editor value="workflowYaml" enable-auto-complete reset-to-end-on-external-value-set="true"></br-yaml-editor>
</div>
<div class="modal-footer">
diff --git a/ui-modules/utils/user-management/user-management.js b/ui-modules/utils/user-management/user-management.js
index 5383461b..54fd2bd6 100644
--- a/ui-modules/utils/user-management/user-management.js
+++ b/ui-modules/utils/user-management/user-management.js
@@ -42,7 +42,6 @@ export function userMenuDirective($compile, serverApi) {
.addClass('dropdown')
.removeAttr('br-user-menu') //remove the attribute to avoid indefinite loop
.removeAttr('data-br-user-menu'); //also remove the same attribute with data- prefix in case users specify data-common-things in the html
-
serverApi.getUser().then((response) => {
scope.user = response.data;
}).catch((response) => {
diff --git a/ui-modules/utils/yaml-editor/yaml-editor.js b/ui-modules/utils/yaml-editor/yaml-editor.js
index 4cfa160b..38952be2 100644
--- a/ui-modules/utils/yaml-editor/yaml-editor.js
+++ b/ui-modules/utils/yaml-editor/yaml-editor.js
@@ -45,7 +45,8 @@ export function yamlEditorDirective($rootScope, brSnackbar) {
scope: {
type: '@',
value: '=',
- onChange: '&'
+ onChange: '&',
+ resetToEndOnExternalValueSet: '=?',
},
link: link
};
@@ -180,6 +181,9 @@ export function yamlEditorDirective($rootScope, brSnackbar) {
$scope.cm.focus();
if ($scope.cm.getValue() !== newVal && angular.isDefined(newVal)) {
$scope.cm.setValue(newVal);
+ if ($scope.resetToEndOnExternalValueSet) {
+ $scope.cm.setCursor($scope.cm.lineCount(), 0);
+ }
}
setTimeout(()=> {
$scope.cm.focus();