@red-hat-developer-hub/backstage-plugin-orchestrator-backend 8.10.1 → 8.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/service/OrchestratorService.cjs.js +29 -9
- package/dist/service/OrchestratorService.cjs.js.map +1 -1
- package/dist/service/SonataFlowService.cjs.js +12 -2
- package/dist/service/SonataFlowService.cjs.js.map +1 -1
- package/dist/service/WorkflowCacheService.cjs.js +2 -2
- package/dist/service/WorkflowCacheService.cjs.js.map +1 -1
- package/dist/service/api/mapping/V2Mappings.cjs.js +1 -0
- package/dist/service/api/mapping/V2Mappings.cjs.js.map +1 -1
- package/dist/service/api/v2.cjs.js +6 -1
- package/dist/service/api/v2.cjs.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @red-hat-developer-hub/backstage-plugin-orchestrator-backend
|
|
2
2
|
|
|
3
|
+
## 8.10.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- b2307f3: The updated overview of a workflow will have the availability property if the isAvailable prop is false
|
|
8
|
+
- e1a86f0: return total count as a parameter for the instances
|
|
9
|
+
- Updated dependencies [b2307f3]
|
|
10
|
+
- Updated dependencies [e1a86f0]
|
|
11
|
+
- @red-hat-developer-hub/backstage-plugin-orchestrator-common@3.7.2
|
|
12
|
+
- @red-hat-developer-hub/backstage-plugin-orchestrator-node@1.3.2
|
|
13
|
+
|
|
3
14
|
## 8.10.1
|
|
4
15
|
|
|
5
16
|
### Patch Changes
|
|
@@ -63,13 +63,25 @@ class OrchestratorService {
|
|
|
63
63
|
filter: args.filter,
|
|
64
64
|
targetEntity: args.targetEntity
|
|
65
65
|
});
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
66
|
+
if (!overviews?.length) {
|
|
67
|
+
return overviews;
|
|
68
|
+
}
|
|
69
|
+
const serviceUrls = await this.dataIndexService.fetchWorkflowServiceUrls();
|
|
70
|
+
return Promise.all(
|
|
71
|
+
overviews.map(async (overview) => {
|
|
72
|
+
const updatedOverview = overview;
|
|
73
|
+
updatedOverview.isAvailable = this.workflowCacheService.isAvailable(
|
|
74
|
+
updatedOverview.workflowId
|
|
75
|
+
);
|
|
76
|
+
if (!updatedOverview.isAvailable) {
|
|
77
|
+
updatedOverview.availability = await this.sonataFlowService.pingWorkflowService({
|
|
78
|
+
definitionId: updatedOverview.workflowId,
|
|
79
|
+
serviceUrl: serviceUrls[updatedOverview.workflowId]
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return updatedOverview;
|
|
83
|
+
})
|
|
84
|
+
);
|
|
73
85
|
}
|
|
74
86
|
async executeWorkflowAsCloudEvent(args) {
|
|
75
87
|
return await this.sonataFlowService.executeWorkflowAsCloudEvent(args);
|
|
@@ -84,7 +96,15 @@ class OrchestratorService {
|
|
|
84
96
|
const { definitionId } = args;
|
|
85
97
|
const isWorkflowAvailable = this.workflowCacheService.isAvailable(definitionId);
|
|
86
98
|
const overview = await this.sonataFlowService.fetchWorkflowOverview(definitionId);
|
|
87
|
-
if (overview)
|
|
99
|
+
if (overview) {
|
|
100
|
+
overview.isAvailable = isWorkflowAvailable;
|
|
101
|
+
if (!isWorkflowAvailable) {
|
|
102
|
+
overview.availability = await this.sonataFlowService.pingWorkflowService({
|
|
103
|
+
definitionId,
|
|
104
|
+
serviceUrl: (await this.dataIndexService.fetchWorkflowServiceUrls())[definitionId]
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
88
108
|
return overview;
|
|
89
109
|
}
|
|
90
110
|
async fetchWorkflowLogsByInstance(args) {
|
|
@@ -104,7 +124,7 @@ class OrchestratorService {
|
|
|
104
124
|
definitionId,
|
|
105
125
|
serviceUrl
|
|
106
126
|
});
|
|
107
|
-
return isServiceUp;
|
|
127
|
+
return isServiceUp.isAvailable;
|
|
108
128
|
}
|
|
109
129
|
}
|
|
110
130
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrchestratorService.cjs.js","sources":["../../src/service/OrchestratorService.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n AuthToken,\n Filter,\n ProcessInstance,\n ProcessInstanceDTO,\n ProcessInstanceVariables,\n WorkflowDefinition,\n WorkflowExecutionResponse,\n WorkflowInfo,\n WorkflowLogsResponse,\n WorkflowOverview,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\nimport { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node';\n\nimport { Pagination } from '../types/pagination';\nimport { DataIndexService } from './DataIndexService';\nimport { SonataFlowService } from './SonataFlowService';\nimport { WorkflowCacheService } from './WorkflowCacheService';\n\nexport class OrchestratorService {\n constructor(\n private readonly sonataFlowService: SonataFlowService,\n private readonly dataIndexService: DataIndexService,\n private readonly workflowCacheService: WorkflowCacheService,\n private readonly workflowLogProvider?: WorkflowLogProvider,\n ) {}\n\n // Data Index Service Wrapper\n public getWorkflowIds(): string[] {\n return this.workflowCacheService.definitionIds;\n }\n\n public async abortWorkflowInstance(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n }): Promise<void> {\n return await this.sonataFlowService.abortInstance(args);\n }\n\n public async fetchWorkflowInfo(args: {\n definitionId: string;\n }): Promise<WorkflowInfo | undefined> {\n const { definitionId } = args;\n return await this.dataIndexService.fetchWorkflowInfo(definitionId);\n }\n\n public async fetchInstances(args: {\n pagination?: Pagination;\n filter?: Filter;\n workflowIds?: string[];\n }): Promise<ProcessInstance[]> {\n const definitionIds = args.workflowIds\n ? args.workflowIds\n : this.workflowCacheService.definitionIds;\n return await this.dataIndexService.fetchInstances({\n definitionIds: definitionIds,\n pagination: args.pagination,\n filter: args.filter,\n });\n }\n\n public async fetchDefinitionIdsFromInstances(args: {\n targetEntity: string;\n }): Promise<string[]> {\n return await this.dataIndexService.fetchDefinitionIdsFromInstances(args);\n }\n\n public async fetchWorkflowSource(args: {\n definitionId: string;\n }): Promise<string | undefined> {\n const { definitionId } = args;\n return await this.dataIndexService.fetchWorkflowSource(definitionId);\n }\n\n public async fetchInstanceVariables(args: {\n instanceId: string;\n }): Promise<object | undefined> {\n const { instanceId } = args;\n return await this.dataIndexService.fetchInstanceVariables(instanceId);\n }\n\n public async fetchInstance(args: {\n instanceId: string;\n }): Promise<ProcessInstance | undefined> {\n const { instanceId } = args;\n const instance = await this.dataIndexService.fetchInstance(instanceId);\n return instance;\n }\n\n // SonataFlow Service Wrapper\n\n public async fetchWorkflowInfoOnService(args: {\n definitionId: string;\n serviceUrl: string;\n }): Promise<WorkflowInfo | undefined> {\n return await this.sonataFlowService.fetchWorkflowInfoOnService(args);\n }\n\n public async fetchWorkflowDefinition(args: {\n definitionId: string;\n }): Promise<WorkflowDefinition | undefined> {\n const { definitionId } = args;\n return await this.sonataFlowService.fetchWorkflowDefinition(definitionId);\n }\n\n public async fetchWorkflowOverviews(args: {\n pagination?: Pagination;\n filter?: Filter;\n targetEntity?: string;\n }): Promise<WorkflowOverview[] | undefined> {\n const overviews = await this.sonataFlowService.fetchWorkflowOverviews({\n definitionIds: this.workflowCacheService.definitionIds?.concat(\n this.workflowCacheService.unavailableDefinitionIds,\n ),\n pagination: args.pagination,\n filter: args.filter,\n targetEntity: args.targetEntity,\n });\n\n return overviews?.map(overview => {\n const updatedOverview = overview;\n updatedOverview.isAvailable = this.workflowCacheService.isAvailable(\n updatedOverview.workflowId,\n );\n return updatedOverview;\n });\n }\n\n public async executeWorkflowAsCloudEvent(args: {\n definitionId: string;\n workflowSource: string;\n workflowEventType: string;\n contextAttribute: string;\n inputData?: ProcessInstanceVariables;\n authTokens?: Array<AuthToken>;\n backstageToken?: string;\n }) {\n return await this.sonataFlowService.executeWorkflowAsCloudEvent(args);\n }\n\n public async executeWorkflow(args: {\n definitionId: string;\n serviceUrl: string;\n inputData?: ProcessInstanceVariables;\n authTokens?: Array<AuthToken>;\n backstageToken?: string | undefined;\n }): Promise<WorkflowExecutionResponse | undefined> {\n return await this.sonataFlowService.executeWorkflow(args);\n }\n\n public async retriggerWorkflow(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n authTokens?: Array<AuthToken>;\n backstageToken?: string | undefined;\n }): Promise<boolean | undefined> {\n return this.sonataFlowService.retriggerInstance(args);\n }\n\n public async fetchWorkflowOverview(args: {\n definitionId: string;\n }): Promise<WorkflowOverview | undefined> {\n const { definitionId } = args;\n const isWorkflowAvailable =\n this.workflowCacheService.isAvailable(definitionId);\n const overview =\n await this.sonataFlowService.fetchWorkflowOverview(definitionId);\n if (overview) overview.isAvailable = isWorkflowAvailable; // workflow overview is avaiable but the workflow itself is not\n return overview;\n }\n\n public async fetchWorkflowLogsByInstance(args: {\n instance: ProcessInstanceDTO;\n }): Promise<WorkflowLogsResponse> {\n return this.workflowLogProvider?.fetchWorkflowLogsByInstance(\n args.instance,\n ) as WorkflowLogsResponse;\n }\n\n public hasLogProvider(): boolean {\n if (this.workflowLogProvider) {\n return true;\n }\n return false;\n }\n\n public async pingWorkflowService(args: {\n definitionId: string;\n serviceUrl: string;\n }): Promise<boolean | undefined> {\n const { definitionId, serviceUrl } = args;\n const isServiceUp = await this.sonataFlowService.pingWorkflowService({\n definitionId,\n serviceUrl,\n });\n return isServiceUp;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OrchestratorService.cjs.js","sources":["../../src/service/OrchestratorService.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n AuthToken,\n Filter,\n ProcessInstance,\n ProcessInstanceDTO,\n ProcessInstanceVariables,\n WorkflowDefinition,\n WorkflowExecutionResponse,\n WorkflowInfo,\n WorkflowLogsResponse,\n WorkflowOverview,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\nimport { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node';\n\nimport { Pagination } from '../types/pagination';\nimport { DataIndexService } from './DataIndexService';\nimport { SonataFlowService } from './SonataFlowService';\nimport { WorkflowCacheService } from './WorkflowCacheService';\n\nexport class OrchestratorService {\n constructor(\n private readonly sonataFlowService: SonataFlowService,\n private readonly dataIndexService: DataIndexService,\n private readonly workflowCacheService: WorkflowCacheService,\n private readonly workflowLogProvider?: WorkflowLogProvider,\n ) {}\n\n // Data Index Service Wrapper\n public getWorkflowIds(): string[] {\n return this.workflowCacheService.definitionIds;\n }\n\n public async abortWorkflowInstance(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n }): Promise<void> {\n return await this.sonataFlowService.abortInstance(args);\n }\n\n public async fetchWorkflowInfo(args: {\n definitionId: string;\n }): Promise<WorkflowInfo | undefined> {\n const { definitionId } = args;\n return await this.dataIndexService.fetchWorkflowInfo(definitionId);\n }\n\n public async fetchInstances(args: {\n pagination?: Pagination;\n filter?: Filter;\n workflowIds?: string[];\n }): Promise<ProcessInstance[]> {\n const definitionIds = args.workflowIds\n ? args.workflowIds\n : this.workflowCacheService.definitionIds;\n return await this.dataIndexService.fetchInstances({\n definitionIds: definitionIds,\n pagination: args.pagination,\n filter: args.filter,\n });\n }\n\n public async fetchDefinitionIdsFromInstances(args: {\n targetEntity: string;\n }): Promise<string[]> {\n return await this.dataIndexService.fetchDefinitionIdsFromInstances(args);\n }\n\n public async fetchWorkflowSource(args: {\n definitionId: string;\n }): Promise<string | undefined> {\n const { definitionId } = args;\n return await this.dataIndexService.fetchWorkflowSource(definitionId);\n }\n\n public async fetchInstanceVariables(args: {\n instanceId: string;\n }): Promise<object | undefined> {\n const { instanceId } = args;\n return await this.dataIndexService.fetchInstanceVariables(instanceId);\n }\n\n public async fetchInstance(args: {\n instanceId: string;\n }): Promise<ProcessInstance | undefined> {\n const { instanceId } = args;\n const instance = await this.dataIndexService.fetchInstance(instanceId);\n return instance;\n }\n\n // SonataFlow Service Wrapper\n\n public async fetchWorkflowInfoOnService(args: {\n definitionId: string;\n serviceUrl: string;\n }): Promise<WorkflowInfo | undefined> {\n return await this.sonataFlowService.fetchWorkflowInfoOnService(args);\n }\n\n public async fetchWorkflowDefinition(args: {\n definitionId: string;\n }): Promise<WorkflowDefinition | undefined> {\n const { definitionId } = args;\n return await this.sonataFlowService.fetchWorkflowDefinition(definitionId);\n }\n\n public async fetchWorkflowOverviews(args: {\n pagination?: Pagination;\n filter?: Filter;\n targetEntity?: string;\n }): Promise<WorkflowOverview[] | undefined> {\n const overviews = await this.sonataFlowService.fetchWorkflowOverviews({\n definitionIds: this.workflowCacheService.definitionIds?.concat(\n this.workflowCacheService.unavailableDefinitionIds,\n ),\n pagination: args.pagination,\n filter: args.filter,\n targetEntity: args.targetEntity,\n });\n\n if (!overviews?.length) {\n return overviews;\n }\n\n const serviceUrls = await this.dataIndexService.fetchWorkflowServiceUrls();\n\n return Promise.all(\n overviews.map(async overview => {\n const updatedOverview = overview;\n updatedOverview.isAvailable = this.workflowCacheService.isAvailable(\n updatedOverview.workflowId,\n );\n if (!updatedOverview.isAvailable) {\n updatedOverview.availability =\n await this.sonataFlowService.pingWorkflowService({\n definitionId: updatedOverview.workflowId,\n serviceUrl: serviceUrls[updatedOverview.workflowId],\n });\n }\n return updatedOverview;\n }),\n );\n }\n\n public async executeWorkflowAsCloudEvent(args: {\n definitionId: string;\n workflowSource: string;\n workflowEventType: string;\n contextAttribute: string;\n inputData?: ProcessInstanceVariables;\n authTokens?: Array<AuthToken>;\n backstageToken?: string;\n }) {\n return await this.sonataFlowService.executeWorkflowAsCloudEvent(args);\n }\n\n public async executeWorkflow(args: {\n definitionId: string;\n serviceUrl: string;\n inputData?: ProcessInstanceVariables;\n authTokens?: Array<AuthToken>;\n backstageToken?: string | undefined;\n }): Promise<WorkflowExecutionResponse | undefined> {\n return await this.sonataFlowService.executeWorkflow(args);\n }\n\n public async retriggerWorkflow(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n authTokens?: Array<AuthToken>;\n backstageToken?: string | undefined;\n }): Promise<boolean | undefined> {\n return this.sonataFlowService.retriggerInstance(args);\n }\n\n public async fetchWorkflowOverview(args: {\n definitionId: string;\n }): Promise<WorkflowOverview | undefined> {\n const { definitionId } = args;\n const isWorkflowAvailable =\n this.workflowCacheService.isAvailable(definitionId);\n const overview =\n await this.sonataFlowService.fetchWorkflowOverview(definitionId);\n if (overview) {\n overview.isAvailable = isWorkflowAvailable; // workflow overview is avaiable but the workflow itself is not\n if (!isWorkflowAvailable) {\n overview.availability =\n await this.sonataFlowService.pingWorkflowService({\n definitionId,\n serviceUrl: (\n await this.dataIndexService.fetchWorkflowServiceUrls()\n )[definitionId],\n });\n }\n }\n return overview;\n }\n\n public async fetchWorkflowLogsByInstance(args: {\n instance: ProcessInstanceDTO;\n }): Promise<WorkflowLogsResponse> {\n return this.workflowLogProvider?.fetchWorkflowLogsByInstance(\n args.instance,\n ) as WorkflowLogsResponse;\n }\n\n public hasLogProvider(): boolean {\n if (this.workflowLogProvider) {\n return true;\n }\n return false;\n }\n\n public async pingWorkflowService(args: {\n definitionId: string;\n serviceUrl: string;\n }): Promise<boolean | undefined> {\n const { definitionId, serviceUrl } = args;\n const isServiceUp = await this.sonataFlowService.pingWorkflowService({\n definitionId,\n serviceUrl,\n });\n return isServiceUp.isAvailable;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -338,9 +338,19 @@ class SonataFlowService {
|
|
|
338
338
|
this.logger.error(
|
|
339
339
|
`Failed to fetch from ${urlToFetch}: ${error.message}`
|
|
340
340
|
);
|
|
341
|
-
return
|
|
341
|
+
return {
|
|
342
|
+
isAvailable: false,
|
|
343
|
+
statusCode: 500,
|
|
344
|
+
urlToFetch,
|
|
345
|
+
reason: `Failed to fetch from ${urlToFetch}: ${error.message}`
|
|
346
|
+
};
|
|
342
347
|
}
|
|
343
|
-
return
|
|
348
|
+
return {
|
|
349
|
+
isAvailable: response.ok,
|
|
350
|
+
statusCode: response.status || 500,
|
|
351
|
+
urlToFetch,
|
|
352
|
+
reason: response.statusText || "Unknown reason"
|
|
353
|
+
};
|
|
344
354
|
}
|
|
345
355
|
async handleWorkflowServiceResponse(operation, workflowId, urlToFetch, response, httpMethod) {
|
|
346
356
|
const logErrorPrefix = `Error during operation '${operation}' on workflow ${workflowId} with service URL ${urlToFetch}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SonataFlowService.cjs.js","sources":["../../src/service/SonataFlowService.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nimport { CloudEvent, Kafka as KafkaCE } from 'cloudevents';\nimport { Kafka } from 'kafkajs';\nimport capitalize from 'lodash/capitalize';\n\nimport {\n AuthToken,\n extractWorkflowFormat,\n Filter,\n fromWorkflowSource,\n ProcessInstanceStateValues,\n ProcessInstanceVariables,\n WorkflowDefinition,\n WorkflowExecutionResponse,\n WorkflowInfo,\n WorkflowOverview,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { randomUUID } from 'node:crypto';\n\nimport { OrchestratorKafkaServiceOptions } from '../types/kafka';\nimport { Pagination } from '../types/pagination';\nimport { DataIndexService } from './DataIndexService';\nimport { getWorkflowRunStats, groupByProcessIdAndVersion } from './Helper';\n\nexport class SonataFlowService {\n private readonly orchestratorKafkaImpl?: Kafka;\n private readonly orchestratorKafkaMessageKey?: string;\n constructor(\n private readonly dataIndexService: DataIndexService,\n private readonly logger: LoggerService,\n private readonly kafkaServiceOptions?: OrchestratorKafkaServiceOptions,\n ) {\n // If there are kafkaServiceOptions, then do the implemntation\n if (this.kafkaServiceOptions) {\n this.orchestratorKafkaMessageKey =\n this.kafkaServiceOptions.messageKey ?? '';\n this.logger.debug(\n `creating orchestrator kafka implementation with options: clientId: ${this.kafkaServiceOptions.clientId} and brokers: ${JSON.stringify(this.kafkaServiceOptions.brokers)}`,\n );\n // It looks like that the community plugin just passes the whole options from the app-config to the kafkajs constructor\n this.orchestratorKafkaImpl = new Kafka(this.kafkaServiceOptions);\n }\n }\n\n getOrchestratorKafkaImpl() {\n return this.orchestratorKafkaImpl;\n }\n\n public async fetchWorkflowInfoOnService(args: {\n definitionId: string;\n serviceUrl: string;\n }): Promise<WorkflowInfo | undefined> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}`;\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch);\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n }\n\n const jsonResponse = await this.handleWorkflowServiceResponse(\n 'Get workflow info',\n args.definitionId,\n urlToFetch,\n response,\n 'GET',\n );\n this.logger.debug(\n `Fetch workflow info result: ${JSON.stringify(jsonResponse)}`,\n );\n return jsonResponse;\n }\n\n public async fetchWorkflowDefinition(\n definitionId: string,\n ): Promise<WorkflowDefinition | undefined> {\n const source =\n await this.dataIndexService.fetchWorkflowSource(definitionId);\n if (source) {\n return fromWorkflowSource(source);\n }\n return undefined;\n }\n\n public async fetchWorkflowOverviews(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n targetEntity?: string;\n }): Promise<WorkflowOverview[] | undefined> {\n const { definitionIds, pagination, filter, targetEntity } = args;\n const workflowInfos = await this.dataIndexService.fetchWorkflowInfos({\n definitionIds,\n pagination,\n filter,\n });\n if (!workflowInfos?.length) {\n return [];\n }\n\n const statsDefinitionIds = workflowInfos.map(info => info.id);\n const instancesFilter: Filter | undefined = targetEntity\n ? {\n field: 'variables',\n nested: {\n operator: 'EQ',\n field: 'targetEntity',\n value: targetEntity,\n },\n }\n : undefined;\n\n // Fetch instances by workflow definition id. Do not reuse the overview\n // filter here: entity overview passes `id IN [workflowIds]`, which applies\n // to definitions but would match instance ids when querying instances.\n const instances = await this.dataIndexService.fetchInstances({\n definitionIds: statsDefinitionIds,\n filter: instancesFilter,\n });\n\n // This will have all the workflows, so we need to group by workflow id\n // and then we can get the success ratio for each workflow\n // And also find the amount of runs for the 30 day window\n\n // First we ned to group the data by processId and version\n // Result will look something like this:\n /**\n * {\n * 'workflowId-version': [processInstance1, processInstance2, ...],\n * 'workflowId-version': [processInstance1, processInstance2, ...],\n * ...\n * }\n */\n const groupedData = groupByProcessIdAndVersion(instances);\n\n // Then we need to calculate the success rate for each processId and get the amount of runs for the last 30 days\n // Result will look something like this:\n /**\n [\n {\n processIdVersion: 'quarkus-backend-1.0',\n successCount: 1,\n errorCount: 0,\n totalCount: 1,\n successRatio: 1,\n runsLastMonth: 1\n },\n {\n processIdVersion: 'random-success-or-error-1.0',\n successCount: 1,\n errorCount: 1,\n totalCount: 2,\n successRatio: 0.5833333333333334,\n runsLastMonth: 12\n }\n ]\n */\n const worflowInstanceStats = getWorkflowRunStats(groupedData);\n\n const items = await Promise.all(\n workflowInfos\n .filter(info => info.source)\n .map(info =>\n this.fetchWorkflowOverviewBySource(info.source!, targetEntity),\n ),\n );\n\n return items\n .filter((item): item is WorkflowOverview => !!item)\n .map(overview => {\n const stats = worflowInstanceStats.find(\n stat =>\n stat.processIdVersion ===\n `${overview.workflowId}-${overview.version}`,\n );\n if (stats) {\n overview.workflowRunStats = {\n successRatio: stats.successRatio,\n runsLastMonth: stats.runsLastMonth,\n successCount: stats.successCount,\n errorCount: stats.errorCount,\n totalCount: stats.totalCount,\n averageTimeToComplete: stats.averageTimeToComplete,\n };\n }\n return overview;\n });\n }\n\n public async executeWorkflowAsCloudEvent(args: {\n definitionId: string;\n workflowSource: string;\n workflowEventType: string;\n contextAttribute: string;\n inputData?: ProcessInstanceVariables;\n authTokens?: Array<AuthToken>;\n backstageToken?: string;\n }): Promise<WorkflowExecutionResponse | undefined> {\n if (!this.orchestratorKafkaImpl) {\n this.logger.error('No Orchestrator kafka implementation added');\n throw new Error('No Orchestrator kafka implementation added');\n }\n const contextAttributeId = randomUUID();\n // The data that needs to be part of the clouevent data is in the workflowdata key.\n // We need to spread the workflowdata payload into the clouevent data,\n // which is slighty different than a regular workflow execution.\n // We also need to remove the isEvent value from the workflowdata payload.\n const rawWorkflowdata = args.inputData?.workflowdata;\n let workflowdataPayload: Record<string, unknown> = {};\n if (\n typeof rawWorkflowdata === 'object' &&\n rawWorkflowdata !== null &&\n !Array.isArray(rawWorkflowdata)\n ) {\n workflowdataPayload = {\n ...(rawWorkflowdata as Record<string, unknown>),\n };\n if (workflowdataPayload.isEvent) {\n delete workflowdataPayload.isEvent;\n }\n }\n const triggeringCloudEvent = new CloudEvent({\n datacontenttype: 'application/json',\n type: args.workflowEventType,\n source: args.workflowSource,\n [args.contextAttribute]: contextAttributeId,\n data: {\n ...workflowdataPayload,\n [args.contextAttribute]: contextAttributeId, // Need this to be able to correlate the workflow run somehow\n },\n });\n\n // Put the CE in the format needed to send as a Kafka message\n const lockEventBinding = KafkaCE.binary(triggeringCloudEvent);\n // Create the message event that will be sent to the kafka topic\n const messageEvent = {\n key: this.orchestratorKafkaMessageKey,\n value: JSON.stringify(KafkaCE.toEvent(lockEventBinding)),\n };\n\n const kfk = this.orchestratorKafkaImpl;\n const producer = kfk.producer();\n try {\n // Connect the producer\n await producer.connect();\n\n // Send the message\n await producer.send({\n topic: args.workflowEventType,\n messages: [messageEvent],\n });\n } catch (error) {\n this.logger.error(\n `Error with Kafka client connection. Options: clientId: ${this.kafkaServiceOptions?.clientId} and broker: ${JSON.stringify(this.kafkaServiceOptions?.brokers)}`,\n );\n throw new Error(\n `Error with Kafka client with connection Options: clientId: ${this.kafkaServiceOptions?.clientId} and broker: ${JSON.stringify(this.kafkaServiceOptions?.brokers)}`,\n );\n } finally {\n // Disconnect the producer\n await producer.disconnect();\n }\n\n // Since sending to kafka doesn't return anything, send back the contextAttributeId here\n // Then we will query the workflow instances to see if it showed up yet\n return {\n id: contextAttributeId,\n };\n }\n\n public async executeWorkflow(args: {\n definitionId: string;\n serviceUrl: string;\n inputData?: ProcessInstanceVariables;\n authTokens?: Array<AuthToken>;\n backstageToken?: string | undefined;\n }): Promise<WorkflowExecutionResponse | undefined> {\n const urlToFetch = `${args.serviceUrl}/${args.definitionId}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n this.addAuthHeaders(headers, args.authTokens, args.backstageToken);\n const headerKeys = Object.keys(headers);\n this.logger.info(\n `Executing workflow ${args.definitionId} with headers: ${headerKeys.join(', ')}`,\n );\n\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch, {\n method: 'POST',\n body: JSON.stringify(args.inputData || {}),\n headers,\n });\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n }\n\n const json = await this.handleWorkflowServiceResponse(\n 'Execute',\n args.definitionId,\n urlToFetch,\n response,\n 'POST',\n );\n if (json.id) {\n this.logger.debug(\n `Execute workflow successful. Response: ${JSON.stringify(json)}`,\n );\n return json;\n }\n this.logger.error(\n `Execute workflow did not return a workflow instance ID. Response: ${JSON.stringify(\n json,\n )}`,\n );\n throw new Error('Execute workflow did not return a workflow instance ID');\n }\n\n private addAuthHeaders(\n headers: Record<string, string>,\n authTokens?: Array<AuthToken>,\n backstageToken?: string | undefined,\n ) {\n // Add X-Authentication headers from authTokens\n if (authTokens && Array.isArray(authTokens)) {\n authTokens.forEach(tokenObj => {\n if (tokenObj.provider && tokenObj.token) {\n const headerKey = `X-Authorization-${capitalize(tokenObj.provider)}`;\n headers[headerKey] = String(tokenObj.token); // Ensure token is a string\n }\n });\n } else {\n this.logger.debug(\n 'No authTokens provided or authTokens is not an array.',\n );\n }\n\n if (backstageToken) {\n const headerKey = 'X-Authorization-Backstage';\n headers[headerKey] = backstageToken;\n }\n }\n\n public async retriggerInstance(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n authTokens?: Array<AuthToken>;\n backstageToken?: string | undefined;\n }): Promise<boolean> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n this.addAuthHeaders(headers, args.authTokens, args.backstageToken);\n const headerKeys = Object.keys(headers);\n this.logger.info(\n `Retriggering workflow ${args.definitionId} with headers: ${headerKeys.join(', ')}`,\n );\n\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}/instances/${args.instanceId}/retrigger`;\n\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch, {\n method: 'POST',\n headers,\n });\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n }\n\n await this.handleWorkflowServiceResponse(\n 'Retrigger',\n args.definitionId,\n urlToFetch,\n response,\n 'POST',\n );\n\n return true;\n }\n\n public async abortInstance(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n }): Promise<void> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}/instances/${args.instanceId}`;\n\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch, {\n method: 'DELETE',\n });\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n }\n\n await this.handleWorkflowServiceResponse(\n 'Abort',\n args.definitionId,\n urlToFetch,\n response,\n 'DELETE',\n );\n }\n\n public async fetchWorkflowOverview(\n definitionId: string,\n ): Promise<WorkflowOverview | undefined> {\n const source =\n await this.dataIndexService.fetchWorkflowSource(definitionId);\n if (!source) {\n this.logger.debug(`Workflow source not found: ${definitionId}`);\n return undefined;\n }\n\n // Can reuse the instances to get the stats\n const instances = await this.dataIndexService.fetchInstances({\n definitionIds: [definitionId],\n });\n const groupedData = groupByProcessIdAndVersion(instances);\n const worflowInstanceStats = getWorkflowRunStats(groupedData);\n const workflowOverview = await this.fetchWorkflowOverviewBySource(source);\n if (workflowOverview) {\n const stats = worflowInstanceStats.find(\n stat =>\n stat.processIdVersion ===\n `${workflowOverview.workflowId}-${workflowOverview.version}`,\n );\n if (stats) {\n workflowOverview.workflowRunStats = {\n successRatio: stats.successRatio,\n runsLastMonth: stats.runsLastMonth,\n successCount: stats.successCount,\n errorCount: stats.errorCount,\n totalCount: stats.totalCount,\n averageTimeToComplete: stats.averageTimeToComplete,\n };\n }\n }\n return workflowOverview;\n }\n\n private async fetchWorkflowOverviewBySource(\n source: string,\n targetEntity?: string,\n ): Promise<WorkflowOverview | undefined> {\n let lastTriggered: Date = new Date(0);\n let lastRunStatus: ProcessInstanceStateValues | undefined;\n let lastRunId: string | undefined;\n const definition = fromWorkflowSource(source);\n\n const processInstances =\n await this.dataIndexService.fetchInstancesByDefinitionId({\n definitionId: definition.id,\n limit: 1,\n offset: 0,\n targetEntity: targetEntity,\n });\n\n const pInstance = processInstances[0];\n\n if (pInstance?.start) {\n lastRunId = pInstance.id;\n lastTriggered = new Date(pInstance.start);\n lastRunStatus = pInstance.state;\n }\n\n return {\n workflowId: definition.id,\n name: definition.name,\n format: extractWorkflowFormat(source),\n lastRunId,\n lastTriggeredMs: lastTriggered.getTime(),\n lastRunStatus,\n description: definition.description,\n version: definition.version,\n };\n }\n\n public async pingWorkflowService(args: {\n definitionId: string;\n serviceUrl: string;\n }): Promise<boolean> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}`;\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch);\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n return false;\n }\n return response.ok;\n }\n\n private async handleWorkflowServiceResponse(\n operation: 'Abort' | 'Execute' | 'Retrigger' | 'Get workflow info',\n workflowId: string,\n urlToFetch: string,\n response: Response | undefined,\n httpMethod: Request['method'],\n ): Promise<any> {\n const logErrorPrefix = `Error during operation '${operation}' on workflow ${workflowId} with service URL ${urlToFetch}`;\n if (!response) {\n throw new Error(`${logErrorPrefix} : fetch failed`);\n }\n const errorLines: string[] = [];\n errorLines.push(`HTTP ${httpMethod} request to ${urlToFetch} failed.`);\n errorLines.push(`Status Code: ${response.status}`);\n if (response.statusText) {\n errorLines.push(`Status Text: ${response.statusText}`);\n }\n try {\n const jsonResponse = await response.json();\n if ((jsonResponse.id && operation === 'Execute') || response.ok) {\n // Treat as successful from the UI perspective.\n // This allows navigation to the instance page even if the workflow execution\n // fails immediately after initiation. The presence of an instance id or a successful\n // 'ok' status indicates the initiation was successful.\n return jsonResponse;\n }\n if (jsonResponse?.message) {\n errorLines.push(`Message: ${jsonResponse.message}`);\n }\n if (jsonResponse?.details) {\n errorLines.push(`Details: ${jsonResponse.details}`);\n }\n if (jsonResponse?.stack) {\n errorLines.push(`Stack Trace: ${jsonResponse.stack}`);\n }\n if (jsonResponse?.failedNodeId) {\n errorLines.push(`Failed Node ID: ${jsonResponse.failedNodeId}`);\n }\n this.logger.error(`${logErrorPrefix}: ${JSON.stringify(jsonResponse)}`);\n } catch (jsonParseError) {\n this.logger.error(\n `${logErrorPrefix}. The details of this error cannot be provided because the response body was not in a parsable format.`,\n );\n }\n throw new Error(errorLines.join('\\n'));\n }\n}\n"],"names":["Kafka","fromWorkflowSource","groupByProcessIdAndVersion","getWorkflowRunStats","randomUUID","CloudEvent","KafkaCE","capitalize","extractWorkflowFormat"],"mappings":";;;;;;;;;;;;;AA0CO,MAAM,iBAAA,CAAkB;AAAA,EAG7B,WAAA,CACmB,gBAAA,EACA,MAAA,EACA,mBAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,mBAAA,GAAA,mBAAA;AAGjB,IAAA,IAAI,KAAK,mBAAA,EAAqB;AAC5B,MAAA,IAAA,CAAK,2BAAA,GACH,IAAA,CAAK,mBAAA,CAAoB,UAAA,IAAc,EAAA;AACzC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,mEAAA,EAAsE,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA,cAAA,EAAiB,KAAK,SAAA,CAAU,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAC,CAAA;AAAA,OAC1K;AAEA,MAAA,IAAA,CAAK,qBAAA,GAAwB,IAAIA,aAAA,CAAM,IAAA,CAAK,mBAAmB,CAAA;AAAA,IACjE;AAAA,EACF;AAAA,EAdmB,gBAAA;AAAA,EACA,MAAA;AAAA,EACA,mBAAA;AAAA,EALF,qBAAA;AAAA,EACA,2BAAA;AAAA,EAkBjB,wBAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,EACd;AAAA,EAEA,MAAa,2BAA2B,IAAA,EAGF;AACpC,IAAA,MAAM,aAAa,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,sBAAA,EAAyB,KAAK,YAAY,CAAA,CAAA;AAC/E,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,MAAM,UAAU,CAAA;AAAA,IACnC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,qBAAA,EAAwB,UAAU,CAAA,EAAA,EAAM,KAAA,CAAgB,OAAO,CAAA;AAAA,OACjE;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,6BAAA;AAAA,MAC9B,mBAAA;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,MACL,UAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,CAAA,4BAAA,EAA+B,IAAA,CAAK,SAAA,CAAU,YAAY,CAAC,CAAA;AAAA,KAC7D;AACA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEA,MAAa,wBACX,YAAA,EACyC;AACzC,IAAA,MAAM,MAAA,GACJ,MAAM,IAAA,CAAK,gBAAA,CAAiB,oBAAoB,YAAY,CAAA;AAC9D,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAOC,qDAAmB,MAAM,CAAA;AAAA,IAClC;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAa,uBAAuB,IAAA,EAKQ;AAC1C,IAAA,MAAM,EAAE,aAAA,EAAe,UAAA,EAAY,MAAA,EAAQ,cAAa,GAAI,IAAA;AAC5D,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,gBAAA,CAAiB,kBAAA,CAAmB;AAAA,MACnE,aAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,IAAI,CAAC,eAAe,MAAA,EAAQ;AAC1B,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,kBAAA,GAAqB,aAAA,CAAc,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,EAAE,CAAA;AAC5D,IAAA,MAAM,kBAAsC,YAAA,GACxC;AAAA,MACE,KAAA,EAAO,WAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,IAAA;AAAA,QACV,KAAA,EAAO,cAAA;AAAA,QACP,KAAA,EAAO;AAAA;AACT,KACF,GACA,MAAA;AAKJ,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,gBAAA,CAAiB,cAAA,CAAe;AAAA,MAC3D,aAAA,EAAe,kBAAA;AAAA,MACf,MAAA,EAAQ;AAAA,KACT,CAAA;AAeD,IAAA,MAAM,WAAA,GAAcC,kCAA2B,SAAS,CAAA;AAwBxD,IAAA,MAAM,oBAAA,GAAuBC,2BAAoB,WAAW,CAAA;AAE5D,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC1B,aAAA,CACG,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAM,CAAA,CAC1B,GAAA;AAAA,QAAI,CAAA,IAAA,KACH,IAAA,CAAK,6BAAA,CAA8B,IAAA,CAAK,QAAS,YAAY;AAAA;AAC/D,KACJ;AAEA,IAAA,OAAO,KAAA,CACJ,OAAO,CAAC,IAAA,KAAmC,CAAC,CAAC,IAAI,CAAA,CACjD,GAAA,CAAI,CAAA,QAAA,KAAY;AACf,MAAA,MAAM,QAAQ,oBAAA,CAAqB,IAAA;AAAA,QACjC,CAAA,IAAA,KACE,KAAK,gBAAA,KACL,CAAA,EAAG,SAAS,UAAU,CAAA,CAAA,EAAI,SAAS,OAAO,CAAA;AAAA,OAC9C;AACA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,QAAA,CAAS,gBAAA,GAAmB;AAAA,UAC1B,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,eAAe,KAAA,CAAM,aAAA;AAAA,UACrB,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,uBAAuB,KAAA,CAAM;AAAA,SAC/B;AAAA,MACF;AACA,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAa,4BAA4B,IAAA,EAQU;AACjD,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC/B,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,4CAA4C,CAAA;AAC9D,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AACA,IAAA,MAAM,qBAAqBC,sBAAA,EAAW;AAKtC,IAAA,MAAM,eAAA,GAAkB,KAAK,SAAA,EAAW,YAAA;AACxC,IAAA,IAAI,sBAA+C,EAAC;AACpD,IAAA,IACE,OAAO,oBAAoB,QAAA,IAC3B,eAAA,KAAoB,QACpB,CAAC,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,EAC9B;AACA,MAAA,mBAAA,GAAsB;AAAA,QACpB,GAAI;AAAA,OACN;AACA,MAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,QAAA,OAAO,mBAAA,CAAoB,OAAA;AAAA,MAC7B;AAAA,IACF;AACA,IAAA,MAAM,oBAAA,GAAuB,IAAIC,sBAAA,CAAW;AAAA,MAC1C,eAAA,EAAiB,kBAAA;AAAA,MACjB,MAAM,IAAA,CAAK,iBAAA;AAAA,MACX,QAAQ,IAAA,CAAK,cAAA;AAAA,MACb,CAAC,IAAA,CAAK,gBAAgB,GAAG,kBAAA;AAAA,MACzB,IAAA,EAAM;AAAA,QACJ,GAAG,mBAAA;AAAA,QACH,CAAC,IAAA,CAAK,gBAAgB,GAAG;AAAA;AAAA;AAC3B,KACD,CAAA;AAGD,IAAA,MAAM,gBAAA,GAAmBC,iBAAA,CAAQ,MAAA,CAAO,oBAAoB,CAAA;AAE5D,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,KAAK,IAAA,CAAK,2BAAA;AAAA,MACV,OAAO,IAAA,CAAK,SAAA,CAAUA,iBAAA,CAAQ,OAAA,CAAQ,gBAAgB,CAAC;AAAA,KACzD;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,qBAAA;AACjB,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,IAAA,IAAI;AAEF,MAAA,MAAM,SAAS,OAAA,EAAQ;AAGvB,MAAA,MAAM,SAAS,IAAA,CAAK;AAAA,QAClB,OAAO,IAAA,CAAK,iBAAA;AAAA,QACZ,QAAA,EAAU,CAAC,YAAY;AAAA,OACxB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,uDAAA,EAA0D,IAAA,CAAK,mBAAA,EAAqB,QAAQ,CAAA,aAAA,EAAgB,KAAK,SAAA,CAAU,IAAA,CAAK,mBAAA,EAAqB,OAAO,CAAC,CAAA;AAAA,OAC/J;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,2DAAA,EAA8D,IAAA,CAAK,mBAAA,EAAqB,QAAQ,CAAA,aAAA,EAAgB,KAAK,SAAA,CAAU,IAAA,CAAK,mBAAA,EAAqB,OAAO,CAAC,CAAA;AAAA,OACnK;AAAA,IACF,CAAA,SAAE;AAEA,MAAA,MAAM,SAAS,UAAA,EAAW;AAAA,IAC5B;AAIA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI;AAAA,KACN;AAAA,EACF;AAAA,EAEA,MAAa,gBAAgB,IAAA,EAMsB;AACjD,IAAA,MAAM,aAAa,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,CAAA,EAAI,KAAK,YAAY,CAAA,CAAA;AAC1D,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB;AAAA,KAClB;AAEA,IAAA,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,IAAA,CAAK,UAAA,EAAY,KAAK,cAAc,CAAA;AACjE,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AACtC,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,MACV,sBAAsB,IAAA,CAAK,YAAY,kBAAkB,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAChF;AAEA,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,MAAM,UAAA,EAAY;AAAA,QACjC,MAAA,EAAQ,MAAA;AAAA,QACR,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,SAAA,IAAa,EAAE,CAAA;AAAA,QACzC;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,qBAAA,EAAwB,UAAU,CAAA,EAAA,EAAM,KAAA,CAAgB,OAAO,CAAA;AAAA,OACjE;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,6BAAA;AAAA,MACtB,SAAA;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,MACL,UAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,uCAAA,EAA0C,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,OAChE;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,qEAAqE,IAAA,CAAK,SAAA;AAAA,QACxE;AAAA,OACD,CAAA;AAAA,KACH;AACA,IAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,EAC1E;AAAA,EAEQ,cAAA,CACN,OAAA,EACA,UAAA,EACA,cAAA,EACA;AAEA,IAAA,IAAI,UAAA,IAAc,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC3C,MAAA,UAAA,CAAW,QAAQ,CAAA,QAAA,KAAY;AAC7B,QAAA,IAAI,QAAA,CAAS,QAAA,IAAY,QAAA,CAAS,KAAA,EAAO;AACvC,UAAA,MAAM,SAAA,GAAY,CAAA,gBAAA,EAAmBC,2BAAA,CAAW,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAA;AAClE,UAAA,OAAA,CAAQ,SAAS,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AAAA,QAC5C;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,SAAA,GAAY,2BAAA;AAClB,MAAA,OAAA,CAAQ,SAAS,CAAA,GAAI,cAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAa,kBAAkB,IAAA,EAMV;AACnB,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB;AAAA,KAClB;AAEA,IAAA,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,IAAA,CAAK,UAAA,EAAY,KAAK,cAAc,CAAA;AACjE,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AACtC,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,MACV,yBAAyB,IAAA,CAAK,YAAY,kBAAkB,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACnF;AAEA,IAAA,MAAM,UAAA,GAAa,GAAG,IAAA,CAAK,UAAU,yBAAyB,IAAA,CAAK,YAAY,CAAA,WAAA,EAAc,IAAA,CAAK,UAAU,CAAA,UAAA,CAAA;AAE5G,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,MAAM,UAAA,EAAY;AAAA,QACjC,MAAA,EAAQ,MAAA;AAAA,QACR;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,qBAAA,EAAwB,UAAU,CAAA,EAAA,EAAM,KAAA,CAAgB,OAAO,CAAA;AAAA,OACjE;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,6BAAA;AAAA,MACT,WAAA;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,MACL,UAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAa,cAAc,IAAA,EAIT;AAChB,IAAA,MAAM,UAAA,GAAa,GAAG,IAAA,CAAK,UAAU,yBAAyB,IAAA,CAAK,YAAY,CAAA,WAAA,EAAc,IAAA,CAAK,UAAU,CAAA,CAAA;AAE5G,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,MAAM,UAAA,EAAY;AAAA,QACjC,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,qBAAA,EAAwB,UAAU,CAAA,EAAA,EAAM,KAAA,CAAgB,OAAO,CAAA;AAAA,OACjE;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,6BAAA;AAAA,MACT,OAAA;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,MACL,UAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAa,sBACX,YAAA,EACuC;AACvC,IAAA,MAAM,MAAA,GACJ,MAAM,IAAA,CAAK,gBAAA,CAAiB,oBAAoB,YAAY,CAAA;AAC9D,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,2BAAA,EAA8B,YAAY,CAAA,CAAE,CAAA;AAC9D,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,gBAAA,CAAiB,cAAA,CAAe;AAAA,MAC3D,aAAA,EAAe,CAAC,YAAY;AAAA,KAC7B,CAAA;AACD,IAAA,MAAM,WAAA,GAAcL,kCAA2B,SAAS,CAAA;AACxD,IAAA,MAAM,oBAAA,GAAuBC,2BAAoB,WAAW,CAAA;AAC5D,IAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,6BAAA,CAA8B,MAAM,CAAA;AACxE,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAM,QAAQ,oBAAA,CAAqB,IAAA;AAAA,QACjC,CAAA,IAAA,KACE,KAAK,gBAAA,KACL,CAAA,EAAG,iBAAiB,UAAU,CAAA,CAAA,EAAI,iBAAiB,OAAO,CAAA;AAAA,OAC9D;AACA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,gBAAA,CAAiB,gBAAA,GAAmB;AAAA,UAClC,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,eAAe,KAAA,CAAM,aAAA;AAAA,UACrB,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,uBAAuB,KAAA,CAAM;AAAA,SAC/B;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,gBAAA;AAAA,EACT;AAAA,EAEA,MAAc,6BAAA,CACZ,MAAA,EACA,YAAA,EACuC;AACvC,IAAA,IAAI,aAAA,mBAAsB,IAAI,IAAA,CAAK,CAAC,CAAA;AACpC,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI,SAAA;AACJ,IAAA,MAAM,UAAA,GAAaF,qDAAmB,MAAM,CAAA;AAE5C,IAAA,MAAM,gBAAA,GACJ,MAAM,IAAA,CAAK,gBAAA,CAAiB,4BAAA,CAA6B;AAAA,MACvD,cAAc,UAAA,CAAW,EAAA;AAAA,MACzB,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR;AAAA,KACD,CAAA;AAEH,IAAA,MAAM,SAAA,GAAY,iBAAiB,CAAC,CAAA;AAEpC,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,SAAA,GAAY,SAAA,CAAU,EAAA;AACtB,MAAA,aAAA,GAAgB,IAAI,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACxC,MAAA,aAAA,GAAgB,SAAA,CAAU,KAAA;AAAA,IAC5B;AAEA,IAAA,OAAO;AAAA,MACL,YAAY,UAAA,CAAW,EAAA;AAAA,MACvB,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,MAAA,EAAQO,wDAAsB,MAAM,CAAA;AAAA,MACpC,SAAA;AAAA,MACA,eAAA,EAAiB,cAAc,OAAA,EAAQ;AAAA,MACvC,aAAA;AAAA,MACA,aAAa,UAAA,CAAW,WAAA;AAAA,MACxB,SAAS,UAAA,CAAW;AAAA,KACtB;AAAA,EACF;AAAA,EAEA,MAAa,oBAAoB,IAAA,EAGZ;AACnB,IAAA,MAAM,aAAa,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,sBAAA,EAAyB,KAAK,YAAY,CAAA,CAAA;AAC/E,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,MAAM,UAAU,CAAA;AAAA,IACnC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,qBAAA,EAAwB,UAAU,CAAA,EAAA,EAAM,KAAA,CAAgB,OAAO,CAAA;AAAA,OACjE;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,QAAA,CAAS,EAAA;AAAA,EAClB;AAAA,EAEA,MAAc,6BAAA,CACZ,SAAA,EACA,UAAA,EACA,UAAA,EACA,UACA,UAAA,EACc;AACd,IAAA,MAAM,iBAAiB,CAAA,wBAAA,EAA2B,SAAS,CAAA,cAAA,EAAiB,UAAU,qBAAqB,UAAU,CAAA,CAAA;AACrH,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA,eAAA,CAAiB,CAAA;AAAA,IACpD;AACA,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,UAAA,CAAW,IAAA,CAAK,CAAA,KAAA,EAAQ,UAAU,CAAA,YAAA,EAAe,UAAU,CAAA,QAAA,CAAU,CAAA;AACrE,IAAA,UAAA,CAAW,IAAA,CAAK,CAAA,aAAA,EAAgB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AACjD,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,aAAA,EAAgB,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACvD;AACA,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AACzC,MAAA,IAAK,YAAA,CAAa,EAAA,IAAM,SAAA,KAAc,SAAA,IAAc,SAAS,EAAA,EAAI;AAK/D,QAAA,OAAO,YAAA;AAAA,MACT;AACA,MAAA,IAAI,cAAc,OAAA,EAAS;AACzB,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,SAAA,EAAY,YAAA,CAAa,OAAO,CAAA,CAAE,CAAA;AAAA,MACpD;AACA,MAAA,IAAI,cAAc,OAAA,EAAS;AACzB,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,SAAA,EAAY,YAAA,CAAa,OAAO,CAAA,CAAE,CAAA;AAAA,MACpD;AACA,MAAA,IAAI,cAAc,KAAA,EAAO;AACvB,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,aAAA,EAAgB,YAAA,CAAa,KAAK,CAAA,CAAE,CAAA;AAAA,MACtD;AACA,MAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,gBAAA,EAAmB,YAAA,CAAa,YAAY,CAAA,CAAE,CAAA;AAAA,MAChE;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG,cAAc,KAAK,IAAA,CAAK,SAAA,CAAU,YAAY,CAAC,CAAA,CAAE,CAAA;AAAA,IACxE,SAAS,cAAA,EAAgB;AACvB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,GAAG,cAAc,CAAA,sGAAA;AAAA,OACnB;AAAA,IACF;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACvC;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"SonataFlowService.cjs.js","sources":["../../src/service/SonataFlowService.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nimport { CloudEvent, Kafka as KafkaCE } from 'cloudevents';\nimport { Kafka } from 'kafkajs';\nimport capitalize from 'lodash/capitalize';\n\nimport {\n AuthToken,\n extractWorkflowFormat,\n Filter,\n fromWorkflowSource,\n ProcessInstanceStateValues,\n ProcessInstanceVariables,\n WorkflowAvailabilityResponse,\n WorkflowDefinition,\n WorkflowExecutionResponse,\n WorkflowInfo,\n WorkflowOverview,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { randomUUID } from 'node:crypto';\n\nimport { OrchestratorKafkaServiceOptions } from '../types/kafka';\nimport { Pagination } from '../types/pagination';\nimport { DataIndexService } from './DataIndexService';\nimport { getWorkflowRunStats, groupByProcessIdAndVersion } from './Helper';\n\nexport class SonataFlowService {\n private readonly orchestratorKafkaImpl?: Kafka;\n private readonly orchestratorKafkaMessageKey?: string;\n constructor(\n private readonly dataIndexService: DataIndexService,\n private readonly logger: LoggerService,\n private readonly kafkaServiceOptions?: OrchestratorKafkaServiceOptions,\n ) {\n // If there are kafkaServiceOptions, then do the implemntation\n if (this.kafkaServiceOptions) {\n this.orchestratorKafkaMessageKey =\n this.kafkaServiceOptions.messageKey ?? '';\n this.logger.debug(\n `creating orchestrator kafka implementation with options: clientId: ${this.kafkaServiceOptions.clientId} and brokers: ${JSON.stringify(this.kafkaServiceOptions.brokers)}`,\n );\n // It looks like that the community plugin just passes the whole options from the app-config to the kafkajs constructor\n this.orchestratorKafkaImpl = new Kafka(this.kafkaServiceOptions);\n }\n }\n\n getOrchestratorKafkaImpl() {\n return this.orchestratorKafkaImpl;\n }\n\n public async fetchWorkflowInfoOnService(args: {\n definitionId: string;\n serviceUrl: string;\n }): Promise<WorkflowInfo | undefined> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}`;\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch);\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n }\n\n const jsonResponse = await this.handleWorkflowServiceResponse(\n 'Get workflow info',\n args.definitionId,\n urlToFetch,\n response,\n 'GET',\n );\n this.logger.debug(\n `Fetch workflow info result: ${JSON.stringify(jsonResponse)}`,\n );\n return jsonResponse;\n }\n\n public async fetchWorkflowDefinition(\n definitionId: string,\n ): Promise<WorkflowDefinition | undefined> {\n const source =\n await this.dataIndexService.fetchWorkflowSource(definitionId);\n if (source) {\n return fromWorkflowSource(source);\n }\n return undefined;\n }\n\n public async fetchWorkflowOverviews(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n targetEntity?: string;\n }): Promise<WorkflowOverview[] | undefined> {\n const { definitionIds, pagination, filter, targetEntity } = args;\n const workflowInfos = await this.dataIndexService.fetchWorkflowInfos({\n definitionIds,\n pagination,\n filter,\n });\n if (!workflowInfos?.length) {\n return [];\n }\n\n const statsDefinitionIds = workflowInfos.map(info => info.id);\n const instancesFilter: Filter | undefined = targetEntity\n ? {\n field: 'variables',\n nested: {\n operator: 'EQ',\n field: 'targetEntity',\n value: targetEntity,\n },\n }\n : undefined;\n\n // Fetch instances by workflow definition id. Do not reuse the overview\n // filter here: entity overview passes `id IN [workflowIds]`, which applies\n // to definitions but would match instance ids when querying instances.\n const instances = await this.dataIndexService.fetchInstances({\n definitionIds: statsDefinitionIds,\n filter: instancesFilter,\n });\n\n // This will have all the workflows, so we need to group by workflow id\n // and then we can get the success ratio for each workflow\n // And also find the amount of runs for the 30 day window\n\n // First we ned to group the data by processId and version\n // Result will look something like this:\n /**\n * {\n * 'workflowId-version': [processInstance1, processInstance2, ...],\n * 'workflowId-version': [processInstance1, processInstance2, ...],\n * ...\n * }\n */\n const groupedData = groupByProcessIdAndVersion(instances);\n\n // Then we need to calculate the success rate for each processId and get the amount of runs for the last 30 days\n // Result will look something like this:\n /**\n [\n {\n processIdVersion: 'quarkus-backend-1.0',\n successCount: 1,\n errorCount: 0,\n totalCount: 1,\n successRatio: 1,\n runsLastMonth: 1\n },\n {\n processIdVersion: 'random-success-or-error-1.0',\n successCount: 1,\n errorCount: 1,\n totalCount: 2,\n successRatio: 0.5833333333333334,\n runsLastMonth: 12\n }\n ]\n */\n const worflowInstanceStats = getWorkflowRunStats(groupedData);\n\n const items = await Promise.all(\n workflowInfos\n .filter(info => info.source)\n .map(info =>\n this.fetchWorkflowOverviewBySource(info.source!, targetEntity),\n ),\n );\n\n return items\n .filter((item): item is WorkflowOverview => !!item)\n .map(overview => {\n const stats = worflowInstanceStats.find(\n stat =>\n stat.processIdVersion ===\n `${overview.workflowId}-${overview.version}`,\n );\n if (stats) {\n overview.workflowRunStats = {\n successRatio: stats.successRatio,\n runsLastMonth: stats.runsLastMonth,\n successCount: stats.successCount,\n errorCount: stats.errorCount,\n totalCount: stats.totalCount,\n averageTimeToComplete: stats.averageTimeToComplete,\n };\n }\n return overview;\n });\n }\n\n public async executeWorkflowAsCloudEvent(args: {\n definitionId: string;\n workflowSource: string;\n workflowEventType: string;\n contextAttribute: string;\n inputData?: ProcessInstanceVariables;\n authTokens?: Array<AuthToken>;\n backstageToken?: string;\n }): Promise<WorkflowExecutionResponse | undefined> {\n if (!this.orchestratorKafkaImpl) {\n this.logger.error('No Orchestrator kafka implementation added');\n throw new Error('No Orchestrator kafka implementation added');\n }\n const contextAttributeId = randomUUID();\n // The data that needs to be part of the clouevent data is in the workflowdata key.\n // We need to spread the workflowdata payload into the clouevent data,\n // which is slighty different than a regular workflow execution.\n // We also need to remove the isEvent value from the workflowdata payload.\n const rawWorkflowdata = args.inputData?.workflowdata;\n let workflowdataPayload: Record<string, unknown> = {};\n if (\n typeof rawWorkflowdata === 'object' &&\n rawWorkflowdata !== null &&\n !Array.isArray(rawWorkflowdata)\n ) {\n workflowdataPayload = {\n ...(rawWorkflowdata as Record<string, unknown>),\n };\n if (workflowdataPayload.isEvent) {\n delete workflowdataPayload.isEvent;\n }\n }\n const triggeringCloudEvent = new CloudEvent({\n datacontenttype: 'application/json',\n type: args.workflowEventType,\n source: args.workflowSource,\n [args.contextAttribute]: contextAttributeId,\n data: {\n ...workflowdataPayload,\n [args.contextAttribute]: contextAttributeId, // Need this to be able to correlate the workflow run somehow\n },\n });\n\n // Put the CE in the format needed to send as a Kafka message\n const lockEventBinding = KafkaCE.binary(triggeringCloudEvent);\n // Create the message event that will be sent to the kafka topic\n const messageEvent = {\n key: this.orchestratorKafkaMessageKey,\n value: JSON.stringify(KafkaCE.toEvent(lockEventBinding)),\n };\n\n const kfk = this.orchestratorKafkaImpl;\n const producer = kfk.producer();\n try {\n // Connect the producer\n await producer.connect();\n\n // Send the message\n await producer.send({\n topic: args.workflowEventType,\n messages: [messageEvent],\n });\n } catch (error) {\n this.logger.error(\n `Error with Kafka client connection. Options: clientId: ${this.kafkaServiceOptions?.clientId} and broker: ${JSON.stringify(this.kafkaServiceOptions?.brokers)}`,\n );\n throw new Error(\n `Error with Kafka client with connection Options: clientId: ${this.kafkaServiceOptions?.clientId} and broker: ${JSON.stringify(this.kafkaServiceOptions?.brokers)}`,\n );\n } finally {\n // Disconnect the producer\n await producer.disconnect();\n }\n\n // Since sending to kafka doesn't return anything, send back the contextAttributeId here\n // Then we will query the workflow instances to see if it showed up yet\n return {\n id: contextAttributeId,\n };\n }\n\n public async executeWorkflow(args: {\n definitionId: string;\n serviceUrl: string;\n inputData?: ProcessInstanceVariables;\n authTokens?: Array<AuthToken>;\n backstageToken?: string | undefined;\n }): Promise<WorkflowExecutionResponse | undefined> {\n const urlToFetch = `${args.serviceUrl}/${args.definitionId}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n this.addAuthHeaders(headers, args.authTokens, args.backstageToken);\n const headerKeys = Object.keys(headers);\n this.logger.info(\n `Executing workflow ${args.definitionId} with headers: ${headerKeys.join(', ')}`,\n );\n\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch, {\n method: 'POST',\n body: JSON.stringify(args.inputData || {}),\n headers,\n });\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n }\n\n const json = await this.handleWorkflowServiceResponse(\n 'Execute',\n args.definitionId,\n urlToFetch,\n response,\n 'POST',\n );\n if (json.id) {\n this.logger.debug(\n `Execute workflow successful. Response: ${JSON.stringify(json)}`,\n );\n return json;\n }\n this.logger.error(\n `Execute workflow did not return a workflow instance ID. Response: ${JSON.stringify(\n json,\n )}`,\n );\n throw new Error('Execute workflow did not return a workflow instance ID');\n }\n\n private addAuthHeaders(\n headers: Record<string, string>,\n authTokens?: Array<AuthToken>,\n backstageToken?: string | undefined,\n ) {\n // Add X-Authentication headers from authTokens\n if (authTokens && Array.isArray(authTokens)) {\n authTokens.forEach(tokenObj => {\n if (tokenObj.provider && tokenObj.token) {\n const headerKey = `X-Authorization-${capitalize(tokenObj.provider)}`;\n headers[headerKey] = String(tokenObj.token); // Ensure token is a string\n }\n });\n } else {\n this.logger.debug(\n 'No authTokens provided or authTokens is not an array.',\n );\n }\n\n if (backstageToken) {\n const headerKey = 'X-Authorization-Backstage';\n headers[headerKey] = backstageToken;\n }\n }\n\n public async retriggerInstance(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n authTokens?: Array<AuthToken>;\n backstageToken?: string | undefined;\n }): Promise<boolean> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n this.addAuthHeaders(headers, args.authTokens, args.backstageToken);\n const headerKeys = Object.keys(headers);\n this.logger.info(\n `Retriggering workflow ${args.definitionId} with headers: ${headerKeys.join(', ')}`,\n );\n\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}/instances/${args.instanceId}/retrigger`;\n\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch, {\n method: 'POST',\n headers,\n });\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n }\n\n await this.handleWorkflowServiceResponse(\n 'Retrigger',\n args.definitionId,\n urlToFetch,\n response,\n 'POST',\n );\n\n return true;\n }\n\n public async abortInstance(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n }): Promise<void> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}/instances/${args.instanceId}`;\n\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch, {\n method: 'DELETE',\n });\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n }\n\n await this.handleWorkflowServiceResponse(\n 'Abort',\n args.definitionId,\n urlToFetch,\n response,\n 'DELETE',\n );\n }\n\n public async fetchWorkflowOverview(\n definitionId: string,\n ): Promise<WorkflowOverview | undefined> {\n const source =\n await this.dataIndexService.fetchWorkflowSource(definitionId);\n if (!source) {\n this.logger.debug(`Workflow source not found: ${definitionId}`);\n return undefined;\n }\n\n // Can reuse the instances to get the stats\n const instances = await this.dataIndexService.fetchInstances({\n definitionIds: [definitionId],\n });\n const groupedData = groupByProcessIdAndVersion(instances);\n const worflowInstanceStats = getWorkflowRunStats(groupedData);\n const workflowOverview = await this.fetchWorkflowOverviewBySource(source);\n if (workflowOverview) {\n const stats = worflowInstanceStats.find(\n stat =>\n stat.processIdVersion ===\n `${workflowOverview.workflowId}-${workflowOverview.version}`,\n );\n if (stats) {\n workflowOverview.workflowRunStats = {\n successRatio: stats.successRatio,\n runsLastMonth: stats.runsLastMonth,\n successCount: stats.successCount,\n errorCount: stats.errorCount,\n totalCount: stats.totalCount,\n averageTimeToComplete: stats.averageTimeToComplete,\n };\n }\n }\n return workflowOverview;\n }\n\n private async fetchWorkflowOverviewBySource(\n source: string,\n targetEntity?: string,\n ): Promise<WorkflowOverview | undefined> {\n let lastTriggered: Date = new Date(0);\n let lastRunStatus: ProcessInstanceStateValues | undefined;\n let lastRunId: string | undefined;\n const definition = fromWorkflowSource(source);\n\n const processInstances =\n await this.dataIndexService.fetchInstancesByDefinitionId({\n definitionId: definition.id,\n limit: 1,\n offset: 0,\n targetEntity: targetEntity,\n });\n\n const pInstance = processInstances[0];\n\n if (pInstance?.start) {\n lastRunId = pInstance.id;\n lastTriggered = new Date(pInstance.start);\n lastRunStatus = pInstance.state;\n }\n\n return {\n workflowId: definition.id,\n name: definition.name,\n format: extractWorkflowFormat(source),\n lastRunId,\n lastTriggeredMs: lastTriggered.getTime(),\n lastRunStatus,\n description: definition.description,\n version: definition.version,\n };\n }\n\n public async pingWorkflowService(args: {\n definitionId: string;\n serviceUrl: string;\n }): Promise<WorkflowAvailabilityResponse> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}`;\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch);\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n return {\n isAvailable: false,\n statusCode: 500,\n urlToFetch,\n reason: `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n };\n }\n return {\n isAvailable: response.ok,\n statusCode: response.status || 500,\n urlToFetch,\n reason: response.statusText || 'Unknown reason',\n };\n }\n\n private async handleWorkflowServiceResponse(\n operation: 'Abort' | 'Execute' | 'Retrigger' | 'Get workflow info',\n workflowId: string,\n urlToFetch: string,\n response: Response | undefined,\n httpMethod: Request['method'],\n ): Promise<any> {\n const logErrorPrefix = `Error during operation '${operation}' on workflow ${workflowId} with service URL ${urlToFetch}`;\n if (!response) {\n throw new Error(`${logErrorPrefix} : fetch failed`);\n }\n const errorLines: string[] = [];\n errorLines.push(`HTTP ${httpMethod} request to ${urlToFetch} failed.`);\n errorLines.push(`Status Code: ${response.status}`);\n if (response.statusText) {\n errorLines.push(`Status Text: ${response.statusText}`);\n }\n try {\n const jsonResponse = await response.json();\n if ((jsonResponse.id && operation === 'Execute') || response.ok) {\n // Treat as successful from the UI perspective.\n // This allows navigation to the instance page even if the workflow execution\n // fails immediately after initiation. The presence of an instance id or a successful\n // 'ok' status indicates the initiation was successful.\n return jsonResponse;\n }\n if (jsonResponse?.message) {\n errorLines.push(`Message: ${jsonResponse.message}`);\n }\n if (jsonResponse?.details) {\n errorLines.push(`Details: ${jsonResponse.details}`);\n }\n if (jsonResponse?.stack) {\n errorLines.push(`Stack Trace: ${jsonResponse.stack}`);\n }\n if (jsonResponse?.failedNodeId) {\n errorLines.push(`Failed Node ID: ${jsonResponse.failedNodeId}`);\n }\n this.logger.error(`${logErrorPrefix}: ${JSON.stringify(jsonResponse)}`);\n } catch (jsonParseError) {\n this.logger.error(\n `${logErrorPrefix}. The details of this error cannot be provided because the response body was not in a parsable format.`,\n );\n }\n throw new Error(errorLines.join('\\n'));\n }\n}\n"],"names":["Kafka","fromWorkflowSource","groupByProcessIdAndVersion","getWorkflowRunStats","randomUUID","CloudEvent","KafkaCE","capitalize","extractWorkflowFormat"],"mappings":"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"}
|
|
@@ -65,7 +65,7 @@ class WorkflowCacheService {
|
|
|
65
65
|
});
|
|
66
66
|
await Promise.all(
|
|
67
67
|
Object.entries(idUrlMap).map(async ([definitionId, serviceUrl]) => {
|
|
68
|
-
let isServiceUp
|
|
68
|
+
let isServiceUp;
|
|
69
69
|
try {
|
|
70
70
|
isServiceUp = await this.sonataFlowService.pingWorkflowService({
|
|
71
71
|
definitionId,
|
|
@@ -76,7 +76,7 @@ class WorkflowCacheService {
|
|
|
76
76
|
`Ping workflow ${definitionId} service threw error: ${err}`
|
|
77
77
|
);
|
|
78
78
|
}
|
|
79
|
-
if (isServiceUp) {
|
|
79
|
+
if (isServiceUp?.isAvailable) {
|
|
80
80
|
this.definitionIdCache.add(definitionId);
|
|
81
81
|
this.unavailableDefinitionIdCache.delete(definitionId);
|
|
82
82
|
} else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowCacheService.cjs.js","sources":["../../src/service/WorkflowCacheService.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoggerService, SchedulerService } from '@backstage/backend-plugin-api';\n\nimport { DataIndexService } from './DataIndexService';\nimport { SonataFlowService } from './SonataFlowService';\n\nexport type CacheHandler = 'skip' | 'throw';\n\nexport class WorkflowCacheService {\n private readonly TASK_ID = 'task__Orchestrator__WorkflowCacheService';\n private readonly DEFAULT_FREQUENCY_IN_SECONDS = 5;\n private readonly DEFAULT_TIMEOUT_IN_MINUTES = 10;\n private readonly definitionIdCache = new Set<string>();\n private readonly unavailableDefinitionIdCache = new Set<string>();\n\n constructor(\n private readonly logger: LoggerService,\n private readonly dataIndexService: DataIndexService,\n private readonly sonataFlowService: SonataFlowService,\n ) {}\n\n public get definitionIds(): string[] {\n return Array.from(this.definitionIdCache);\n }\n\n public get unavailableDefinitionIds(): string[] {\n return Array.from(this.unavailableDefinitionIdCache);\n }\n\n private isEmpty(): boolean {\n return (\n this.definitionIdCache.size === 0 &&\n this.unavailableDefinitionIdCache.size === 0\n );\n }\n\n public isAvailable(\n definitionId?: string,\n cacheHandler: CacheHandler = 'skip',\n ): boolean {\n if (!definitionId) {\n return false;\n }\n const isAvailable = this.definitionIdCache.has(definitionId);\n if (!isAvailable && cacheHandler === 'throw') {\n throw new Error(\n `Workflow service \"${definitionId}\" not available at the moment`,\n );\n }\n return isAvailable;\n }\n\n public schedule(args: {\n scheduler: SchedulerService;\n frequencyInSeconds?: number;\n timeoutInMinutes?: number;\n }): void {\n const {\n scheduler,\n frequencyInSeconds = this.DEFAULT_FREQUENCY_IN_SECONDS,\n timeoutInMinutes = this.DEFAULT_TIMEOUT_IN_MINUTES,\n } = args;\n\n scheduler.scheduleTask({\n id: this.TASK_ID,\n frequency: { seconds: frequencyInSeconds },\n timeout: { minutes: timeoutInMinutes },\n fn: async () => {\n await this.runTask();\n },\n });\n }\n\n private async runTask() {\n try {\n const idUrlMap = await this.dataIndexService.fetchWorkflowServiceUrls();\n this.definitionIdCache.forEach(definitionId => {\n if (!idUrlMap[definitionId]) {\n this.definitionIdCache.delete(definitionId);\n }\n });\n this.unavailableDefinitionIdCache.forEach(definitionId => {\n if (!idUrlMap[definitionId]) {\n this.unavailableDefinitionIdCache.delete(definitionId);\n }\n });\n await Promise.all(\n Object.entries(idUrlMap).map(async ([definitionId, serviceUrl]) => {\n let isServiceUp
|
|
1
|
+
{"version":3,"file":"WorkflowCacheService.cjs.js","sources":["../../src/service/WorkflowCacheService.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoggerService, SchedulerService } from '@backstage/backend-plugin-api';\n\nimport { WorkflowAvailabilityResponse } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { DataIndexService } from './DataIndexService';\nimport { SonataFlowService } from './SonataFlowService';\n\nexport type CacheHandler = 'skip' | 'throw';\n\nexport class WorkflowCacheService {\n private readonly TASK_ID = 'task__Orchestrator__WorkflowCacheService';\n private readonly DEFAULT_FREQUENCY_IN_SECONDS = 5;\n private readonly DEFAULT_TIMEOUT_IN_MINUTES = 10;\n private readonly definitionIdCache = new Set<string>();\n private readonly unavailableDefinitionIdCache = new Set<string>();\n\n constructor(\n private readonly logger: LoggerService,\n private readonly dataIndexService: DataIndexService,\n private readonly sonataFlowService: SonataFlowService,\n ) {}\n\n public get definitionIds(): string[] {\n return Array.from(this.definitionIdCache);\n }\n\n public get unavailableDefinitionIds(): string[] {\n return Array.from(this.unavailableDefinitionIdCache);\n }\n\n private isEmpty(): boolean {\n return (\n this.definitionIdCache.size === 0 &&\n this.unavailableDefinitionIdCache.size === 0\n );\n }\n\n public isAvailable(\n definitionId?: string,\n cacheHandler: CacheHandler = 'skip',\n ): boolean {\n if (!definitionId) {\n return false;\n }\n const isAvailable = this.definitionIdCache.has(definitionId);\n if (!isAvailable && cacheHandler === 'throw') {\n throw new Error(\n `Workflow service \"${definitionId}\" not available at the moment`,\n );\n }\n return isAvailable;\n }\n\n public schedule(args: {\n scheduler: SchedulerService;\n frequencyInSeconds?: number;\n timeoutInMinutes?: number;\n }): void {\n const {\n scheduler,\n frequencyInSeconds = this.DEFAULT_FREQUENCY_IN_SECONDS,\n timeoutInMinutes = this.DEFAULT_TIMEOUT_IN_MINUTES,\n } = args;\n\n scheduler.scheduleTask({\n id: this.TASK_ID,\n frequency: { seconds: frequencyInSeconds },\n timeout: { minutes: timeoutInMinutes },\n fn: async () => {\n await this.runTask();\n },\n });\n }\n\n private async runTask() {\n try {\n const idUrlMap = await this.dataIndexService.fetchWorkflowServiceUrls();\n this.definitionIdCache.forEach(definitionId => {\n if (!idUrlMap[definitionId]) {\n this.definitionIdCache.delete(definitionId);\n }\n });\n this.unavailableDefinitionIdCache.forEach(definitionId => {\n if (!idUrlMap[definitionId]) {\n this.unavailableDefinitionIdCache.delete(definitionId);\n }\n });\n await Promise.all(\n Object.entries(idUrlMap).map(async ([definitionId, serviceUrl]) => {\n let isServiceUp: WorkflowAvailabilityResponse | undefined;\n try {\n isServiceUp = await this.sonataFlowService.pingWorkflowService({\n definitionId,\n serviceUrl,\n });\n } catch (err) {\n this.logger.error(\n `Ping workflow ${definitionId} service threw error: ${err}`,\n );\n }\n if (isServiceUp?.isAvailable) {\n this.definitionIdCache.add(definitionId);\n this.unavailableDefinitionIdCache.delete(definitionId);\n } else {\n this.logger.error(\n `Failed to ping service for workflow ${definitionId} at ${serviceUrl}`,\n );\n if (this.definitionIdCache.has(definitionId)) {\n this.definitionIdCache.delete(definitionId);\n }\n this.unavailableDefinitionIdCache.add(definitionId);\n }\n }),\n );\n\n const workflowDefinitionIds = this.isEmpty()\n ? 'empty cache'\n : Array.from(this.definitionIdCache)\n .concat(Array.from(this.unavailableDefinitionIdCache))\n .join(', ');\n\n this.logger.debug(\n `${this.TASK_ID} updated the workflow definition ID cache to: ${workflowDefinitionIds}`,\n );\n } catch (error) {\n this.logger.error(`Error running ${this.TASK_ID}: ${error}`);\n return;\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ function mapToWorkflowOverviewDTO(overview) {
|
|
|
13
13
|
lastRunStatus: overview.lastRunStatus ? getProcessInstancesStatusDTOFromString(overview.lastRunStatus) : void 0,
|
|
14
14
|
lastTriggeredMs: overview.lastTriggeredMs,
|
|
15
15
|
isAvailable: overview.isAvailable,
|
|
16
|
+
availability: overview.availability,
|
|
16
17
|
version: overview.version,
|
|
17
18
|
workflowRunStats: overview.workflowRunStats
|
|
18
19
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"V2Mappings.cjs.js","sources":["../../../../src/service/api/mapping/V2Mappings.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DateTime, Duration } from 'luxon';\n\nimport {\n capitalize,\n ExecuteWorkflowResponseDTO,\n extractWorkflowFormat,\n fromWorkflowSource,\n NodeInstance,\n NodeInstanceDTO,\n ProcessInstance,\n ProcessInstanceDTO,\n ProcessInstanceState,\n ProcessInstanceStatusDTO,\n WorkflowDTO,\n WorkflowExecutionResponse,\n WorkflowFormatDTO,\n WorkflowOverview,\n WorkflowOverviewDTO,\n WorkflowRunStatusDTO,\n type ProcessInstanceStatusDTO as ProcessInstanceStatusDTOType,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\n// Mapping functions\nexport function mapToWorkflowOverviewDTO(\n overview: WorkflowOverview,\n): WorkflowOverviewDTO {\n return {\n name: overview.name,\n format: overview.format,\n workflowId: overview.workflowId,\n description: overview.description,\n lastRunId: overview.lastRunId,\n lastRunStatus: overview.lastRunStatus\n ? getProcessInstancesStatusDTOFromString(overview.lastRunStatus)\n : undefined,\n lastTriggeredMs: overview.lastTriggeredMs,\n isAvailable: overview.isAvailable,\n version: overview.version,\n workflowRunStats: overview.workflowRunStats,\n };\n}\n\nexport function getWorkflowFormatDTO(source: string): WorkflowFormatDTO {\n return extractWorkflowFormat(source);\n}\n\nexport function mapToWorkflowDTO(source: string): WorkflowDTO {\n const definition = fromWorkflowSource(source);\n return {\n annotations: definition.annotations,\n description: definition.description,\n name: definition.name,\n format: getWorkflowFormatDTO(source),\n id: definition.id,\n };\n}\n\nexport function getProcessInstancesStatusDTOFromString(\n state: string,\n): ProcessInstanceStatusDTOType {\n if (\n !Object.values(ProcessInstanceStatusDTO).includes(\n state as ProcessInstanceStatusDTOType,\n )\n ) {\n throw new Error(\n `state ${state} is not one of the values of type ProcessInstanceStatusDTO`,\n );\n }\n return state as ProcessInstanceStatusDTOType;\n}\n\nexport function mapToProcessInstanceDTO(\n processInstance: ProcessInstance,\n): ProcessInstanceDTO {\n const start = DateTime.fromISO(processInstance.start as string, {\n setZone: true,\n });\n const end = DateTime.fromISO(processInstance.end as string, {\n setZone: true,\n });\n const duration = processInstance.end\n ? Duration.fromMillis(end.diff(start).toMillis())\n .shiftTo('hours', 'minutes', 'seconds')\n .toHuman({ unitDisplay: 'long' })\n : undefined;\n\n let variables: Record<string, unknown> | undefined;\n if (typeof processInstance?.variables === 'string') {\n variables = JSON.parse(processInstance?.variables);\n } else {\n variables = processInstance?.variables;\n }\n\n return {\n id: processInstance.id,\n version: processInstance.version,\n processId: processInstance.processId,\n processName: processInstance.processName,\n description: processInstance.description,\n serviceUrl: processInstance.serviceUrl,\n executionSummary: processInstance.executionSummary,\n endpoint: processInstance.endpoint,\n error: processInstance.error,\n start: processInstance.start,\n end: processInstance.end,\n duration: duration,\n // @ts-ignore\n workflowdata: variables?.workflowdata,\n initiatorEntity: variables?.initiatorEntity as string,\n targetEntity: variables?.targetEntity as string,\n state: processInstance.state\n ? getProcessInstancesStatusDTOFromString(processInstance.state)\n : undefined,\n nodes: processInstance.nodes.map(mapToNodeInstanceDTO),\n };\n}\n\nexport function mapToNodeInstanceDTO(\n nodeInstance: NodeInstance,\n): NodeInstanceDTO {\n return { ...nodeInstance, __typename: 'NodeInstance' };\n}\n\nexport function mapToExecuteWorkflowResponseDTO(\n workflowId: string,\n workflowExecutionResponse: WorkflowExecutionResponse,\n): ExecuteWorkflowResponseDTO {\n if (!workflowExecutionResponse?.id) {\n throw new Error(\n `Error while mapping ExecuteWorkflowResponse to ExecuteWorkflowResponseDTO for workflow with id ${workflowId}`,\n );\n }\n\n return {\n id: workflowExecutionResponse.id,\n };\n}\n\nexport function mapToWorkflowRunStatusDTO(\n status: ProcessInstanceState,\n): WorkflowRunStatusDTO {\n return {\n key: capitalize(status),\n value: status,\n };\n}\n"],"names":["extractWorkflowFormat","fromWorkflowSource","ProcessInstanceStatusDTO","DateTime","Duration","capitalize"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"V2Mappings.cjs.js","sources":["../../../../src/service/api/mapping/V2Mappings.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DateTime, Duration } from 'luxon';\n\nimport {\n capitalize,\n ExecuteWorkflowResponseDTO,\n extractWorkflowFormat,\n fromWorkflowSource,\n NodeInstance,\n NodeInstanceDTO,\n ProcessInstance,\n ProcessInstanceDTO,\n ProcessInstanceState,\n ProcessInstanceStatusDTO,\n WorkflowDTO,\n WorkflowExecutionResponse,\n WorkflowFormatDTO,\n WorkflowOverview,\n WorkflowOverviewDTO,\n WorkflowRunStatusDTO,\n type ProcessInstanceStatusDTO as ProcessInstanceStatusDTOType,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\n// Mapping functions\nexport function mapToWorkflowOverviewDTO(\n overview: WorkflowOverview,\n): WorkflowOverviewDTO {\n return {\n name: overview.name,\n format: overview.format,\n workflowId: overview.workflowId,\n description: overview.description,\n lastRunId: overview.lastRunId,\n lastRunStatus: overview.lastRunStatus\n ? getProcessInstancesStatusDTOFromString(overview.lastRunStatus)\n : undefined,\n lastTriggeredMs: overview.lastTriggeredMs,\n isAvailable: overview.isAvailable,\n availability: overview.availability,\n version: overview.version,\n workflowRunStats: overview.workflowRunStats,\n };\n}\n\nexport function getWorkflowFormatDTO(source: string): WorkflowFormatDTO {\n return extractWorkflowFormat(source);\n}\n\nexport function mapToWorkflowDTO(source: string): WorkflowDTO {\n const definition = fromWorkflowSource(source);\n return {\n annotations: definition.annotations,\n description: definition.description,\n name: definition.name,\n format: getWorkflowFormatDTO(source),\n id: definition.id,\n };\n}\n\nexport function getProcessInstancesStatusDTOFromString(\n state: string,\n): ProcessInstanceStatusDTOType {\n if (\n !Object.values(ProcessInstanceStatusDTO).includes(\n state as ProcessInstanceStatusDTOType,\n )\n ) {\n throw new Error(\n `state ${state} is not one of the values of type ProcessInstanceStatusDTO`,\n );\n }\n return state as ProcessInstanceStatusDTOType;\n}\n\nexport function mapToProcessInstanceDTO(\n processInstance: ProcessInstance,\n): ProcessInstanceDTO {\n const start = DateTime.fromISO(processInstance.start as string, {\n setZone: true,\n });\n const end = DateTime.fromISO(processInstance.end as string, {\n setZone: true,\n });\n const duration = processInstance.end\n ? Duration.fromMillis(end.diff(start).toMillis())\n .shiftTo('hours', 'minutes', 'seconds')\n .toHuman({ unitDisplay: 'long' })\n : undefined;\n\n let variables: Record<string, unknown> | undefined;\n if (typeof processInstance?.variables === 'string') {\n variables = JSON.parse(processInstance?.variables);\n } else {\n variables = processInstance?.variables;\n }\n\n return {\n id: processInstance.id,\n version: processInstance.version,\n processId: processInstance.processId,\n processName: processInstance.processName,\n description: processInstance.description,\n serviceUrl: processInstance.serviceUrl,\n executionSummary: processInstance.executionSummary,\n endpoint: processInstance.endpoint,\n error: processInstance.error,\n start: processInstance.start,\n end: processInstance.end,\n duration: duration,\n // @ts-ignore\n workflowdata: variables?.workflowdata,\n initiatorEntity: variables?.initiatorEntity as string,\n targetEntity: variables?.targetEntity as string,\n state: processInstance.state\n ? getProcessInstancesStatusDTOFromString(processInstance.state)\n : undefined,\n nodes: processInstance.nodes.map(mapToNodeInstanceDTO),\n };\n}\n\nexport function mapToNodeInstanceDTO(\n nodeInstance: NodeInstance,\n): NodeInstanceDTO {\n return { ...nodeInstance, __typename: 'NodeInstance' };\n}\n\nexport function mapToExecuteWorkflowResponseDTO(\n workflowId: string,\n workflowExecutionResponse: WorkflowExecutionResponse,\n): ExecuteWorkflowResponseDTO {\n if (!workflowExecutionResponse?.id) {\n throw new Error(\n `Error while mapping ExecuteWorkflowResponse to ExecuteWorkflowResponseDTO for workflow with id ${workflowId}`,\n );\n }\n\n return {\n id: workflowExecutionResponse.id,\n };\n}\n\nexport function mapToWorkflowRunStatusDTO(\n status: ProcessInstanceState,\n): WorkflowRunStatusDTO {\n return {\n key: capitalize(status),\n value: status,\n };\n}\n"],"names":["extractWorkflowFormat","fromWorkflowSource","ProcessInstanceStatusDTO","DateTime","Duration","capitalize"],"mappings":"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"}
|
|
@@ -89,8 +89,13 @@ class V2 {
|
|
|
89
89
|
filter,
|
|
90
90
|
workflowIds
|
|
91
91
|
});
|
|
92
|
+
const totalCount = (await this.orchestratorService.fetchInstances({
|
|
93
|
+
filter,
|
|
94
|
+
workflowIds
|
|
95
|
+
})).length;
|
|
92
96
|
const result = {
|
|
93
|
-
|
|
97
|
+
totalCount,
|
|
98
|
+
items: instances.map(V2Mappings.mapToProcessInstanceDTO),
|
|
94
99
|
paginationInfo: {
|
|
95
100
|
pageSize: pagination?.limit,
|
|
96
101
|
offset: pagination?.offset
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v2.cjs.js","sources":["../../../src/service/api/v2.ts"],"sourcesContent":["/* eslint-disable no-else-return */\n/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { load } from 'js-yaml';\nimport { ParsedRequest } from 'openapi-backend';\n\nimport {\n AuthToken,\n ExecuteWorkflowRequestDTO,\n ExecuteWorkflowResponseDTO,\n Filter,\n ProcessInstanceDTO,\n ProcessInstanceListResultDTO,\n ProcessInstanceState,\n RetriggerInstanceRequestDTO,\n WorkflowDTO,\n WorkflowExecutionResponse,\n WorkflowInfo,\n WorkflowLogsResponse,\n WorkflowOverviewDTO,\n WorkflowOverviewListResultDTO,\n WorkflowRunStatusDTO,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { Pagination } from '../../types/pagination';\nimport { retryAsyncFunction } from '../Helper';\nimport { OrchestratorService } from '../OrchestratorService';\nimport {\n mapToExecuteWorkflowResponseDTO,\n mapToProcessInstanceDTO,\n mapToWorkflowDTO,\n mapToWorkflowOverviewDTO,\n mapToWorkflowRunStatusDTO,\n} from './mapping/V2Mappings';\n\nconst FETCH_INSTANCE_MAX_ATTEMPTS = 10;\nconst FETCH_INSTANCE_RETRY_DELAY_MS = 1000;\n\nexport class V2 {\n constructor(private readonly orchestratorService: OrchestratorService) {}\n\n public async getWorkflowsOverviewForEntity(\n targetEntity: string,\n annotationWorkflowIds: string[],\n ): Promise<WorkflowOverviewListResultDTO> {\n let combinedWorkflowIds: string[] = annotationWorkflowIds;\n\n if (targetEntity) {\n const definitionIdsFromInstances =\n await this.orchestratorService.fetchDefinitionIdsFromInstances({\n targetEntity,\n });\n\n if (definitionIdsFromInstances.length > 0) {\n combinedWorkflowIds = Array.from(\n new Set([...combinedWorkflowIds, ...definitionIdsFromInstances]),\n );\n }\n }\n\n // If no workflow IDs are provided, return empty result\n if (combinedWorkflowIds.length === 0) {\n return {\n overviews: [],\n };\n }\n\n const workflowIdsFilter: Filter = {\n field: 'id',\n operator: 'IN',\n value: combinedWorkflowIds,\n };\n\n return this.getWorkflowsOverview(\n undefined,\n workflowIdsFilter,\n targetEntity,\n );\n }\n\n public async getWorkflowsOverview(\n pagination?: Pagination,\n filter?: Filter,\n targetEntity?: string,\n ): Promise<WorkflowOverviewListResultDTO> {\n const overviews = await this.orchestratorService.fetchWorkflowOverviews({\n pagination,\n filter,\n targetEntity,\n });\n if (!overviews) {\n throw new Error(\"Couldn't fetch workflow overviews\");\n }\n const result: WorkflowOverviewListResultDTO = {\n overviews: overviews.map(item => mapToWorkflowOverviewDTO(item)),\n paginationInfo: {\n pageSize: pagination?.limit,\n offset: pagination?.offset,\n },\n };\n return result;\n }\n\n public getWorkflowIds(): string[] {\n return this.orchestratorService.getWorkflowIds();\n }\n\n public async getWorkflowOverviewById(\n workflowId: string,\n ): Promise<WorkflowOverviewDTO> {\n const overview = await this.orchestratorService.fetchWorkflowOverview({\n definitionId: workflowId,\n });\n\n if (!overview) {\n throw new Error(`Couldn't fetch workflow overview for ${workflowId}`);\n }\n return mapToWorkflowOverviewDTO(overview);\n }\n\n public async getWorkflowById(workflowId: string): Promise<WorkflowDTO> {\n const resultV1 = await this.getWorkflowSourceById(workflowId);\n return mapToWorkflowDTO(resultV1);\n }\n\n public async getWorkflowSourceById(workflowId: string): Promise<string> {\n const source = await this.orchestratorService.fetchWorkflowSource({\n definitionId: workflowId,\n });\n\n if (!source) {\n throw new Error(`Couldn't fetch workflow source for ${workflowId}`);\n }\n\n return source;\n }\n\n public async getInstances(\n pagination?: Pagination,\n filter?: Filter,\n workflowIds?: string[],\n ): Promise<ProcessInstanceListResultDTO> {\n const instances = await this.orchestratorService.fetchInstances({\n pagination,\n filter,\n workflowIds,\n });\n\n const result: ProcessInstanceListResultDTO = {\n items: instances?.map(mapToProcessInstanceDTO),\n paginationInfo: {\n pageSize: pagination?.limit,\n offset: pagination?.offset,\n },\n };\n return result;\n }\n\n public async getInstanceById(\n instanceId: string,\n ): Promise<ProcessInstanceDTO> {\n const instance = await this.orchestratorService.fetchInstance({\n instanceId,\n });\n\n if (!instance) {\n throw new Error(`Couldn't fetch process instance ${instanceId}`);\n }\n\n return mapToProcessInstanceDTO(instance);\n }\n\n public async getInstanceLogsByInstance(\n instance: ProcessInstanceDTO,\n ): Promise<WorkflowLogsResponse> {\n const logs = await this.orchestratorService.fetchWorkflowLogsByInstance({\n instance,\n });\n return logs;\n }\n\n public async executeWorkflow(\n executeWorkflowRequestDTO: ExecuteWorkflowRequestDTO,\n workflowId: string,\n initiatorEntity: string,\n backstageToken: string | undefined,\n ): Promise<ExecuteWorkflowResponseDTO> {\n const definition = await this.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n });\n if (!definition) {\n throw new Error(`Couldn't fetch workflow definition for ${workflowId}`);\n }\n\n let executionResponse: WorkflowExecutionResponse | undefined;\n\n // Figure out if we are sending as cloudevent are regular\n // The frontend will send the isEvent=true parameter in the inputData if it running as an Event\n const isEventType =\n (executeWorkflowRequestDTO.inputData as any)?.isEvent || false;\n\n if (isEventType) {\n // definition.source will be the yaml\n const parsedDefinitionSource: any = load(definition.source as string);\n\n // Parse the definition to find the start param then determine things from there\n // All workflows should have this start param\n /**\n * When a workflow is compiled, the start value will look like this:\n *\n * start:\n * stateName: \"Start State Name\"\n *\n * Note: This doesn't matter if it is JSON or YAML.\n * Need to test for both params since we need to be able to test.\n */\n const start =\n parsedDefinitionSource.start?.stateName || parsedDefinitionSource.start;\n\n // Find the start state from the list of states\n const startState = parsedDefinitionSource.states.filter(\n (val: { name: any }) => {\n return val.name === start;\n },\n );\n\n if (startState.length < 1) {\n throw new Error(\n `Error executing workflow with id ${workflowId}, No States that match the start state`,\n );\n }\n\n // Look at the onEvents to get what it responds to\n // The kafka topic name will be: ${eventName}`\n const eventName = startState?.[0].onEvents?.[0].eventRefs?.[0];\n\n if (!eventName) {\n throw new Error(\n `Error executing workflow with id ${workflowId}, No event ref`,\n );\n }\n\n // Once we have the start state and its eventRef, go back and find it in the events array\n const workflowEventToUse = parsedDefinitionSource.events.filter(\n (val: { name: any }) => {\n return val.name === eventName;\n },\n );\n\n if (workflowEventToUse.length < 1) {\n throw new Error(\n `Error executing workflow with id ${workflowId}, No Events that match the start state eventRef`,\n );\n }\n\n // This will be the key value for event correlation: ${correlationContextAttributeName}\n const correlationContextAttributeName =\n workflowEventToUse?.[0].correlation?.[0].contextAttributeName;\n\n if (!correlationContextAttributeName) {\n throw new Error(\n `Error executing workflow with id ${workflowId}, No correlation context attribute name found in event with event name ${eventName}`,\n );\n }\n\n executionResponse =\n await this.orchestratorService.executeWorkflowAsCloudEvent({\n definitionId: workflowId,\n workflowSource: workflowEventToUse[0].source,\n workflowEventType: eventName,\n contextAttribute: correlationContextAttributeName,\n inputData: {\n workflowdata: executeWorkflowRequestDTO.inputData,\n initiatorEntity: initiatorEntity,\n targetEntity: executeWorkflowRequestDTO.targetEntity,\n },\n authTokens: executeWorkflowRequestDTO.authTokens as Array<AuthToken>,\n backstageToken,\n });\n\n // We need to return the workflow instance ID\n // This is what is returned when executing a \"normal\" workflow\n // Wait a small amount so the workflow has a chance to get triggered\n // There is a very good possibility that the workflow will not be ready yet when we query here\n\n let currentInstanceToReturn: string | any[] = [];\n for (let i = 0; i < FETCH_INSTANCE_MAX_ATTEMPTS; i++) {\n const response = await this.orchestratorService.fetchInstances({\n workflowIds: [workflowId],\n });\n\n // Find the correct workflow by using the correlation context attribute(CCA) value\n // id returned from the execution response will be the CCA value\n // eslint-disable-next-line no-loop-func\n currentInstanceToReturn = response.filter((val: any) => {\n return (\n val.variables.workflowdata[correlationContextAttributeName] ===\n executionResponse?.id\n );\n });\n\n if (currentInstanceToReturn.length > 0) {\n break;\n }\n\n await new Promise(resolve =>\n setTimeout(resolve, FETCH_INSTANCE_RETRY_DELAY_MS),\n );\n }\n\n let currentInstanceIDToReturn;\n if (currentInstanceToReturn.length < 1) {\n // nothing returned yet,\n // doesn't mean this is an error since it might take time for the trigger to happen\n // return something else so the front-end knows to just show the list of workflow runs\n currentInstanceIDToReturn = 'kafkaEvent';\n } else {\n currentInstanceIDToReturn = currentInstanceToReturn[0]?.id;\n }\n\n // Return just the id of the response, which will be the instanceID or some identifier\n // to let the front end know the workflow isn't ready yet\n return {\n id: currentInstanceIDToReturn,\n };\n } else {\n if (!definition.serviceUrl) {\n throw new Error(`ServiceURL is not defined for workflow ${workflowId}`);\n }\n // A non event type workflow to be executed\n executionResponse = await this.orchestratorService.executeWorkflow({\n definitionId: workflowId,\n inputData: {\n workflowdata: executeWorkflowRequestDTO.inputData,\n initiatorEntity: initiatorEntity,\n targetEntity: executeWorkflowRequestDTO.targetEntity,\n },\n authTokens: executeWorkflowRequestDTO.authTokens as Array<AuthToken>,\n serviceUrl: definition.serviceUrl,\n backstageToken,\n });\n }\n\n if (!executionResponse) {\n throw new Error(`Couldn't execute workflow ${workflowId}`);\n }\n\n // Making sure the instance data is available before returning\n await retryAsyncFunction({\n asyncFn: () =>\n this.orchestratorService.fetchInstance({\n instanceId: executionResponse.id,\n }),\n maxAttempts: FETCH_INSTANCE_MAX_ATTEMPTS,\n delayMs: FETCH_INSTANCE_RETRY_DELAY_MS,\n });\n\n if (!executionResponse) {\n throw new Error('Error executing workflow with id ${workflowId}');\n }\n\n return mapToExecuteWorkflowResponseDTO(workflowId, executionResponse);\n }\n\n public async retriggerInstance(\n workflowId: string,\n instanceId: string,\n retriggerInstanceRequestDTO: RetriggerInstanceRequestDTO,\n backstageToken: string | undefined,\n ): Promise<void> {\n const definition = await this.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n });\n if (!definition) {\n throw new Error(`Couldn't fetch workflow definition for ${workflowId}`);\n }\n if (!definition.serviceUrl) {\n throw new Error(`ServiceURL is not defined for workflow ${workflowId}`);\n }\n const response = await this.orchestratorService.retriggerWorkflow({\n definitionId: workflowId,\n instanceId: instanceId,\n serviceUrl: definition.serviceUrl,\n authTokens: retriggerInstanceRequestDTO.authTokens as Array<AuthToken>,\n backstageToken,\n });\n\n if (!response) {\n throw new Error(\n `Couldn't retrigger instance ${instanceId} of workflow ${workflowId}`,\n );\n }\n }\n\n public async abortWorkflow(\n workflowId: string,\n instanceId: string,\n ): Promise<string> {\n const definition = await this.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n });\n if (!definition) {\n throw new Error(`Couldn't fetch workflow definition for ${workflowId}`);\n }\n if (!definition.serviceUrl) {\n throw new Error(`ServiceURL is not defined for workflow ${workflowId}`);\n }\n await this.orchestratorService.abortWorkflowInstance({\n definitionId: workflowId,\n instanceId: instanceId,\n serviceUrl: definition.serviceUrl,\n });\n return `Workflow instance ${instanceId} successfully aborted`;\n }\n\n public async getWorkflowStatuses(): Promise<WorkflowRunStatusDTO[]> {\n return [\n ProcessInstanceState.Active,\n ProcessInstanceState.Error,\n ProcessInstanceState.Completed,\n ProcessInstanceState.Aborted,\n ProcessInstanceState.Suspended,\n ProcessInstanceState.Pending,\n ].map(status => mapToWorkflowRunStatusDTO(status));\n }\n\n public async getWorkflowInputSchemaById(\n workflowId: string,\n serviceUrl: string,\n ): Promise<WorkflowInfo | undefined> {\n return this.orchestratorService.fetchWorkflowInfoOnService({\n definitionId: workflowId,\n serviceUrl: serviceUrl,\n });\n }\n\n public async pingWorkflowService(\n workflowId: string,\n ): Promise<boolean | undefined> {\n const definition = await this.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n });\n if (!definition) {\n throw new Error(`Couldn't fetch workflow definition for ${workflowId}`);\n }\n if (!definition.serviceUrl) {\n throw new Error(`ServiceURL is not defined for workflow ${workflowId}`);\n }\n const isAvailableNow = await this.orchestratorService.pingWorkflowService({\n definitionId: workflowId,\n serviceUrl: definition.serviceUrl,\n });\n if (!isAvailableNow) {\n throw new Error(\n `Workflow service for workflow ${workflowId} at ${definition.serviceUrl}/management/processes/${workflowId} is not available at the moment.`,\n );\n }\n return isAvailableNow;\n }\n\n public extractQueryParam(\n req: ParsedRequest,\n key: string,\n ): string | undefined {\n return req.query[key] as string | undefined;\n }\n}\n"],"names":["mapToWorkflowOverviewDTO","mapToWorkflowDTO","mapToProcessInstanceDTO","load","retryAsyncFunction","mapToExecuteWorkflowResponseDTO","ProcessInstanceState","mapToWorkflowRunStatusDTO"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"v2.cjs.js","sources":["../../../src/service/api/v2.ts"],"sourcesContent":["/* eslint-disable no-else-return */\n/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { load } from 'js-yaml';\nimport { ParsedRequest } from 'openapi-backend';\n\nimport {\n AuthToken,\n ExecuteWorkflowRequestDTO,\n ExecuteWorkflowResponseDTO,\n Filter,\n ProcessInstanceDTO,\n ProcessInstanceListResultDTO,\n ProcessInstanceState,\n RetriggerInstanceRequestDTO,\n WorkflowDTO,\n WorkflowExecutionResponse,\n WorkflowInfo,\n WorkflowLogsResponse,\n WorkflowOverviewDTO,\n WorkflowOverviewListResultDTO,\n WorkflowRunStatusDTO,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { Pagination } from '../../types/pagination';\nimport { retryAsyncFunction } from '../Helper';\nimport { OrchestratorService } from '../OrchestratorService';\nimport {\n mapToExecuteWorkflowResponseDTO,\n mapToProcessInstanceDTO,\n mapToWorkflowDTO,\n mapToWorkflowOverviewDTO,\n mapToWorkflowRunStatusDTO,\n} from './mapping/V2Mappings';\n\nconst FETCH_INSTANCE_MAX_ATTEMPTS = 10;\nconst FETCH_INSTANCE_RETRY_DELAY_MS = 1000;\n\nexport class V2 {\n constructor(private readonly orchestratorService: OrchestratorService) {}\n\n public async getWorkflowsOverviewForEntity(\n targetEntity: string,\n annotationWorkflowIds: string[],\n ): Promise<WorkflowOverviewListResultDTO> {\n let combinedWorkflowIds: string[] = annotationWorkflowIds;\n\n if (targetEntity) {\n const definitionIdsFromInstances =\n await this.orchestratorService.fetchDefinitionIdsFromInstances({\n targetEntity,\n });\n\n if (definitionIdsFromInstances.length > 0) {\n combinedWorkflowIds = Array.from(\n new Set([...combinedWorkflowIds, ...definitionIdsFromInstances]),\n );\n }\n }\n\n // If no workflow IDs are provided, return empty result\n if (combinedWorkflowIds.length === 0) {\n return {\n overviews: [],\n };\n }\n\n const workflowIdsFilter: Filter = {\n field: 'id',\n operator: 'IN',\n value: combinedWorkflowIds,\n };\n\n return this.getWorkflowsOverview(\n undefined,\n workflowIdsFilter,\n targetEntity,\n );\n }\n\n public async getWorkflowsOverview(\n pagination?: Pagination,\n filter?: Filter,\n targetEntity?: string,\n ): Promise<WorkflowOverviewListResultDTO> {\n const overviews = await this.orchestratorService.fetchWorkflowOverviews({\n pagination,\n filter,\n targetEntity,\n });\n if (!overviews) {\n throw new Error(\"Couldn't fetch workflow overviews\");\n }\n const result: WorkflowOverviewListResultDTO = {\n overviews: overviews.map(item => mapToWorkflowOverviewDTO(item)),\n paginationInfo: {\n pageSize: pagination?.limit,\n offset: pagination?.offset,\n },\n };\n return result;\n }\n\n public getWorkflowIds(): string[] {\n return this.orchestratorService.getWorkflowIds();\n }\n\n public async getWorkflowOverviewById(\n workflowId: string,\n ): Promise<WorkflowOverviewDTO> {\n const overview = await this.orchestratorService.fetchWorkflowOverview({\n definitionId: workflowId,\n });\n\n if (!overview) {\n throw new Error(`Couldn't fetch workflow overview for ${workflowId}`);\n }\n return mapToWorkflowOverviewDTO(overview);\n }\n\n public async getWorkflowById(workflowId: string): Promise<WorkflowDTO> {\n const resultV1 = await this.getWorkflowSourceById(workflowId);\n return mapToWorkflowDTO(resultV1);\n }\n\n public async getWorkflowSourceById(workflowId: string): Promise<string> {\n const source = await this.orchestratorService.fetchWorkflowSource({\n definitionId: workflowId,\n });\n\n if (!source) {\n throw new Error(`Couldn't fetch workflow source for ${workflowId}`);\n }\n\n return source;\n }\n\n public async getInstances(\n pagination?: Pagination,\n filter?: Filter,\n workflowIds?: string[],\n ): Promise<ProcessInstanceListResultDTO> {\n const instances = await this.orchestratorService.fetchInstances({\n pagination,\n filter,\n workflowIds,\n });\n\n // Fetch the instances again but without the pagination filter to get the total count.\n const totalCount = (\n await this.orchestratorService.fetchInstances({\n filter,\n workflowIds,\n })\n ).length;\n\n const result: ProcessInstanceListResultDTO = {\n totalCount,\n items: instances.map(mapToProcessInstanceDTO),\n paginationInfo: {\n pageSize: pagination?.limit,\n offset: pagination?.offset,\n },\n };\n return result;\n }\n\n public async getInstanceById(\n instanceId: string,\n ): Promise<ProcessInstanceDTO> {\n const instance = await this.orchestratorService.fetchInstance({\n instanceId,\n });\n\n if (!instance) {\n throw new Error(`Couldn't fetch process instance ${instanceId}`);\n }\n\n return mapToProcessInstanceDTO(instance);\n }\n\n public async getInstanceLogsByInstance(\n instance: ProcessInstanceDTO,\n ): Promise<WorkflowLogsResponse> {\n const logs = await this.orchestratorService.fetchWorkflowLogsByInstance({\n instance,\n });\n return logs;\n }\n\n public async executeWorkflow(\n executeWorkflowRequestDTO: ExecuteWorkflowRequestDTO,\n workflowId: string,\n initiatorEntity: string,\n backstageToken: string | undefined,\n ): Promise<ExecuteWorkflowResponseDTO> {\n const definition = await this.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n });\n if (!definition) {\n throw new Error(`Couldn't fetch workflow definition for ${workflowId}`);\n }\n\n let executionResponse: WorkflowExecutionResponse | undefined;\n\n // Figure out if we are sending as cloudevent are regular\n // The frontend will send the isEvent=true parameter in the inputData if it running as an Event\n const isEventType =\n (executeWorkflowRequestDTO.inputData as any)?.isEvent || false;\n\n if (isEventType) {\n // definition.source will be the yaml\n const parsedDefinitionSource: any = load(definition.source as string);\n\n // Parse the definition to find the start param then determine things from there\n // All workflows should have this start param\n /**\n * When a workflow is compiled, the start value will look like this:\n *\n * start:\n * stateName: \"Start State Name\"\n *\n * Note: This doesn't matter if it is JSON or YAML.\n * Need to test for both params since we need to be able to test.\n */\n const start =\n parsedDefinitionSource.start?.stateName || parsedDefinitionSource.start;\n\n // Find the start state from the list of states\n const startState = parsedDefinitionSource.states.filter(\n (val: { name: any }) => {\n return val.name === start;\n },\n );\n\n if (startState.length < 1) {\n throw new Error(\n `Error executing workflow with id ${workflowId}, No States that match the start state`,\n );\n }\n\n // Look at the onEvents to get what it responds to\n // The kafka topic name will be: ${eventName}`\n const eventName = startState?.[0].onEvents?.[0].eventRefs?.[0];\n\n if (!eventName) {\n throw new Error(\n `Error executing workflow with id ${workflowId}, No event ref`,\n );\n }\n\n // Once we have the start state and its eventRef, go back and find it in the events array\n const workflowEventToUse = parsedDefinitionSource.events.filter(\n (val: { name: any }) => {\n return val.name === eventName;\n },\n );\n\n if (workflowEventToUse.length < 1) {\n throw new Error(\n `Error executing workflow with id ${workflowId}, No Events that match the start state eventRef`,\n );\n }\n\n // This will be the key value for event correlation: ${correlationContextAttributeName}\n const correlationContextAttributeName =\n workflowEventToUse?.[0].correlation?.[0].contextAttributeName;\n\n if (!correlationContextAttributeName) {\n throw new Error(\n `Error executing workflow with id ${workflowId}, No correlation context attribute name found in event with event name ${eventName}`,\n );\n }\n\n executionResponse =\n await this.orchestratorService.executeWorkflowAsCloudEvent({\n definitionId: workflowId,\n workflowSource: workflowEventToUse[0].source,\n workflowEventType: eventName,\n contextAttribute: correlationContextAttributeName,\n inputData: {\n workflowdata: executeWorkflowRequestDTO.inputData,\n initiatorEntity: initiatorEntity,\n targetEntity: executeWorkflowRequestDTO.targetEntity,\n },\n authTokens: executeWorkflowRequestDTO.authTokens as Array<AuthToken>,\n backstageToken,\n });\n\n // We need to return the workflow instance ID\n // This is what is returned when executing a \"normal\" workflow\n // Wait a small amount so the workflow has a chance to get triggered\n // There is a very good possibility that the workflow will not be ready yet when we query here\n\n let currentInstanceToReturn: string | any[] = [];\n for (let i = 0; i < FETCH_INSTANCE_MAX_ATTEMPTS; i++) {\n const response = await this.orchestratorService.fetchInstances({\n workflowIds: [workflowId],\n });\n\n // Find the correct workflow by using the correlation context attribute(CCA) value\n // id returned from the execution response will be the CCA value\n // eslint-disable-next-line no-loop-func\n currentInstanceToReturn = response.filter((val: any) => {\n return (\n val.variables.workflowdata[correlationContextAttributeName] ===\n executionResponse?.id\n );\n });\n\n if (currentInstanceToReturn.length > 0) {\n break;\n }\n\n await new Promise(resolve =>\n setTimeout(resolve, FETCH_INSTANCE_RETRY_DELAY_MS),\n );\n }\n\n let currentInstanceIDToReturn;\n if (currentInstanceToReturn.length < 1) {\n // nothing returned yet,\n // doesn't mean this is an error since it might take time for the trigger to happen\n // return something else so the front-end knows to just show the list of workflow runs\n currentInstanceIDToReturn = 'kafkaEvent';\n } else {\n currentInstanceIDToReturn = currentInstanceToReturn[0]?.id;\n }\n\n // Return just the id of the response, which will be the instanceID or some identifier\n // to let the front end know the workflow isn't ready yet\n return {\n id: currentInstanceIDToReturn,\n };\n } else {\n if (!definition.serviceUrl) {\n throw new Error(`ServiceURL is not defined for workflow ${workflowId}`);\n }\n // A non event type workflow to be executed\n executionResponse = await this.orchestratorService.executeWorkflow({\n definitionId: workflowId,\n inputData: {\n workflowdata: executeWorkflowRequestDTO.inputData,\n initiatorEntity: initiatorEntity,\n targetEntity: executeWorkflowRequestDTO.targetEntity,\n },\n authTokens: executeWorkflowRequestDTO.authTokens as Array<AuthToken>,\n serviceUrl: definition.serviceUrl,\n backstageToken,\n });\n }\n\n if (!executionResponse) {\n throw new Error(`Couldn't execute workflow ${workflowId}`);\n }\n\n // Making sure the instance data is available before returning\n await retryAsyncFunction({\n asyncFn: () =>\n this.orchestratorService.fetchInstance({\n instanceId: executionResponse.id,\n }),\n maxAttempts: FETCH_INSTANCE_MAX_ATTEMPTS,\n delayMs: FETCH_INSTANCE_RETRY_DELAY_MS,\n });\n\n if (!executionResponse) {\n throw new Error('Error executing workflow with id ${workflowId}');\n }\n\n return mapToExecuteWorkflowResponseDTO(workflowId, executionResponse);\n }\n\n public async retriggerInstance(\n workflowId: string,\n instanceId: string,\n retriggerInstanceRequestDTO: RetriggerInstanceRequestDTO,\n backstageToken: string | undefined,\n ): Promise<void> {\n const definition = await this.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n });\n if (!definition) {\n throw new Error(`Couldn't fetch workflow definition for ${workflowId}`);\n }\n if (!definition.serviceUrl) {\n throw new Error(`ServiceURL is not defined for workflow ${workflowId}`);\n }\n const response = await this.orchestratorService.retriggerWorkflow({\n definitionId: workflowId,\n instanceId: instanceId,\n serviceUrl: definition.serviceUrl,\n authTokens: retriggerInstanceRequestDTO.authTokens as Array<AuthToken>,\n backstageToken,\n });\n\n if (!response) {\n throw new Error(\n `Couldn't retrigger instance ${instanceId} of workflow ${workflowId}`,\n );\n }\n }\n\n public async abortWorkflow(\n workflowId: string,\n instanceId: string,\n ): Promise<string> {\n const definition = await this.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n });\n if (!definition) {\n throw new Error(`Couldn't fetch workflow definition for ${workflowId}`);\n }\n if (!definition.serviceUrl) {\n throw new Error(`ServiceURL is not defined for workflow ${workflowId}`);\n }\n await this.orchestratorService.abortWorkflowInstance({\n definitionId: workflowId,\n instanceId: instanceId,\n serviceUrl: definition.serviceUrl,\n });\n return `Workflow instance ${instanceId} successfully aborted`;\n }\n\n public async getWorkflowStatuses(): Promise<WorkflowRunStatusDTO[]> {\n return [\n ProcessInstanceState.Active,\n ProcessInstanceState.Error,\n ProcessInstanceState.Completed,\n ProcessInstanceState.Aborted,\n ProcessInstanceState.Suspended,\n ProcessInstanceState.Pending,\n ].map(status => mapToWorkflowRunStatusDTO(status));\n }\n\n public async getWorkflowInputSchemaById(\n workflowId: string,\n serviceUrl: string,\n ): Promise<WorkflowInfo | undefined> {\n return this.orchestratorService.fetchWorkflowInfoOnService({\n definitionId: workflowId,\n serviceUrl: serviceUrl,\n });\n }\n\n public async pingWorkflowService(\n workflowId: string,\n ): Promise<boolean | undefined> {\n const definition = await this.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n });\n if (!definition) {\n throw new Error(`Couldn't fetch workflow definition for ${workflowId}`);\n }\n if (!definition.serviceUrl) {\n throw new Error(`ServiceURL is not defined for workflow ${workflowId}`);\n }\n const isAvailableNow = await this.orchestratorService.pingWorkflowService({\n definitionId: workflowId,\n serviceUrl: definition.serviceUrl,\n });\n if (!isAvailableNow) {\n throw new Error(\n `Workflow service for workflow ${workflowId} at ${definition.serviceUrl}/management/processes/${workflowId} is not available at the moment.`,\n );\n }\n return isAvailableNow;\n }\n\n public extractQueryParam(\n req: ParsedRequest,\n key: string,\n ): string | undefined {\n return req.query[key] as string | undefined;\n }\n}\n"],"names":["mapToWorkflowOverviewDTO","mapToWorkflowDTO","mapToProcessInstanceDTO","load","retryAsyncFunction","mapToExecuteWorkflowResponseDTO","ProcessInstanceState","mapToWorkflowRunStatusDTO"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@red-hat-developer-hub/backstage-plugin-orchestrator-backend",
|
|
3
|
-
"version": "8.10.
|
|
3
|
+
"version": "8.10.2",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"main": "./dist/index.cjs.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -84,8 +84,8 @@
|
|
|
84
84
|
"@backstage/plugin-permission-node": "^0.11.0",
|
|
85
85
|
"@backstage/plugin-scaffolder-backend": "^4.0.0",
|
|
86
86
|
"@backstage/plugin-scaffolder-node": "^0.13.3",
|
|
87
|
-
"@red-hat-developer-hub/backstage-plugin-orchestrator-common": "^3.7.
|
|
88
|
-
"@red-hat-developer-hub/backstage-plugin-orchestrator-node": "^1.3.
|
|
87
|
+
"@red-hat-developer-hub/backstage-plugin-orchestrator-common": "^3.7.2",
|
|
88
|
+
"@red-hat-developer-hub/backstage-plugin-orchestrator-node": "^1.3.2",
|
|
89
89
|
"@urql/core": "^6.0.1",
|
|
90
90
|
"ajv-formats": "^2.1.1",
|
|
91
91
|
"cloudevents": "^10.0.0",
|