@red-hat-developer-hub/backstage-plugin-orchestrator-backend 8.5.1 → 8.6.1
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 +31 -1
- package/dist/helpers/errorBuilder.cjs.js +8 -0
- package/dist/helpers/errorBuilder.cjs.js.map +1 -1
- package/dist/plugin.cjs.js +14 -1
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/providers/WorkflowLogsProvidersRegistry.cjs.js +31 -0
- package/dist/providers/WorkflowLogsProvidersRegistry.cjs.js.map +1 -0
- package/dist/routerWrapper/index.cjs.js +2 -4
- package/dist/routerWrapper/index.cjs.js.map +1 -1
- package/dist/service/OrchestratorService.cjs.js +13 -1
- package/dist/service/OrchestratorService.cjs.js.map +1 -1
- package/dist/service/api/mapping/V2Mappings.cjs.js +1 -1
- package/dist/service/api/mapping/V2Mappings.cjs.js.map +1 -1
- package/dist/service/api/v2.cjs.js +6 -0
- package/dist/service/api/v2.cjs.js.map +1 -1
- package/dist/service/router.cjs.js +79 -5
- package/dist/service/router.cjs.js.map +1 -1
- package/package.json +6 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,34 @@
|
|
|
1
|
-
|
|
1
|
+
# @red-hat-developer-hub/backstage-plugin-orchestrator-backend
|
|
2
|
+
|
|
3
|
+
## 8.6.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 0f60a00: feat: Improve permission denied error handling for workflow instances
|
|
8
|
+
- Add PermissionDeniedPanel component for clean access denied UI
|
|
9
|
+
- Improve backend error messages when user lacks instanceAdminView permission
|
|
10
|
+
- Provide detailed error messages explaining why access is denied:
|
|
11
|
+
- When instance has no ownership info (external/legacy runs)
|
|
12
|
+
- When instance was created by another user
|
|
13
|
+
|
|
14
|
+
- 9c17c36: Updated dependency `prettier` to `3.8.0`.
|
|
15
|
+
- aaac497: Updated dependency `prettier` to `3.8.1`.
|
|
16
|
+
- Updated dependencies [858963d]
|
|
17
|
+
- @red-hat-developer-hub/backstage-plugin-orchestrator-common@3.4.1
|
|
18
|
+
- @red-hat-developer-hub/backstage-plugin-orchestrator-node@1.0.1
|
|
19
|
+
|
|
20
|
+
## 8.6.0
|
|
21
|
+
|
|
22
|
+
### Minor Changes
|
|
23
|
+
|
|
24
|
+
- 3e2c3f7: Adding Workflow Logs endpoint. Loki provider added
|
|
25
|
+
|
|
26
|
+
### Patch Changes
|
|
27
|
+
|
|
28
|
+
- Updated dependencies [3e2c3f7]
|
|
29
|
+
- Updated dependencies [f1b43c5]
|
|
30
|
+
- @red-hat-developer-hub/backstage-plugin-orchestrator-common@3.4.0
|
|
31
|
+
- @red-hat-developer-hub/backstage-plugin-orchestrator-node@1.0.0
|
|
2
32
|
|
|
3
33
|
## 8.5.1
|
|
4
34
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
const NO_LOG_STORAGE_URL = "NO_LOG_STORAGE_URL";
|
|
3
4
|
const NO_DATA_INDEX_URL = "NO_DATA_INDEX_URL";
|
|
4
5
|
const NO_CLIENT_PROVIDED = "NO_CLIENT_PROVIDED";
|
|
5
6
|
const SWF_BACKEND_NOT_INITED = "SWF_BACKEND_NOT_INITED";
|
|
@@ -9,6 +10,12 @@ class ErrorBuilder {
|
|
|
9
10
|
e.name = name;
|
|
10
11
|
return e;
|
|
11
12
|
}
|
|
13
|
+
static GET_NO_LOG_STORAGE_URL_ERR() {
|
|
14
|
+
return this.NewBackendError(
|
|
15
|
+
NO_LOG_STORAGE_URL,
|
|
16
|
+
"No log storage url specified or found"
|
|
17
|
+
);
|
|
18
|
+
}
|
|
12
19
|
static GET_NO_DATA_INDEX_URL_ERR() {
|
|
13
20
|
return this.NewBackendError(
|
|
14
21
|
NO_DATA_INDEX_URL,
|
|
@@ -32,5 +39,6 @@ class ErrorBuilder {
|
|
|
32
39
|
exports.ErrorBuilder = ErrorBuilder;
|
|
33
40
|
exports.NO_CLIENT_PROVIDED = NO_CLIENT_PROVIDED;
|
|
34
41
|
exports.NO_DATA_INDEX_URL = NO_DATA_INDEX_URL;
|
|
42
|
+
exports.NO_LOG_STORAGE_URL = NO_LOG_STORAGE_URL;
|
|
35
43
|
exports.SWF_BACKEND_NOT_INITED = SWF_BACKEND_NOT_INITED;
|
|
36
44
|
//# sourceMappingURL=errorBuilder.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorBuilder.cjs.js","sources":["../../src/helpers/errorBuilder.ts"],"sourcesContent":["/*\n * Copyright
|
|
1
|
+
{"version":3,"file":"errorBuilder.cjs.js","sources":["../../src/helpers/errorBuilder.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\nexport const NO_LOG_STORAGE_URL = 'NO_LOG_STORAGE_URL';\nexport const NO_DATA_INDEX_URL = 'NO_DATA_INDEX_URL';\nexport const NO_BACKEND_EXEC_CTX = 'NO_BACKEND_EXEC_CTX';\nexport const NO_CLIENT_PROVIDED = 'NO_CLIENT_PROVIDED';\nexport const NO_LOGGER = 'NO_LOGGER';\nexport const SWF_BACKEND_NOT_INITED = 'SWF_BACKEND_NOT_INITED';\n\nexport class ErrorBuilder {\n public static NewBackendError(name: string, message: string): Error {\n const e = new Error(message);\n e.name = name;\n return e;\n }\n\n public static GET_NO_LOG_STORAGE_URL_ERR(): Error {\n return this.NewBackendError(\n NO_LOG_STORAGE_URL,\n 'No log storage url specified or found',\n );\n }\n\n public static GET_NO_DATA_INDEX_URL_ERR(): Error {\n return this.NewBackendError(\n NO_DATA_INDEX_URL,\n 'No data index url specified or found',\n );\n }\n\n public static GET_NO_CLIENT_PROVIDED_ERR(): Error {\n return this.NewBackendError(\n NO_CLIENT_PROVIDED,\n 'No or null graphql client',\n );\n }\n\n public static GET_SWF_BACKEND_NOT_INITED(): Error {\n return this.NewBackendError(\n SWF_BACKEND_NOT_INITED,\n 'The SonataFlow backend is not initialized, call initialize() method before trying to get the workflows.',\n );\n }\n}\n"],"names":[],"mappings":";;AAgBO,MAAM,kBAAA,GAAqB;AAC3B,MAAM,iBAAA,GAAoB;AAE1B,MAAM,kBAAA,GAAqB;AAE3B,MAAM,sBAAA,GAAyB;AAE/B,MAAM,YAAA,CAAa;AAAA,EACxB,OAAc,eAAA,CAAgB,IAAA,EAAc,OAAA,EAAwB;AAClE,IAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,OAAO,CAAA;AAC3B,IAAA,CAAA,CAAE,IAAA,GAAO,IAAA;AACT,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,OAAc,0BAAA,GAAoC;AAChD,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,MACV,kBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,OAAc,yBAAA,GAAmC;AAC/C,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,MACV,iBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,OAAc,0BAAA,GAAoC;AAChD,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,MACV,kBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,OAAc,0BAAA,GAAoC;AAChD,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,MACV,sBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;;;;;;"}
|
package/dist/plugin.cjs.js
CHANGED
|
@@ -2,11 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
4
4
|
var alpha = require('@backstage/plugin-catalog-node/alpha');
|
|
5
|
+
var backstagePluginOrchestratorNode = require('@red-hat-developer-hub/backstage-plugin-orchestrator-node');
|
|
6
|
+
var WorkflowLogsProvidersRegistry = require('./providers/WorkflowLogsProvidersRegistry.cjs.js');
|
|
5
7
|
var index = require('./routerWrapper/index.cjs.js');
|
|
6
8
|
|
|
7
9
|
const orchestratorPlugin = backendPluginApi.createBackendPlugin({
|
|
8
10
|
pluginId: "orchestrator",
|
|
9
11
|
register(env) {
|
|
12
|
+
const workflowLogsProvidersRegistry = new WorkflowLogsProvidersRegistry.WorkflowLogsProvidersRegistry();
|
|
13
|
+
env.registerExtensionPoint(backstagePluginOrchestratorNode.workflowLogsExtensionEndpoint, {
|
|
14
|
+
addWorkflowLogProvider(...newWorkflowLogProviders) {
|
|
15
|
+
newWorkflowLogProviders.forEach((workflowLogProvider) => {
|
|
16
|
+
workflowLogsProvidersRegistry.register(workflowLogProvider);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
10
20
|
env.registerInit({
|
|
11
21
|
deps: {
|
|
12
22
|
logger: backendPluginApi.coreServices.logger,
|
|
@@ -23,7 +33,10 @@ const orchestratorPlugin = backendPluginApi.createBackendPlugin({
|
|
|
23
33
|
},
|
|
24
34
|
async init(props) {
|
|
25
35
|
const { http } = props;
|
|
26
|
-
const router = await index.createRouter(
|
|
36
|
+
const router = await index.createRouter({
|
|
37
|
+
...props,
|
|
38
|
+
workflowLogsProvidersRegistry
|
|
39
|
+
});
|
|
27
40
|
http.use(router);
|
|
28
41
|
http.addAuthPolicy({
|
|
29
42
|
path: "/health",
|
package/dist/plugin.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.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 coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { catalogServiceRef } from '@backstage/plugin-catalog-node/alpha';\n\nimport { createRouter } from './routerWrapper';\n\n/**\n * @public\n * Orchestrator Backend Plugin\n */\nexport const orchestratorPlugin = createBackendPlugin({\n pluginId: 'orchestrator',\n register(env) {\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n auditor: coreServices.auditor,\n config: coreServices.rootConfig,\n discovery: coreServices.discovery,\n catalogApi: catalogServiceRef,\n urlReader: coreServices.urlReader,\n permissions: coreServices.permissions,\n scheduler: coreServices.scheduler,\n httpAuth: coreServices.httpAuth,\n http: coreServices.httpRouter,\n userInfo: coreServices.userInfo,\n },\n async init(props) {\n const { http } = props;\n const router = await createRouter(props);\n http.use(router);\n http.addAuthPolicy({\n path: '/health',\n allow: 'unauthenticated',\n });\n http.addAuthPolicy({\n path: '/static',\n allow: 'unauthenticated',\n });\n http.addAuthPolicy({\n path: '/docs',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["createBackendPlugin","coreServices","catalogServiceRef","createRouter"],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.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 coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { catalogServiceRef } from '@backstage/plugin-catalog-node/alpha';\n\nimport {\n WorkflowLogProvider,\n workflowLogsExtensionEndpoint,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-node';\n\nimport { WorkflowLogsProvidersRegistry } from './providers/WorkflowLogsProvidersRegistry';\nimport { createRouter } from './routerWrapper';\n\n/**\n * @public\n * Orchestrator Backend Plugin\n */\nexport const orchestratorPlugin = createBackendPlugin({\n pluginId: 'orchestrator',\n register(env) {\n const workflowLogsProvidersRegistry = new WorkflowLogsProvidersRegistry();\n\n env.registerExtensionPoint(workflowLogsExtensionEndpoint, {\n addWorkflowLogProvider(\n ...newWorkflowLogProviders: WorkflowLogProvider[]\n ) {\n newWorkflowLogProviders.forEach(workflowLogProvider => {\n workflowLogsProvidersRegistry.register(workflowLogProvider);\n });\n },\n });\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n auditor: coreServices.auditor,\n config: coreServices.rootConfig,\n discovery: coreServices.discovery,\n catalogApi: catalogServiceRef,\n urlReader: coreServices.urlReader,\n permissions: coreServices.permissions,\n scheduler: coreServices.scheduler,\n httpAuth: coreServices.httpAuth,\n http: coreServices.httpRouter,\n userInfo: coreServices.userInfo,\n },\n async init(props) {\n const { http } = props;\n const router = await createRouter({\n ...props,\n workflowLogsProvidersRegistry,\n });\n http.use(router);\n http.addAuthPolicy({\n path: '/health',\n allow: 'unauthenticated',\n });\n http.addAuthPolicy({\n path: '/static',\n allow: 'unauthenticated',\n });\n http.addAuthPolicy({\n path: '/docs',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["createBackendPlugin","WorkflowLogsProvidersRegistry","workflowLogsExtensionEndpoint","coreServices","catalogServiceRef","createRouter"],"mappings":";;;;;;;;AAkCO,MAAM,qBAAqBA,oCAAA,CAAoB;AAAA,EACpD,QAAA,EAAU,cAAA;AAAA,EACV,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,6BAAA,GAAgC,IAAIC,2DAAA,EAA8B;AAExE,IAAA,GAAA,CAAI,uBAAuBC,6DAAA,EAA+B;AAAA,MACxD,0BACK,uBAAA,EACH;AACA,QAAA,uBAAA,CAAwB,QAAQ,CAAA,mBAAA,KAAuB;AACrD,UAAA,6BAAA,CAA8B,SAAS,mBAAmB,CAAA;AAAA,QAC5D,CAAC,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AACD,IAAA,GAAA,CAAI,YAAA,CAAa;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,QAAQC,6BAAA,CAAa,MAAA;AAAA,QACrB,SAASA,6BAAA,CAAa,OAAA;AAAA,QACtB,QAAQA,6BAAA,CAAa,UAAA;AAAA,QACrB,WAAWA,6BAAA,CAAa,SAAA;AAAA,QACxB,UAAA,EAAYC,uBAAA;AAAA,QACZ,WAAWD,6BAAA,CAAa,SAAA;AAAA,QACxB,aAAaA,6BAAA,CAAa,WAAA;AAAA,QAC1B,WAAWA,6BAAA,CAAa,SAAA;AAAA,QACxB,UAAUA,6BAAA,CAAa,QAAA;AAAA,QACvB,MAAMA,6BAAA,CAAa,UAAA;AAAA,QACnB,UAAUA,6BAAA,CAAa;AAAA,OACzB;AAAA,MACA,MAAM,KAAK,KAAA,EAAO;AAChB,QAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,QAAA,MAAM,MAAA,GAAS,MAAME,kBAAA,CAAa;AAAA,UAChC,GAAG,KAAA;AAAA,UACH;AAAA,SACD,CAAA;AACD,QAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AACf,QAAA,IAAA,CAAK,aAAA,CAAc;AAAA,UACjB,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA,IAAA,CAAK,aAAA,CAAc;AAAA,UACjB,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA,IAAA,CAAK,aAAA,CAAc;AAAA,UACjB,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAC;;;;"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var errors = require('@backstage/errors');
|
|
4
|
+
|
|
5
|
+
class WorkflowLogsProvidersRegistry {
|
|
6
|
+
workfLogsProviders = /* @__PURE__ */ new Map();
|
|
7
|
+
register(workflowLogProvider) {
|
|
8
|
+
const providerId = workflowLogProvider.getProviderId();
|
|
9
|
+
if (this.workfLogsProviders.has(providerId)) {
|
|
10
|
+
throw new errors.ConflictError(
|
|
11
|
+
`Workflow Log Provider with ID ${providerId} has already been registered`
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
this.workfLogsProviders.set(providerId, workflowLogProvider);
|
|
15
|
+
}
|
|
16
|
+
listProviders() {
|
|
17
|
+
return Array.from(this.workfLogsProviders.values());
|
|
18
|
+
}
|
|
19
|
+
getProvider(providerId) {
|
|
20
|
+
const provider = this.workfLogsProviders.get(providerId);
|
|
21
|
+
if (!provider) {
|
|
22
|
+
throw new errors.NotFoundError(
|
|
23
|
+
`Workflow Log Provider with ID '${providerId}' is not registered`
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
return this.workfLogsProviders.get(providerId);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
exports.WorkflowLogsProvidersRegistry = WorkflowLogsProvidersRegistry;
|
|
31
|
+
//# sourceMappingURL=WorkflowLogsProvidersRegistry.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowLogsProvidersRegistry.cjs.js","sources":["../../src/providers/WorkflowLogsProvidersRegistry.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 { ConflictError, NotFoundError } from '@backstage/errors';\n\nimport { WorkflowLogProvider } from '@red-hat-developer-hub/backstage-plugin-orchestrator-node';\n\nexport class WorkflowLogsProvidersRegistry {\n private readonly workfLogsProviders = new Map<string, WorkflowLogProvider>();\n\n register(workflowLogProvider: WorkflowLogProvider): void {\n const providerId = workflowLogProvider.getProviderId();\n\n if (this.workfLogsProviders.has(providerId)) {\n throw new ConflictError(\n `Workflow Log Provider with ID ${providerId} has already been registered`,\n );\n }\n\n this.workfLogsProviders.set(providerId, workflowLogProvider);\n }\n\n listProviders(): WorkflowLogProvider[] {\n return Array.from(this.workfLogsProviders.values());\n }\n\n getProvider(providerId: string): WorkflowLogProvider | undefined {\n const provider = this.workfLogsProviders.get(providerId);\n if (!provider) {\n throw new NotFoundError(\n `Workflow Log Provider with ID '${providerId}' is not registered`,\n );\n }\n return this.workfLogsProviders.get(providerId);\n }\n}\n"],"names":["ConflictError","NotFoundError"],"mappings":";;;;AAoBO,MAAM,6BAAA,CAA8B;AAAA,EACxB,kBAAA,uBAAyB,GAAA,EAAiC;AAAA,EAE3E,SAAS,mBAAA,EAAgD;AACvD,IAAA,MAAM,UAAA,GAAa,oBAAoB,aAAA,EAAc;AAErD,IAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,UAAU,CAAA,EAAG;AAC3C,MAAA,MAAM,IAAIA,oBAAA;AAAA,QACR,iCAAiC,UAAU,CAAA,4BAAA;AAAA,OAC7C;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,UAAA,EAAY,mBAAmB,CAAA;AAAA,EAC7D;AAAA,EAEA,aAAA,GAAuC;AACrC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAA;AAAA,EACpD;AAAA,EAEA,YAAY,UAAA,EAAqD;AAC/D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,UAAU,CAAA;AACvD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAIC,oBAAA;AAAA,QACR,kCAAkC,UAAU,CAAA,mBAAA;AAAA,OAC9C;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,UAAU,CAAA;AAAA,EAC/C;AACF;;;;"}
|
|
@@ -18,13 +18,11 @@ async function createRouter(args) {
|
|
|
18
18
|
config: args.config,
|
|
19
19
|
logger: args.logger,
|
|
20
20
|
auditor: args.auditor,
|
|
21
|
-
discovery: args.discovery,
|
|
22
|
-
catalogApi: args.catalogApi,
|
|
23
|
-
urlReader: args.urlReader,
|
|
24
21
|
scheduler: args.scheduler,
|
|
25
22
|
permissions: args.permissions,
|
|
26
23
|
httpAuth: args.httpAuth,
|
|
27
|
-
userInfo: args.userInfo
|
|
24
|
+
userInfo: args.userInfo,
|
|
25
|
+
workflowLogsProvidersRegistry: args.workflowLogsProvidersRegistry
|
|
28
26
|
});
|
|
29
27
|
}
|
|
30
28
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../src/routerWrapper/index.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 {\n AuditorService,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n SchedulerService,\n UrlReaderService,\n UserInfoService,\n} from '@backstage/backend-plugin-api';\nimport type { CatalogApi } from '@backstage/catalog-client';\nimport type { Config } from '@backstage/config';\n\nimport express from 'express';\n\nimport { DevModeService } from '../service/DevModeService';\nimport { createBackendRouter } from '../service/router';\n\nexport interface RouterOptions {\n config: Config;\n logger: LoggerService;\n auditor: AuditorService;\n discovery: DiscoveryService;\n catalogApi: CatalogApi;\n urlReader: UrlReaderService;\n scheduler: SchedulerService;\n permissions: PermissionsService;\n httpAuth: HttpAuthService;\n userInfo: UserInfoService;\n}\n\nexport async function createRouter(\n args: RouterOptions,\n): Promise<express.Router> {\n const autoStartDevMode =\n args.config.getOptionalBoolean(\n 'orchestrator.sonataFlowService.autoStart',\n ) ?? false;\n\n if (autoStartDevMode) {\n const devModeService = new DevModeService(args.config, args.logger);\n\n const isSonataFlowUp = await devModeService.launchDevMode();\n\n if (!isSonataFlowUp) {\n args.logger.error('SonataFlow is not up. Check your configuration.');\n }\n }\n\n return await createBackendRouter({\n config: args.config,\n logger: args.logger,\n auditor: args.auditor,\n discovery: args.discovery,\n catalogApi: args.catalogApi,\n urlReader: args.urlReader,\n scheduler: args.scheduler,\n permissions: args.permissions,\n httpAuth: args.httpAuth,\n userInfo: args.userInfo,\n });\n}\n"],"names":["DevModeService","createBackendRouter"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../src/routerWrapper/index.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 {\n AuditorService,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n SchedulerService,\n UrlReaderService,\n UserInfoService,\n} from '@backstage/backend-plugin-api';\nimport type { CatalogApi } from '@backstage/catalog-client';\nimport type { Config } from '@backstage/config';\n\nimport express from 'express';\n\nimport { WorkflowLogsProvidersRegistry } from '../providers/WorkflowLogsProvidersRegistry';\nimport { DevModeService } from '../service/DevModeService';\nimport { createBackendRouter } from '../service/router';\n\nexport interface RouterOptions {\n config: Config;\n logger: LoggerService;\n auditor: AuditorService;\n discovery: DiscoveryService;\n catalogApi: CatalogApi;\n urlReader: UrlReaderService;\n scheduler: SchedulerService;\n permissions: PermissionsService;\n httpAuth: HttpAuthService;\n userInfo: UserInfoService;\n workflowLogsProvidersRegistry: WorkflowLogsProvidersRegistry;\n}\n\nexport async function createRouter(\n args: RouterOptions,\n): Promise<express.Router> {\n const autoStartDevMode =\n args.config.getOptionalBoolean(\n 'orchestrator.sonataFlowService.autoStart',\n ) ?? false;\n\n if (autoStartDevMode) {\n const devModeService = new DevModeService(args.config, args.logger);\n\n const isSonataFlowUp = await devModeService.launchDevMode();\n\n if (!isSonataFlowUp) {\n args.logger.error('SonataFlow is not up. Check your configuration.');\n }\n }\n\n return await createBackendRouter({\n config: args.config,\n logger: args.logger,\n auditor: args.auditor,\n discovery: args.discovery,\n catalogApi: args.catalogApi,\n urlReader: args.urlReader,\n scheduler: args.scheduler,\n permissions: args.permissions,\n httpAuth: args.httpAuth,\n userInfo: args.userInfo,\n workflowLogsProvidersRegistry: args.workflowLogsProvidersRegistry,\n });\n}\n"],"names":["DevModeService","createBackendRouter"],"mappings":";;;;;AAiDA,eAAsB,aACpB,IAAA,EACyB;AACzB,EAAA,MAAM,gBAAA,GACJ,KAAK,MAAA,CAAO,kBAAA;AAAA,IACV;AAAA,GACF,IAAK,KAAA;AAEP,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,MAAM,iBAAiB,IAAIA,6BAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,KAAK,MAAM,CAAA;AAElE,IAAA,MAAM,cAAA,GAAiB,MAAM,cAAA,CAAe,aAAA,EAAc;AAE1D,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,iDAAiD,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,OAAO,MAAMC,0BAAA,CAAoB;AAAA,IAC/B,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,SAAS,IAAA,CAAK,OAAA;AAAA,IAId,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,+BAA+B,IAAA,CAAK;AAAA,GACrC,CAAA;AACH;;;;"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
class OrchestratorService {
|
|
4
|
-
constructor(sonataFlowService, dataIndexService, workflowCacheService) {
|
|
4
|
+
constructor(sonataFlowService, dataIndexService, workflowCacheService, workflowLogProvider) {
|
|
5
5
|
this.sonataFlowService = sonataFlowService;
|
|
6
6
|
this.dataIndexService = dataIndexService;
|
|
7
7
|
this.workflowCacheService = workflowCacheService;
|
|
8
|
+
this.workflowLogProvider = workflowLogProvider;
|
|
8
9
|
}
|
|
9
10
|
// Data Index Service Wrapper
|
|
10
11
|
getWorkflowIds() {
|
|
@@ -79,6 +80,17 @@ class OrchestratorService {
|
|
|
79
80
|
if (overview) overview.isAvailable = isWorkflowAvailable;
|
|
80
81
|
return overview;
|
|
81
82
|
}
|
|
83
|
+
async fetchWorkflowLogsByInstance(args) {
|
|
84
|
+
return this.workflowLogProvider?.fetchWorkflowLogsByInstance(
|
|
85
|
+
args.instance
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
hasLogProvider() {
|
|
89
|
+
if (this.workflowLogProvider) {
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
82
94
|
async pingWorkflowService(args) {
|
|
83
95
|
const { definitionId, serviceUrl } = args;
|
|
84
96
|
const isServiceUp = await this.sonataFlowService.pingWorkflowService({
|
|
@@ -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 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';\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 ) {}\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 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":";;
|
|
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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"}
|
|
@@ -45,7 +45,7 @@ function mapToProcessInstanceDTO(processInstance) {
|
|
|
45
45
|
const end = luxon.DateTime.fromISO(processInstance.end, {
|
|
46
46
|
setZone: true
|
|
47
47
|
});
|
|
48
|
-
const duration = processInstance.end ? luxon.Duration.fromMillis(end.diff(start).toMillis()).
|
|
48
|
+
const duration = processInstance.end ? luxon.Duration.fromMillis(end.diff(start).toMillis()).shiftTo("hours", "minutes", "seconds").toHuman({ unitDisplay: "long" }) : void 0;
|
|
49
49
|
let variables;
|
|
50
50
|
if (typeof processInstance?.variables === "string") {
|
|
51
51
|
variables = JSON.parse(processInstance?.variables);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"V2Mappings.cjs.js","sources":["../../../../src/service/api/mapping/V2Mappings.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DateTime, Duration } from 'luxon';\n\nimport {\n capitalize,\n ExecuteWorkflowResponseDTO,\n extractWorkflowFormat,\n fromWorkflowSource,\n NodeInstance,\n NodeInstanceDTO,\n ProcessInstance,\n ProcessInstanceDTO,\n ProcessInstanceState,\n ProcessInstanceStatusDTO,\n WorkflowDTO,\n WorkflowExecutionResponse,\n WorkflowFormatDTO,\n WorkflowOverview,\n WorkflowOverviewDTO,\n WorkflowRunStatusDTO,\n type ProcessInstanceStatusDTO as ProcessInstanceStatusDTOType,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\n// Mapping functions\nexport function mapToWorkflowOverviewDTO(\n overview: WorkflowOverview,\n): WorkflowOverviewDTO {\n return {\n name: overview.name,\n format: overview.format,\n workflowId: overview.workflowId,\n description: overview.description,\n lastRunId: overview.lastRunId,\n lastRunStatus: overview.lastRunStatus\n ? getProcessInstancesStatusDTOFromString(overview.lastRunStatus)\n : undefined,\n lastTriggeredMs: overview.lastTriggeredMs,\n isAvailable: overview.isAvailable,\n };\n}\n\nexport function getWorkflowFormatDTO(source: string): WorkflowFormatDTO {\n return extractWorkflowFormat(source);\n}\n\nexport function mapToWorkflowDTO(source: string): WorkflowDTO {\n const definition = fromWorkflowSource(source);\n return {\n annotations: definition.annotations,\n description: definition.description,\n name: definition.name,\n format: getWorkflowFormatDTO(source),\n id: definition.id,\n };\n}\n\nexport function getProcessInstancesStatusDTOFromString(\n state: string,\n): ProcessInstanceStatusDTOType {\n if (\n !Object.values(ProcessInstanceStatusDTO).includes(\n state as ProcessInstanceStatusDTOType,\n )\n ) {\n throw new Error(\n `state ${state} is not one of the values of type ProcessInstanceStatusDTO`,\n );\n }\n return state as ProcessInstanceStatusDTOType;\n}\n\nexport function mapToProcessInstanceDTO(\n processInstance: ProcessInstance,\n): ProcessInstanceDTO {\n const start = DateTime.fromISO(processInstance.start as string, {\n setZone: true,\n });\n const end = DateTime.fromISO(processInstance.end as string, {\n setZone: true,\n });\n const duration = processInstance.end\n ? Duration.fromMillis(end.diff(start).toMillis()).
|
|
1
|
+
{"version":3,"file":"V2Mappings.cjs.js","sources":["../../../../src/service/api/mapping/V2Mappings.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DateTime, Duration } from 'luxon';\n\nimport {\n capitalize,\n ExecuteWorkflowResponseDTO,\n extractWorkflowFormat,\n fromWorkflowSource,\n NodeInstance,\n NodeInstanceDTO,\n ProcessInstance,\n ProcessInstanceDTO,\n ProcessInstanceState,\n ProcessInstanceStatusDTO,\n WorkflowDTO,\n WorkflowExecutionResponse,\n WorkflowFormatDTO,\n WorkflowOverview,\n WorkflowOverviewDTO,\n WorkflowRunStatusDTO,\n type ProcessInstanceStatusDTO as ProcessInstanceStatusDTOType,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\n// Mapping functions\nexport function mapToWorkflowOverviewDTO(\n overview: WorkflowOverview,\n): WorkflowOverviewDTO {\n return {\n name: overview.name,\n format: overview.format,\n workflowId: overview.workflowId,\n description: overview.description,\n lastRunId: overview.lastRunId,\n lastRunStatus: overview.lastRunStatus\n ? getProcessInstancesStatusDTOFromString(overview.lastRunStatus)\n : undefined,\n lastTriggeredMs: overview.lastTriggeredMs,\n isAvailable: overview.isAvailable,\n };\n}\n\nexport function getWorkflowFormatDTO(source: string): WorkflowFormatDTO {\n return extractWorkflowFormat(source);\n}\n\nexport function mapToWorkflowDTO(source: string): WorkflowDTO {\n const definition = fromWorkflowSource(source);\n return {\n annotations: definition.annotations,\n description: definition.description,\n name: definition.name,\n format: getWorkflowFormatDTO(source),\n id: definition.id,\n };\n}\n\nexport function getProcessInstancesStatusDTOFromString(\n state: string,\n): ProcessInstanceStatusDTOType {\n if (\n !Object.values(ProcessInstanceStatusDTO).includes(\n state as ProcessInstanceStatusDTOType,\n )\n ) {\n throw new Error(\n `state ${state} is not one of the values of type ProcessInstanceStatusDTO`,\n );\n }\n return state as ProcessInstanceStatusDTOType;\n}\n\nexport function mapToProcessInstanceDTO(\n processInstance: ProcessInstance,\n): ProcessInstanceDTO {\n const start = DateTime.fromISO(processInstance.start as string, {\n setZone: true,\n });\n const end = DateTime.fromISO(processInstance.end as string, {\n setZone: true,\n });\n const duration = processInstance.end\n ? Duration.fromMillis(end.diff(start).toMillis())\n .shiftTo('hours', 'minutes', 'seconds')\n .toHuman({ unitDisplay: 'long' })\n : undefined;\n\n let variables: Record<string, unknown> | undefined;\n if (typeof processInstance?.variables === 'string') {\n variables = JSON.parse(processInstance?.variables);\n } else {\n variables = processInstance?.variables;\n }\n\n return {\n id: processInstance.id,\n processId: processInstance.processId,\n processName: processInstance.processName,\n description: processInstance.description,\n serviceUrl: processInstance.serviceUrl,\n executionSummary: processInstance.executionSummary,\n endpoint: processInstance.endpoint,\n error: processInstance.error,\n start: processInstance.start,\n end: processInstance.end,\n duration: duration,\n // @ts-ignore\n workflowdata: variables?.workflowdata,\n initiatorEntity: variables?.initiatorEntity as string,\n targetEntity: variables?.targetEntity as string,\n state: processInstance.state\n ? getProcessInstancesStatusDTOFromString(processInstance.state)\n : undefined,\n nodes: processInstance.nodes.map(mapToNodeInstanceDTO),\n };\n}\n\nexport function mapToNodeInstanceDTO(\n nodeInstance: NodeInstance,\n): NodeInstanceDTO {\n return { ...nodeInstance, __typename: 'NodeInstance' };\n}\n\nexport function mapToExecuteWorkflowResponseDTO(\n workflowId: string,\n workflowExecutionResponse: WorkflowExecutionResponse,\n): ExecuteWorkflowResponseDTO {\n if (!workflowExecutionResponse?.id) {\n throw new Error(\n `Error while mapping ExecuteWorkflowResponse to ExecuteWorkflowResponseDTO for workflow with id ${workflowId}`,\n );\n }\n\n return {\n id: workflowExecutionResponse.id,\n };\n}\n\nexport function mapToWorkflowRunStatusDTO(\n status: ProcessInstanceState,\n): WorkflowRunStatusDTO {\n return {\n key: capitalize(status),\n value: status,\n };\n}\n"],"names":["extractWorkflowFormat","fromWorkflowSource","ProcessInstanceStatusDTO","DateTime","Duration","capitalize"],"mappings":"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"}
|
|
@@ -105,6 +105,12 @@ class V2 {
|
|
|
105
105
|
}
|
|
106
106
|
return V2Mappings.mapToProcessInstanceDTO(instance);
|
|
107
107
|
}
|
|
108
|
+
async getInstanceLogsByInstance(instance) {
|
|
109
|
+
const logs = await this.orchestratorService.fetchWorkflowLogsByInstance({
|
|
110
|
+
instance
|
|
111
|
+
});
|
|
112
|
+
return logs;
|
|
113
|
+
}
|
|
108
114
|
async executeWorkflow(executeWorkflowRequestDTO, workflowId, initiatorEntity, backstageToken) {
|
|
109
115
|
const definition = await this.orchestratorService.fetchWorkflowInfo({
|
|
110
116
|
definitionId: workflowId
|
|
@@ -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 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 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":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var rootHttpRouter = require('@backstage/backend-defaults/rootHttpRouter');
|
|
4
|
+
var errors = require('@backstage/errors');
|
|
4
5
|
var pluginPermissionCommon = require('@backstage/plugin-permission-common');
|
|
5
6
|
var pluginPermissionNode = require('@backstage/plugin-permission-node');
|
|
6
7
|
var pluginRbacCommon = require('@backstage-community/plugin-rbac-common');
|
|
@@ -92,9 +93,15 @@ async function createBackendRouter(options) {
|
|
|
92
93
|
scheduler,
|
|
93
94
|
permissions,
|
|
94
95
|
httpAuth,
|
|
95
|
-
userInfo
|
|
96
|
+
userInfo,
|
|
97
|
+
workflowLogsProvidersRegistry
|
|
96
98
|
} = options;
|
|
97
|
-
const publicServices = initPublicServices(
|
|
99
|
+
const publicServices = initPublicServices(
|
|
100
|
+
logger,
|
|
101
|
+
config,
|
|
102
|
+
scheduler,
|
|
103
|
+
workflowLogsProvidersRegistry
|
|
104
|
+
);
|
|
98
105
|
const routerApi = await initRouterApi(publicServices.orchestratorService);
|
|
99
106
|
const router = express.Router();
|
|
100
107
|
const permissionsIntegrationRouter = pluginPermissionNode.createPermissionIntegrationRouter({
|
|
@@ -139,7 +146,7 @@ async function createBackendRouter(options) {
|
|
|
139
146
|
router.use(middleware.error({ logAllErrors: true }));
|
|
140
147
|
return router;
|
|
141
148
|
}
|
|
142
|
-
function initPublicServices(logger, config, scheduler) {
|
|
149
|
+
function initPublicServices(logger, config, scheduler, workflowLogsProvidersRegistry) {
|
|
143
150
|
const dataIndexUrl = config.getString("orchestrator.dataIndexService.url");
|
|
144
151
|
const dataIndexService = new DataIndexService.DataIndexService(dataIndexUrl, logger);
|
|
145
152
|
const sonataFlowService = new SonataFlowService.SonataFlowService(dataIndexService, logger);
|
|
@@ -149,10 +156,18 @@ function initPublicServices(logger, config, scheduler) {
|
|
|
149
156
|
sonataFlowService
|
|
150
157
|
);
|
|
151
158
|
workflowCacheService.schedule({ scheduler });
|
|
159
|
+
const isWorkflowLogProviderAdded = config.getOptional(
|
|
160
|
+
"orchestrator.workflowLogProvider"
|
|
161
|
+
);
|
|
162
|
+
let workflowLogProvider;
|
|
163
|
+
if (isWorkflowLogProviderAdded) {
|
|
164
|
+
workflowLogProvider = workflowLogsProvidersRegistry.getProvider("loki");
|
|
165
|
+
}
|
|
152
166
|
const orchestratorService = new OrchestratorService.OrchestratorService(
|
|
153
167
|
sonataFlowService,
|
|
154
168
|
dataIndexService,
|
|
155
|
-
workflowCacheService
|
|
169
|
+
workflowCacheService,
|
|
170
|
+
workflowLogProvider
|
|
156
171
|
);
|
|
157
172
|
const dataInputSchemaService = new DataInputSchemaService.DataInputSchemaService();
|
|
158
173
|
return {
|
|
@@ -661,6 +676,64 @@ function setupInternalRoutes(services, routerApi, permissions, httpAuth, auditor
|
|
|
661
676
|
}
|
|
662
677
|
});
|
|
663
678
|
try {
|
|
679
|
+
const instance = await routerApi.v2.getInstanceById(instanceId);
|
|
680
|
+
const workflowId = instance.processId;
|
|
681
|
+
const decision = await authorize(
|
|
682
|
+
request,
|
|
683
|
+
[
|
|
684
|
+
backstagePluginOrchestratorCommon.orchestratorWorkflowPermission,
|
|
685
|
+
backstagePluginOrchestratorCommon.orchestratorWorkflowSpecificPermission(workflowId)
|
|
686
|
+
],
|
|
687
|
+
permissions,
|
|
688
|
+
httpAuth
|
|
689
|
+
);
|
|
690
|
+
if (decision.result === pluginPermissionCommon.AuthorizeResult.DENY) {
|
|
691
|
+
manageDenyAuthorization(auditEvent);
|
|
692
|
+
}
|
|
693
|
+
const credentials = await httpAuth.credentials(request);
|
|
694
|
+
const initiatorEntity = (await userInfo.getUserInfo(credentials)).userEntityRef;
|
|
695
|
+
const isUserAuthorizedForInstanceAdminView = await isUserAuthorizedForInstanceAdminViewPermission(
|
|
696
|
+
request,
|
|
697
|
+
permissions,
|
|
698
|
+
httpAuth
|
|
699
|
+
);
|
|
700
|
+
if (!isUserAuthorizedForInstanceAdminView) {
|
|
701
|
+
const instanceInitiatorEntity = instance.initiatorEntity;
|
|
702
|
+
if (!instanceInitiatorEntity) {
|
|
703
|
+
throw new errors.NotAllowedError(
|
|
704
|
+
`Access denied for instance ${instanceId}. You have permission to view workflow '${workflowId}', but this workflow run does not have ownership information recorded. Since we cannot verify you initiated this run, the 'orchestrator.instanceAdminView' permission is required. Contact your administrator to grant this permission.`
|
|
705
|
+
);
|
|
706
|
+
}
|
|
707
|
+
if (instanceInitiatorEntity !== initiatorEntity) {
|
|
708
|
+
throw new errors.NotAllowedError(
|
|
709
|
+
`Access denied for instance ${instanceId}. This workflow run was initiated by '${instanceInitiatorEntity}', not by you ('${initiatorEntity}'). With 'orchestrator.workflow' or 'orchestrator.workflow.${workflowId}' permissions, you can only view instances you created. To view all instances, you need the 'orchestrator.instanceAdminView' permission.`
|
|
710
|
+
);
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
auditEvent.success();
|
|
714
|
+
res.status(200).json(instance);
|
|
715
|
+
} catch (error) {
|
|
716
|
+
auditEvent.fail({ error });
|
|
717
|
+
next(error);
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
);
|
|
721
|
+
routerApi.openApiBackend.register(
|
|
722
|
+
"getWorkflowLogById",
|
|
723
|
+
async (c, request, res, next) => {
|
|
724
|
+
const instanceId = c.request.params.instanceId;
|
|
725
|
+
const auditEvent = await auditor.createEvent({
|
|
726
|
+
eventId: "get-logs-by-instance",
|
|
727
|
+
request,
|
|
728
|
+
meta: {
|
|
729
|
+
actionType: "by-id",
|
|
730
|
+
instanceId
|
|
731
|
+
}
|
|
732
|
+
});
|
|
733
|
+
try {
|
|
734
|
+
if (!services.orchestratorService.hasLogProvider()) {
|
|
735
|
+
throw new Error(`No log provider setup`);
|
|
736
|
+
}
|
|
664
737
|
const instance = await routerApi.v2.getInstanceById(instanceId);
|
|
665
738
|
const workflowId = instance.processId;
|
|
666
739
|
const decision = await authorize(
|
|
@@ -690,8 +763,9 @@ function setupInternalRoutes(services, routerApi, permissions, httpAuth, auditor
|
|
|
690
763
|
);
|
|
691
764
|
}
|
|
692
765
|
}
|
|
766
|
+
const logs = await routerApi.v2.getInstanceLogsByInstance(instance);
|
|
693
767
|
auditEvent.success();
|
|
694
|
-
res.status(200).json(
|
|
768
|
+
res.status(200).json(logs);
|
|
695
769
|
} catch (error) {
|
|
696
770
|
auditEvent.fail({ error });
|
|
697
771
|
next(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.cjs.js","sources":["../../src/service/router.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport {\n AuditorService,\n AuditorServiceEvent,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n SchedulerService,\n UserInfoService,\n} from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport {\n AuthorizePermissionRequest,\n AuthorizePermissionResponse,\n AuthorizeResult,\n BasicPermission,\n} from '@backstage/plugin-permission-common';\nimport { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';\nimport type { JsonObject } from '@backstage/types';\n\nimport { UnauthorizedError } from '@backstage-community/plugin-rbac-common';\nimport { fullFormats } from 'ajv-formats/dist/formats';\nimport express, { Router } from 'express';\nimport { Request as HttpRequest } from 'express-serve-static-core';\nimport { OpenAPIBackend, Request } from 'openapi-backend';\n\nimport {\n FieldFilter,\n Filter,\n NestedFilter,\n openApiDocument,\n orchestratorInstanceAdminViewPermission,\n orchestratorPermissions,\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission,\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission,\n WorkflowOverviewListResultDTO,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { RouterOptions } from '../routerWrapper';\nimport { buildPagination } from '../types/pagination';\nimport { V2 } from './api/v2';\nimport { DataIndexService } from './DataIndexService';\nimport { DataInputSchemaService } from './DataInputSchemaService';\nimport { OrchestratorService } from './OrchestratorService';\nimport { SonataFlowService } from './SonataFlowService';\nimport { WorkflowCacheService } from './WorkflowCacheService';\n\ninterface PublicServices {\n dataInputSchemaService: DataInputSchemaService;\n orchestratorService: OrchestratorService;\n}\n\ninterface RouterApi {\n openApiBackend: OpenAPIBackend;\n v2: V2;\n}\n\nconst authorize = async (\n request: HttpRequest,\n anyOfPermissions: BasicPermission[],\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n): Promise<AuthorizePermissionResponse> => {\n const credentials = await httpAuth.credentials(request);\n const decisionResponses: AuthorizePermissionResponse[][] = await Promise.all(\n anyOfPermissions.map(permission =>\n permissionsSvc.authorize([{ permission }], {\n credentials,\n }),\n ),\n );\n const decisions: AuthorizePermissionResponse[] = decisionResponses.map(\n d => d[0],\n );\n\n const allow = decisions.find(d => d.result === AuthorizeResult.ALLOW);\n return (\n allow || {\n result: AuthorizeResult.DENY,\n }\n );\n};\n\nconst isUserAuthorizedForInstanceAdminViewPermission = async (\n request: HttpRequest,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n): Promise<boolean> => {\n const credentials = await httpAuth.credentials(request);\n const [decision] = await permissionsSvc.authorize(\n [{ permission: orchestratorInstanceAdminViewPermission }],\n { credentials },\n );\n\n return decision.result === AuthorizeResult.ALLOW;\n};\n\nconst filterAuthorizedWorkflowIds = async (\n request: HttpRequest,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n workflowIds: string[],\n): Promise<string[]> => {\n const credentials = await httpAuth.credentials(request);\n const genericWorkflowPermissionDecision = await permissionsSvc.authorize(\n [{ permission: orchestratorWorkflowPermission }],\n {\n credentials,\n },\n );\n\n if (genericWorkflowPermissionDecision[0].result === AuthorizeResult.ALLOW) {\n // The user can see all workflows\n return workflowIds;\n }\n\n const specificWorkflowRequests: AuthorizePermissionRequest[] =\n workflowIds.map(workflowId => ({\n permission: orchestratorWorkflowSpecificPermission(workflowId),\n }));\n\n const decisions = await permissionsSvc.authorize(specificWorkflowRequests, {\n credentials,\n });\n\n return workflowIds.filter(\n (_, idx) => decisions[idx].result === AuthorizeResult.ALLOW,\n );\n};\n\nconst filterAuthorizedWorkflows = async (\n request: HttpRequest,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n workflows: WorkflowOverviewListResultDTO,\n): Promise<WorkflowOverviewListResultDTO> => {\n if (!workflows.overviews) {\n return workflows;\n }\n\n const authorizedWorkflowIds = await filterAuthorizedWorkflowIds(\n request,\n permissionsSvc,\n httpAuth,\n workflows.overviews.map(w => w.workflowId),\n );\n\n const filtered = {\n ...workflows,\n overviews: workflows.overviews.filter(w =>\n authorizedWorkflowIds.includes(w.workflowId),\n ),\n };\n\n return filtered;\n};\n\nexport async function createBackendRouter(\n options: RouterOptions,\n): Promise<Router> {\n const {\n config,\n logger,\n auditor,\n scheduler,\n permissions,\n httpAuth,\n userInfo,\n } = options;\n const publicServices = initPublicServices(logger, config, scheduler);\n\n const routerApi = await initRouterApi(publicServices.orchestratorService);\n\n const router = Router();\n const permissionsIntegrationRouter = createPermissionIntegrationRouter({\n permissions: orchestratorPermissions,\n });\n router.use(express.json());\n router.use(permissionsIntegrationRouter);\n router.use('/workflows', express.text());\n router.get('/health', (_, response) => {\n logger.info('PONG!');\n response.json({ status: 'ok' });\n });\n\n setupInternalRoutes(\n publicServices,\n routerApi,\n permissions,\n httpAuth,\n auditor,\n userInfo,\n );\n\n router.use((req, res, next) => {\n if (!next) {\n throw new Error('next is undefined');\n }\n\n return routerApi.openApiBackend\n .handleRequest(req as Request, req, res, next)\n .catch(error => {\n auditor\n .createEvent({\n eventId: 'generic-error-handler',\n request: req,\n // Keep at high since this is a fallback - any error should be caught in handlers\n severityLevel: 'high',\n meta: {},\n })\n .then(event => {\n event.fail({\n meta: {},\n error,\n });\n });\n\n next(error);\n });\n });\n\n const middleware = MiddlewareFactory.create({ logger, config });\n\n router.use(middleware.error({ logAllErrors: true })); // log also openapi errors\n\n return router;\n}\n\nfunction initPublicServices(\n logger: LoggerService,\n config: Config,\n scheduler: SchedulerService,\n): PublicServices {\n const dataIndexUrl = config.getString('orchestrator.dataIndexService.url');\n const dataIndexService = new DataIndexService(dataIndexUrl, logger);\n const sonataFlowService = new SonataFlowService(dataIndexService, logger);\n\n const workflowCacheService = new WorkflowCacheService(\n logger,\n dataIndexService,\n sonataFlowService,\n );\n workflowCacheService.schedule({ scheduler: scheduler });\n\n const orchestratorService = new OrchestratorService(\n sonataFlowService,\n dataIndexService,\n workflowCacheService,\n );\n\n const dataInputSchemaService = new DataInputSchemaService();\n\n return {\n orchestratorService,\n dataInputSchemaService,\n };\n}\n\nasync function initRouterApi(\n orchestratorService: OrchestratorService,\n): Promise<RouterApi> {\n const openApiBackend = new OpenAPIBackend({\n definition: openApiDocument,\n strict: false,\n ajvOpts: {\n strict: false,\n strictSchema: false,\n verbose: true,\n addUsedSchema: false,\n formats: fullFormats, // open issue: https://github.com/openapistack/openapi-backend/issues/280\n },\n handlers: {\n validationFail: async (\n c,\n _req: express.Request,\n res: express.Response,\n ) => {\n console.log('OPENAPI validationFail', c.operation);\n res.status(400).json({ err: c.validation.errors });\n },\n notFound: async (_c, req: express.Request, res: express.Response) => {\n res.status(404).json({ err: `${req.path} path not found` });\n },\n notImplemented: async (_c, req: express.Request, res: express.Response) =>\n res.status(500).json({ err: `${req.path} not implemented` }),\n },\n });\n await openApiBackend.init();\n const v2 = new V2(orchestratorService);\n return { v2, openApiBackend };\n}\n\n// ======================================================\n// Internal Backstage API calls to delegate to SonataFlow\n// ======================================================\nfunction setupInternalRoutes(\n services: PublicServices,\n routerApi: RouterApi,\n permissions: PermissionsService,\n httpAuth: HttpAuthService,\n auditor: AuditorService,\n userInfo: UserInfoService,\n) {\n function manageDenyAuthorization(auditEvent: AuditorServiceEvent) {\n const error = new UnauthorizedError();\n auditEvent.fail({\n meta: {\n message: 'Not authorized to request the endpoint',\n },\n error: new UnauthorizedError(),\n });\n\n throw error;\n }\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowsOverviewForEntity',\n async (_c, req, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-overview-entity',\n request: req,\n });\n const targetEntity = req.body.targetEntity as string;\n const annotationWorkflowIds = req.body.annotationWorkflowIds as string[];\n try {\n const result = await routerApi.v2.getWorkflowsOverviewForEntity(\n targetEntity,\n annotationWorkflowIds,\n );\n\n const workflows = await filterAuthorizedWorkflows(\n req,\n permissions,\n httpAuth,\n result,\n );\n auditEvent.success({\n meta: {\n workflowsCount: workflows.overviews?.length,\n },\n });\n res.json(workflows);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowsOverview',\n async (_c, req, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-overview',\n request: req,\n });\n\n try {\n const result = await routerApi.v2.getWorkflowsOverview(\n buildPagination(req),\n getRequestFilters(req),\n );\n\n const workflows = await filterAuthorizedWorkflows(\n req,\n permissions,\n httpAuth,\n result,\n );\n auditEvent.success({\n meta: {\n workflowsCount: workflows.overviews?.length,\n },\n });\n res.json(workflows);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowSourceById',\n async (c, req, res, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-source',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n },\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n try {\n const result = await routerApi.v2.getWorkflowSourceById(workflowId);\n auditEvent.success();\n res.status(200).contentType('text/plain').send(result);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'executeWorkflow',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const credentials = await httpAuth.credentials(req);\n const token = req.headers.authorization?.split(' ')[1];\n const initiatorEntity = await (\n await userInfo.getUserInfo(credentials)\n ).userEntityRef;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'execute-workflow',\n request: req,\n meta: {\n workflowId,\n },\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const executeWorkflowRequestDTO = req.body;\n\n return routerApi.v2\n .executeWorkflow(\n executeWorkflowRequestDTO,\n workflowId,\n initiatorEntity,\n token,\n )\n .then(result => {\n auditEvent.success({ meta: { id: result.id } });\n return res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'retriggerInstance',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const instanceId = c.request.params.instanceId as string;\n const token = req.headers.authorization?.split(' ')[1];\n const retriggerInstanceRequestDTO = req.body;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'retrigger-instance',\n request: req,\n meta: {\n workflowId,\n instanceId,\n },\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n await routerApi.v2\n .retriggerInstance(\n workflowId,\n instanceId,\n retriggerInstanceRequestDTO,\n token,\n )\n .then(result => {\n auditEvent.success();\n return res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowOverviewById',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-overview',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n },\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n return routerApi.v2\n .getWorkflowOverviewById(workflowId)\n .then(result => {\n auditEvent.success({\n meta: {\n workflowId: result.workflowId,\n },\n });\n return res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowStatuses',\n async (_c, request: express.Request, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-statuses',\n request,\n });\n\n // Anyone is authorized to call this endpoint\n\n return routerApi.v2\n .getWorkflowStatuses()\n .then(result => {\n auditEvent.success();\n res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowInputSchemaById',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const instanceId = c.request.query.instanceId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-input-schema',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n instanceId,\n },\n });\n\n try {\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const workflowDefinition =\n await services.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n });\n\n if (!workflowDefinition) {\n throw new Error(\n `Failed to fetch workflow info for workflow ${workflowId}`,\n );\n }\n const serviceUrl = workflowDefinition.serviceUrl;\n if (!serviceUrl) {\n throw new Error(\n `Service URL is not defined for workflow ${workflowId}`,\n );\n }\n\n const definition =\n await services.orchestratorService.fetchWorkflowDefinition({\n definitionId: workflowId,\n });\n\n if (!definition) {\n throw new Error(\n 'Failed to fetch workflow definition for workflow ${workflowId}',\n );\n }\n\n if (!definition.dataInputSchema) {\n res.status(200).json({});\n return;\n }\n\n const instanceVariables = instanceId\n ? await services.orchestratorService.fetchInstanceVariables({\n instanceId,\n })\n : undefined;\n\n const workflowData = instanceVariables\n ? services.dataInputSchemaService.extractWorkflowData(\n instanceVariables,\n )\n : undefined;\n\n const workflowInfo = await routerApi.v2.getWorkflowInputSchemaById(\n workflowId,\n serviceUrl,\n );\n\n if (!workflowInfo?.inputSchema?.properties) {\n auditEvent.success({\n meta: {\n message: 'Successfully found nothing.',\n },\n });\n res.status(200).json({});\n return;\n }\n\n const inputSchemaProps = workflowInfo.inputSchema.properties;\n let inputData;\n\n if (workflowData) {\n inputData = Object.keys(inputSchemaProps)\n .filter(k => k in workflowData)\n .reduce((result, k) => {\n if (workflowData[k] === undefined) {\n return result;\n }\n result[k] = workflowData[k];\n return result;\n }, {} as JsonObject);\n }\n\n auditEvent.success({\n meta: {\n workflowId: workflowInfo.id,\n },\n });\n res.status(200).json({\n inputSchema: workflowInfo.inputSchema,\n data: inputData,\n });\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowInstances',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-instances',\n request: req,\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n return routerApi.v2\n .getInstances(buildPagination(req), getRequestFilters(req), [\n workflowId,\n ])\n .then(result => {\n auditEvent.success();\n res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'pingWorkflowServiceById',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'ping-workflow-service',\n request: req,\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n return routerApi.v2\n .pingWorkflowService(workflowId)\n .then(result => {\n auditEvent.success();\n res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getInstances',\n async (_c, req: express.Request, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-instances',\n request: req,\n });\n\n try {\n // Once we assign user to the instance in the future, we can rework this filtering\n const allWorkflowIds = routerApi.v2.getWorkflowIds();\n const authorizedWorkflowIds: string[] =\n await filterAuthorizedWorkflowIds(\n req,\n permissions,\n httpAuth,\n allWorkflowIds,\n );\n\n if (!authorizedWorkflowIds || authorizedWorkflowIds.length === 0)\n res.json([]);\n\n const credentials = await httpAuth.credentials(req);\n const initiatorEntity = (await userInfo.getUserInfo(credentials))\n .userEntityRef;\n const isUserAuthorizedForInstanceAdminView: boolean = // This permission will let user see ALL instances (including ones others created)\n await isUserAuthorizedForInstanceAdminViewPermission(\n req,\n permissions,\n httpAuth,\n );\n\n const requestFilters = getRequestFilters(req);\n\n let filters = requestFilters;\n\n if (!isUserAuthorizedForInstanceAdminView) {\n const initiatorEntityFilter: FieldFilter = {\n operator: 'EQ',\n value: initiatorEntity,\n field: 'initiatorEntity',\n };\n\n const nestedVariablesFilter: NestedFilter = {\n field: 'variables',\n nested: initiatorEntityFilter,\n };\n\n if (requestFilters === undefined) {\n filters = nestedVariablesFilter;\n } else {\n // combine filters\n filters = {\n operator: 'AND',\n filters: [nestedVariablesFilter, requestFilters],\n };\n }\n }\n\n const result = await routerApi.v2.getInstances(\n buildPagination(req),\n filters,\n authorizedWorkflowIds,\n );\n\n auditEvent.success({ meta: { authorizedWorkflowIds } });\n res.json(result);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getInstanceById',\n async (c, request: express.Request, res: express.Response, next) => {\n const instanceId = c.request.params.instanceId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-instance',\n request,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\n });\n\n try {\n const instance = await routerApi.v2.getInstanceById(instanceId);\n\n const workflowId = instance.processId;\n\n const decision = await authorize(\n request,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const credentials = await httpAuth.credentials(request);\n const initiatorEntity = (await userInfo.getUserInfo(credentials))\n .userEntityRef;\n // Check if user is authorized to view all instances\n const isUserAuthorizedForInstanceAdminView =\n await isUserAuthorizedForInstanceAdminViewPermission(\n request,\n permissions,\n httpAuth,\n );\n\n // If not an admin, enforce initiatorEntity check\n if (!isUserAuthorizedForInstanceAdminView) {\n const instanceInitiatorEntity = instance.initiatorEntity;\n if (instanceInitiatorEntity !== initiatorEntity) {\n throw new Error(\n `Unauthorized to access instance ${instanceId} not initiated by user.`,\n );\n }\n }\n\n auditEvent.success();\n res.status(200).json(instance);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'abortWorkflow',\n async (c, request, res, next) => {\n const instanceId = c.request.params.instanceId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'abort-workflow',\n request,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\n });\n\n try {\n const instance = await routerApi.v2.getInstanceById(instanceId);\n const workflowId = instance.processId;\n\n const decision = await authorize(\n request,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const result = await routerApi.v2.abortWorkflow(workflowId, instanceId);\n auditEvent.success({ meta: { result } });\n res.status(200).json(result);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n}\n\nfunction getRequestFilters(req: HttpRequest): Filter | undefined {\n return req.body.filters ? (req.body.filters as Filter) : undefined;\n}\n"],"names":["AuthorizeResult","orchestratorInstanceAdminViewPermission","orchestratorWorkflowPermission","orchestratorWorkflowSpecificPermission","Router","createPermissionIntegrationRouter","orchestratorPermissions","express","MiddlewareFactory","DataIndexService","SonataFlowService","WorkflowCacheService","OrchestratorService","DataInputSchemaService","OpenAPIBackend","openApiDocument","fullFormats","v2","V2","UnauthorizedError","buildPagination","orchestratorWorkflowUsePermission","orchestratorWorkflowUseSpecificPermission"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"router.cjs.js","sources":["../../src/service/router.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport {\n AuditorService,\n AuditorServiceEvent,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n SchedulerService,\n UserInfoService,\n} from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport { NotAllowedError } from '@backstage/errors';\nimport {\n AuthorizePermissionRequest,\n AuthorizePermissionResponse,\n AuthorizeResult,\n BasicPermission,\n} from '@backstage/plugin-permission-common';\nimport { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';\nimport type { JsonObject } from '@backstage/types';\n\nimport { UnauthorizedError } from '@backstage-community/plugin-rbac-common';\nimport { fullFormats } from 'ajv-formats/dist/formats';\nimport express, { Router } from 'express';\nimport { Request as HttpRequest } from 'express-serve-static-core';\nimport { OpenAPIBackend, Request } from 'openapi-backend';\n\nimport {\n FieldFilter,\n Filter,\n NestedFilter,\n openApiDocument,\n orchestratorInstanceAdminViewPermission,\n orchestratorPermissions,\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission,\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission,\n WorkflowOverviewListResultDTO,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { WorkflowLogsProvidersRegistry } from '../providers/WorkflowLogsProvidersRegistry';\nimport { RouterOptions } from '../routerWrapper';\nimport { buildPagination } from '../types/pagination';\nimport { V2 } from './api/v2';\nimport { DataIndexService } from './DataIndexService';\nimport { DataInputSchemaService } from './DataInputSchemaService';\nimport { OrchestratorService } from './OrchestratorService';\nimport { SonataFlowService } from './SonataFlowService';\nimport { WorkflowCacheService } from './WorkflowCacheService';\n\ninterface PublicServices {\n dataInputSchemaService: DataInputSchemaService;\n orchestratorService: OrchestratorService;\n}\n\ninterface RouterApi {\n openApiBackend: OpenAPIBackend;\n v2: V2;\n}\n\nconst authorize = async (\n request: HttpRequest,\n anyOfPermissions: BasicPermission[],\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n): Promise<AuthorizePermissionResponse> => {\n const credentials = await httpAuth.credentials(request);\n const decisionResponses: AuthorizePermissionResponse[][] = await Promise.all(\n anyOfPermissions.map(permission =>\n permissionsSvc.authorize([{ permission }], {\n credentials,\n }),\n ),\n );\n const decisions: AuthorizePermissionResponse[] = decisionResponses.map(\n d => d[0],\n );\n\n const allow = decisions.find(d => d.result === AuthorizeResult.ALLOW);\n return (\n allow || {\n result: AuthorizeResult.DENY,\n }\n );\n};\n\nconst isUserAuthorizedForInstanceAdminViewPermission = async (\n request: HttpRequest,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n): Promise<boolean> => {\n const credentials = await httpAuth.credentials(request);\n const [decision] = await permissionsSvc.authorize(\n [{ permission: orchestratorInstanceAdminViewPermission }],\n { credentials },\n );\n\n return decision.result === AuthorizeResult.ALLOW;\n};\n\nconst filterAuthorizedWorkflowIds = async (\n request: HttpRequest,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n workflowIds: string[],\n): Promise<string[]> => {\n const credentials = await httpAuth.credentials(request);\n const genericWorkflowPermissionDecision = await permissionsSvc.authorize(\n [{ permission: orchestratorWorkflowPermission }],\n {\n credentials,\n },\n );\n\n if (genericWorkflowPermissionDecision[0].result === AuthorizeResult.ALLOW) {\n // The user can see all workflows\n return workflowIds;\n }\n\n const specificWorkflowRequests: AuthorizePermissionRequest[] =\n workflowIds.map(workflowId => ({\n permission: orchestratorWorkflowSpecificPermission(workflowId),\n }));\n\n const decisions = await permissionsSvc.authorize(specificWorkflowRequests, {\n credentials,\n });\n\n return workflowIds.filter(\n (_, idx) => decisions[idx].result === AuthorizeResult.ALLOW,\n );\n};\n\nconst filterAuthorizedWorkflows = async (\n request: HttpRequest,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n workflows: WorkflowOverviewListResultDTO,\n): Promise<WorkflowOverviewListResultDTO> => {\n if (!workflows.overviews) {\n return workflows;\n }\n\n const authorizedWorkflowIds = await filterAuthorizedWorkflowIds(\n request,\n permissionsSvc,\n httpAuth,\n workflows.overviews.map(w => w.workflowId),\n );\n\n const filtered = {\n ...workflows,\n overviews: workflows.overviews.filter(w =>\n authorizedWorkflowIds.includes(w.workflowId),\n ),\n };\n\n return filtered;\n};\n\nexport async function createBackendRouter(\n options: RouterOptions,\n): Promise<Router> {\n const {\n config,\n logger,\n auditor,\n scheduler,\n permissions,\n httpAuth,\n userInfo,\n workflowLogsProvidersRegistry,\n } = options;\n const publicServices = initPublicServices(\n logger,\n config,\n scheduler,\n workflowLogsProvidersRegistry,\n );\n\n const routerApi = await initRouterApi(publicServices.orchestratorService);\n\n const router = Router();\n const permissionsIntegrationRouter = createPermissionIntegrationRouter({\n permissions: orchestratorPermissions,\n });\n router.use(express.json());\n router.use(permissionsIntegrationRouter);\n router.use('/workflows', express.text());\n router.get('/health', (_, response) => {\n logger.info('PONG!');\n response.json({ status: 'ok' });\n });\n\n setupInternalRoutes(\n publicServices,\n routerApi,\n permissions,\n httpAuth,\n auditor,\n userInfo,\n );\n\n router.use((req, res, next) => {\n if (!next) {\n throw new Error('next is undefined');\n }\n\n return routerApi.openApiBackend\n .handleRequest(req as Request, req, res, next)\n .catch(error => {\n auditor\n .createEvent({\n eventId: 'generic-error-handler',\n request: req,\n // Keep at high since this is a fallback - any error should be caught in handlers\n severityLevel: 'high',\n meta: {},\n })\n .then(event => {\n event.fail({\n meta: {},\n error,\n });\n });\n\n next(error);\n });\n });\n\n const middleware = MiddlewareFactory.create({ logger, config });\n\n router.use(middleware.error({ logAllErrors: true })); // log also openapi errors\n\n return router;\n}\n\nfunction initPublicServices(\n logger: LoggerService,\n config: Config,\n scheduler: SchedulerService,\n workflowLogsProvidersRegistry: WorkflowLogsProvidersRegistry,\n): PublicServices {\n const dataIndexUrl = config.getString('orchestrator.dataIndexService.url');\n const dataIndexService = new DataIndexService(dataIndexUrl, logger);\n const sonataFlowService = new SonataFlowService(dataIndexService, logger);\n\n const workflowCacheService = new WorkflowCacheService(\n logger,\n dataIndexService,\n sonataFlowService,\n );\n workflowCacheService.schedule({ scheduler: scheduler });\n\n const isWorkflowLogProviderAdded = config.getOptional(\n 'orchestrator.workflowLogProvider',\n );\n let workflowLogProvider;\n if (isWorkflowLogProviderAdded) {\n workflowLogProvider = workflowLogsProvidersRegistry.getProvider('loki');\n }\n\n const orchestratorService = new OrchestratorService(\n sonataFlowService,\n dataIndexService,\n workflowCacheService,\n workflowLogProvider,\n );\n\n const dataInputSchemaService = new DataInputSchemaService();\n\n return {\n orchestratorService,\n dataInputSchemaService,\n };\n}\n\nasync function initRouterApi(\n orchestratorService: OrchestratorService,\n): Promise<RouterApi> {\n const openApiBackend = new OpenAPIBackend({\n definition: openApiDocument,\n strict: false,\n ajvOpts: {\n strict: false,\n strictSchema: false,\n verbose: true,\n addUsedSchema: false,\n formats: fullFormats, // open issue: https://github.com/openapistack/openapi-backend/issues/280\n },\n handlers: {\n validationFail: async (\n c,\n _req: express.Request,\n res: express.Response,\n ) => {\n console.log('OPENAPI validationFail', c.operation);\n res.status(400).json({ err: c.validation.errors });\n },\n notFound: async (_c, req: express.Request, res: express.Response) => {\n res.status(404).json({ err: `${req.path} path not found` });\n },\n notImplemented: async (_c, req: express.Request, res: express.Response) =>\n res.status(500).json({ err: `${req.path} not implemented` }),\n },\n });\n await openApiBackend.init();\n const v2 = new V2(orchestratorService);\n return { v2, openApiBackend };\n}\n\n// ======================================================\n// Internal Backstage API calls to delegate to SonataFlow\n// ======================================================\nfunction setupInternalRoutes(\n services: PublicServices,\n routerApi: RouterApi,\n permissions: PermissionsService,\n httpAuth: HttpAuthService,\n auditor: AuditorService,\n userInfo: UserInfoService,\n) {\n function manageDenyAuthorization(auditEvent: AuditorServiceEvent) {\n const error = new UnauthorizedError();\n auditEvent.fail({\n meta: {\n message: 'Not authorized to request the endpoint',\n },\n error: new UnauthorizedError(),\n });\n\n throw error;\n }\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowsOverviewForEntity',\n async (_c, req, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-overview-entity',\n request: req,\n });\n const targetEntity = req.body.targetEntity as string;\n const annotationWorkflowIds = req.body.annotationWorkflowIds as string[];\n try {\n const result = await routerApi.v2.getWorkflowsOverviewForEntity(\n targetEntity,\n annotationWorkflowIds,\n );\n\n const workflows = await filterAuthorizedWorkflows(\n req,\n permissions,\n httpAuth,\n result,\n );\n auditEvent.success({\n meta: {\n workflowsCount: workflows.overviews?.length,\n },\n });\n res.json(workflows);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowsOverview',\n async (_c, req, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-overview',\n request: req,\n });\n\n try {\n const result = await routerApi.v2.getWorkflowsOverview(\n buildPagination(req),\n getRequestFilters(req),\n );\n\n const workflows = await filterAuthorizedWorkflows(\n req,\n permissions,\n httpAuth,\n result,\n );\n auditEvent.success({\n meta: {\n workflowsCount: workflows.overviews?.length,\n },\n });\n res.json(workflows);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowSourceById',\n async (c, req, res, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-source',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n },\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n try {\n const result = await routerApi.v2.getWorkflowSourceById(workflowId);\n auditEvent.success();\n res.status(200).contentType('text/plain').send(result);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'executeWorkflow',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const credentials = await httpAuth.credentials(req);\n const token = req.headers.authorization?.split(' ')[1];\n const initiatorEntity = await (\n await userInfo.getUserInfo(credentials)\n ).userEntityRef;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'execute-workflow',\n request: req,\n meta: {\n workflowId,\n },\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const executeWorkflowRequestDTO = req.body;\n\n return routerApi.v2\n .executeWorkflow(\n executeWorkflowRequestDTO,\n workflowId,\n initiatorEntity,\n token,\n )\n .then(result => {\n auditEvent.success({ meta: { id: result.id } });\n return res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'retriggerInstance',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const instanceId = c.request.params.instanceId as string;\n const token = req.headers.authorization?.split(' ')[1];\n const retriggerInstanceRequestDTO = req.body;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'retrigger-instance',\n request: req,\n meta: {\n workflowId,\n instanceId,\n },\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n await routerApi.v2\n .retriggerInstance(\n workflowId,\n instanceId,\n retriggerInstanceRequestDTO,\n token,\n )\n .then(result => {\n auditEvent.success();\n return res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowOverviewById',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-overview',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n },\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n return routerApi.v2\n .getWorkflowOverviewById(workflowId)\n .then(result => {\n auditEvent.success({\n meta: {\n workflowId: result.workflowId,\n },\n });\n return res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowStatuses',\n async (_c, request: express.Request, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-statuses',\n request,\n });\n\n // Anyone is authorized to call this endpoint\n\n return routerApi.v2\n .getWorkflowStatuses()\n .then(result => {\n auditEvent.success();\n res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowInputSchemaById',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const instanceId = c.request.query.instanceId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-input-schema',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n instanceId,\n },\n });\n\n try {\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const workflowDefinition =\n await services.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n });\n\n if (!workflowDefinition) {\n throw new Error(\n `Failed to fetch workflow info for workflow ${workflowId}`,\n );\n }\n const serviceUrl = workflowDefinition.serviceUrl;\n if (!serviceUrl) {\n throw new Error(\n `Service URL is not defined for workflow ${workflowId}`,\n );\n }\n\n const definition =\n await services.orchestratorService.fetchWorkflowDefinition({\n definitionId: workflowId,\n });\n\n if (!definition) {\n throw new Error(\n 'Failed to fetch workflow definition for workflow ${workflowId}',\n );\n }\n\n if (!definition.dataInputSchema) {\n res.status(200).json({});\n return;\n }\n\n const instanceVariables = instanceId\n ? await services.orchestratorService.fetchInstanceVariables({\n instanceId,\n })\n : undefined;\n\n const workflowData = instanceVariables\n ? services.dataInputSchemaService.extractWorkflowData(\n instanceVariables,\n )\n : undefined;\n\n const workflowInfo = await routerApi.v2.getWorkflowInputSchemaById(\n workflowId,\n serviceUrl,\n );\n\n if (!workflowInfo?.inputSchema?.properties) {\n auditEvent.success({\n meta: {\n message: 'Successfully found nothing.',\n },\n });\n res.status(200).json({});\n return;\n }\n\n const inputSchemaProps = workflowInfo.inputSchema.properties;\n let inputData;\n\n if (workflowData) {\n inputData = Object.keys(inputSchemaProps)\n .filter(k => k in workflowData)\n .reduce((result, k) => {\n if (workflowData[k] === undefined) {\n return result;\n }\n result[k] = workflowData[k];\n return result;\n }, {} as JsonObject);\n }\n\n auditEvent.success({\n meta: {\n workflowId: workflowInfo.id,\n },\n });\n res.status(200).json({\n inputSchema: workflowInfo.inputSchema,\n data: inputData,\n });\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowInstances',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-instances',\n request: req,\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n return routerApi.v2\n .getInstances(buildPagination(req), getRequestFilters(req), [\n workflowId,\n ])\n .then(result => {\n auditEvent.success();\n res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'pingWorkflowServiceById',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'ping-workflow-service',\n request: req,\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n return routerApi.v2\n .pingWorkflowService(workflowId)\n .then(result => {\n auditEvent.success();\n res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getInstances',\n async (_c, req: express.Request, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-instances',\n request: req,\n });\n\n try {\n // Once we assign user to the instance in the future, we can rework this filtering\n const allWorkflowIds = routerApi.v2.getWorkflowIds();\n const authorizedWorkflowIds: string[] =\n await filterAuthorizedWorkflowIds(\n req,\n permissions,\n httpAuth,\n allWorkflowIds,\n );\n\n if (!authorizedWorkflowIds || authorizedWorkflowIds.length === 0)\n res.json([]);\n\n const credentials = await httpAuth.credentials(req);\n const initiatorEntity = (await userInfo.getUserInfo(credentials))\n .userEntityRef;\n const isUserAuthorizedForInstanceAdminView: boolean = // This permission will let user see ALL instances (including ones others created)\n await isUserAuthorizedForInstanceAdminViewPermission(\n req,\n permissions,\n httpAuth,\n );\n\n const requestFilters = getRequestFilters(req);\n\n let filters = requestFilters;\n\n if (!isUserAuthorizedForInstanceAdminView) {\n const initiatorEntityFilter: FieldFilter = {\n operator: 'EQ',\n value: initiatorEntity,\n field: 'initiatorEntity',\n };\n\n const nestedVariablesFilter: NestedFilter = {\n field: 'variables',\n nested: initiatorEntityFilter,\n };\n\n if (requestFilters === undefined) {\n filters = nestedVariablesFilter;\n } else {\n // combine filters\n filters = {\n operator: 'AND',\n filters: [nestedVariablesFilter, requestFilters],\n };\n }\n }\n\n const result = await routerApi.v2.getInstances(\n buildPagination(req),\n filters,\n authorizedWorkflowIds,\n );\n\n auditEvent.success({ meta: { authorizedWorkflowIds } });\n res.json(result);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getInstanceById',\n async (c, request: express.Request, res: express.Response, next) => {\n const instanceId = c.request.params.instanceId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-instance',\n request,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\n });\n\n try {\n const instance = await routerApi.v2.getInstanceById(instanceId);\n\n const workflowId = instance.processId;\n\n const decision = await authorize(\n request,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const credentials = await httpAuth.credentials(request);\n const initiatorEntity = (await userInfo.getUserInfo(credentials))\n .userEntityRef;\n // Check if user is authorized to view all instances\n const isUserAuthorizedForInstanceAdminView =\n await isUserAuthorizedForInstanceAdminViewPermission(\n request,\n permissions,\n httpAuth,\n );\n\n // If not an admin, enforce initiatorEntity check\n if (!isUserAuthorizedForInstanceAdminView) {\n const instanceInitiatorEntity = instance.initiatorEntity;\n\n // If the instance has no initiatorEntity recorded, we cannot determine ownership.\n // This can happen for:\n // 1. Workflow instances created before the initiatorEntity feature was added\n // 2. Workflow instances started externally (not through Backstage)\n // 3. Workflows that transform/overwrite their input variables\n if (!instanceInitiatorEntity) {\n throw new NotAllowedError(\n `Access denied for instance ${instanceId}. ` +\n `You have permission to view workflow '${workflowId}', but this workflow run ` +\n `does not have ownership information recorded. Since we cannot verify you ` +\n `initiated this run, the 'orchestrator.instanceAdminView' permission is required. ` +\n `Contact your administrator to grant this permission.`,\n );\n }\n\n if (instanceInitiatorEntity !== initiatorEntity) {\n throw new NotAllowedError(\n `Access denied for instance ${instanceId}. ` +\n `This workflow run was initiated by '${instanceInitiatorEntity}', not by you ('${initiatorEntity}'). ` +\n `With 'orchestrator.workflow' or 'orchestrator.workflow.${workflowId}' permissions, ` +\n `you can only view instances you created. To view all instances, you need the ` +\n `'orchestrator.instanceAdminView' permission.`,\n );\n }\n }\n\n auditEvent.success();\n res.status(200).json(instance);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowLogById',\n async (c, request: express.Request, res: express.Response, next) => {\n const instanceId = c.request.params.instanceId as string;\n // will probably have to get the raw log at some point\n // const rawLog = c.request.query.instanceId as Boolean;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-logs-by-instance',\n request,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\n });\n\n try {\n // Check that a log provider has been setup\n if (!services.orchestratorService.hasLogProvider()) {\n throw new Error(`No log provider setup`);\n }\n const instance = await routerApi.v2.getInstanceById(instanceId);\n const workflowId = instance.processId;\n\n const decision = await authorize(\n request,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const credentials = await httpAuth.credentials(request);\n const initiatorEntity = (await userInfo.getUserInfo(credentials))\n .userEntityRef;\n // Check if user is authorized to view all instances\n const isUserAuthorizedForInstanceAdminView =\n await isUserAuthorizedForInstanceAdminViewPermission(\n request,\n permissions,\n httpAuth,\n );\n\n // If not an admin, enforce initiatorEntity check\n if (!isUserAuthorizedForInstanceAdminView) {\n const instanceInitiatorEntity = instance.initiatorEntity;\n if (instanceInitiatorEntity !== initiatorEntity) {\n throw new Error(\n `Unauthorized to access instance ${instanceId} not initiated by user.`,\n );\n }\n }\n\n const logs = await routerApi.v2.getInstanceLogsByInstance(instance);\n\n auditEvent.success();\n res.status(200).json(logs);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'abortWorkflow',\n async (c, request, res, next) => {\n const instanceId = c.request.params.instanceId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'abort-workflow',\n request,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\n });\n\n try {\n const instance = await routerApi.v2.getInstanceById(instanceId);\n const workflowId = instance.processId;\n\n const decision = await authorize(\n request,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const result = await routerApi.v2.abortWorkflow(workflowId, instanceId);\n auditEvent.success({ meta: { result } });\n res.status(200).json(result);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n}\n\nfunction getRequestFilters(req: HttpRequest): Filter | undefined {\n return req.body.filters ? (req.body.filters as Filter) : undefined;\n}\n"],"names":["AuthorizeResult","orchestratorInstanceAdminViewPermission","orchestratorWorkflowPermission","orchestratorWorkflowSpecificPermission","Router","createPermissionIntegrationRouter","orchestratorPermissions","express","MiddlewareFactory","DataIndexService","SonataFlowService","WorkflowCacheService","OrchestratorService","DataInputSchemaService","OpenAPIBackend","openApiDocument","fullFormats","v2","V2","UnauthorizedError","buildPagination","orchestratorWorkflowUsePermission","orchestratorWorkflowUseSpecificPermission","NotAllowedError"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@red-hat-developer-hub/backstage-plugin-orchestrator-backend",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.6.1",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"main": "./dist/index.cjs.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
"pluginPackages": [
|
|
14
14
|
"@red-hat-developer-hub/backstage-plugin-orchestrator",
|
|
15
15
|
"@red-hat-developer-hub/backstage-plugin-orchestrator-backend",
|
|
16
|
-
"@red-hat-developer-hub/backstage-plugin-orchestrator-common"
|
|
16
|
+
"@red-hat-developer-hub/backstage-plugin-orchestrator-common",
|
|
17
|
+
"@red-hat-developer-hub/backstage-plugin-orchestrator-node"
|
|
17
18
|
],
|
|
18
19
|
"features": {
|
|
19
20
|
".": "@backstage/BackendFeature"
|
|
@@ -81,7 +82,8 @@
|
|
|
81
82
|
"@backstage/plugin-permission-node": "^0.10.6",
|
|
82
83
|
"@backstage/plugin-scaffolder-backend": "^3.0.1",
|
|
83
84
|
"@backstage/plugin-scaffolder-node": "^0.12.1",
|
|
84
|
-
"@red-hat-developer-hub/backstage-plugin-orchestrator-common": "^3.
|
|
85
|
+
"@red-hat-developer-hub/backstage-plugin-orchestrator-common": "^3.4.1",
|
|
86
|
+
"@red-hat-developer-hub/backstage-plugin-orchestrator-node": "^1.0.1",
|
|
85
87
|
"@urql/core": "^4.1.4",
|
|
86
88
|
"ajv-formats": "^2.1.1",
|
|
87
89
|
"cloudevents": "^8.0.0",
|
|
@@ -104,7 +106,7 @@
|
|
|
104
106
|
"@types/fs-extra": "11.0.4",
|
|
105
107
|
"@types/json-schema": "7.0.15",
|
|
106
108
|
"@types/luxon": "^3.7.1",
|
|
107
|
-
"prettier": "3.
|
|
109
|
+
"prettier": "3.8.1"
|
|
108
110
|
},
|
|
109
111
|
"peerDependencies": {
|
|
110
112
|
"@backstage-community/plugin-rbac-common": "^1.12.1",
|