@red-hat-developer-hub/backstage-plugin-orchestrator-backend 8.7.3 → 8.8.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,18 @@
1
1
  # @red-hat-developer-hub/backstage-plugin-orchestrator-backend
2
2
 
3
+ ## 8.8.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 2212e8d: Backstage version bump to v1.49.3
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [665a75c]
12
+ - Updated dependencies [2212e8d]
13
+ - @red-hat-developer-hub/backstage-plugin-orchestrator-common@3.6.0
14
+ - @red-hat-developer-hub/backstage-plugin-orchestrator-node@1.2.0
15
+
3
16
  ## 8.7.3
4
17
 
5
18
  ### Patch Changes
@@ -41,6 +54,13 @@
41
54
  - @red-hat-developer-hub/backstage-plugin-orchestrator-common@3.5.0
42
55
  - @red-hat-developer-hub/backstage-plugin-orchestrator-node@1.1.0
43
56
 
57
+ ## 8.6.4
58
+
59
+ ### Patch Changes
60
+
61
+ - 13159d3: - Update dependecy @urql/core to fix CVE-2026-3118
62
+ - Reworks the filter and query builder code to use query variables
63
+
44
64
  ## 8.6.3
45
65
 
46
66
  ### Patch Changes
@@ -128,6 +148,13 @@
128
148
  - Updated dependencies [fba1136]
129
149
  - @red-hat-developer-hub/backstage-plugin-orchestrator-common@3.2.0
130
150
 
151
+ ## 8.3.1
152
+
153
+ ### Patch Changes
154
+
155
+ - 480bde1: - Update dependecy @urql/core to fix CVE-2026-3118
156
+ - Reworks the filter and query builder code to use query variables
157
+
131
158
  ## 8.3.0
132
159
 
133
160
  ### Minor Changes
@@ -16,6 +16,8 @@ class DataIndexService {
16
16
  }
17
17
  this.client = this.getNewGraphQLClient();
18
18
  }
19
+ dataIndexUrl;
20
+ logger;
19
21
  client;
20
22
  processDefinitionArguments = [];
21
23
  processInstanceArguments = [];
@@ -1 +1 @@
1
- {"version":3,"file":"DataIndexService.cjs.js","sources":["../../src/service/DataIndexService.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 { Client, fetchExchange, gql } from '@urql/core';\n\nimport {\n Filter,\n fromWorkflowSource,\n IntrospectionField,\n NestedFilter,\n parseWorkflowVariables,\n ProcessInstance,\n WorkflowDefinition,\n WorkflowInfo,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { ErrorBuilder } from '../helpers/errorBuilder';\nimport { buildFilterCondition } from '../helpers/filterBuilder';\nimport {\n buildGraphQlQuery,\n buildQueryParamVariable,\n} from '../helpers/queryBuilder';\nimport { Pagination } from '../types/pagination';\nimport { FETCH_PROCESS_INSTANCES_SORT_FIELD } from './constants';\n\nexport class DataIndexService {\n private readonly client: Client;\n public processDefinitionArguments: IntrospectionField[] = [];\n public processInstanceArguments: IntrospectionField[] = [];\n\n public constructor(\n private readonly dataIndexUrl: string,\n private readonly logger: LoggerService,\n ) {\n if (!dataIndexUrl.length) {\n throw ErrorBuilder.GET_NO_DATA_INDEX_URL_ERR();\n }\n\n this.client = this.getNewGraphQLClient();\n }\n\n private getNewGraphQLClient(): Client {\n const diURL = `${this.dataIndexUrl}/graphql`;\n return new Client({\n url: diURL,\n exchanges: [fetchExchange],\n });\n }\n\n public async initInputProcessDefinitionArgs(): Promise<IntrospectionField[]> {\n if (this.processDefinitionArguments.length === 0) {\n this.processDefinitionArguments =\n await this.inspectInputArgument('ProcessDefinition');\n }\n return this.processDefinitionArguments; // For testing purposes\n }\n\n public graphQLArgumentQuery(type: string): string {\n return `query ${type}Argument {\n __type(name: \"${type}Argument\") {\n kind\n name\n inputFields {\n name\n type {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n }\n }\n }\n }\n }\n }\n }`;\n }\n\n public async inspectInputArgument(\n type: string,\n ): Promise<IntrospectionField[]> {\n const result = await this.client.query(this.graphQLArgumentQuery(type), {});\n\n this.logger.debug(`Introspection query result: ${JSON.stringify(result)}`);\n\n this.handleGraphqlClientError(\n 'Error executing introspection query',\n result,\n );\n\n const pairs: IntrospectionField[] = [];\n if (result?.data?.__type?.inputFields) {\n for (const field of result.data.__type.inputFields) {\n if (\n field.name !== 'and' &&\n field.name !== 'or' &&\n field.name !== 'not'\n ) {\n pairs.push({\n name: field.name,\n type: {\n name: field.type.name,\n kind: field.type.kind,\n ofType: field.type.ofType,\n },\n });\n }\n }\n }\n return pairs;\n }\n\n public async fetchWorkflowInfo(\n definitionId: string,\n ): Promise<WorkflowInfo | undefined> {\n const graphQlQuery = gql`\n query FindProcessInstanceQuery($definitionId: String!) {\n ProcessDefinitions(where: { id: { equal: $definitionId } }) {\n id\n name\n version\n type\n endpoint\n serviceUrl\n source\n }\n }\n `;\n\n const result = await this.client.query(graphQlQuery, {\n definitionId,\n });\n\n this.logger.debug(\n `Get workflow definition result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError('Error fetching workflow definition', result);\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n\n if (processDefinitions.length === 0) {\n this.logger.info(`No workflow definition found for ${definitionId}`);\n return undefined;\n }\n\n return processDefinitions[0];\n }\n\n public async fetchWorkflowServiceUrls(): Promise<Record<string, string>> {\n const graphQlQuery = `{ ProcessDefinitions { id, serviceUrl } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Get workflow service urls result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error fetching workflow service urls',\n result,\n );\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n return processDefinitions\n .filter(definition => definition.serviceUrl)\n .map(definition => ({ [definition.id]: definition.serviceUrl! }))\n .reduce((acc, curr) => ({ ...acc, ...curr }), {});\n }\n\n private filterDeletedWorkflows(workflows: WorkflowInfo[]): WorkflowInfo[] {\n // filter deleted workflows, that were deleted via deleting SonataFlow CR, operator marks them as unavailable\n // Note this is different then the isAvailable status in WorkflowOverviewDTO, that is used to mark workflows that are not available on the service for unexpected reasons\n\n const availableWorkflows: WorkflowInfo[] = [];\n const unavailableWorkflows: WorkflowInfo[] = [];\n\n workflows.forEach(workflow => {\n const isUnavailable = workflow.metadata?.status === 'unavailable';\n if (isUnavailable) {\n unavailableWorkflows.push(workflow);\n } else {\n availableWorkflows.push(workflow);\n }\n });\n\n this.logger.debug(\n `filtered deleted workflows when fetching workflow infos: ${JSON.stringify(\n unavailableWorkflows.map(w => ({\n id: w.id,\n name: w.name,\n status: w.metadata?.status,\n })),\n )}`,\n );\n\n return availableWorkflows;\n }\n\n public async fetchWorkflowInfos(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<WorkflowInfo[]> {\n this.logger.info(`fetchWorkflowInfos() called: ${this.dataIndexUrl}`);\n const { definitionIds, pagination, filter } = args;\n\n const definitionIdsCondition =\n definitionIds !== undefined && definitionIds.length > 0\n ? `id: {in: ${JSON.stringify(definitionIds)}}`\n : undefined;\n\n const filterCondition = filter\n ? buildFilterCondition(\n await this.initInputProcessDefinitionArgs(),\n 'ProcessDefinition',\n filter,\n )\n : undefined;\n\n let whereClause: string | undefined;\n if (definitionIdsCondition && filterCondition) {\n whereClause = `and: [{${definitionIdsCondition}}, {${filterCondition?.clause}}]`;\n } else if (definitionIdsCondition || filterCondition) {\n whereClause = definitionIdsCondition ?? filterCondition?.clause;\n } else {\n whereClause = undefined;\n }\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessDefinitions',\n queryBody:\n 'id, name, version, type, endpoint, serviceUrl, source, metadata',\n whereClause,\n pagination,\n filterCondition: filterCondition,\n });\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n\n const paramVariables = buildQueryParamVariable(pagination, filterCondition);\n\n this.logger.debug(`GraphQL query params:`, paramVariables);\n\n const result = await this.client.query(graphQlQuery, paramVariables);\n this.logger.debug(\n `Get workflow definitions result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error fetching data index swf results',\n result,\n );\n\n return this.filterDeletedWorkflows(result.data.ProcessDefinitions);\n }\n\n public async fetchInstances(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<ProcessInstance[]> {\n const { pagination, definitionIds, filter } = args;\n if (pagination) pagination.sortField ??= FETCH_PROCESS_INSTANCES_SORT_FIELD;\n\n const processIdNotNullCondition = 'processId: {isNull: false}';\n const definitionIdsCondition =\n definitionIds && definitionIds.length > 0\n ? `processId: {in: ${JSON.stringify(definitionIds)}}`\n : undefined;\n const type = 'ProcessInstance';\n const filterCondition = filter\n ? buildFilterCondition(\n await this.inspectInputArgument(type),\n type,\n filter,\n )\n : undefined;\n\n let whereClause = '';\n const conditions = [];\n\n if (processIdNotNullCondition) {\n conditions.push(`{${processIdNotNullCondition}}`);\n }\n\n if (definitionIdsCondition) {\n conditions.push(`{${definitionIdsCondition}}`);\n }\n\n if (filterCondition) {\n conditions.push(`{${filterCondition?.clause}}`);\n }\n\n if (conditions.length === 0) {\n whereClause = processIdNotNullCondition;\n } else if (conditions.length === 1) {\n whereClause = conditions[0].slice(1, -1); // Remove the outer braces\n } else if (conditions.length > 1) {\n whereClause = `and: [${conditions.join(', ')}]`;\n }\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessInstances',\n queryBody:\n 'id, processName, processId, state, start, end, nodes { id }, variables, executionSummary, parentProcessInstance {id, processName, businessKey}',\n whereClause,\n pagination,\n filterCondition: filterCondition,\n });\n\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n\n const paramVariables = buildQueryParamVariable(pagination, filterCondition);\n\n this.logger.debug(`GraphQL query params:`, paramVariables);\n\n const result = await this.client.query<{\n ProcessInstances: ProcessInstance[];\n }>(graphQlQuery, paramVariables);\n this.logger.debug(\n `Fetch process instances result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError('Error when fetching instances', result);\n\n const processInstancesSrc = result.data ? result.data.ProcessInstances : [];\n\n const processInstances = await Promise.all(\n processInstancesSrc.map(async instance => {\n return await this.getWorkflowDefinitionFromInstance(instance);\n }),\n );\n return processInstances;\n }\n\n public async fetchDefinitionIdsFromInstances(args: {\n targetEntity: string;\n }): Promise<string[]> {\n const { targetEntity } = args;\n\n const processIdNotNullCondition = 'processId: {isNull: false}';\n\n const type = 'ProcessInstance';\n const targetEntityFilter: NestedFilter = {\n field: 'variables',\n nested: {\n operator: 'EQ',\n field: 'targetEntity',\n value: targetEntity,\n },\n };\n\n const filterCondition = buildFilterCondition(\n await this.inspectInputArgument(type),\n type,\n targetEntityFilter,\n );\n\n const whereClause = `and: [{${processIdNotNullCondition}}, {${filterCondition.clause}}]`;\n\n // Apply a limit to prevent memory exhaustion and network timeouts when entities\n // have thousands of process instances. Entities with more instances than this limit\n // may not see all their associated workflows.\n const pagination = {\n limit: 1000,\n offset: 0,\n };\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessInstances',\n queryBody: 'processId',\n whereClause,\n pagination,\n filterCondition,\n });\n\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n\n const paramVariables = buildQueryParamVariable(pagination, filterCondition);\n\n this.logger.debug(`GraphQL query params:`, paramVariables);\n\n const result = await this.client.query<{\n ProcessInstances: ProcessInstance[];\n }>(graphQlQuery, paramVariables);\n this.logger.debug(\n `Fetch definition ids from instances history result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching definition ids from instances history',\n result,\n );\n\n const processInstancesSrc = result.data ? result.data.ProcessInstances : [];\n const distinctProcessIds = [\n ...new Set(processInstancesSrc.map(instance => instance.processId)),\n ]; // graphql doesn't support distinct so we need to use a set to get the distinct process ids\n return distinctProcessIds;\n }\n\n private async getWorkflowDefinitionFromInstance(instance: ProcessInstance) {\n const workflowInfo = await this.fetchWorkflowInfo(instance.processId);\n if (!workflowInfo?.source) {\n throw new Error(\n `Workflow defintion is required to fetch instance ${instance.id}`,\n );\n }\n if (workflowInfo) {\n instance.description = workflowInfo.description;\n }\n return instance;\n }\n\n public async fetchWorkflowSource(\n definitionId: string,\n ): Promise<string | undefined> {\n const graphQlQuery = gql`\n query FindProcessInstanceQuery($definitionId: String!) {\n ProcessDefinitions(where: { id: { equal: $definitionId } }) {\n id\n source\n }\n }\n `;\n\n const result = await this.client.query(graphQlQuery, {\n definitionId,\n });\n\n this.logger.debug(\n `Fetch workflow source result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching workflow source',\n result,\n );\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n\n if (processDefinitions.length === 0) {\n this.logger.info(`No workflow source found for ${definitionId}`);\n return undefined;\n }\n\n return processDefinitions[0].source;\n }\n\n public async fetchInstancesByDefinitionId(args: {\n definitionId: string;\n limit: number;\n offset: number;\n targetEntity?: string;\n }): Promise<ProcessInstance[]> {\n const targetEntityWhereCondition = args.targetEntity\n ? `, variables: {targetEntity: {equal: $targetEntity } }`\n : '';\n\n const graphQlQuery = gql`\n query FindProcessInstanceQuery($definitionId: String!, $limit: Int!, $offset: Int! ${args.targetEntity ? `, $targetEntity: String` : ''}) {\n ProcessInstances(\n where: {processId: {equal: $definitionId } ${targetEntityWhereCondition} },\n orderBy: {start:DESC},\n pagination: {limit: $limit, offset: $offset}\n ) { id, processName, state, start, end }\n }\n `;\n\n const result = await this.client.query(\n graphQlQuery,\n args.targetEntity\n ? {\n definitionId: args.definitionId,\n limit: args.limit,\n offset: args.offset,\n targetEntity: args.targetEntity,\n }\n : {\n definitionId: args.definitionId,\n limit: args.limit,\n offset: args.offset,\n },\n );\n\n this.logger.debug(\n `Fetch workflow instances result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching workflow instances',\n result,\n );\n\n return result.data.ProcessInstances;\n }\n\n public async fetchInstanceVariables(\n instanceId: string,\n ): Promise<object | undefined> {\n const graphQlQuery = gql`\n query FindProcessInstanceQuery($instanceId: String!) {\n ProcessInstances(where: { id: { equal: $instanceId } }) {\n variables\n }\n }\n `;\n\n const result = await this.client.query(graphQlQuery, {\n instanceId,\n });\n\n this.logger.debug(\n `Fetch process instance variables result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching process instance variables',\n result,\n );\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n return parseWorkflowVariables(processInstances[0].variables as object);\n }\n\n public async fetchDefinitionIdByInstanceId(\n instanceId: string,\n ): Promise<string | undefined> {\n const graphQlQuery = gql`\n query FindProcessInstanceQuery($instanceId: String!) {\n ProcessInstances(where: { id: { equal: $instanceId } }) {\n processId\n }\n }\n `;\n\n const result = await this.client.query(graphQlQuery, {\n instanceId,\n });\n\n this.logger.debug(\n `Fetch process id from instance result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching process id from instance',\n result,\n );\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n return processInstances[0].processId;\n }\n\n public async fetchInstance(\n instanceId: string,\n ): Promise<ProcessInstance | undefined> {\n const FindProcessInstanceQuery = gql`\n query FindProcessInstanceQuery($instanceId: String!) {\n ProcessInstances(where: { id: { equal: $instanceId } }) {\n id\n processName\n processId\n serviceUrl\n executionSummary\n state\n start\n end\n nodes {\n id\n nodeId\n definitionId\n type\n name\n enter\n exit\n errorMessage\n }\n variables\n parentProcessInstance {\n id\n processName\n businessKey\n }\n error {\n nodeDefinitionId\n nodeInstanceId\n message\n }\n }\n }\n `;\n\n const result = await this.client.query(FindProcessInstanceQuery, {\n instanceId,\n });\n\n this.logger.debug(\n `Fetch process instance result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching process instances',\n result,\n );\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n const instance = this.removeNodes(processInstances[0]);\n\n const workflowInfo = await this.fetchWorkflowInfo(instance.processId);\n if (!workflowInfo?.source) {\n throw new Error(\n `Workflow definition is required to fetch instance ${instance.id}`,\n );\n }\n const workflowDefinitionSrc: WorkflowDefinition = fromWorkflowSource(\n workflowInfo.source,\n );\n if (workflowInfo) {\n instance.description = workflowDefinitionSrc.description;\n }\n return instance;\n }\n\n private handleGraphqlClientError(scenario: string, result: any) {\n if (!result?.error) {\n return;\n }\n\n this.logger.error(scenario, result);\n\n const networkError = result.error.networkError?.cause?.message;\n if (networkError) {\n const toThrow = new Error(`${result.error.message}. ${networkError}`);\n toThrow.name = 'Network Error';\n throw toThrow;\n }\n\n const graphQLErrors = result.error.graphQLErrors;\n if (\n result.data &&\n Array.isArray(graphQLErrors) &&\n graphQLErrors.length > 0\n ) {\n const graphQLError = graphQLErrors[0];\n if (\n graphQLError?.extensions?.classification === 'DataFetchingException'\n ) {\n // we have data (perhaps partial) and it is a data fetch error ==> log and ignore\n return;\n }\n }\n\n throw result.error;\n }\n\n private removeNodes(instance: ProcessInstance): ProcessInstance {\n const errorNodeId = instance.error?.nodeInstanceId;\n instance.nodes = instance.nodes.filter(node => {\n return !node.errorMessage || node.id === errorNodeId;\n });\n return instance;\n }\n}\n"],"names":["ErrorBuilder","Client","fetchExchange","gql","buildFilterCondition","buildGraphQlQuery","buildQueryParamVariable","FETCH_PROCESS_INSTANCES_SORT_FIELD","parseWorkflowVariables","fromWorkflowSource"],"mappings":"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"}
1
+ {"version":3,"file":"DataIndexService.cjs.js","sources":["../../src/service/DataIndexService.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 { Client, fetchExchange, gql } from '@urql/core';\n\nimport {\n Filter,\n fromWorkflowSource,\n IntrospectionField,\n NestedFilter,\n parseWorkflowVariables,\n ProcessInstance,\n WorkflowDefinition,\n WorkflowInfo,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { ErrorBuilder } from '../helpers/errorBuilder';\nimport { buildFilterCondition } from '../helpers/filterBuilder';\nimport {\n buildGraphQlQuery,\n buildQueryParamVariable,\n} from '../helpers/queryBuilder';\nimport { Pagination } from '../types/pagination';\nimport { FETCH_PROCESS_INSTANCES_SORT_FIELD } from './constants';\n\nexport class DataIndexService {\n private readonly client: Client;\n public processDefinitionArguments: IntrospectionField[] = [];\n public processInstanceArguments: IntrospectionField[] = [];\n\n public constructor(\n private readonly dataIndexUrl: string,\n private readonly logger: LoggerService,\n ) {\n if (!dataIndexUrl.length) {\n throw ErrorBuilder.GET_NO_DATA_INDEX_URL_ERR();\n }\n\n this.client = this.getNewGraphQLClient();\n }\n\n private getNewGraphQLClient(): Client {\n const diURL = `${this.dataIndexUrl}/graphql`;\n return new Client({\n url: diURL,\n exchanges: [fetchExchange],\n });\n }\n\n public async initInputProcessDefinitionArgs(): Promise<IntrospectionField[]> {\n if (this.processDefinitionArguments.length === 0) {\n this.processDefinitionArguments =\n await this.inspectInputArgument('ProcessDefinition');\n }\n return this.processDefinitionArguments; // For testing purposes\n }\n\n public graphQLArgumentQuery(type: string): string {\n return `query ${type}Argument {\n __type(name: \"${type}Argument\") {\n kind\n name\n inputFields {\n name\n type {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n }\n }\n }\n }\n }\n }\n }`;\n }\n\n public async inspectInputArgument(\n type: string,\n ): Promise<IntrospectionField[]> {\n const result = await this.client.query(this.graphQLArgumentQuery(type), {});\n\n this.logger.debug(`Introspection query result: ${JSON.stringify(result)}`);\n\n this.handleGraphqlClientError(\n 'Error executing introspection query',\n result,\n );\n\n const pairs: IntrospectionField[] = [];\n if (result?.data?.__type?.inputFields) {\n for (const field of result.data.__type.inputFields) {\n if (\n field.name !== 'and' &&\n field.name !== 'or' &&\n field.name !== 'not'\n ) {\n pairs.push({\n name: field.name,\n type: {\n name: field.type.name,\n kind: field.type.kind,\n ofType: field.type.ofType,\n },\n });\n }\n }\n }\n return pairs;\n }\n\n public async fetchWorkflowInfo(\n definitionId: string,\n ): Promise<WorkflowInfo | undefined> {\n const graphQlQuery = gql`\n query FindProcessInstanceQuery($definitionId: String!) {\n ProcessDefinitions(where: { id: { equal: $definitionId } }) {\n id\n name\n version\n type\n endpoint\n serviceUrl\n source\n }\n }\n `;\n\n const result = await this.client.query(graphQlQuery, {\n definitionId,\n });\n\n this.logger.debug(\n `Get workflow definition result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError('Error fetching workflow definition', result);\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n\n if (processDefinitions.length === 0) {\n this.logger.info(`No workflow definition found for ${definitionId}`);\n return undefined;\n }\n\n return processDefinitions[0];\n }\n\n public async fetchWorkflowServiceUrls(): Promise<Record<string, string>> {\n const graphQlQuery = `{ ProcessDefinitions { id, serviceUrl } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Get workflow service urls result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error fetching workflow service urls',\n result,\n );\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n return processDefinitions\n .filter(definition => definition.serviceUrl)\n .map(definition => ({ [definition.id]: definition.serviceUrl! }))\n .reduce((acc, curr) => ({ ...acc, ...curr }), {});\n }\n\n private filterDeletedWorkflows(workflows: WorkflowInfo[]): WorkflowInfo[] {\n // filter deleted workflows, that were deleted via deleting SonataFlow CR, operator marks them as unavailable\n // Note this is different then the isAvailable status in WorkflowOverviewDTO, that is used to mark workflows that are not available on the service for unexpected reasons\n\n const availableWorkflows: WorkflowInfo[] = [];\n const unavailableWorkflows: WorkflowInfo[] = [];\n\n workflows.forEach(workflow => {\n const isUnavailable = workflow.metadata?.status === 'unavailable';\n if (isUnavailable) {\n unavailableWorkflows.push(workflow);\n } else {\n availableWorkflows.push(workflow);\n }\n });\n\n this.logger.debug(\n `filtered deleted workflows when fetching workflow infos: ${JSON.stringify(\n unavailableWorkflows.map(w => ({\n id: w.id,\n name: w.name,\n status: w.metadata?.status,\n })),\n )}`,\n );\n\n return availableWorkflows;\n }\n\n public async fetchWorkflowInfos(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<WorkflowInfo[]> {\n this.logger.info(`fetchWorkflowInfos() called: ${this.dataIndexUrl}`);\n const { definitionIds, pagination, filter } = args;\n\n const definitionIdsCondition =\n definitionIds !== undefined && definitionIds.length > 0\n ? `id: {in: ${JSON.stringify(definitionIds)}}`\n : undefined;\n\n const filterCondition = filter\n ? buildFilterCondition(\n await this.initInputProcessDefinitionArgs(),\n 'ProcessDefinition',\n filter,\n )\n : undefined;\n\n let whereClause: string | undefined;\n if (definitionIdsCondition && filterCondition) {\n whereClause = `and: [{${definitionIdsCondition}}, {${filterCondition?.clause}}]`;\n } else if (definitionIdsCondition || filterCondition) {\n whereClause = definitionIdsCondition ?? filterCondition?.clause;\n } else {\n whereClause = undefined;\n }\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessDefinitions',\n queryBody:\n 'id, name, version, type, endpoint, serviceUrl, source, metadata',\n whereClause,\n pagination,\n filterCondition: filterCondition,\n });\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n\n const paramVariables = buildQueryParamVariable(pagination, filterCondition);\n\n this.logger.debug(`GraphQL query params:`, paramVariables);\n\n const result = await this.client.query(graphQlQuery, paramVariables);\n this.logger.debug(\n `Get workflow definitions result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error fetching data index swf results',\n result,\n );\n\n return this.filterDeletedWorkflows(result.data.ProcessDefinitions);\n }\n\n public async fetchInstances(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<ProcessInstance[]> {\n const { pagination, definitionIds, filter } = args;\n if (pagination) pagination.sortField ??= FETCH_PROCESS_INSTANCES_SORT_FIELD;\n\n const processIdNotNullCondition = 'processId: {isNull: false}';\n const definitionIdsCondition =\n definitionIds && definitionIds.length > 0\n ? `processId: {in: ${JSON.stringify(definitionIds)}}`\n : undefined;\n const type = 'ProcessInstance';\n const filterCondition = filter\n ? buildFilterCondition(\n await this.inspectInputArgument(type),\n type,\n filter,\n )\n : undefined;\n\n let whereClause = '';\n const conditions = [];\n\n if (processIdNotNullCondition) {\n conditions.push(`{${processIdNotNullCondition}}`);\n }\n\n if (definitionIdsCondition) {\n conditions.push(`{${definitionIdsCondition}}`);\n }\n\n if (filterCondition) {\n conditions.push(`{${filterCondition?.clause}}`);\n }\n\n if (conditions.length === 0) {\n whereClause = processIdNotNullCondition;\n } else if (conditions.length === 1) {\n whereClause = conditions[0].slice(1, -1); // Remove the outer braces\n } else if (conditions.length > 1) {\n whereClause = `and: [${conditions.join(', ')}]`;\n }\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessInstances',\n queryBody:\n 'id, processName, processId, state, start, end, nodes { id }, variables, executionSummary, parentProcessInstance {id, processName, businessKey}',\n whereClause,\n pagination,\n filterCondition: filterCondition,\n });\n\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n\n const paramVariables = buildQueryParamVariable(pagination, filterCondition);\n\n this.logger.debug(`GraphQL query params:`, paramVariables);\n\n const result = await this.client.query<{\n ProcessInstances: ProcessInstance[];\n }>(graphQlQuery, paramVariables);\n this.logger.debug(\n `Fetch process instances result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError('Error when fetching instances', result);\n\n const processInstancesSrc = result.data ? result.data.ProcessInstances : [];\n\n const processInstances = await Promise.all(\n processInstancesSrc.map(async instance => {\n return await this.getWorkflowDefinitionFromInstance(instance);\n }),\n );\n return processInstances;\n }\n\n public async fetchDefinitionIdsFromInstances(args: {\n targetEntity: string;\n }): Promise<string[]> {\n const { targetEntity } = args;\n\n const processIdNotNullCondition = 'processId: {isNull: false}';\n\n const type = 'ProcessInstance';\n const targetEntityFilter: NestedFilter = {\n field: 'variables',\n nested: {\n operator: 'EQ',\n field: 'targetEntity',\n value: targetEntity,\n },\n };\n\n const filterCondition = buildFilterCondition(\n await this.inspectInputArgument(type),\n type,\n targetEntityFilter,\n );\n\n const whereClause = `and: [{${processIdNotNullCondition}}, {${filterCondition.clause}}]`;\n\n // Apply a limit to prevent memory exhaustion and network timeouts when entities\n // have thousands of process instances. Entities with more instances than this limit\n // may not see all their associated workflows.\n const pagination = {\n limit: 1000,\n offset: 0,\n };\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessInstances',\n queryBody: 'processId',\n whereClause,\n pagination,\n filterCondition,\n });\n\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n\n const paramVariables = buildQueryParamVariable(pagination, filterCondition);\n\n this.logger.debug(`GraphQL query params:`, paramVariables);\n\n const result = await this.client.query<{\n ProcessInstances: ProcessInstance[];\n }>(graphQlQuery, paramVariables);\n this.logger.debug(\n `Fetch definition ids from instances history result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching definition ids from instances history',\n result,\n );\n\n const processInstancesSrc = result.data ? result.data.ProcessInstances : [];\n const distinctProcessIds = [\n ...new Set(processInstancesSrc.map(instance => instance.processId)),\n ]; // graphql doesn't support distinct so we need to use a set to get the distinct process ids\n return distinctProcessIds;\n }\n\n private async getWorkflowDefinitionFromInstance(instance: ProcessInstance) {\n const workflowInfo = await this.fetchWorkflowInfo(instance.processId);\n if (!workflowInfo?.source) {\n throw new Error(\n `Workflow defintion is required to fetch instance ${instance.id}`,\n );\n }\n if (workflowInfo) {\n instance.description = workflowInfo.description;\n }\n return instance;\n }\n\n public async fetchWorkflowSource(\n definitionId: string,\n ): Promise<string | undefined> {\n const graphQlQuery = gql`\n query FindProcessInstanceQuery($definitionId: String!) {\n ProcessDefinitions(where: { id: { equal: $definitionId } }) {\n id\n source\n }\n }\n `;\n\n const result = await this.client.query(graphQlQuery, {\n definitionId,\n });\n\n this.logger.debug(\n `Fetch workflow source result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching workflow source',\n result,\n );\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n\n if (processDefinitions.length === 0) {\n this.logger.info(`No workflow source found for ${definitionId}`);\n return undefined;\n }\n\n return processDefinitions[0].source;\n }\n\n public async fetchInstancesByDefinitionId(args: {\n definitionId: string;\n limit: number;\n offset: number;\n targetEntity?: string;\n }): Promise<ProcessInstance[]> {\n const targetEntityWhereCondition = args.targetEntity\n ? `, variables: {targetEntity: {equal: $targetEntity } }`\n : '';\n\n const graphQlQuery = gql`\n query FindProcessInstanceQuery($definitionId: String!, $limit: Int!, $offset: Int! ${args.targetEntity ? `, $targetEntity: String` : ''}) {\n ProcessInstances(\n where: {processId: {equal: $definitionId } ${targetEntityWhereCondition} },\n orderBy: {start:DESC},\n pagination: {limit: $limit, offset: $offset}\n ) { id, processName, state, start, end }\n }\n `;\n\n const result = await this.client.query(\n graphQlQuery,\n args.targetEntity\n ? {\n definitionId: args.definitionId,\n limit: args.limit,\n offset: args.offset,\n targetEntity: args.targetEntity,\n }\n : {\n definitionId: args.definitionId,\n limit: args.limit,\n offset: args.offset,\n },\n );\n\n this.logger.debug(\n `Fetch workflow instances result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching workflow instances',\n result,\n );\n\n return result.data.ProcessInstances;\n }\n\n public async fetchInstanceVariables(\n instanceId: string,\n ): Promise<object | undefined> {\n const graphQlQuery = gql`\n query FindProcessInstanceQuery($instanceId: String!) {\n ProcessInstances(where: { id: { equal: $instanceId } }) {\n variables\n }\n }\n `;\n\n const result = await this.client.query(graphQlQuery, {\n instanceId,\n });\n\n this.logger.debug(\n `Fetch process instance variables result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching process instance variables',\n result,\n );\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n return parseWorkflowVariables(processInstances[0].variables as object);\n }\n\n public async fetchDefinitionIdByInstanceId(\n instanceId: string,\n ): Promise<string | undefined> {\n const graphQlQuery = gql`\n query FindProcessInstanceQuery($instanceId: String!) {\n ProcessInstances(where: { id: { equal: $instanceId } }) {\n processId\n }\n }\n `;\n\n const result = await this.client.query(graphQlQuery, {\n instanceId,\n });\n\n this.logger.debug(\n `Fetch process id from instance result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching process id from instance',\n result,\n );\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n return processInstances[0].processId;\n }\n\n public async fetchInstance(\n instanceId: string,\n ): Promise<ProcessInstance | undefined> {\n const FindProcessInstanceQuery = gql`\n query FindProcessInstanceQuery($instanceId: String!) {\n ProcessInstances(where: { id: { equal: $instanceId } }) {\n id\n processName\n processId\n serviceUrl\n executionSummary\n state\n start\n end\n nodes {\n id\n nodeId\n definitionId\n type\n name\n enter\n exit\n errorMessage\n }\n variables\n parentProcessInstance {\n id\n processName\n businessKey\n }\n error {\n nodeDefinitionId\n nodeInstanceId\n message\n }\n }\n }\n `;\n\n const result = await this.client.query(FindProcessInstanceQuery, {\n instanceId,\n });\n\n this.logger.debug(\n `Fetch process instance result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching process instances',\n result,\n );\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n const instance = this.removeNodes(processInstances[0]);\n\n const workflowInfo = await this.fetchWorkflowInfo(instance.processId);\n if (!workflowInfo?.source) {\n throw new Error(\n `Workflow definition is required to fetch instance ${instance.id}`,\n );\n }\n const workflowDefinitionSrc: WorkflowDefinition = fromWorkflowSource(\n workflowInfo.source,\n );\n if (workflowInfo) {\n instance.description = workflowDefinitionSrc.description;\n }\n return instance;\n }\n\n private handleGraphqlClientError(scenario: string, result: any) {\n if (!result?.error) {\n return;\n }\n\n this.logger.error(scenario, result);\n\n const networkError = result.error.networkError?.cause?.message;\n if (networkError) {\n const toThrow = new Error(`${result.error.message}. ${networkError}`);\n toThrow.name = 'Network Error';\n throw toThrow;\n }\n\n const graphQLErrors = result.error.graphQLErrors;\n if (\n result.data &&\n Array.isArray(graphQLErrors) &&\n graphQLErrors.length > 0\n ) {\n const graphQLError = graphQLErrors[0];\n if (\n graphQLError?.extensions?.classification === 'DataFetchingException'\n ) {\n // we have data (perhaps partial) and it is a data fetch error ==> log and ignore\n return;\n }\n }\n\n throw result.error;\n }\n\n private removeNodes(instance: ProcessInstance): ProcessInstance {\n const errorNodeId = instance.error?.nodeInstanceId;\n instance.nodes = instance.nodes.filter(node => {\n return !node.errorMessage || node.id === errorNodeId;\n });\n return instance;\n }\n}\n"],"names":["ErrorBuilder","Client","fetchExchange","gql","buildFilterCondition","buildGraphQlQuery","buildQueryParamVariable","FETCH_PROCESS_INSTANCES_SORT_FIELD","parseWorkflowVariables","fromWorkflowSource"],"mappings":"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"}
@@ -19,6 +19,7 @@ class DevModeService {
19
19
  this.connection = this.extractConnectionConfig(config);
20
20
  this.gitService = new GitService.GitService(logger, config);
21
21
  }
22
+ logger;
22
23
  connection;
23
24
  gitService;
24
25
  get devModeUrl() {
@@ -1 +1 @@
1
- {"version":3,"file":"DevModeService.cjs.js","sources":["../../src/service/DevModeService.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 {\n DEFAULT_SONATAFLOW_BASE_URL,\n DEFAULT_SONATAFLOW_CONTAINER_IMAGE,\n DEFAULT_SONATAFLOW_PERSISTENCE_PATH,\n DEFAULT_WORKFLOWS_PATH,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { spawn } from 'child_process';\nimport { join, resolve } from 'path';\n\nimport { GitService } from './GitService';\nimport { executeWithRetry } from './Helper';\n\nconst SONATA_FLOW_RESOURCES_PATH =\n '/home/kogito/serverless-workflow-project/src/main/resources';\nconst DEFAULT_SONATAFLOW_RUNTIME = 'docker';\n\ninterface LauncherCommand {\n command: string;\n args: string[];\n}\n\ninterface DevModeConnectionConfig {\n host: string;\n port?: number;\n containerImage: string;\n resourcesPath: string;\n persistencePath?: string;\n repoUrl?: string;\n notificationsBearerToken?: string;\n notificationsUrl?: string;\n runtime: string;\n}\n\nexport class DevModeService {\n private readonly connection: DevModeConnectionConfig;\n private readonly gitService;\n\n constructor(\n config: Config,\n private readonly logger: LoggerService,\n ) {\n this.connection = this.extractConnectionConfig(config);\n this.gitService = new GitService(logger, config);\n }\n\n public get devModeUrl(): string {\n if (!this.connection.port) {\n return this.connection.host;\n }\n return `${this.connection.host}:${this.connection.port}`;\n }\n\n public async launchDevMode(): Promise<boolean> {\n await this.loadDevWorkflows();\n\n const isAlreadyUp = await this.isSonataFlowUp(false, this.devModeUrl);\n if (isAlreadyUp) {\n return true;\n }\n\n this.launchSonataFlow();\n\n return await this.isSonataFlowUp(true, this.devModeUrl);\n }\n\n private async isSonataFlowUp(\n withRetry: boolean,\n endpoint: string,\n ): Promise<boolean> {\n const healthUrl = `${endpoint}/q/health`;\n this.logger.info(`Checking SonataFlow health at: ${healthUrl}`);\n\n try {\n const response = await executeWithRetry(\n () => fetch(healthUrl),\n withRetry ? 15 : 1,\n );\n if (response.ok) {\n this.logger.info('SonataFlow is up and running');\n return true;\n }\n } catch (e) {\n this.logger.error(`Error when checking SonataFlow health: ${e}`);\n }\n return false;\n }\n\n private launchSonataFlow(): void {\n const launcherCmd = this.createLauncherCommand();\n\n this.logger.info(\n `Auto starting SonataFlow through: ${\n launcherCmd.command\n } ${launcherCmd.args.join(' ')}`,\n );\n\n const process = spawn(launcherCmd.command, launcherCmd.args, {\n shell: false,\n });\n\n process.on('close', code => {\n this.logger.info(`SonataFlow process exited with code ${code}`);\n });\n\n process.on('exit', code => {\n this.logger.info(`SonataFlow process exited with code ${code}`);\n });\n\n process.on('error', error => {\n this.logger.error(`SonataFlow process error: ${error}`);\n });\n }\n\n private createLauncherCommand(): LauncherCommand {\n const resourcesAbsPath = resolve(\n join(this.connection.resourcesPath, DEFAULT_WORKFLOWS_PATH),\n );\n\n const launcherArgs = [\n 'run',\n '--name',\n 'backstage-internal-sonataflow',\n ...(this.connection.runtime === 'podman'\n ? ['--replace']\n : ['--add-host', 'host.docker.internal:host-gateway']),\n ];\n\n // TODO: pass automatically a set of env variables from configuration, i.e. all config props with names starting at ENV_:\n // config: orchestrator.sonataFlowService.ENV_foo\n\n launcherArgs.push('-e', `QUARKUS_HTTP_PORT=${this.connection.port}`);\n\n launcherArgs.push('-p', `${this.connection.port}:${this.connection.port}`);\n launcherArgs.push('-e', `KOGITO_SERVICE_URL=${this.devModeUrl}`);\n launcherArgs.push(\n '-v',\n `${resourcesAbsPath}:${SONATA_FLOW_RESOURCES_PATH}:Z`,\n );\n if (this.connection?.persistencePath) {\n // if persistence is enabled, mount the volume and persist data across restarts\n const persistenceAbsPath = resolve(this.connection.persistencePath);\n this.logger.info(\n `Persistence is enabled, mounting ${persistenceAbsPath} as volume to persist data`,\n );\n if (!fs.existsSync(persistenceAbsPath)) {\n fs.mkdirSync(persistenceAbsPath, { recursive: true });\n }\n launcherArgs.push(\n '-v',\n `${persistenceAbsPath}:${DEFAULT_SONATAFLOW_PERSISTENCE_PATH}:Z`,\n );\n }\n launcherArgs.push('-e', 'KOGITO.CODEGEN.PROCESS.FAILONERROR=false');\n launcherArgs.push(\n '-e',\n `QUARKUS_EMBEDDED_POSTGRESQL_DATA_DIR=${DEFAULT_SONATAFLOW_PERSISTENCE_PATH}`,\n );\n launcherArgs.push(\n '-e',\n `NOTIFICATIONS_BEARER_TOKEN=${this.connection.notificationsBearerToken}`,\n );\n launcherArgs.push(\n '-e',\n `BACKSTAGE_NOTIFICATIONS_URL=${this.connection.notificationsUrl}`,\n );\n\n launcherArgs.push(this.connection.containerImage);\n\n return {\n command: this.connection.runtime,\n args: launcherArgs,\n };\n }\n\n private extractConnectionConfig(config: Config): DevModeConnectionConfig {\n const host =\n config.getOptionalString('orchestrator.sonataFlowService.baseUrl') ??\n DEFAULT_SONATAFLOW_BASE_URL;\n const port = config.getOptionalNumber(\n 'orchestrator.sonataFlowService.port',\n );\n\n const resourcesPath =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.workflowsSource.localPath',\n ) ?? '';\n\n const containerImage =\n config.getOptionalString('orchestrator.sonataFlowService.container') ??\n DEFAULT_SONATAFLOW_CONTAINER_IMAGE;\n\n const persistencePath =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.persistence.path',\n ) ?? '';\n\n const repoUrl =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.workflowsSource.gitRepositoryUrl',\n ) ?? '';\n\n const notificationsBearerToken =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.notificationsBearerToken',\n ) ?? '';\n\n const notificationsUrl =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.notificationsUrl',\n ) ?? '';\n\n const runtime =\n config.getOptionalString('orchestrator.sonataFlowService.runtime') ??\n DEFAULT_SONATAFLOW_RUNTIME;\n\n return {\n runtime,\n host,\n port,\n containerImage,\n resourcesPath,\n persistencePath,\n repoUrl,\n notificationsBearerToken,\n notificationsUrl,\n };\n }\n\n public async loadDevWorkflows() {\n if (!this.connection?.repoUrl || !this.connection?.resourcesPath) {\n this.logger.info(\n 'No Git repository or path configured. Skipping dev workflows loading.',\n );\n return;\n }\n\n this.logger.info(`Loading dev workflows from ${this.connection.repoUrl}`);\n const localPath = this.connection.resourcesPath;\n if (await fs.pathExists(localPath)) {\n this.logger.info(`Path ${localPath} already exists. Skipping clone.`);\n return;\n }\n\n await this.gitService.clone(this.connection.repoUrl, localPath);\n // Remove .git to avoid any submodule issues\n await fs.rm(join(localPath, '.git'), { recursive: true, force: true });\n }\n}\n"],"names":["GitService","executeWithRetry","spawn","resolve","join","DEFAULT_WORKFLOWS_PATH","fs","DEFAULT_SONATAFLOW_PERSISTENCE_PATH","DEFAULT_SONATAFLOW_BASE_URL","DEFAULT_SONATAFLOW_CONTAINER_IMAGE"],"mappings":"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"}
1
+ {"version":3,"file":"DevModeService.cjs.js","sources":["../../src/service/DevModeService.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 {\n DEFAULT_SONATAFLOW_BASE_URL,\n DEFAULT_SONATAFLOW_CONTAINER_IMAGE,\n DEFAULT_SONATAFLOW_PERSISTENCE_PATH,\n DEFAULT_WORKFLOWS_PATH,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { spawn } from 'child_process';\nimport { join, resolve } from 'path';\n\nimport { GitService } from './GitService';\nimport { executeWithRetry } from './Helper';\n\nconst SONATA_FLOW_RESOURCES_PATH =\n '/home/kogito/serverless-workflow-project/src/main/resources';\nconst DEFAULT_SONATAFLOW_RUNTIME = 'docker';\n\ninterface LauncherCommand {\n command: string;\n args: string[];\n}\n\ninterface DevModeConnectionConfig {\n host: string;\n port?: number;\n containerImage: string;\n resourcesPath: string;\n persistencePath?: string;\n repoUrl?: string;\n notificationsBearerToken?: string;\n notificationsUrl?: string;\n runtime: string;\n}\n\nexport class DevModeService {\n private readonly connection: DevModeConnectionConfig;\n private readonly gitService;\n\n constructor(\n config: Config,\n private readonly logger: LoggerService,\n ) {\n this.connection = this.extractConnectionConfig(config);\n this.gitService = new GitService(logger, config);\n }\n\n public get devModeUrl(): string {\n if (!this.connection.port) {\n return this.connection.host;\n }\n return `${this.connection.host}:${this.connection.port}`;\n }\n\n public async launchDevMode(): Promise<boolean> {\n await this.loadDevWorkflows();\n\n const isAlreadyUp = await this.isSonataFlowUp(false, this.devModeUrl);\n if (isAlreadyUp) {\n return true;\n }\n\n this.launchSonataFlow();\n\n return await this.isSonataFlowUp(true, this.devModeUrl);\n }\n\n private async isSonataFlowUp(\n withRetry: boolean,\n endpoint: string,\n ): Promise<boolean> {\n const healthUrl = `${endpoint}/q/health`;\n this.logger.info(`Checking SonataFlow health at: ${healthUrl}`);\n\n try {\n const response = await executeWithRetry(\n () => fetch(healthUrl),\n withRetry ? 15 : 1,\n );\n if (response.ok) {\n this.logger.info('SonataFlow is up and running');\n return true;\n }\n } catch (e) {\n this.logger.error(`Error when checking SonataFlow health: ${e}`);\n }\n return false;\n }\n\n private launchSonataFlow(): void {\n const launcherCmd = this.createLauncherCommand();\n\n this.logger.info(\n `Auto starting SonataFlow through: ${\n launcherCmd.command\n } ${launcherCmd.args.join(' ')}`,\n );\n\n const process = spawn(launcherCmd.command, launcherCmd.args, {\n shell: false,\n });\n\n process.on('close', code => {\n this.logger.info(`SonataFlow process exited with code ${code}`);\n });\n\n process.on('exit', code => {\n this.logger.info(`SonataFlow process exited with code ${code}`);\n });\n\n process.on('error', error => {\n this.logger.error(`SonataFlow process error: ${error}`);\n });\n }\n\n private createLauncherCommand(): LauncherCommand {\n const resourcesAbsPath = resolve(\n join(this.connection.resourcesPath, DEFAULT_WORKFLOWS_PATH),\n );\n\n const launcherArgs = [\n 'run',\n '--name',\n 'backstage-internal-sonataflow',\n ...(this.connection.runtime === 'podman'\n ? ['--replace']\n : ['--add-host', 'host.docker.internal:host-gateway']),\n ];\n\n // TODO: pass automatically a set of env variables from configuration, i.e. all config props with names starting at ENV_:\n // config: orchestrator.sonataFlowService.ENV_foo\n\n launcherArgs.push('-e', `QUARKUS_HTTP_PORT=${this.connection.port}`);\n\n launcherArgs.push('-p', `${this.connection.port}:${this.connection.port}`);\n launcherArgs.push('-e', `KOGITO_SERVICE_URL=${this.devModeUrl}`);\n launcherArgs.push(\n '-v',\n `${resourcesAbsPath}:${SONATA_FLOW_RESOURCES_PATH}:Z`,\n );\n if (this.connection?.persistencePath) {\n // if persistence is enabled, mount the volume and persist data across restarts\n const persistenceAbsPath = resolve(this.connection.persistencePath);\n this.logger.info(\n `Persistence is enabled, mounting ${persistenceAbsPath} as volume to persist data`,\n );\n if (!fs.existsSync(persistenceAbsPath)) {\n fs.mkdirSync(persistenceAbsPath, { recursive: true });\n }\n launcherArgs.push(\n '-v',\n `${persistenceAbsPath}:${DEFAULT_SONATAFLOW_PERSISTENCE_PATH}:Z`,\n );\n }\n launcherArgs.push('-e', 'KOGITO.CODEGEN.PROCESS.FAILONERROR=false');\n launcherArgs.push(\n '-e',\n `QUARKUS_EMBEDDED_POSTGRESQL_DATA_DIR=${DEFAULT_SONATAFLOW_PERSISTENCE_PATH}`,\n );\n launcherArgs.push(\n '-e',\n `NOTIFICATIONS_BEARER_TOKEN=${this.connection.notificationsBearerToken}`,\n );\n launcherArgs.push(\n '-e',\n `BACKSTAGE_NOTIFICATIONS_URL=${this.connection.notificationsUrl}`,\n );\n\n launcherArgs.push(this.connection.containerImage);\n\n return {\n command: this.connection.runtime,\n args: launcherArgs,\n };\n }\n\n private extractConnectionConfig(config: Config): DevModeConnectionConfig {\n const host =\n config.getOptionalString('orchestrator.sonataFlowService.baseUrl') ??\n DEFAULT_SONATAFLOW_BASE_URL;\n const port = config.getOptionalNumber(\n 'orchestrator.sonataFlowService.port',\n );\n\n const resourcesPath =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.workflowsSource.localPath',\n ) ?? '';\n\n const containerImage =\n config.getOptionalString('orchestrator.sonataFlowService.container') ??\n DEFAULT_SONATAFLOW_CONTAINER_IMAGE;\n\n const persistencePath =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.persistence.path',\n ) ?? '';\n\n const repoUrl =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.workflowsSource.gitRepositoryUrl',\n ) ?? '';\n\n const notificationsBearerToken =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.notificationsBearerToken',\n ) ?? '';\n\n const notificationsUrl =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.notificationsUrl',\n ) ?? '';\n\n const runtime =\n config.getOptionalString('orchestrator.sonataFlowService.runtime') ??\n DEFAULT_SONATAFLOW_RUNTIME;\n\n return {\n runtime,\n host,\n port,\n containerImage,\n resourcesPath,\n persistencePath,\n repoUrl,\n notificationsBearerToken,\n notificationsUrl,\n };\n }\n\n public async loadDevWorkflows() {\n if (!this.connection?.repoUrl || !this.connection?.resourcesPath) {\n this.logger.info(\n 'No Git repository or path configured. Skipping dev workflows loading.',\n );\n return;\n }\n\n this.logger.info(`Loading dev workflows from ${this.connection.repoUrl}`);\n const localPath = this.connection.resourcesPath;\n if (await fs.pathExists(localPath)) {\n this.logger.info(`Path ${localPath} already exists. Skipping clone.`);\n return;\n }\n\n await this.gitService.clone(this.connection.repoUrl, localPath);\n // Remove .git to avoid any submodule issues\n await fs.rm(join(localPath, '.git'), { recursive: true, force: true });\n }\n}\n"],"names":["GitService","executeWithRetry","spawn","resolve","join","DEFAULT_WORKFLOWS_PATH","fs","DEFAULT_SONATAFLOW_PERSISTENCE_PATH","DEFAULT_SONATAFLOW_BASE_URL","DEFAULT_SONATAFLOW_CONTAINER_IMAGE"],"mappings":"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"}
@@ -22,6 +22,7 @@ class Git {
22
22
  ...config.token ? { Authorization: `Bearer ${config.token}` } : {}
23
23
  };
24
24
  }
25
+ config;
25
26
  headers;
26
27
  async add(options) {
27
28
  const { dir, filepath } = options;
@@ -1 +1 @@
1
- {"version":3,"file":"git.cjs.js","sources":["../../../src/service/GitWrapper/git.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 */\n\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nimport fs from 'fs-extra';\nimport git, {\n AuthCallback,\n MergeResult,\n ProgressCallback,\n ReadCommitResult,\n} from 'isomorphic-git';\nimport http from 'isomorphic-git/http/node';\n\nfunction isAuthCallbackOptions(\n options: StaticAuthOptions | AuthCallbackOptions,\n): options is AuthCallbackOptions {\n return 'onAuth' in options;\n}\n\n/**\n * Configure static credential for authentication\n * @public\n */\nexport type StaticAuthOptions = {\n username?: string;\n password?: string;\n token?: string;\n logger?: LoggerService;\n};\n\n/**\n * Configure an authentication callback that can provide credentials on demand\n * @public\n */\nexport type AuthCallbackOptions = {\n onAuth: AuthCallback;\n logger?: LoggerService;\n};\n\n/*\nprovider username password\nAzure 'notempty' token\nBitbucket Cloud 'x-token-auth' token\nBitbucket Server username password or token\nGitHub 'x-access-token' token\nGitLab 'oauth2' token\nFrom : https://isomorphic-git.org/docs/en/onAuth with fix for GitHub\nOr token provided as `token` for Bearer auth header\ninstead of Basic Auth (e.g., Bitbucket Server).\n*/\n\n/**\n * A convenience wrapper around the `isomorphic-git` library.\n * @public\n */\n\nexport class Git {\n private readonly headers: {\n [x: string]: string;\n };\n\n private constructor(\n private readonly config: {\n onAuth: AuthCallback;\n token?: string;\n logger?: LoggerService;\n },\n ) {\n this.onAuth = config.onAuth;\n\n this.headers = {\n 'user-agent': 'git/@isomorphic-git',\n ...(config.token ? { Authorization: `Bearer ${config.token}` } : {}),\n };\n }\n\n async add(options: { dir: string; filepath: string }): Promise<void> {\n const { dir, filepath } = options;\n this.config.logger?.info(`Adding file {dir=${dir},filepath=${filepath}}`);\n\n return git.add({ fs, dir, filepath });\n }\n\n async addRemote(options: {\n dir: string;\n remote: string;\n url: string;\n force?: boolean;\n }): Promise<void> {\n const { dir, url, remote, force } = options;\n this.config.logger?.info(\n `Creating new remote {dir=${dir},remote=${remote},url=${url}}`,\n );\n return git.addRemote({ fs, dir, remote, url, force });\n }\n\n async deleteRemote(options: { dir: string; remote: string }): Promise<void> {\n const { dir, remote } = options;\n this.config.logger?.info(`Deleting remote {dir=${dir},remote=${remote}}`);\n return git.deleteRemote({ fs, dir, remote });\n }\n\n async checkout(options: { dir: string; ref: string }): Promise<void> {\n const { dir, ref } = options;\n this.config.logger?.info(`Checking out branch {dir=${dir},ref=${ref}}`);\n\n return git.checkout({ fs, dir, ref });\n }\n\n async branch(options: { dir: string; ref: string }): Promise<void> {\n const { dir, ref } = options;\n this.config.logger?.info(`Creating branch {dir=${dir},ref=${ref}`);\n\n return git.branch({ fs, dir, ref });\n }\n\n async commit(options: {\n dir: string;\n message: string;\n author: { name: string; email: string };\n committer: { name: string; email: string };\n }): Promise<string> {\n const { dir, message, author, committer } = options;\n this.config.logger?.info(\n `Committing file to repo {dir=${dir},message=${message}}`,\n );\n return git.commit({ fs, dir, message, author, committer });\n }\n\n /** https://isomorphic-git.org/docs/en/clone */\n async clone(options: {\n url: string;\n dir: string;\n ref?: string;\n depth?: number;\n noCheckout?: boolean;\n }): Promise<void> {\n const { url, dir, ref, depth, noCheckout } = options;\n this.config.logger?.info(`Cloning repo {dir=${dir},url=${url}}`);\n\n try {\n return await git.clone({\n fs,\n http,\n url,\n dir,\n ref,\n singleBranch: true,\n depth: depth ?? 1,\n noCheckout,\n onProgress: this.onProgressHandler(),\n headers: this.headers,\n onAuth: this.onAuth,\n });\n } catch (ex: any) {\n this.config.logger?.error(`Failed to clone repo {dir=${dir},url=${url}}`);\n if (ex.data) {\n throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);\n }\n throw ex;\n }\n }\n\n /** https://isomorphic-git.org/docs/en/currentBranch */\n async currentBranch(options: {\n dir: string;\n fullName?: boolean;\n }): Promise<string | undefined> {\n const { dir, fullName = false } = options;\n return git.currentBranch({ fs, dir, fullname: fullName }) as Promise<\n string | undefined\n >;\n }\n\n /** https://isomorphic-git.org/docs/en/fetch */\n async fetch(options: {\n dir: string;\n remote?: string;\n tags?: boolean;\n }): Promise<void> {\n const { dir, remote = 'origin', tags = false } = options;\n this.config.logger?.info(\n `Fetching remote=${remote} for repository {dir=${dir}}`,\n );\n\n try {\n await git.fetch({\n fs,\n http,\n dir,\n remote,\n tags,\n onProgress: this.onProgressHandler(),\n headers: this.headers,\n onAuth: this.onAuth,\n });\n } catch (ex: any) {\n this.config.logger?.error(\n `Failed to fetch repo {dir=${dir},remote=${remote}}`,\n );\n if (ex.data) {\n throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);\n }\n throw ex;\n }\n }\n\n async init(options: { dir: string; defaultBranch?: string }): Promise<void> {\n const { dir, defaultBranch = 'master' } = options;\n this.config.logger?.info(`Init git repository {dir=${dir}}`);\n\n return git.init({\n fs,\n dir,\n defaultBranch,\n });\n }\n\n /** https://isomorphic-git.org/docs/en/merge */\n async merge(options: {\n dir: string;\n theirs: string;\n ours?: string;\n author: { name: string; email: string };\n committer: { name: string; email: string };\n }): Promise<MergeResult> {\n const { dir, theirs, ours, author, committer } = options;\n this.config.logger?.info(\n `Merging branch '${theirs}' into '${ours}' for repository {dir=${dir}}`,\n );\n\n // If ours is undefined, current branch is used.\n return git.merge({\n fs,\n dir,\n ours,\n theirs,\n author,\n committer,\n });\n }\n\n async push(options: {\n dir: string;\n remote: string;\n remoteRef?: string;\n force?: boolean;\n }) {\n const { dir, remote, remoteRef, force } = options;\n this.config.logger?.info(\n `Pushing directory to remote {dir=${dir},remote=${remote}}`,\n );\n try {\n return await git.push({\n fs,\n dir,\n http,\n onProgress: this.onProgressHandler(),\n remoteRef,\n force,\n headers: this.headers,\n remote,\n onAuth: this.onAuth,\n });\n } catch (ex: any) {\n this.config.logger?.error(\n `Failed to push to repo {dir=${dir}, remote=${remote}}`,\n );\n if (ex.data) {\n throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);\n }\n throw ex;\n }\n }\n\n /** https://isomorphic-git.org/docs/en/readCommit */\n async readCommit(options: {\n dir: string;\n sha: string;\n }): Promise<ReadCommitResult> {\n const { dir, sha } = options;\n return git.readCommit({ fs, dir, oid: sha });\n }\n\n /** https://isomorphic-git.org/docs/en/remove */\n async remove(options: { dir: string; filepath: string }): Promise<void> {\n const { dir, filepath } = options;\n this.config.logger?.info(\n `Removing file from git index {dir=${dir},filepath=${filepath}}`,\n );\n return git.remove({ fs, dir, filepath });\n }\n\n /** https://isomorphic-git.org/docs/en/resolveRef */\n async resolveRef(options: { dir: string; ref: string }): Promise<string> {\n const { dir, ref } = options;\n return git.resolveRef({ fs, dir, ref });\n }\n\n /** https://isomorphic-git.org/docs/en/log */\n async log(options: {\n dir: string;\n ref?: string;\n }): Promise<ReadCommitResult[]> {\n const { dir, ref } = options;\n return git.log({\n fs,\n dir,\n ref: ref ?? 'HEAD',\n });\n }\n\n private readonly onAuth: AuthCallback;\n\n private readonly onProgressHandler = (): ProgressCallback => {\n let currentPhase = '';\n\n return event => {\n if (currentPhase !== event.phase) {\n currentPhase = event.phase;\n this.config.logger?.info(event.phase);\n }\n const total = event.total\n ? `${Math.round((event.loaded / event.total) * 100)}%`\n : event.loaded;\n this.config.logger?.debug(`status={${event.phase},total={${total}}}`);\n };\n };\n\n static readonly fromAuth = (\n options: StaticAuthOptions | AuthCallbackOptions,\n ) => {\n if (isAuthCallbackOptions(options)) {\n const { onAuth, logger } = options;\n return new Git({ onAuth, logger });\n }\n\n const { username, password, token, logger } = options;\n return new Git({ onAuth: () => ({ username, password }), token, logger });\n };\n}\n"],"names":["git","fs","http","logger"],"mappings":"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"}
1
+ {"version":3,"file":"git.cjs.js","sources":["../../../src/service/GitWrapper/git.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 */\n\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nimport fs from 'fs-extra';\nimport git, {\n AuthCallback,\n MergeResult,\n ProgressCallback,\n ReadCommitResult,\n} from 'isomorphic-git';\nimport http from 'isomorphic-git/http/node';\n\nfunction isAuthCallbackOptions(\n options: StaticAuthOptions | AuthCallbackOptions,\n): options is AuthCallbackOptions {\n return 'onAuth' in options;\n}\n\n/**\n * Configure static credential for authentication\n * @public\n */\nexport type StaticAuthOptions = {\n username?: string;\n password?: string;\n token?: string;\n logger?: LoggerService;\n};\n\n/**\n * Configure an authentication callback that can provide credentials on demand\n * @public\n */\nexport type AuthCallbackOptions = {\n onAuth: AuthCallback;\n logger?: LoggerService;\n};\n\n/*\nprovider username password\nAzure 'notempty' token\nBitbucket Cloud 'x-token-auth' token\nBitbucket Server username password or token\nGitHub 'x-access-token' token\nGitLab 'oauth2' token\nFrom : https://isomorphic-git.org/docs/en/onAuth with fix for GitHub\nOr token provided as `token` for Bearer auth header\ninstead of Basic Auth (e.g., Bitbucket Server).\n*/\n\n/**\n * A convenience wrapper around the `isomorphic-git` library.\n * @public\n */\n\nexport class Git {\n private readonly headers: {\n [x: string]: string;\n };\n\n private constructor(\n private readonly config: {\n onAuth: AuthCallback;\n token?: string;\n logger?: LoggerService;\n },\n ) {\n this.onAuth = config.onAuth;\n\n this.headers = {\n 'user-agent': 'git/@isomorphic-git',\n ...(config.token ? { Authorization: `Bearer ${config.token}` } : {}),\n };\n }\n\n async add(options: { dir: string; filepath: string }): Promise<void> {\n const { dir, filepath } = options;\n this.config.logger?.info(`Adding file {dir=${dir},filepath=${filepath}}`);\n\n return git.add({ fs, dir, filepath });\n }\n\n async addRemote(options: {\n dir: string;\n remote: string;\n url: string;\n force?: boolean;\n }): Promise<void> {\n const { dir, url, remote, force } = options;\n this.config.logger?.info(\n `Creating new remote {dir=${dir},remote=${remote},url=${url}}`,\n );\n return git.addRemote({ fs, dir, remote, url, force });\n }\n\n async deleteRemote(options: { dir: string; remote: string }): Promise<void> {\n const { dir, remote } = options;\n this.config.logger?.info(`Deleting remote {dir=${dir},remote=${remote}}`);\n return git.deleteRemote({ fs, dir, remote });\n }\n\n async checkout(options: { dir: string; ref: string }): Promise<void> {\n const { dir, ref } = options;\n this.config.logger?.info(`Checking out branch {dir=${dir},ref=${ref}}`);\n\n return git.checkout({ fs, dir, ref });\n }\n\n async branch(options: { dir: string; ref: string }): Promise<void> {\n const { dir, ref } = options;\n this.config.logger?.info(`Creating branch {dir=${dir},ref=${ref}`);\n\n return git.branch({ fs, dir, ref });\n }\n\n async commit(options: {\n dir: string;\n message: string;\n author: { name: string; email: string };\n committer: { name: string; email: string };\n }): Promise<string> {\n const { dir, message, author, committer } = options;\n this.config.logger?.info(\n `Committing file to repo {dir=${dir},message=${message}}`,\n );\n return git.commit({ fs, dir, message, author, committer });\n }\n\n /** https://isomorphic-git.org/docs/en/clone */\n async clone(options: {\n url: string;\n dir: string;\n ref?: string;\n depth?: number;\n noCheckout?: boolean;\n }): Promise<void> {\n const { url, dir, ref, depth, noCheckout } = options;\n this.config.logger?.info(`Cloning repo {dir=${dir},url=${url}}`);\n\n try {\n return await git.clone({\n fs,\n http,\n url,\n dir,\n ref,\n singleBranch: true,\n depth: depth ?? 1,\n noCheckout,\n onProgress: this.onProgressHandler(),\n headers: this.headers,\n onAuth: this.onAuth,\n });\n } catch (ex: any) {\n this.config.logger?.error(`Failed to clone repo {dir=${dir},url=${url}}`);\n if (ex.data) {\n throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);\n }\n throw ex;\n }\n }\n\n /** https://isomorphic-git.org/docs/en/currentBranch */\n async currentBranch(options: {\n dir: string;\n fullName?: boolean;\n }): Promise<string | undefined> {\n const { dir, fullName = false } = options;\n return git.currentBranch({ fs, dir, fullname: fullName }) as Promise<\n string | undefined\n >;\n }\n\n /** https://isomorphic-git.org/docs/en/fetch */\n async fetch(options: {\n dir: string;\n remote?: string;\n tags?: boolean;\n }): Promise<void> {\n const { dir, remote = 'origin', tags = false } = options;\n this.config.logger?.info(\n `Fetching remote=${remote} for repository {dir=${dir}}`,\n );\n\n try {\n await git.fetch({\n fs,\n http,\n dir,\n remote,\n tags,\n onProgress: this.onProgressHandler(),\n headers: this.headers,\n onAuth: this.onAuth,\n });\n } catch (ex: any) {\n this.config.logger?.error(\n `Failed to fetch repo {dir=${dir},remote=${remote}}`,\n );\n if (ex.data) {\n throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);\n }\n throw ex;\n }\n }\n\n async init(options: { dir: string; defaultBranch?: string }): Promise<void> {\n const { dir, defaultBranch = 'master' } = options;\n this.config.logger?.info(`Init git repository {dir=${dir}}`);\n\n return git.init({\n fs,\n dir,\n defaultBranch,\n });\n }\n\n /** https://isomorphic-git.org/docs/en/merge */\n async merge(options: {\n dir: string;\n theirs: string;\n ours?: string;\n author: { name: string; email: string };\n committer: { name: string; email: string };\n }): Promise<MergeResult> {\n const { dir, theirs, ours, author, committer } = options;\n this.config.logger?.info(\n `Merging branch '${theirs}' into '${ours}' for repository {dir=${dir}}`,\n );\n\n // If ours is undefined, current branch is used.\n return git.merge({\n fs,\n dir,\n ours,\n theirs,\n author,\n committer,\n });\n }\n\n async push(options: {\n dir: string;\n remote: string;\n remoteRef?: string;\n force?: boolean;\n }) {\n const { dir, remote, remoteRef, force } = options;\n this.config.logger?.info(\n `Pushing directory to remote {dir=${dir},remote=${remote}}`,\n );\n try {\n return await git.push({\n fs,\n dir,\n http,\n onProgress: this.onProgressHandler(),\n remoteRef,\n force,\n headers: this.headers,\n remote,\n onAuth: this.onAuth,\n });\n } catch (ex: any) {\n this.config.logger?.error(\n `Failed to push to repo {dir=${dir}, remote=${remote}}`,\n );\n if (ex.data) {\n throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);\n }\n throw ex;\n }\n }\n\n /** https://isomorphic-git.org/docs/en/readCommit */\n async readCommit(options: {\n dir: string;\n sha: string;\n }): Promise<ReadCommitResult> {\n const { dir, sha } = options;\n return git.readCommit({ fs, dir, oid: sha });\n }\n\n /** https://isomorphic-git.org/docs/en/remove */\n async remove(options: { dir: string; filepath: string }): Promise<void> {\n const { dir, filepath } = options;\n this.config.logger?.info(\n `Removing file from git index {dir=${dir},filepath=${filepath}}`,\n );\n return git.remove({ fs, dir, filepath });\n }\n\n /** https://isomorphic-git.org/docs/en/resolveRef */\n async resolveRef(options: { dir: string; ref: string }): Promise<string> {\n const { dir, ref } = options;\n return git.resolveRef({ fs, dir, ref });\n }\n\n /** https://isomorphic-git.org/docs/en/log */\n async log(options: {\n dir: string;\n ref?: string;\n }): Promise<ReadCommitResult[]> {\n const { dir, ref } = options;\n return git.log({\n fs,\n dir,\n ref: ref ?? 'HEAD',\n });\n }\n\n private readonly onAuth: AuthCallback;\n\n private readonly onProgressHandler = (): ProgressCallback => {\n let currentPhase = '';\n\n return event => {\n if (currentPhase !== event.phase) {\n currentPhase = event.phase;\n this.config.logger?.info(event.phase);\n }\n const total = event.total\n ? `${Math.round((event.loaded / event.total) * 100)}%`\n : event.loaded;\n this.config.logger?.debug(`status={${event.phase},total={${total}}}`);\n };\n };\n\n static readonly fromAuth = (\n options: StaticAuthOptions | AuthCallbackOptions,\n ) => {\n if (isAuthCallbackOptions(options)) {\n const { onAuth, logger } = options;\n return new Git({ onAuth, logger });\n }\n\n const { username, password, token, logger } = options;\n return new Git({ onAuth: () => ({ username, password }), token, logger });\n };\n}\n"],"names":["git","fs","http","logger"],"mappings":"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"}
@@ -7,6 +7,10 @@ class OrchestratorService {
7
7
  this.workflowCacheService = workflowCacheService;
8
8
  this.workflowLogProvider = workflowLogProvider;
9
9
  }
10
+ sonataFlowService;
11
+ dataIndexService;
12
+ workflowCacheService;
13
+ workflowLogProvider;
10
14
  // Data Index Service Wrapper
11
15
  getWorkflowIds() {
12
16
  return this.workflowCacheService.definitionIds;
@@ -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 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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"}
@@ -12,6 +12,8 @@ class SonataFlowService {
12
12
  this.dataIndexService = dataIndexService;
13
13
  this.logger = logger;
14
14
  }
15
+ dataIndexService;
16
+ logger;
15
17
  async fetchWorkflowInfoOnService(args) {
16
18
  const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}`;
17
19
  let response;
@@ -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 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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"}
@@ -6,6 +6,9 @@ class WorkflowCacheService {
6
6
  this.dataIndexService = dataIndexService;
7
7
  this.sonataFlowService = sonataFlowService;
8
8
  }
9
+ logger;
10
+ dataIndexService;
11
+ sonataFlowService;
9
12
  TASK_ID = "task__Orchestrator__WorkflowCacheService";
10
13
  DEFAULT_FREQUENCY_IN_SECONDS = 5;
11
14
  DEFAULT_TIMEOUT_IN_MINUTES = 10;
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowCacheService.cjs.js","sources":["../../src/service/WorkflowCacheService.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoggerService, SchedulerService } from '@backstage/backend-plugin-api';\n\nimport { DataIndexService } from './DataIndexService';\nimport { SonataFlowService } from './SonataFlowService';\n\nexport type CacheHandler = 'skip' | 'throw';\n\nexport class WorkflowCacheService {\n private readonly TASK_ID = 'task__Orchestrator__WorkflowCacheService';\n private readonly DEFAULT_FREQUENCY_IN_SECONDS = 5;\n private readonly DEFAULT_TIMEOUT_IN_MINUTES = 10;\n private readonly definitionIdCache = new Set<string>();\n private readonly unavailableDefinitionIdCache = new Set<string>();\n\n constructor(\n private readonly logger: LoggerService,\n private readonly dataIndexService: DataIndexService,\n private readonly sonataFlowService: SonataFlowService,\n ) {}\n\n public get definitionIds(): string[] {\n return Array.from(this.definitionIdCache);\n }\n\n public get unavailableDefinitionIds(): string[] {\n return Array.from(this.unavailableDefinitionIdCache);\n }\n\n private isEmpty(): boolean {\n return (\n this.definitionIdCache.size === 0 &&\n this.unavailableDefinitionIdCache.size === 0\n );\n }\n\n public isAvailable(\n definitionId?: string,\n cacheHandler: CacheHandler = 'skip',\n ): boolean {\n if (!definitionId) {\n return false;\n }\n const isAvailable = this.definitionIdCache.has(definitionId);\n if (!isAvailable && cacheHandler === 'throw') {\n throw new Error(\n `Workflow service \"${definitionId}\" not available at the moment`,\n );\n }\n return isAvailable;\n }\n\n public schedule(args: {\n scheduler: SchedulerService;\n frequencyInSeconds?: number;\n timeoutInMinutes?: number;\n }): void {\n const {\n scheduler,\n frequencyInSeconds = this.DEFAULT_FREQUENCY_IN_SECONDS,\n timeoutInMinutes = this.DEFAULT_TIMEOUT_IN_MINUTES,\n } = args;\n\n scheduler.scheduleTask({\n id: this.TASK_ID,\n frequency: { seconds: frequencyInSeconds },\n timeout: { minutes: timeoutInMinutes },\n fn: async () => {\n await this.runTask();\n },\n });\n }\n\n private async runTask() {\n try {\n const idUrlMap = await this.dataIndexService.fetchWorkflowServiceUrls();\n this.definitionIdCache.forEach(definitionId => {\n if (!idUrlMap[definitionId]) {\n this.definitionIdCache.delete(definitionId);\n }\n });\n this.unavailableDefinitionIdCache.forEach(definitionId => {\n if (!idUrlMap[definitionId]) {\n this.unavailableDefinitionIdCache.delete(definitionId);\n }\n });\n await Promise.all(\n Object.entries(idUrlMap).map(async ([definitionId, serviceUrl]) => {\n let isServiceUp = false;\n try {\n isServiceUp = await this.sonataFlowService.pingWorkflowService({\n definitionId,\n serviceUrl,\n });\n } catch (err) {\n this.logger.error(\n `Ping workflow ${definitionId} service threw error: ${err}`,\n );\n }\n if (isServiceUp) {\n this.definitionIdCache.add(definitionId);\n this.unavailableDefinitionIdCache.delete(definitionId);\n } else {\n this.logger.error(\n `Failed to ping service for workflow ${definitionId} at ${serviceUrl}`,\n );\n if (this.definitionIdCache.has(definitionId)) {\n this.definitionIdCache.delete(definitionId);\n }\n this.unavailableDefinitionIdCache.add(definitionId);\n }\n }),\n );\n\n const workflowDefinitionIds = this.isEmpty()\n ? 'empty cache'\n : Array.from(this.definitionIdCache)\n .concat(Array.from(this.unavailableDefinitionIdCache))\n .join(', ');\n\n this.logger.debug(\n `${this.TASK_ID} updated the workflow definition ID cache to: ${workflowDefinitionIds}`,\n );\n } catch (error) {\n this.logger.error(`Error running ${this.TASK_ID}: ${error}`);\n return;\n }\n }\n}\n"],"names":[],"mappings":";;AAuBO,MAAM,oBAAA,CAAqB;AAAA,EAOhC,WAAA,CACmB,MAAA,EACA,gBAAA,EACA,iBAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA;AAAA,EAChB;AAAA,EAVc,OAAA,GAAU,0CAAA;AAAA,EACV,4BAAA,GAA+B,CAAA;AAAA,EAC/B,0BAAA,GAA6B,EAAA;AAAA,EAC7B,iBAAA,uBAAwB,GAAA,EAAY;AAAA,EACpC,4BAAA,uBAAmC,GAAA,EAAY;AAAA,EAQhE,IAAW,aAAA,GAA0B;AACnC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,iBAAiB,CAAA;AAAA,EAC1C;AAAA,EAEA,IAAW,wBAAA,GAAqC;AAC9C,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,4BAA4B,CAAA;AAAA,EACrD;AAAA,EAEQ,OAAA,GAAmB;AACzB,IAAA,OACE,KAAK,iBAAA,CAAkB,IAAA,KAAS,CAAA,IAChC,IAAA,CAAK,6BAA6B,IAAA,KAAS,CAAA;AAAA,EAE/C;AAAA,EAEO,WAAA,CACL,YAAA,EACA,YAAA,GAA6B,MAAA,EACpB;AACT,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,YAAY,CAAA;AAC3D,IAAA,IAAI,CAAC,WAAA,IAAe,YAAA,KAAiB,OAAA,EAAS;AAC5C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,qBAAqB,YAAY,CAAA,6BAAA;AAAA,OACnC;AAAA,IACF;AACA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEO,SAAS,IAAA,EAIP;AACP,IAAA,MAAM;AAAA,MACJ,SAAA;AAAA,MACA,qBAAqB,IAAA,CAAK,4BAAA;AAAA,MAC1B,mBAAmB,IAAA,CAAK;AAAA,KAC1B,GAAI,IAAA;AAEJ,IAAA,SAAA,CAAU,YAAA,CAAa;AAAA,MACrB,IAAI,IAAA,CAAK,OAAA;AAAA,MACT,SAAA,EAAW,EAAE,OAAA,EAAS,kBAAA,EAAmB;AAAA,MACzC,OAAA,EAAS,EAAE,OAAA,EAAS,gBAAA,EAAiB;AAAA,MACrC,IAAI,YAAY;AACd,QAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,MACrB;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,OAAA,GAAU;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,gBAAA,CAAiB,wBAAA,EAAyB;AACtE,MAAA,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA,YAAA,KAAgB;AAC7C,QAAA,IAAI,CAAC,QAAA,CAAS,YAAY,CAAA,EAAG;AAC3B,UAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,YAAY,CAAA;AAAA,QAC5C;AAAA,MACF,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,4BAAA,CAA6B,QAAQ,CAAA,YAAA,KAAgB;AACxD,QAAA,IAAI,CAAC,QAAA,CAAS,YAAY,CAAA,EAAG;AAC3B,UAAA,IAAA,CAAK,4BAAA,CAA6B,OAAO,YAAY,CAAA;AAAA,QACvD;AAAA,MACF,CAAC,CAAA;AACD,MAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,QACZ,MAAA,CAAO,QAAQ,QAAQ,CAAA,CAAE,IAAI,OAAO,CAAC,YAAA,EAAc,UAAU,CAAA,KAAM;AACjE,UAAA,IAAI,WAAA,GAAc,KAAA;AAClB,UAAA,IAAI;AACF,YAAA,WAAA,GAAc,MAAM,IAAA,CAAK,iBAAA,CAAkB,mBAAA,CAAoB;AAAA,cAC7D,YAAA;AAAA,cACA;AAAA,aACD,CAAA;AAAA,UACH,SAAS,GAAA,EAAK;AACZ,YAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,cACV,CAAA,cAAA,EAAiB,YAAY,CAAA,sBAAA,EAAyB,GAAG,CAAA;AAAA,aAC3D;AAAA,UACF;AACA,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,IAAA,CAAK,iBAAA,CAAkB,IAAI,YAAY,CAAA;AACvC,YAAA,IAAA,CAAK,4BAAA,CAA6B,OAAO,YAAY,CAAA;AAAA,UACvD,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,cACV,CAAA,oCAAA,EAAuC,YAAY,CAAA,IAAA,EAAO,UAAU,CAAA;AAAA,aACtE;AACA,YAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,YAAY,CAAA,EAAG;AAC5C,cAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,YAAY,CAAA;AAAA,YAC5C;AACA,YAAA,IAAA,CAAK,4BAAA,CAA6B,IAAI,YAAY,CAAA;AAAA,UACpD;AAAA,QACF,CAAC;AAAA,OACH;AAEA,MAAA,MAAM,wBAAwB,IAAA,CAAK,OAAA,KAC/B,aAAA,GACA,KAAA,CAAM,KAAK,IAAA,CAAK,iBAAiB,CAAA,CAC9B,MAAA,CAAO,MAAM,IAAA,CAAK,IAAA,CAAK,4BAA4B,CAAC,CAAA,CACpD,KAAK,IAAI,CAAA;AAEhB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,8CAAA,EAAiD,qBAAqB,CAAA;AAAA,OACvF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,cAAA,EAAiB,KAAK,OAAO,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAC3D,MAAA;AAAA,IACF;AAAA,EACF;AACF;;;;"}
1
+ {"version":3,"file":"WorkflowCacheService.cjs.js","sources":["../../src/service/WorkflowCacheService.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoggerService, SchedulerService } from '@backstage/backend-plugin-api';\n\nimport { DataIndexService } from './DataIndexService';\nimport { SonataFlowService } from './SonataFlowService';\n\nexport type CacheHandler = 'skip' | 'throw';\n\nexport class WorkflowCacheService {\n private readonly TASK_ID = 'task__Orchestrator__WorkflowCacheService';\n private readonly DEFAULT_FREQUENCY_IN_SECONDS = 5;\n private readonly DEFAULT_TIMEOUT_IN_MINUTES = 10;\n private readonly definitionIdCache = new Set<string>();\n private readonly unavailableDefinitionIdCache = new Set<string>();\n\n constructor(\n private readonly logger: LoggerService,\n private readonly dataIndexService: DataIndexService,\n private readonly sonataFlowService: SonataFlowService,\n ) {}\n\n public get definitionIds(): string[] {\n return Array.from(this.definitionIdCache);\n }\n\n public get unavailableDefinitionIds(): string[] {\n return Array.from(this.unavailableDefinitionIdCache);\n }\n\n private isEmpty(): boolean {\n return (\n this.definitionIdCache.size === 0 &&\n this.unavailableDefinitionIdCache.size === 0\n );\n }\n\n public isAvailable(\n definitionId?: string,\n cacheHandler: CacheHandler = 'skip',\n ): boolean {\n if (!definitionId) {\n return false;\n }\n const isAvailable = this.definitionIdCache.has(definitionId);\n if (!isAvailable && cacheHandler === 'throw') {\n throw new Error(\n `Workflow service \"${definitionId}\" not available at the moment`,\n );\n }\n return isAvailable;\n }\n\n public schedule(args: {\n scheduler: SchedulerService;\n frequencyInSeconds?: number;\n timeoutInMinutes?: number;\n }): void {\n const {\n scheduler,\n frequencyInSeconds = this.DEFAULT_FREQUENCY_IN_SECONDS,\n timeoutInMinutes = this.DEFAULT_TIMEOUT_IN_MINUTES,\n } = args;\n\n scheduler.scheduleTask({\n id: this.TASK_ID,\n frequency: { seconds: frequencyInSeconds },\n timeout: { minutes: timeoutInMinutes },\n fn: async () => {\n await this.runTask();\n },\n });\n }\n\n private async runTask() {\n try {\n const idUrlMap = await this.dataIndexService.fetchWorkflowServiceUrls();\n this.definitionIdCache.forEach(definitionId => {\n if (!idUrlMap[definitionId]) {\n this.definitionIdCache.delete(definitionId);\n }\n });\n this.unavailableDefinitionIdCache.forEach(definitionId => {\n if (!idUrlMap[definitionId]) {\n this.unavailableDefinitionIdCache.delete(definitionId);\n }\n });\n await Promise.all(\n Object.entries(idUrlMap).map(async ([definitionId, serviceUrl]) => {\n let isServiceUp = false;\n try {\n isServiceUp = await this.sonataFlowService.pingWorkflowService({\n definitionId,\n serviceUrl,\n });\n } catch (err) {\n this.logger.error(\n `Ping workflow ${definitionId} service threw error: ${err}`,\n );\n }\n if (isServiceUp) {\n this.definitionIdCache.add(definitionId);\n this.unavailableDefinitionIdCache.delete(definitionId);\n } else {\n this.logger.error(\n `Failed to ping service for workflow ${definitionId} at ${serviceUrl}`,\n );\n if (this.definitionIdCache.has(definitionId)) {\n this.definitionIdCache.delete(definitionId);\n }\n this.unavailableDefinitionIdCache.add(definitionId);\n }\n }),\n );\n\n const workflowDefinitionIds = this.isEmpty()\n ? 'empty cache'\n : Array.from(this.definitionIdCache)\n .concat(Array.from(this.unavailableDefinitionIdCache))\n .join(', ');\n\n this.logger.debug(\n `${this.TASK_ID} updated the workflow definition ID cache to: ${workflowDefinitionIds}`,\n );\n } catch (error) {\n this.logger.error(`Error running ${this.TASK_ID}: ${error}`);\n return;\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ class V2 {
10
10
  constructor(orchestratorService) {
11
11
  this.orchestratorService = orchestratorService;
12
12
  }
13
+ orchestratorService;
13
14
  async getWorkflowsOverviewForEntity(targetEntity, annotationWorkflowIds) {
14
15
  let combinedWorkflowIds = annotationWorkflowIds;
15
16
  if (targetEntity) {
@@ -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":["/*\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":";;;;;;AA8CA,MAAM,2BAAA,GAA8B,EAAA;AACpC,MAAM,6BAAA,GAAgC,GAAA;AAE/B,MAAM,EAAA,CAAG;AAAA,EACd,YAA6B,mBAAA,EAA0C;AAA1C,IAAA,IAAA,CAAA,mBAAA,GAAA,mBAAA;AAAA,EAA2C;AAAA,EAA3C,mBAAA;AAAA,EAE7B,MAAa,6BAAA,CACX,YAAA,EACA,qBAAA,EACwC;AACxC,IAAA,IAAI,mBAAA,GAAgC,qBAAA;AAEpC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,0BAAA,GACJ,MAAM,IAAA,CAAK,mBAAA,CAAoB,+BAAA,CAAgC;AAAA,QAC7D;AAAA,OACD,CAAA;AAEH,MAAA,IAAI,0BAAA,CAA2B,SAAS,CAAA,EAAG;AACzC,QAAA,mBAAA,GAAsB,KAAA,CAAM,IAAA;AAAA,8BACtB,GAAA,CAAI,CAAC,GAAG,mBAAA,EAAqB,GAAG,0BAA0B,CAAC;AAAA,SACjE;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,mBAAA,CAAoB,WAAW,CAAA,EAAG;AACpC,MAAA,OAAO;AAAA,QACL,WAAW;AAAC,OACd;AAAA,IACF;AAEA,IAAA,MAAM,iBAAA,GAA4B;AAAA,MAChC,KAAA,EAAO,IAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AAEA,IAAA,OAAO,IAAA,CAAK,oBAAA;AAAA,MACV,MAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAa,oBAAA,CACX,UAAA,EACA,MAAA,EACA,YAAA,EACwC;AACxC,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,mBAAA,CAAoB,sBAAA,CAAuB;AAAA,MACtE,UAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AACA,IAAA,MAAM,MAAA,GAAwC;AAAA,MAC5C,WAAW,SAAA,CAAU,GAAA,CAAI,CAAA,IAAA,KAAQA,mCAAA,CAAyB,IAAI,CAAC,CAAA;AAAA,MAC/D,cAAA,EAAgB;AAAA,QACd,UAAU,UAAA,EAAY,KAAA;AAAA,QACtB,QAAQ,UAAA,EAAY;AAAA;AACtB,KACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEO,cAAA,GAA2B;AAChC,IAAA,OAAO,IAAA,CAAK,oBAAoB,cAAA,EAAe;AAAA,EACjD;AAAA,EAEA,MAAa,wBACX,UAAA,EAC8B;AAC9B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,mBAAA,CAAoB,qBAAA,CAAsB;AAAA,MACpE,YAAA,EAAc;AAAA,KACf,CAAA;AAED,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,UAAU,CAAA,CAAE,CAAA;AAAA,IACtE;AACA,IAAA,OAAOA,oCAAyB,QAAQ,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAa,gBAAgB,UAAA,EAA0C;AACrE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,CAAsB,UAAU,CAAA;AAC5D,IAAA,OAAOC,4BAAiB,QAAQ,CAAA;AAAA,EAClC;AAAA,EAEA,MAAa,sBAAsB,UAAA,EAAqC;AACtE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,mBAAA,CAAoB,mBAAA,CAAoB;AAAA,MAChE,YAAA,EAAc;AAAA,KACf,CAAA;AAED,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,UAAU,CAAA,CAAE,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAa,YAAA,CACX,UAAA,EACA,MAAA,EACA,WAAA,EACuC;AACvC,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,mBAAA,CAAoB,cAAA,CAAe;AAAA,MAC9D,UAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,MAAA,GAAuC;AAAA,MAC3C,KAAA,EAAO,SAAA,EAAW,GAAA,CAAIC,kCAAuB,CAAA;AAAA,MAC7C,cAAA,EAAgB;AAAA,QACd,UAAU,UAAA,EAAY,KAAA;AAAA,QACtB,QAAQ,UAAA,EAAY;AAAA;AACtB,KACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAa,gBACX,UAAA,EAC6B;AAC7B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,mBAAA,CAAoB,aAAA,CAAc;AAAA,MAC5D;AAAA,KACD,CAAA;AAED,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,UAAU,CAAA,CAAE,CAAA;AAAA,IACjE;AAEA,IAAA,OAAOA,mCAAwB,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,MAAa,0BACX,QAAA,EAC+B;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,mBAAA,CAAoB,2BAAA,CAA4B;AAAA,MACtE;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAa,eAAA,CACX,yBAAA,EACA,UAAA,EACA,iBACA,cAAA,EACqC;AACrC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,mBAAA,CAAoB,iBAAA,CAAkB;AAAA,MAClE,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,UAAU,CAAA,CAAE,CAAA;AAAA,IACxE;AACA,IAAA,IAAI,CAAC,WAAW,UAAA,EAAY;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,UAAU,CAAA,CAAE,CAAA;AAAA,IACxE;AACA,IAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,mBAAA,CAAoB,eAAA,CAAgB;AAAA,MACvE,YAAA,EAAc,UAAA;AAAA,MACd,SAAA,EAAW;AAAA,QACT,cAAc,yBAAA,CAA0B,SAAA;AAAA,QACxC,eAAA;AAAA,QACA,cAAc,yBAAA,CAA0B;AAAA,OAC1C;AAAA,MACA,YAAY,yBAAA,CAA0B,UAAA;AAAA,MACtC,YAAY,UAAA,CAAW,UAAA;AAAA,MACvB;AAAA,KACD,CAAA;AAED,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,UAAU,CAAA,CAAE,CAAA;AAAA,IAC3D;AAGA,IAAA,MAAMC,yBAAA,CAAmB;AAAA,MACvB,OAAA,EAAS,MACP,IAAA,CAAK,mBAAA,CAAoB,aAAA,CAAc;AAAA,QACrC,YAAY,iBAAA,CAAkB;AAAA,OAC/B,CAAA;AAAA,MACH,WAAA,EAAa,2BAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAClE;AAEA,IAAA,OAAOC,0CAAA,CAAgC,YAAY,iBAAiB,CAAA;AAAA,EACtE;AAAA,EAEA,MAAa,iBAAA,CACX,UAAA,EACA,UAAA,EACA,6BACA,cAAA,EACe;AACf,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,mBAAA,CAAoB,iBAAA,CAAkB;AAAA,MAClE,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,UAAU,CAAA,CAAE,CAAA;AAAA,IACxE;AACA,IAAA,IAAI,CAAC,WAAW,UAAA,EAAY;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,UAAU,CAAA,CAAE,CAAA;AAAA,IACxE;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,mBAAA,CAAoB,iBAAA,CAAkB;AAAA,MAChE,YAAA,EAAc,UAAA;AAAA,MACd,UAAA;AAAA,MACA,YAAY,UAAA,CAAW,UAAA;AAAA,MACvB,YAAY,2BAAA,CAA4B,UAAA;AAAA,MACxC;AAAA,KACD,CAAA;AAED,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,4BAAA,EAA+B,UAAU,CAAA,aAAA,EAAgB,UAAU,CAAA;AAAA,OACrE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,aAAA,CACX,UAAA,EACA,UAAA,EACiB;AACjB,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,mBAAA,CAAoB,iBAAA,CAAkB;AAAA,MAClE,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,UAAU,CAAA,CAAE,CAAA;AAAA,IACxE;AACA,IAAA,IAAI,CAAC,WAAW,UAAA,EAAY;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,UAAU,CAAA,CAAE,CAAA;AAAA,IACxE;AACA,IAAA,MAAM,IAAA,CAAK,oBAAoB,qBAAA,CAAsB;AAAA,MACnD,YAAA,EAAc,UAAA;AAAA,MACd,UAAA;AAAA,MACA,YAAY,UAAA,CAAW;AAAA,KACxB,CAAA;AACD,IAAA,OAAO,qBAAqB,UAAU,CAAA,qBAAA,CAAA;AAAA,EACxC;AAAA,EAEA,MAAa,mBAAA,GAAuD;AAClE,IAAA,OAAO;AAAA,MACLC,sDAAA,CAAqB,MAAA;AAAA,MACrBA,sDAAA,CAAqB,KAAA;AAAA,MACrBA,sDAAA,CAAqB,SAAA;AAAA,MACrBA,sDAAA,CAAqB,OAAA;AAAA,MACrBA,sDAAA,CAAqB,SAAA;AAAA,MACrBA,sDAAA,CAAqB;AAAA,KACvB,CAAE,GAAA,CAAI,CAAA,MAAA,KAAUC,oCAAA,CAA0B,MAAM,CAAC,CAAA;AAAA,EACnD;AAAA,EAEA,MAAa,0BAAA,CACX,UAAA,EACA,UAAA,EACmC;AACnC,IAAA,OAAO,IAAA,CAAK,oBAAoB,0BAAA,CAA2B;AAAA,MACzD,YAAA,EAAc,UAAA;AAAA,MACd;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAa,oBACX,UAAA,EAC8B;AAC9B,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,mBAAA,CAAoB,iBAAA,CAAkB;AAAA,MAClE,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,UAAU,CAAA,CAAE,CAAA;AAAA,IACxE;AACA,IAAA,IAAI,CAAC,WAAW,UAAA,EAAY;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,UAAU,CAAA,CAAE,CAAA;AAAA,IACxE;AACA,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,mBAAA,CAAoB,mBAAA,CAAoB;AAAA,MACxE,YAAA,EAAc,UAAA;AAAA,MACd,YAAY,UAAA,CAAW;AAAA,KACxB,CAAA;AACD,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,iCAAiC,UAAU,CAAA,IAAA,EAAO,UAAA,CAAW,UAAU,yBAAyB,UAAU,CAAA,gCAAA;AAAA,OAC5G;AAAA,IACF;AACA,IAAA,OAAO,cAAA;AAAA,EACT;AAAA,EAEO,iBAAA,CACL,KACA,GAAA,EACoB;AACpB,IAAA,OAAO,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,EACtB;AACF;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@red-hat-developer-hub/backstage-plugin-orchestrator-backend",
3
- "version": "8.7.3",
3
+ "version": "8.8.0",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.cjs.js",
6
6
  "types": "./dist/index.d.ts",
@@ -71,19 +71,19 @@
71
71
  "export-dynamic": "janus-cli package export-dynamic-plugin"
72
72
  },
73
73
  "dependencies": {
74
- "@backstage/backend-defaults": "^0.15.1",
75
- "@backstage/backend-plugin-api": "^1.6.2",
76
- "@backstage/catalog-client": "^1.12.1",
77
- "@backstage/core-plugin-api": "^1.12.2",
74
+ "@backstage/backend-defaults": "^0.16.0",
75
+ "@backstage/backend-plugin-api": "^1.8.0",
76
+ "@backstage/catalog-client": "^1.14.0",
77
+ "@backstage/core-plugin-api": "^1.12.4",
78
78
  "@backstage/errors": "^1.2.7",
79
- "@backstage/integration": "^1.19.2",
80
- "@backstage/plugin-catalog-node": "^1.20.1",
81
- "@backstage/plugin-permission-common": "^0.9.5",
82
- "@backstage/plugin-permission-node": "^0.10.9",
83
- "@backstage/plugin-scaffolder-backend": "^3.1.2",
84
- "@backstage/plugin-scaffolder-node": "^0.12.4",
85
- "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "^3.5.3",
86
- "@red-hat-developer-hub/backstage-plugin-orchestrator-node": "^1.1.3",
79
+ "@backstage/integration": "^2.0.0",
80
+ "@backstage/plugin-catalog-node": "^2.1.0",
81
+ "@backstage/plugin-permission-common": "^0.9.7",
82
+ "@backstage/plugin-permission-node": "^0.10.11",
83
+ "@backstage/plugin-scaffolder-backend": "^3.2.0",
84
+ "@backstage/plugin-scaffolder-node": "^0.13.0",
85
+ "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "^3.6.0",
86
+ "@red-hat-developer-hub/backstage-plugin-orchestrator-node": "^1.2.0",
87
87
  "@urql/core": "^6.0.1",
88
88
  "ajv-formats": "^2.1.1",
89
89
  "cloudevents": "^8.0.0",
@@ -98,8 +98,8 @@
98
98
  },
99
99
  "devDependencies": {
100
100
  "@backstage-community/plugin-rbac-common": "^1.12.1",
101
- "@backstage/backend-test-utils": "^1.10.4",
102
- "@backstage/cli": "^0.35.3",
101
+ "@backstage/backend-test-utils": "^1.11.1",
102
+ "@backstage/cli": "^0.36.0",
103
103
  "@janus-idp/backstage-plugin-audit-log-node": "^1.7.1",
104
104
  "@janus-idp/cli": "3.7.0",
105
105
  "@types/express": "4.17.25",