@red-hat-developer-hub/backstage-plugin-orchestrator-backend 8.8.2 → 8.9.0

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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # @red-hat-developer-hub/backstage-plugin-orchestrator-backend
2
2
 
3
+ ## 8.9.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 9ab62e3: feature: add the ability to trigger kafka based workflows from the plugin
8
+
3
9
  ## 8.8.2
4
10
 
5
11
  ### Patch Changes
package/config.d.ts ADDED
@@ -0,0 +1,68 @@
1
+ /*
2
+ * Copyright Red Hat, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ export interface Config {
18
+ /**
19
+ * Configuration for the Orchestrator plugin.
20
+ */
21
+ orchestrator?: {
22
+ kafka?: {
23
+ // A logical identifier of an application.
24
+ // https://kafka.js.org/docs/configuration#client-id
25
+ clientId: string;
26
+ // logLevel override for the orchestrator kafka services
27
+ // logLevel values based on KafkaJS values https://kafka.js.org/docs/configuration#logging
28
+ // export enum logLevel {
29
+ // NOTHING = 0,
30
+ // ERROR = 1,
31
+ // WARN = 2,
32
+ // INFO = 4,
33
+ // DEBUG = 5,
34
+ // }
35
+ logLevel?: 0 | 1 | 2 | 4 | 5;
36
+ /**
37
+ * List of brokers in the Kafka cluster to connect to.
38
+ */
39
+ brokers: string[];
40
+ /**
41
+ * https://kafka.js.org/docs/producing#message-key
42
+ */
43
+ messageKey?: string;
44
+ /**
45
+ * Optional SSL connection parameters to connect to the cluster. Passed directly to Node tls.connect.
46
+ * See https://nodejs.org/dist/latest-v8.x/docs/api/tls.html#tls_tls_createsecurecontext_options
47
+ */
48
+ ssl?:
49
+ | {
50
+ ca?: string[];
51
+ /** @visibility secret */
52
+ key?: string;
53
+ cert?: string;
54
+ rejectUnauthorized?: boolean;
55
+ }
56
+ | boolean;
57
+ /**
58
+ * Optional SASL connection parameters.
59
+ */
60
+ sasl?: {
61
+ mechanism: 'plain' | 'scram-sha-256' | 'scram-sha-512';
62
+ username: string;
63
+ /** @visibility secret */
64
+ password: string;
65
+ };
66
+ };
67
+ };
68
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"Helper.cjs.js","sources":["../../src/service/Helper.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\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 */\nimport type { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\n\nimport fs from 'fs-extra';\n\nimport os from 'os';\n\nexport async function retryAsyncFunction<T>(args: {\n asyncFn: () => Promise<T | undefined>;\n maxAttempts: number;\n delayMs: number;\n}): Promise<T> {\n let result: T | undefined;\n for (let i = 0; i < args.maxAttempts; i++) {\n result = await args.asyncFn();\n if (result !== undefined) {\n return result;\n }\n await new Promise(resolve => setTimeout(resolve, args.delayMs));\n }\n throw new Error('Exceeded maximum number of retries for async function');\n}\n\nexport async function getWorkingDirectory(\n config: Config,\n logger: LoggerService,\n): Promise<string> {\n if (!config.has('backend.workingDirectory')) {\n return os.tmpdir();\n }\n\n const workingDirectory = config.getString('backend.workingDirectory');\n try {\n // Check if working directory exists and is writable\n await fs.access(workingDirectory, fs.constants.F_OK | fs.constants.W_OK);\n logger.info(`using working directory: ${workingDirectory}`);\n } catch (err: any) {\n logger.error(\n `working directory ${workingDirectory} ${\n err.code === 'ENOENT' ? 'does not exist' : 'is not writable'\n }`,\n );\n throw err;\n }\n return workingDirectory;\n}\n\nexport async function executeWithRetry(\n action: () => Promise<Response>,\n maxErrors = 15,\n): Promise<Response> {\n let response: Response;\n let errorCount = 0;\n // execute with retry\n const backoff = 5000;\n while (errorCount < maxErrors) {\n try {\n response = await action();\n if (response.status >= 400) {\n errorCount++;\n // backoff\n await delay(backoff);\n } else {\n return response;\n }\n } catch (e) {\n errorCount++;\n await delay(backoff);\n }\n }\n throw new Error('Unable to execute query.');\n}\n\nexport function delay(time: number) {\n return new Promise(r => setTimeout(r, time));\n}\n"],"names":[],"mappings":";;;;;AAsBA,eAAsB,mBAAsB,IAAA,EAI7B;AACb,EAAA,IAAI,MAAA;AACJ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,aAAa,CAAA,EAAA,EAAK;AACzC,IAAA,MAAA,GAAS,MAAM,KAAK,OAAA,EAAQ;AAC5B,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,WAAW,OAAA,EAAS,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AACzE;AA0BA,eAAsB,gBAAA,CACpB,MAAA,EACA,SAAA,GAAY,EAAA,EACO;AACnB,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,MAAM,OAAA,GAAU,GAAA;AAChB,EAAA,OAAO,aAAa,SAAA,EAAW;AAC7B,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,MAAA,EAAO;AACxB,MAAA,IAAI,QAAA,CAAS,UAAU,GAAA,EAAK;AAC1B,QAAA,UAAA,EAAA;AAEA,QAAA,MAAM,MAAM,OAAO,CAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,UAAA,EAAA;AACA,MAAA,MAAM,MAAM,OAAO,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAC5C;AAEO,SAAS,MAAM,IAAA,EAAc;AAClC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAA,CAAA,KAAK,UAAA,CAAW,CAAA,EAAG,IAAI,CAAC,CAAA;AAC7C;;;;;;"}
1
+ {"version":3,"file":"Helper.cjs.js","sources":["../../src/service/Helper.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 type { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\n\nimport fs from 'fs-extra';\n\nimport os from 'os';\n\nexport async function retryAsyncFunction<T>(args: {\n asyncFn: () => Promise<T | undefined>;\n maxAttempts: number;\n delayMs: number;\n}): Promise<T> {\n let result: T | undefined;\n for (let i = 0; i < args.maxAttempts; i++) {\n result = await args.asyncFn();\n if (result !== undefined) {\n return result;\n }\n await new Promise(resolve => setTimeout(resolve, args.delayMs));\n }\n throw new Error('Exceeded maximum number of retries for async function');\n}\n\nexport async function getWorkingDirectory(\n config: Config,\n logger: LoggerService,\n): Promise<string> {\n if (!config.has('backend.workingDirectory')) {\n return os.tmpdir();\n }\n\n const workingDirectory = config.getString('backend.workingDirectory');\n try {\n // Check if working directory exists and is writable\n await fs.access(workingDirectory, fs.constants.F_OK | fs.constants.W_OK);\n logger.info(`using working directory: ${workingDirectory}`);\n } catch (err: any) {\n logger.error(\n `working directory ${workingDirectory} ${\n err.code === 'ENOENT' ? 'does not exist' : 'is not writable'\n }`,\n );\n throw err;\n }\n return workingDirectory;\n}\n\nexport async function executeWithRetry(\n action: () => Promise<Response>,\n maxErrors = 15,\n): Promise<Response> {\n let response: Response;\n let errorCount = 0;\n // execute with retry\n const backoff = 5000;\n while (errorCount < maxErrors) {\n try {\n response = await action();\n if (response.status >= 400) {\n errorCount++;\n // backoff\n await delay(backoff);\n } else {\n return response;\n }\n } catch (e) {\n errorCount++;\n await delay(backoff);\n }\n }\n throw new Error('Unable to execute query.');\n}\n\nexport function delay(time: number) {\n return new Promise(r => setTimeout(r, time));\n}\n"],"names":[],"mappings":";;;;;AAuBA,eAAsB,mBAAsB,IAAA,EAI7B;AACb,EAAA,IAAI,MAAA;AACJ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,aAAa,CAAA,EAAA,EAAK;AACzC,IAAA,MAAA,GAAS,MAAM,KAAK,OAAA,EAAQ;AAC5B,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,WAAW,OAAA,EAAS,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AACzE;AA0BA,eAAsB,gBAAA,CACpB,MAAA,EACA,SAAA,GAAY,EAAA,EACO;AACnB,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,MAAM,OAAA,GAAU,GAAA;AAChB,EAAA,OAAO,aAAa,SAAA,EAAW;AAC7B,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,MAAA,EAAO;AACxB,MAAA,IAAI,QAAA,CAAS,UAAU,GAAA,EAAK;AAC1B,QAAA,UAAA,EAAA;AAEA,QAAA,MAAM,MAAM,OAAO,CAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,UAAA,EAAA;AACA,MAAA,MAAM,MAAM,OAAO,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAC5C;AAEO,SAAS,MAAM,IAAA,EAAc;AAClC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAA,CAAA,KAAK,UAAA,CAAW,CAAA,EAAG,IAAI,CAAC,CAAA;AAC7C;;;;;;"}
@@ -71,6 +71,9 @@ class OrchestratorService {
71
71
  return updatedOverview;
72
72
  });
73
73
  }
74
+ async executeWorkflowAsCloudEvent(args) {
75
+ return await this.sonataFlowService.executeWorkflowAsCloudEvent(args);
76
+ }
74
77
  async executeWorkflow(args) {
75
78
  return await this.sonataFlowService.executeWorkflow(args);
76
79
  }
@@ -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 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 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,19 +1,36 @@
1
1
  'use strict';
2
2
 
3
+ var cloudevents = require('cloudevents');
4
+ var kafkajs = require('kafkajs');
3
5
  var capitalize = require('lodash/capitalize');
4
6
  var backstagePluginOrchestratorCommon = require('@red-hat-developer-hub/backstage-plugin-orchestrator-common');
7
+ var node_crypto = require('node:crypto');
5
8
 
6
9
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
7
10
 
8
11
  var capitalize__default = /*#__PURE__*/_interopDefaultCompat(capitalize);
9
12
 
10
13
  class SonataFlowService {
11
- constructor(dataIndexService, logger) {
14
+ constructor(dataIndexService, logger, kafkaServiceOptions) {
12
15
  this.dataIndexService = dataIndexService;
13
16
  this.logger = logger;
17
+ this.kafkaServiceOptions = kafkaServiceOptions;
18
+ if (this.kafkaServiceOptions) {
19
+ this.orchestratorKafkaMessageKey = this.kafkaServiceOptions.messageKey ?? "";
20
+ this.logger.debug(
21
+ `creating orchestrator kafka implementation with options: clientId: ${this.kafkaServiceOptions.clientId} and brokers: ${JSON.stringify(this.kafkaServiceOptions.brokers)}`
22
+ );
23
+ this.orchestratorKafkaImpl = new kafkajs.Kafka(this.kafkaServiceOptions);
24
+ }
14
25
  }
15
26
  dataIndexService;
16
27
  logger;
28
+ kafkaServiceOptions;
29
+ orchestratorKafkaImpl;
30
+ orchestratorKafkaMessageKey;
31
+ getOrchestratorKafkaImpl() {
32
+ return this.orchestratorKafkaImpl;
33
+ }
17
34
  async fetchWorkflowInfoOnService(args) {
18
35
  const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}`;
19
36
  let response;
@@ -60,6 +77,50 @@ class SonataFlowService {
60
77
  );
61
78
  return items.filter((item) => !!item);
62
79
  }
80
+ async executeWorkflowAsCloudEvent(args) {
81
+ if (!this.orchestratorKafkaImpl) {
82
+ this.logger.error("No Orchestrator kafka implementation added");
83
+ throw new Error("No Orchestrator kafka implementation added");
84
+ }
85
+ const contextAttributeId = node_crypto.randomUUID();
86
+ const triggeringCloudEvent = new cloudevents.CloudEvent({
87
+ datacontenttype: "application/json",
88
+ type: args.workflowEventType,
89
+ source: args.workflowSource,
90
+ [args.contextAttribute]: contextAttributeId,
91
+ data: {
92
+ ...args.inputData,
93
+ [args.contextAttribute]: contextAttributeId
94
+ // Need this to be able to correlate the workflow run somehow
95
+ }
96
+ });
97
+ const lockEventBinding = cloudevents.Kafka.binary(triggeringCloudEvent);
98
+ const messageEvent = {
99
+ key: this.orchestratorKafkaMessageKey,
100
+ value: JSON.stringify(cloudevents.Kafka.toEvent(lockEventBinding))
101
+ };
102
+ const kfk = this.orchestratorKafkaImpl;
103
+ const producer = kfk.producer();
104
+ try {
105
+ await producer.connect();
106
+ await producer.send({
107
+ topic: args.workflowEventType,
108
+ messages: [messageEvent]
109
+ });
110
+ } catch (error) {
111
+ this.logger.error(
112
+ `Error with Kafka client connection. Options: clientId: ${this.kafkaServiceOptions?.clientId} and broker: ${JSON.stringify(this.kafkaServiceOptions?.brokers)}`
113
+ );
114
+ throw new Error(
115
+ `Error with Kafka client with connection Options: clientId: ${this.kafkaServiceOptions?.clientId} and broker: ${JSON.stringify(this.kafkaServiceOptions?.brokers)}`
116
+ );
117
+ } finally {
118
+ await producer.disconnect();
119
+ }
120
+ return {
121
+ id: contextAttributeId
122
+ };
123
+ }
63
124
  async executeWorkflow(args) {
64
125
  const urlToFetch = `${args.serviceUrl}/${args.definitionId}`;
65
126
  const headers = {
@@ -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 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 { Pagination } from '../types/pagination';\nimport { DataIndexService } from './DataIndexService';\n\nexport class SonataFlowService {\n constructor(\n private readonly dataIndexService: DataIndexService,\n private readonly logger: LoggerService,\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 const items = await Promise.all(\n workflowInfos\n .filter(info => info.source)\n .map(info =>\n this.fetchWorkflowOverviewBySource(info.source!, targetEntity),\n ),\n );\n return items.filter((item): item is WorkflowOverview => !!item);\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 return await this.fetchWorkflowOverviewBySource(source);\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 };\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":["fromWorkflowSource","capitalize","extractWorkflowFormat"],"mappings":"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"}
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';\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 const items = await Promise.all(\n workflowInfos\n .filter(info => info.source)\n .map(info =>\n this.fetchWorkflowOverviewBySource(info.source!, targetEntity),\n ),\n );\n return items.filter((item): item is WorkflowOverview => !!item);\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\n const triggeringCloudEvent = new CloudEvent({\n datacontenttype: 'application/json',\n type: args.workflowEventType,\n source: args.workflowSource,\n [args.contextAttribute]: contextAttributeId,\n data: {\n ...args.inputData,\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 return await this.fetchWorkflowOverviewBySource(source);\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 };\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","randomUUID","CloudEvent","KafkaCE","capitalize","extractWorkflowFormat"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ var jsYaml = require('js-yaml');
3
4
  var backstagePluginOrchestratorCommon = require('@red-hat-developer-hub/backstage-plugin-orchestrator-common');
4
5
  var Helper = require('../Helper.cjs.js');
5
6
  var V2Mappings = require('./mapping/V2Mappings.cjs.js');
@@ -119,20 +120,96 @@ class V2 {
119
120
  if (!definition) {
120
121
  throw new Error(`Couldn't fetch workflow definition for ${workflowId}`);
121
122
  }
122
- if (!definition.serviceUrl) {
123
- throw new Error(`ServiceURL is not defined for workflow ${workflowId}`);
123
+ let executionResponse;
124
+ const isEventType = executeWorkflowRequestDTO.inputData?.isEvent || false;
125
+ if (isEventType) {
126
+ const parsedDefinitionSource = jsYaml.load(definition.source);
127
+ const start = parsedDefinitionSource.start;
128
+ const startState = parsedDefinitionSource.states.filter(
129
+ (val) => {
130
+ return val.name === start;
131
+ }
132
+ );
133
+ if (startState.length < 1) {
134
+ throw new Error(
135
+ `Error executing workflow with id ${workflowId}, No States that match the start state`
136
+ );
137
+ }
138
+ const eventName = startState?.[0].onEvents?.[0].eventRefs?.[0];
139
+ if (!eventName) {
140
+ throw new Error(
141
+ `Error executing workflow with id ${workflowId}, No event ref`
142
+ );
143
+ }
144
+ const workflowEventToUse = parsedDefinitionSource.events.filter(
145
+ (val) => {
146
+ return val.name === eventName;
147
+ }
148
+ );
149
+ if (workflowEventToUse.length < 1) {
150
+ throw new Error(
151
+ `Error executing workflow with id ${workflowId}, No Events that match the start state eventRef`
152
+ );
153
+ }
154
+ const correlationContextAttributeName = workflowEventToUse?.[0].correlation?.[0].contextAttributeName;
155
+ if (!correlationContextAttributeName) {
156
+ throw new Error(
157
+ `Error executing workflow with id ${workflowId}, No correlation context attribute name found in event with event name ${eventName}`
158
+ );
159
+ }
160
+ executionResponse = await this.orchestratorService.executeWorkflowAsCloudEvent({
161
+ definitionId: workflowId,
162
+ workflowSource: workflowEventToUse[0].source,
163
+ workflowEventType: eventName,
164
+ contextAttribute: correlationContextAttributeName,
165
+ inputData: {
166
+ workflowdata: executeWorkflowRequestDTO.inputData,
167
+ initiatorEntity,
168
+ targetEntity: executeWorkflowRequestDTO.targetEntity
169
+ },
170
+ authTokens: executeWorkflowRequestDTO.authTokens,
171
+ backstageToken
172
+ });
173
+ let currentInstanceToReturn = [];
174
+ for (let i = 0; i < FETCH_INSTANCE_MAX_ATTEMPTS; i++) {
175
+ const response = await this.orchestratorService.fetchInstances({
176
+ workflowIds: [workflowId]
177
+ });
178
+ currentInstanceToReturn = response.filter((val) => {
179
+ return val.variables.workflowdata[correlationContextAttributeName] === executionResponse?.id;
180
+ });
181
+ if (currentInstanceToReturn.length > 0) {
182
+ break;
183
+ }
184
+ await new Promise(
185
+ (resolve) => setTimeout(resolve, FETCH_INSTANCE_RETRY_DELAY_MS)
186
+ );
187
+ }
188
+ let currentInstanceIDToReturn;
189
+ if (currentInstanceToReturn.length < 1) {
190
+ currentInstanceIDToReturn = "kafkaEvent";
191
+ } else {
192
+ currentInstanceIDToReturn = currentInstanceToReturn[0]?.id;
193
+ }
194
+ return {
195
+ id: currentInstanceIDToReturn
196
+ };
197
+ } else {
198
+ if (!definition.serviceUrl) {
199
+ throw new Error(`ServiceURL is not defined for workflow ${workflowId}`);
200
+ }
201
+ executionResponse = await this.orchestratorService.executeWorkflow({
202
+ definitionId: workflowId,
203
+ inputData: {
204
+ workflowdata: executeWorkflowRequestDTO.inputData,
205
+ initiatorEntity,
206
+ targetEntity: executeWorkflowRequestDTO.targetEntity
207
+ },
208
+ authTokens: executeWorkflowRequestDTO.authTokens,
209
+ serviceUrl: definition.serviceUrl,
210
+ backstageToken
211
+ });
124
212
  }
125
- const executionResponse = await this.orchestratorService.executeWorkflow({
126
- definitionId: workflowId,
127
- inputData: {
128
- workflowdata: executeWorkflowRequestDTO.inputData,
129
- initiatorEntity,
130
- targetEntity: executeWorkflowRequestDTO.targetEntity
131
- },
132
- authTokens: executeWorkflowRequestDTO.authTokens,
133
- serviceUrl: definition.serviceUrl,
134
- backstageToken
135
- });
136
213
  if (!executionResponse) {
137
214
  throw new Error(`Couldn't execute workflow ${workflowId}`);
138
215
  }
@@ -1 +1 @@
1
- {"version":3,"file":"v2.cjs.js","sources":["../../../src/service/api/v2.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 { 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 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 if (!definition.serviceUrl) {\n throw new Error(`ServiceURL is not defined for workflow ${workflowId}`);\n }\n const 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 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","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 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 const start = 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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"}
@@ -148,8 +148,13 @@ async function createBackendRouter(options) {
148
148
  }
149
149
  function initPublicServices(logger, config, scheduler, workflowLogsProvidersRegistry) {
150
150
  const dataIndexUrl = config.getString("orchestrator.dataIndexService.url");
151
+ const orchestratorKafka = config.getOptional("orchestrator.kafka");
151
152
  const dataIndexService = new DataIndexService.DataIndexService(dataIndexUrl, logger);
152
- const sonataFlowService = new SonataFlowService.SonataFlowService(dataIndexService, logger);
153
+ const sonataFlowService = new SonataFlowService.SonataFlowService(
154
+ dataIndexService,
155
+ logger,
156
+ orchestratorKafka
157
+ );
153
158
  const workflowCacheService = new WorkflowCacheService.WorkflowCacheService(
154
159
  logger,
155
160
  dataIndexService,
@@ -1 +1 @@
1
- {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.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 { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport {\n AuditorService,\n AuditorServiceEvent,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n SchedulerService,\n UserInfoService,\n} from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport { NotAllowedError } from '@backstage/errors';\nimport {\n AuthorizePermissionRequest,\n AuthorizePermissionResponse,\n AuthorizeResult,\n BasicPermission,\n} from '@backstage/plugin-permission-common';\nimport { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';\nimport type { JsonObject } from '@backstage/types';\n\nimport { UnauthorizedError } from '@backstage-community/plugin-rbac-common';\nimport { fullFormats } from 'ajv-formats/dist/formats';\nimport express, { Router } from 'express';\nimport { Request as HttpRequest } from 'express-serve-static-core';\nimport { OpenAPIBackend, Request } from 'openapi-backend';\n\nimport {\n FieldFilter,\n Filter,\n NestedFilter,\n openApiDocument,\n orchestratorInstanceAdminViewPermission,\n orchestratorPermissions,\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission,\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission,\n WorkflowOverviewListResultDTO,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { WorkflowLogsProvidersRegistry } from '../providers/WorkflowLogsProvidersRegistry';\nimport { RouterOptions } from '../routerWrapper';\nimport { buildPagination } from '../types/pagination';\nimport { V2 } from './api/v2';\nimport { DataIndexService } from './DataIndexService';\nimport { DataInputSchemaService } from './DataInputSchemaService';\nimport { OrchestratorService } from './OrchestratorService';\nimport { SonataFlowService } from './SonataFlowService';\nimport { WorkflowCacheService } from './WorkflowCacheService';\n\ninterface PublicServices {\n dataInputSchemaService: DataInputSchemaService;\n orchestratorService: OrchestratorService;\n}\n\ninterface RouterApi {\n openApiBackend: OpenAPIBackend;\n v2: V2;\n}\n\nconst authorize = async (\n request: HttpRequest,\n anyOfPermissions: BasicPermission[],\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n): Promise<AuthorizePermissionResponse> => {\n const credentials = await httpAuth.credentials(request);\n const decisionResponses: AuthorizePermissionResponse[][] = await Promise.all(\n anyOfPermissions.map(permission =>\n permissionsSvc.authorize([{ permission }], {\n credentials,\n }),\n ),\n );\n const decisions: AuthorizePermissionResponse[] = decisionResponses.map(\n d => d[0],\n );\n\n const allow = decisions.find(d => d.result === AuthorizeResult.ALLOW);\n return (\n allow || {\n result: AuthorizeResult.DENY,\n }\n );\n};\n\nconst isUserAuthorizedForInstanceAdminViewPermission = async (\n request: HttpRequest,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n): Promise<boolean> => {\n const credentials = await httpAuth.credentials(request);\n const [decision] = await permissionsSvc.authorize(\n [{ permission: orchestratorInstanceAdminViewPermission }],\n { credentials },\n );\n\n return decision.result === AuthorizeResult.ALLOW;\n};\n\nconst filterAuthorizedWorkflowIds = async (\n request: HttpRequest,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n workflowIds: string[],\n): Promise<string[]> => {\n const credentials = await httpAuth.credentials(request);\n const genericWorkflowPermissionDecision = await permissionsSvc.authorize(\n [{ permission: orchestratorWorkflowPermission }],\n {\n credentials,\n },\n );\n\n if (genericWorkflowPermissionDecision[0].result === AuthorizeResult.ALLOW) {\n // The user can see all workflows\n return workflowIds;\n }\n\n const specificWorkflowRequests: AuthorizePermissionRequest[] =\n workflowIds.map(workflowId => ({\n permission: orchestratorWorkflowSpecificPermission(workflowId),\n }));\n\n const decisions = await permissionsSvc.authorize(specificWorkflowRequests, {\n credentials,\n });\n\n return workflowIds.filter(\n (_, idx) => decisions[idx].result === AuthorizeResult.ALLOW,\n );\n};\n\nconst filterAuthorizedWorkflows = async (\n request: HttpRequest,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n workflows: WorkflowOverviewListResultDTO,\n): Promise<WorkflowOverviewListResultDTO> => {\n if (!workflows.overviews) {\n return workflows;\n }\n\n const authorizedWorkflowIds = await filterAuthorizedWorkflowIds(\n request,\n permissionsSvc,\n httpAuth,\n workflows.overviews.map(w => w.workflowId),\n );\n\n const filtered = {\n ...workflows,\n overviews: workflows.overviews.filter(w =>\n authorizedWorkflowIds.includes(w.workflowId),\n ),\n };\n\n return filtered;\n};\n\nexport async function createBackendRouter(\n options: RouterOptions,\n): Promise<Router> {\n const {\n config,\n logger,\n auditor,\n scheduler,\n permissions,\n httpAuth,\n userInfo,\n workflowLogsProvidersRegistry,\n } = options;\n const publicServices = initPublicServices(\n logger,\n config,\n scheduler,\n workflowLogsProvidersRegistry,\n );\n\n const routerApi = await initRouterApi(publicServices.orchestratorService);\n\n const router = Router();\n const permissionsIntegrationRouter = createPermissionIntegrationRouter({\n permissions: orchestratorPermissions,\n });\n router.use(express.json());\n router.use(permissionsIntegrationRouter);\n router.use('/workflows', express.text());\n router.get('/health', (_, response) => {\n logger.info('PONG!');\n response.json({ status: 'ok' });\n });\n\n setupInternalRoutes(\n publicServices,\n routerApi,\n permissions,\n httpAuth,\n auditor,\n userInfo,\n );\n\n router.use((req, res, next) => {\n if (!next) {\n throw new Error('next is undefined');\n }\n\n return routerApi.openApiBackend\n .handleRequest(req as Request, req, res, next)\n .catch(error => {\n auditor\n .createEvent({\n eventId: 'generic-error-handler',\n request: req,\n // Keep at high since this is a fallback - any error should be caught in handlers\n severityLevel: 'high',\n meta: {},\n })\n .then(event => {\n event.fail({\n meta: {},\n error,\n });\n });\n\n next(error);\n });\n });\n\n const middleware = MiddlewareFactory.create({ logger, config });\n\n router.use(middleware.error({ logAllErrors: true })); // log also openapi errors\n\n return router;\n}\n\nfunction initPublicServices(\n logger: LoggerService,\n config: Config,\n scheduler: SchedulerService,\n workflowLogsProvidersRegistry: WorkflowLogsProvidersRegistry,\n): PublicServices {\n const dataIndexUrl = config.getString('orchestrator.dataIndexService.url');\n const dataIndexService = new DataIndexService(dataIndexUrl, logger);\n const sonataFlowService = new SonataFlowService(dataIndexService, logger);\n\n const workflowCacheService = new WorkflowCacheService(\n logger,\n dataIndexService,\n sonataFlowService,\n );\n workflowCacheService.schedule({ scheduler: scheduler });\n\n const isWorkflowLogProviderAdded = config.getOptional(\n 'orchestrator.workflowLogProvider',\n );\n let workflowLogProvider;\n if (isWorkflowLogProviderAdded) {\n workflowLogProvider = workflowLogsProvidersRegistry.getProvider('loki');\n }\n\n const orchestratorService = new OrchestratorService(\n sonataFlowService,\n dataIndexService,\n workflowCacheService,\n workflowLogProvider,\n );\n\n const dataInputSchemaService = new DataInputSchemaService();\n\n return {\n orchestratorService,\n dataInputSchemaService,\n };\n}\n\nasync function initRouterApi(\n orchestratorService: OrchestratorService,\n): Promise<RouterApi> {\n const openApiBackend = new OpenAPIBackend({\n definition: openApiDocument,\n strict: false,\n ajvOpts: {\n strict: false,\n strictSchema: false,\n verbose: true,\n addUsedSchema: false,\n formats: fullFormats, // open issue: https://github.com/openapistack/openapi-backend/issues/280\n },\n handlers: {\n validationFail: async (\n c,\n _req: express.Request,\n res: express.Response,\n ) => {\n console.log('OPENAPI validationFail', c.operation);\n res.status(400).json({ err: c.validation.errors });\n },\n notFound: async (_c, req: express.Request, res: express.Response) => {\n res.status(404).json({ err: `${req.path} path not found` });\n },\n notImplemented: async (_c, req: express.Request, res: express.Response) =>\n res.status(500).json({ err: `${req.path} not implemented` }),\n },\n });\n await openApiBackend.init();\n const v2 = new V2(orchestratorService);\n return { v2, openApiBackend };\n}\n\n// ======================================================\n// Internal Backstage API calls to delegate to SonataFlow\n// ======================================================\nfunction setupInternalRoutes(\n services: PublicServices,\n routerApi: RouterApi,\n permissions: PermissionsService,\n httpAuth: HttpAuthService,\n auditor: AuditorService,\n userInfo: UserInfoService,\n) {\n function manageDenyAuthorization(auditEvent: AuditorServiceEvent) {\n const error = new UnauthorizedError();\n auditEvent.fail({\n meta: {\n message: 'Not authorized to request the endpoint',\n },\n error: new UnauthorizedError(),\n });\n\n throw error;\n }\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowsOverviewForEntity',\n async (_c, req, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-overview-entity',\n request: req,\n });\n const targetEntity = req.body.targetEntity as string;\n const annotationWorkflowIds = req.body.annotationWorkflowIds as string[];\n try {\n const result = await routerApi.v2.getWorkflowsOverviewForEntity(\n targetEntity,\n annotationWorkflowIds,\n );\n\n const workflows = await filterAuthorizedWorkflows(\n req,\n permissions,\n httpAuth,\n result,\n );\n auditEvent.success({\n meta: {\n workflowsCount: workflows.overviews?.length,\n },\n });\n res.json(workflows);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowsOverview',\n async (_c, req, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-overview',\n request: req,\n });\n\n try {\n const result = await routerApi.v2.getWorkflowsOverview(\n buildPagination(req),\n getRequestFilters(req),\n );\n\n const workflows = await filterAuthorizedWorkflows(\n req,\n permissions,\n httpAuth,\n result,\n );\n auditEvent.success({\n meta: {\n workflowsCount: workflows.overviews?.length,\n },\n });\n res.json(workflows);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowSourceById',\n async (c, req, res, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-source',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n },\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n try {\n const result = await routerApi.v2.getWorkflowSourceById(workflowId);\n auditEvent.success();\n res.status(200).contentType('text/plain').send(result);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'executeWorkflow',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const credentials = await httpAuth.credentials(req);\n const token = req.headers.authorization?.split(' ')[1];\n const initiatorEntity = await (\n await userInfo.getUserInfo(credentials)\n ).userEntityRef;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'execute-workflow',\n request: req,\n meta: {\n workflowId,\n },\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const executeWorkflowRequestDTO = req.body;\n\n return routerApi.v2\n .executeWorkflow(\n executeWorkflowRequestDTO,\n workflowId,\n initiatorEntity,\n token,\n )\n .then(result => {\n auditEvent.success({ meta: { id: result.id } });\n return res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'retriggerInstance',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const instanceId = c.request.params.instanceId as string;\n const token = req.headers.authorization?.split(' ')[1];\n const retriggerInstanceRequestDTO = req.body;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'retrigger-instance',\n request: req,\n meta: {\n workflowId,\n instanceId,\n },\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n await routerApi.v2\n .retriggerInstance(\n workflowId,\n instanceId,\n retriggerInstanceRequestDTO,\n token,\n )\n .then(result => {\n auditEvent.success();\n return res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowOverviewById',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-overview',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n },\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n return routerApi.v2\n .getWorkflowOverviewById(workflowId)\n .then(result => {\n auditEvent.success({\n meta: {\n workflowId: result.workflowId,\n },\n });\n return res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowStatuses',\n async (_c, request: express.Request, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-statuses',\n request,\n });\n\n // Anyone is authorized to call this endpoint\n\n return routerApi.v2\n .getWorkflowStatuses()\n .then(result => {\n auditEvent.success();\n res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowInputSchemaById',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const instanceId = c.request.query.instanceId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-input-schema',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n instanceId,\n },\n });\n\n try {\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const workflowDefinition =\n await services.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n });\n\n if (!workflowDefinition) {\n throw new Error(\n `Failed to fetch workflow info for workflow ${workflowId}`,\n );\n }\n const serviceUrl = workflowDefinition.serviceUrl;\n if (!serviceUrl) {\n throw new Error(\n `Service URL is not defined for workflow ${workflowId}`,\n );\n }\n\n const definition =\n await services.orchestratorService.fetchWorkflowDefinition({\n definitionId: workflowId,\n });\n\n if (!definition) {\n throw new Error(\n 'Failed to fetch workflow definition for workflow ${workflowId}',\n );\n }\n\n if (!definition.dataInputSchema) {\n res.status(200).json({});\n return;\n }\n\n const instanceVariables = instanceId\n ? await services.orchestratorService.fetchInstanceVariables({\n instanceId,\n })\n : undefined;\n\n const workflowData = instanceVariables\n ? services.dataInputSchemaService.extractWorkflowData(\n instanceVariables,\n )\n : undefined;\n\n const workflowInfo = await routerApi.v2.getWorkflowInputSchemaById(\n workflowId,\n serviceUrl,\n );\n\n if (!workflowInfo?.inputSchema?.properties) {\n auditEvent.success({\n meta: {\n message: 'Successfully found nothing.',\n },\n });\n res.status(200).json({});\n return;\n }\n\n const inputSchemaProps = workflowInfo.inputSchema.properties;\n let inputData;\n\n if (workflowData) {\n inputData = Object.keys(inputSchemaProps)\n .filter(k => k in workflowData)\n .reduce((result, k) => {\n if (workflowData[k] === undefined) {\n return result;\n }\n result[k] = workflowData[k];\n return result;\n }, {} as JsonObject);\n }\n\n auditEvent.success({\n meta: {\n workflowId: workflowInfo.id,\n },\n });\n res.status(200).json({\n inputSchema: workflowInfo.inputSchema,\n data: inputData,\n });\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowInstances',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-instances',\n request: req,\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n return routerApi.v2\n .getInstances(buildPagination(req), getRequestFilters(req), [\n workflowId,\n ])\n .then(result => {\n auditEvent.success();\n res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'pingWorkflowServiceById',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'ping-workflow-service',\n request: req,\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n return routerApi.v2\n .pingWorkflowService(workflowId)\n .then(result => {\n auditEvent.success();\n res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getInstances',\n async (_c, req: express.Request, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-instances',\n request: req,\n });\n\n try {\n // Once we assign user to the instance in the future, we can rework this filtering\n const allWorkflowIds = routerApi.v2.getWorkflowIds();\n const authorizedWorkflowIds: string[] =\n await filterAuthorizedWorkflowIds(\n req,\n permissions,\n httpAuth,\n allWorkflowIds,\n );\n\n if (!authorizedWorkflowIds || authorizedWorkflowIds.length === 0)\n res.json([]);\n\n const credentials = await httpAuth.credentials(req);\n const initiatorEntity = (await userInfo.getUserInfo(credentials))\n .userEntityRef;\n const isUserAuthorizedForInstanceAdminView: boolean = // This permission will let user see ALL instances (including ones others created)\n await isUserAuthorizedForInstanceAdminViewPermission(\n req,\n permissions,\n httpAuth,\n );\n\n const requestFilters = getRequestFilters(req);\n\n let filters = requestFilters;\n\n if (!isUserAuthorizedForInstanceAdminView) {\n const initiatorEntityFilter: FieldFilter = {\n operator: 'EQ',\n value: initiatorEntity,\n field: 'initiatorEntity',\n };\n\n const nestedVariablesFilter: NestedFilter = {\n field: 'variables',\n nested: initiatorEntityFilter,\n };\n\n if (requestFilters === undefined) {\n filters = nestedVariablesFilter;\n } else {\n // combine filters\n filters = {\n operator: 'AND',\n filters: [nestedVariablesFilter, requestFilters],\n };\n }\n }\n\n const result = await routerApi.v2.getInstances(\n buildPagination(req),\n filters,\n authorizedWorkflowIds,\n );\n\n auditEvent.success({ meta: { authorizedWorkflowIds } });\n res.json(result);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getInstanceById',\n async (c, request: express.Request, res: express.Response, next) => {\n const instanceId = c.request.params.instanceId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-instance',\n request,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\n });\n\n try {\n const instance = await routerApi.v2.getInstanceById(instanceId);\n\n const workflowId = instance.processId;\n\n const decision = await authorize(\n request,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const credentials = await httpAuth.credentials(request);\n const initiatorEntity = (await userInfo.getUserInfo(credentials))\n .userEntityRef;\n // Check if user is authorized to view all instances\n const isUserAuthorizedForInstanceAdminView =\n await isUserAuthorizedForInstanceAdminViewPermission(\n request,\n permissions,\n httpAuth,\n );\n\n // If not an admin, enforce initiatorEntity check\n if (!isUserAuthorizedForInstanceAdminView) {\n const instanceInitiatorEntity = instance.initiatorEntity;\n\n // If the instance has no initiatorEntity recorded, we cannot determine ownership.\n // This can happen for:\n // 1. Workflow instances created before the initiatorEntity feature was added\n // 2. Workflow instances started externally (not through Backstage)\n // 3. Workflows that transform/overwrite their input variables\n if (!instanceInitiatorEntity) {\n throw new NotAllowedError(\n `Access denied for instance ${instanceId}. ` +\n `You have permission to view workflow '${workflowId}', but this workflow run ` +\n `does not have ownership information recorded. Since we cannot verify you ` +\n `initiated this run, the 'orchestrator.instanceAdminView' permission is required. ` +\n `Contact your administrator to grant this permission.`,\n );\n }\n\n if (instanceInitiatorEntity !== initiatorEntity) {\n throw new NotAllowedError(\n `Access denied for instance ${instanceId}. ` +\n `This workflow run was initiated by '${instanceInitiatorEntity}', not by you ('${initiatorEntity}'). ` +\n `With 'orchestrator.workflow' or 'orchestrator.workflow.${workflowId}' permissions, ` +\n `you can only view instances you created. To view all instances, you need the ` +\n `'orchestrator.instanceAdminView' permission.`,\n );\n }\n }\n\n auditEvent.success();\n res.status(200).json(instance);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowLogById',\n async (c, request: express.Request, res: express.Response, next) => {\n const instanceId = c.request.params.instanceId as string;\n // will probably have to get the raw log at some point\n // const rawLog = c.request.query.instanceId as Boolean;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-logs-by-instance',\n request,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\n });\n\n try {\n // Check that a log provider has been setup\n if (!services.orchestratorService.hasLogProvider()) {\n throw new Error(`No log provider setup`);\n }\n const instance = await routerApi.v2.getInstanceById(instanceId);\n const workflowId = instance.processId;\n\n const decision = await authorize(\n request,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const credentials = await httpAuth.credentials(request);\n const initiatorEntity = (await userInfo.getUserInfo(credentials))\n .userEntityRef;\n // Check if user is authorized to view all instances\n const isUserAuthorizedForInstanceAdminView =\n await isUserAuthorizedForInstanceAdminViewPermission(\n request,\n permissions,\n httpAuth,\n );\n\n // If not an admin, enforce initiatorEntity check\n if (!isUserAuthorizedForInstanceAdminView) {\n const instanceInitiatorEntity = instance.initiatorEntity;\n if (instanceInitiatorEntity !== initiatorEntity) {\n throw new Error(\n `Unauthorized to access instance ${instanceId} not initiated by user.`,\n );\n }\n }\n\n const logs = await routerApi.v2.getInstanceLogsByInstance(instance);\n\n auditEvent.success();\n res.status(200).json(logs);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'abortWorkflow',\n async (c, request, res, next) => {\n const instanceId = c.request.params.instanceId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'abort-workflow',\n request,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\n });\n\n try {\n const instance = await routerApi.v2.getInstanceById(instanceId);\n const workflowId = instance.processId;\n\n const decision = await authorize(\n request,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const result = await routerApi.v2.abortWorkflow(workflowId, instanceId);\n auditEvent.success({ meta: { result } });\n res.status(200).json(result);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n}\n\nfunction getRequestFilters(req: HttpRequest): Filter | undefined {\n return req.body.filters ? (req.body.filters as Filter) : undefined;\n}\n"],"names":["AuthorizeResult","orchestratorInstanceAdminViewPermission","orchestratorWorkflowPermission","orchestratorWorkflowSpecificPermission","Router","createPermissionIntegrationRouter","orchestratorPermissions","express","MiddlewareFactory","DataIndexService","SonataFlowService","WorkflowCacheService","OrchestratorService","DataInputSchemaService","OpenAPIBackend","openApiDocument","fullFormats","v2","V2","UnauthorizedError","buildPagination","orchestratorWorkflowUsePermission","orchestratorWorkflowUseSpecificPermission","NotAllowedError"],"mappings":"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"}
1
+ {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.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 { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport {\n AuditorService,\n AuditorServiceEvent,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n SchedulerService,\n UserInfoService,\n} from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport { NotAllowedError } from '@backstage/errors';\nimport {\n AuthorizePermissionRequest,\n AuthorizePermissionResponse,\n AuthorizeResult,\n BasicPermission,\n} from '@backstage/plugin-permission-common';\nimport { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';\nimport type { JsonObject } from '@backstage/types';\n\nimport { UnauthorizedError } from '@backstage-community/plugin-rbac-common';\nimport { fullFormats } from 'ajv-formats/dist/formats';\nimport express, { Router } from 'express';\nimport { Request as HttpRequest } from 'express-serve-static-core';\nimport { OpenAPIBackend, Request } from 'openapi-backend';\n\nimport {\n FieldFilter,\n Filter,\n NestedFilter,\n openApiDocument,\n orchestratorInstanceAdminViewPermission,\n orchestratorPermissions,\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission,\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission,\n WorkflowOverviewListResultDTO,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { WorkflowLogsProvidersRegistry } from '../providers/WorkflowLogsProvidersRegistry';\nimport { RouterOptions } from '../routerWrapper';\nimport { OrchestratorKafkaServiceOptions } from '../types/kafka';\nimport { buildPagination } from '../types/pagination';\nimport { V2 } from './api/v2';\nimport { DataIndexService } from './DataIndexService';\nimport { DataInputSchemaService } from './DataInputSchemaService';\nimport { OrchestratorService } from './OrchestratorService';\nimport { SonataFlowService } from './SonataFlowService';\nimport { WorkflowCacheService } from './WorkflowCacheService';\n\ninterface PublicServices {\n dataInputSchemaService: DataInputSchemaService;\n orchestratorService: OrchestratorService;\n}\n\ninterface RouterApi {\n openApiBackend: OpenAPIBackend;\n v2: V2;\n}\n\nconst authorize = async (\n request: HttpRequest,\n anyOfPermissions: BasicPermission[],\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n): Promise<AuthorizePermissionResponse> => {\n const credentials = await httpAuth.credentials(request);\n const decisionResponses: AuthorizePermissionResponse[][] = await Promise.all(\n anyOfPermissions.map(permission =>\n permissionsSvc.authorize([{ permission }], {\n credentials,\n }),\n ),\n );\n const decisions: AuthorizePermissionResponse[] = decisionResponses.map(\n d => d[0],\n );\n\n const allow = decisions.find(d => d.result === AuthorizeResult.ALLOW);\n return (\n allow || {\n result: AuthorizeResult.DENY,\n }\n );\n};\n\nconst isUserAuthorizedForInstanceAdminViewPermission = async (\n request: HttpRequest,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n): Promise<boolean> => {\n const credentials = await httpAuth.credentials(request);\n const [decision] = await permissionsSvc.authorize(\n [{ permission: orchestratorInstanceAdminViewPermission }],\n { credentials },\n );\n\n return decision.result === AuthorizeResult.ALLOW;\n};\n\nconst filterAuthorizedWorkflowIds = async (\n request: HttpRequest,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n workflowIds: string[],\n): Promise<string[]> => {\n const credentials = await httpAuth.credentials(request);\n const genericWorkflowPermissionDecision = await permissionsSvc.authorize(\n [{ permission: orchestratorWorkflowPermission }],\n {\n credentials,\n },\n );\n\n if (genericWorkflowPermissionDecision[0].result === AuthorizeResult.ALLOW) {\n // The user can see all workflows\n return workflowIds;\n }\n\n const specificWorkflowRequests: AuthorizePermissionRequest[] =\n workflowIds.map(workflowId => ({\n permission: orchestratorWorkflowSpecificPermission(workflowId),\n }));\n\n const decisions = await permissionsSvc.authorize(specificWorkflowRequests, {\n credentials,\n });\n\n return workflowIds.filter(\n (_, idx) => decisions[idx].result === AuthorizeResult.ALLOW,\n );\n};\n\nconst filterAuthorizedWorkflows = async (\n request: HttpRequest,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n workflows: WorkflowOverviewListResultDTO,\n): Promise<WorkflowOverviewListResultDTO> => {\n if (!workflows.overviews) {\n return workflows;\n }\n\n const authorizedWorkflowIds = await filterAuthorizedWorkflowIds(\n request,\n permissionsSvc,\n httpAuth,\n workflows.overviews.map(w => w.workflowId),\n );\n\n const filtered = {\n ...workflows,\n overviews: workflows.overviews.filter(w =>\n authorizedWorkflowIds.includes(w.workflowId),\n ),\n };\n\n return filtered;\n};\n\nexport async function createBackendRouter(\n options: RouterOptions,\n): Promise<Router> {\n const {\n config,\n logger,\n auditor,\n scheduler,\n permissions,\n httpAuth,\n userInfo,\n workflowLogsProvidersRegistry,\n } = options;\n const publicServices = initPublicServices(\n logger,\n config,\n scheduler,\n workflowLogsProvidersRegistry,\n );\n\n const routerApi = await initRouterApi(publicServices.orchestratorService);\n\n const router = Router();\n const permissionsIntegrationRouter = createPermissionIntegrationRouter({\n permissions: orchestratorPermissions,\n });\n router.use(express.json());\n router.use(permissionsIntegrationRouter);\n router.use('/workflows', express.text());\n router.get('/health', (_, response) => {\n logger.info('PONG!');\n response.json({ status: 'ok' });\n });\n\n setupInternalRoutes(\n publicServices,\n routerApi,\n permissions,\n httpAuth,\n auditor,\n userInfo,\n );\n\n router.use((req, res, next) => {\n if (!next) {\n throw new Error('next is undefined');\n }\n\n return routerApi.openApiBackend\n .handleRequest(req as Request, req, res, next)\n .catch(error => {\n auditor\n .createEvent({\n eventId: 'generic-error-handler',\n request: req,\n // Keep at high since this is a fallback - any error should be caught in handlers\n severityLevel: 'high',\n meta: {},\n })\n .then(event => {\n event.fail({\n meta: {},\n error,\n });\n });\n\n next(error);\n });\n });\n\n const middleware = MiddlewareFactory.create({ logger, config });\n\n router.use(middleware.error({ logAllErrors: true })); // log also openapi errors\n\n return router;\n}\n\nfunction initPublicServices(\n logger: LoggerService,\n config: Config,\n scheduler: SchedulerService,\n workflowLogsProvidersRegistry: WorkflowLogsProvidersRegistry,\n): PublicServices {\n const dataIndexUrl = config.getString('orchestrator.dataIndexService.url');\n const orchestratorKafka: OrchestratorKafkaServiceOptions | undefined =\n config.getOptional('orchestrator.kafka');\n const dataIndexService = new DataIndexService(dataIndexUrl, logger);\n const sonataFlowService = new SonataFlowService(\n dataIndexService,\n logger,\n orchestratorKafka,\n );\n\n const workflowCacheService = new WorkflowCacheService(\n logger,\n dataIndexService,\n sonataFlowService,\n );\n workflowCacheService.schedule({ scheduler: scheduler });\n\n const isWorkflowLogProviderAdded = config.getOptional(\n 'orchestrator.workflowLogProvider',\n );\n let workflowLogProvider;\n if (isWorkflowLogProviderAdded) {\n workflowLogProvider = workflowLogsProvidersRegistry.getProvider('loki');\n }\n\n const orchestratorService = new OrchestratorService(\n sonataFlowService,\n dataIndexService,\n workflowCacheService,\n workflowLogProvider,\n );\n\n const dataInputSchemaService = new DataInputSchemaService();\n\n return {\n orchestratorService,\n dataInputSchemaService,\n };\n}\n\nasync function initRouterApi(\n orchestratorService: OrchestratorService,\n): Promise<RouterApi> {\n const openApiBackend = new OpenAPIBackend({\n definition: openApiDocument,\n strict: false,\n ajvOpts: {\n strict: false,\n strictSchema: false,\n verbose: true,\n addUsedSchema: false,\n formats: fullFormats, // open issue: https://github.com/openapistack/openapi-backend/issues/280\n },\n handlers: {\n validationFail: async (\n c,\n _req: express.Request,\n res: express.Response,\n ) => {\n console.log('OPENAPI validationFail', c.operation);\n res.status(400).json({ err: c.validation.errors });\n },\n notFound: async (_c, req: express.Request, res: express.Response) => {\n res.status(404).json({ err: `${req.path} path not found` });\n },\n notImplemented: async (_c, req: express.Request, res: express.Response) =>\n res.status(500).json({ err: `${req.path} not implemented` }),\n },\n });\n await openApiBackend.init();\n const v2 = new V2(orchestratorService);\n return { v2, openApiBackend };\n}\n\n// ======================================================\n// Internal Backstage API calls to delegate to SonataFlow\n// ======================================================\nfunction setupInternalRoutes(\n services: PublicServices,\n routerApi: RouterApi,\n permissions: PermissionsService,\n httpAuth: HttpAuthService,\n auditor: AuditorService,\n userInfo: UserInfoService,\n) {\n function manageDenyAuthorization(auditEvent: AuditorServiceEvent) {\n const error = new UnauthorizedError();\n auditEvent.fail({\n meta: {\n message: 'Not authorized to request the endpoint',\n },\n error: new UnauthorizedError(),\n });\n\n throw error;\n }\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowsOverviewForEntity',\n async (_c, req, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-overview-entity',\n request: req,\n });\n const targetEntity = req.body.targetEntity as string;\n const annotationWorkflowIds = req.body.annotationWorkflowIds as string[];\n try {\n const result = await routerApi.v2.getWorkflowsOverviewForEntity(\n targetEntity,\n annotationWorkflowIds,\n );\n\n const workflows = await filterAuthorizedWorkflows(\n req,\n permissions,\n httpAuth,\n result,\n );\n auditEvent.success({\n meta: {\n workflowsCount: workflows.overviews?.length,\n },\n });\n res.json(workflows);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowsOverview',\n async (_c, req, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-overview',\n request: req,\n });\n\n try {\n const result = await routerApi.v2.getWorkflowsOverview(\n buildPagination(req),\n getRequestFilters(req),\n );\n\n const workflows = await filterAuthorizedWorkflows(\n req,\n permissions,\n httpAuth,\n result,\n );\n auditEvent.success({\n meta: {\n workflowsCount: workflows.overviews?.length,\n },\n });\n res.json(workflows);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowSourceById',\n async (c, req, res, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-source',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n },\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n try {\n const result = await routerApi.v2.getWorkflowSourceById(workflowId);\n auditEvent.success();\n res.status(200).contentType('text/plain').send(result);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'executeWorkflow',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const credentials = await httpAuth.credentials(req);\n const token = req.headers.authorization?.split(' ')[1];\n const initiatorEntity = await (\n await userInfo.getUserInfo(credentials)\n ).userEntityRef;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'execute-workflow',\n request: req,\n meta: {\n workflowId,\n },\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const executeWorkflowRequestDTO = req.body;\n\n return routerApi.v2\n .executeWorkflow(\n executeWorkflowRequestDTO,\n workflowId,\n initiatorEntity,\n token,\n )\n .then(result => {\n auditEvent.success({ meta: { id: result.id } });\n return res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'retriggerInstance',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const instanceId = c.request.params.instanceId as string;\n const token = req.headers.authorization?.split(' ')[1];\n const retriggerInstanceRequestDTO = req.body;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'retrigger-instance',\n request: req,\n meta: {\n workflowId,\n instanceId,\n },\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n await routerApi.v2\n .retriggerInstance(\n workflowId,\n instanceId,\n retriggerInstanceRequestDTO,\n token,\n )\n .then(result => {\n auditEvent.success();\n return res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowOverviewById',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-overview',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n },\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n return routerApi.v2\n .getWorkflowOverviewById(workflowId)\n .then(result => {\n auditEvent.success({\n meta: {\n workflowId: result.workflowId,\n },\n });\n return res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowStatuses',\n async (_c, request: express.Request, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-statuses',\n request,\n });\n\n // Anyone is authorized to call this endpoint\n\n return routerApi.v2\n .getWorkflowStatuses()\n .then(result => {\n auditEvent.success();\n res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowInputSchemaById',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const instanceId = c.request.query.instanceId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-input-schema',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n instanceId,\n },\n });\n\n try {\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const workflowDefinition =\n await services.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n });\n\n if (!workflowDefinition) {\n throw new Error(\n `Failed to fetch workflow info for workflow ${workflowId}`,\n );\n }\n const serviceUrl = workflowDefinition.serviceUrl;\n if (!serviceUrl) {\n throw new Error(\n `Service URL is not defined for workflow ${workflowId}`,\n );\n }\n\n const definition =\n await services.orchestratorService.fetchWorkflowDefinition({\n definitionId: workflowId,\n });\n\n if (!definition) {\n throw new Error(\n 'Failed to fetch workflow definition for workflow ${workflowId}',\n );\n }\n\n if (!definition.dataInputSchema) {\n res.status(200).json({});\n return;\n }\n\n const instanceVariables = instanceId\n ? await services.orchestratorService.fetchInstanceVariables({\n instanceId,\n })\n : undefined;\n\n const workflowData = instanceVariables\n ? services.dataInputSchemaService.extractWorkflowData(\n instanceVariables,\n )\n : undefined;\n\n const workflowInfo = await routerApi.v2.getWorkflowInputSchemaById(\n workflowId,\n serviceUrl,\n );\n\n if (!workflowInfo?.inputSchema?.properties) {\n auditEvent.success({\n meta: {\n message: 'Successfully found nothing.',\n },\n });\n res.status(200).json({});\n return;\n }\n\n const inputSchemaProps = workflowInfo.inputSchema.properties;\n let inputData;\n\n if (workflowData) {\n inputData = Object.keys(inputSchemaProps)\n .filter(k => k in workflowData)\n .reduce((result, k) => {\n if (workflowData[k] === undefined) {\n return result;\n }\n result[k] = workflowData[k];\n return result;\n }, {} as JsonObject);\n }\n\n auditEvent.success({\n meta: {\n workflowId: workflowInfo.id,\n },\n });\n res.status(200).json({\n inputSchema: workflowInfo.inputSchema,\n data: inputData,\n });\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowInstances',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-instances',\n request: req,\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n return routerApi.v2\n .getInstances(buildPagination(req), getRequestFilters(req), [\n workflowId,\n ])\n .then(result => {\n auditEvent.success();\n res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'pingWorkflowServiceById',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'ping-workflow-service',\n request: req,\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n return routerApi.v2\n .pingWorkflowService(workflowId)\n .then(result => {\n auditEvent.success();\n res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getInstances',\n async (_c, req: express.Request, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-instances',\n request: req,\n });\n\n try {\n // Once we assign user to the instance in the future, we can rework this filtering\n const allWorkflowIds = routerApi.v2.getWorkflowIds();\n const authorizedWorkflowIds: string[] =\n await filterAuthorizedWorkflowIds(\n req,\n permissions,\n httpAuth,\n allWorkflowIds,\n );\n\n if (!authorizedWorkflowIds || authorizedWorkflowIds.length === 0)\n res.json([]);\n\n const credentials = await httpAuth.credentials(req);\n const initiatorEntity = (await userInfo.getUserInfo(credentials))\n .userEntityRef;\n const isUserAuthorizedForInstanceAdminView: boolean = // This permission will let user see ALL instances (including ones others created)\n await isUserAuthorizedForInstanceAdminViewPermission(\n req,\n permissions,\n httpAuth,\n );\n\n const requestFilters = getRequestFilters(req);\n\n let filters = requestFilters;\n\n if (!isUserAuthorizedForInstanceAdminView) {\n const initiatorEntityFilter: FieldFilter = {\n operator: 'EQ',\n value: initiatorEntity,\n field: 'initiatorEntity',\n };\n\n const nestedVariablesFilter: NestedFilter = {\n field: 'variables',\n nested: initiatorEntityFilter,\n };\n\n if (requestFilters === undefined) {\n filters = nestedVariablesFilter;\n } else {\n // combine filters\n filters = {\n operator: 'AND',\n filters: [nestedVariablesFilter, requestFilters],\n };\n }\n }\n\n const result = await routerApi.v2.getInstances(\n buildPagination(req),\n filters,\n authorizedWorkflowIds,\n );\n\n auditEvent.success({ meta: { authorizedWorkflowIds } });\n res.json(result);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getInstanceById',\n async (c, request: express.Request, res: express.Response, next) => {\n const instanceId = c.request.params.instanceId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-instance',\n request,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\n });\n\n try {\n const instance = await routerApi.v2.getInstanceById(instanceId);\n\n const workflowId = instance.processId;\n\n const decision = await authorize(\n request,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const credentials = await httpAuth.credentials(request);\n const initiatorEntity = (await userInfo.getUserInfo(credentials))\n .userEntityRef;\n // Check if user is authorized to view all instances\n const isUserAuthorizedForInstanceAdminView =\n await isUserAuthorizedForInstanceAdminViewPermission(\n request,\n permissions,\n httpAuth,\n );\n\n // If not an admin, enforce initiatorEntity check\n if (!isUserAuthorizedForInstanceAdminView) {\n const instanceInitiatorEntity = instance.initiatorEntity;\n\n // If the instance has no initiatorEntity recorded, we cannot determine ownership.\n // This can happen for:\n // 1. Workflow instances created before the initiatorEntity feature was added\n // 2. Workflow instances started externally (not through Backstage)\n // 3. Workflows that transform/overwrite their input variables\n if (!instanceInitiatorEntity) {\n throw new NotAllowedError(\n `Access denied for instance ${instanceId}. ` +\n `You have permission to view workflow '${workflowId}', but this workflow run ` +\n `does not have ownership information recorded. Since we cannot verify you ` +\n `initiated this run, the 'orchestrator.instanceAdminView' permission is required. ` +\n `Contact your administrator to grant this permission.`,\n );\n }\n\n if (instanceInitiatorEntity !== initiatorEntity) {\n throw new NotAllowedError(\n `Access denied for instance ${instanceId}. ` +\n `This workflow run was initiated by '${instanceInitiatorEntity}', not by you ('${initiatorEntity}'). ` +\n `With 'orchestrator.workflow' or 'orchestrator.workflow.${workflowId}' permissions, ` +\n `you can only view instances you created. To view all instances, you need the ` +\n `'orchestrator.instanceAdminView' permission.`,\n );\n }\n }\n\n auditEvent.success();\n res.status(200).json(instance);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowLogById',\n async (c, request: express.Request, res: express.Response, next) => {\n const instanceId = c.request.params.instanceId as string;\n // will probably have to get the raw log at some point\n // const rawLog = c.request.query.instanceId as Boolean;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-logs-by-instance',\n request,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\n });\n\n try {\n // Check that a log provider has been setup\n if (!services.orchestratorService.hasLogProvider()) {\n throw new Error(`No log provider setup`);\n }\n const instance = await routerApi.v2.getInstanceById(instanceId);\n const workflowId = instance.processId;\n\n const decision = await authorize(\n request,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const credentials = await httpAuth.credentials(request);\n const initiatorEntity = (await userInfo.getUserInfo(credentials))\n .userEntityRef;\n // Check if user is authorized to view all instances\n const isUserAuthorizedForInstanceAdminView =\n await isUserAuthorizedForInstanceAdminViewPermission(\n request,\n permissions,\n httpAuth,\n );\n\n // If not an admin, enforce initiatorEntity check\n if (!isUserAuthorizedForInstanceAdminView) {\n const instanceInitiatorEntity = instance.initiatorEntity;\n if (instanceInitiatorEntity !== initiatorEntity) {\n throw new Error(\n `Unauthorized to access instance ${instanceId} not initiated by user.`,\n );\n }\n }\n\n const logs = await routerApi.v2.getInstanceLogsByInstance(instance);\n\n auditEvent.success();\n res.status(200).json(logs);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'abortWorkflow',\n async (c, request, res, next) => {\n const instanceId = c.request.params.instanceId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'abort-workflow',\n request,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\n });\n\n try {\n const instance = await routerApi.v2.getInstanceById(instanceId);\n const workflowId = instance.processId;\n\n const decision = await authorize(\n request,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const result = await routerApi.v2.abortWorkflow(workflowId, instanceId);\n auditEvent.success({ meta: { result } });\n res.status(200).json(result);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n}\n\nfunction getRequestFilters(req: HttpRequest): Filter | undefined {\n return req.body.filters ? (req.body.filters as Filter) : undefined;\n}\n"],"names":["AuthorizeResult","orchestratorInstanceAdminViewPermission","orchestratorWorkflowPermission","orchestratorWorkflowSpecificPermission","Router","createPermissionIntegrationRouter","orchestratorPermissions","express","MiddlewareFactory","DataIndexService","SonataFlowService","WorkflowCacheService","OrchestratorService","DataInputSchemaService","OpenAPIBackend","openApiDocument","fullFormats","v2","V2","UnauthorizedError","buildPagination","orchestratorWorkflowUsePermission","orchestratorWorkflowUseSpecificPermission","NotAllowedError"],"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.8.2",
3
+ "version": "8.9.0",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.cjs.js",
6
6
  "types": "./dist/index.d.ts",
@@ -51,11 +51,13 @@
51
51
  ],
52
52
  "files": [
53
53
  "app-config.yaml",
54
+ "config.d.ts",
54
55
  "dist",
55
56
  "dist-dynamic/*.*",
56
57
  "dist-dynamic/dist/**",
57
58
  "static"
58
59
  ],
60
+ "configSchema": "config.d.ts",
59
61
  "scripts": {
60
62
  "start": "backstage-cli package start",
61
63
  "build": "backstage-cli package build",
@@ -86,11 +88,13 @@
86
88
  "@red-hat-developer-hub/backstage-plugin-orchestrator-node": "^1.2.1",
87
89
  "@urql/core": "^6.0.1",
88
90
  "ajv-formats": "^2.1.1",
89
- "cloudevents": "^8.0.0",
91
+ "cloudevents": "^10.0.0",
90
92
  "express": "^4.21.2",
91
93
  "express-promise-router": "^4.1.1",
92
94
  "fs-extra": "^10.1.0",
93
95
  "isomorphic-git": "^1.23.0",
96
+ "js-yaml": "^4.1.0",
97
+ "kafkajs": "^2.2.4",
94
98
  "lodash": "^4.18.1",
95
99
  "luxon": "^3.7.2",
96
100
  "openapi-backend": "^5.10.5",