@red-hat-developer-hub/backstage-plugin-orchestrator-backend 4.1.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.
Files changed (49) hide show
  1. package/CHANGELOG.md +740 -0
  2. package/README.md +5 -0
  3. package/app-config.yaml +3 -0
  4. package/dist/helpers/errorBuilder.cjs.js +36 -0
  5. package/dist/helpers/errorBuilder.cjs.js.map +1 -0
  6. package/dist/helpers/filterBuilder.cjs.js +197 -0
  7. package/dist/helpers/filterBuilder.cjs.js.map +1 -0
  8. package/dist/helpers/queryBuilder.cjs.js +40 -0
  9. package/dist/helpers/queryBuilder.cjs.js.map +1 -0
  10. package/dist/index.cjs.js +10 -0
  11. package/dist/index.cjs.js.map +1 -0
  12. package/dist/index.d.ts +9 -0
  13. package/dist/package.json.cjs.js +6 -0
  14. package/dist/package.json.cjs.js.map +1 -0
  15. package/dist/plugin.cjs.js +45 -0
  16. package/dist/plugin.cjs.js.map +1 -0
  17. package/dist/routerWrapper/index.cjs.js +31 -0
  18. package/dist/routerWrapper/index.cjs.js.map +1 -0
  19. package/dist/service/DataIndexService.cjs.js +405 -0
  20. package/dist/service/DataIndexService.cjs.js.map +1 -0
  21. package/dist/service/DataInputSchemaService.cjs.js +12 -0
  22. package/dist/service/DataInputSchemaService.cjs.js.map +1 -0
  23. package/dist/service/DevModeService.cjs.js +144 -0
  24. package/dist/service/DevModeService.cjs.js.map +1 -0
  25. package/dist/service/GitService.cjs.js +72 -0
  26. package/dist/service/GitService.cjs.js.map +1 -0
  27. package/dist/service/GitWrapper/git.cjs.js +219 -0
  28. package/dist/service/GitWrapper/git.cjs.js.map +1 -0
  29. package/dist/service/Helper.cjs.js +66 -0
  30. package/dist/service/Helper.cjs.js.map +1 -0
  31. package/dist/service/OrchestratorService.cjs.js +119 -0
  32. package/dist/service/OrchestratorService.cjs.js.map +1 -0
  33. package/dist/service/ScaffolderService.cjs.js +94 -0
  34. package/dist/service/ScaffolderService.cjs.js.map +1 -0
  35. package/dist/service/SonataFlowService.cjs.js +188 -0
  36. package/dist/service/SonataFlowService.cjs.js.map +1 -0
  37. package/dist/service/WorkflowCacheService.cjs.js +91 -0
  38. package/dist/service/WorkflowCacheService.cjs.js.map +1 -0
  39. package/dist/service/api/mapping/V2Mappings.cjs.js +150 -0
  40. package/dist/service/api/mapping/V2Mappings.cjs.js.map +1 -0
  41. package/dist/service/api/v2.cjs.js +187 -0
  42. package/dist/service/api/v2.cjs.js.map +1 -0
  43. package/dist/service/constants.cjs.js +10 -0
  44. package/dist/service/constants.cjs.js.map +1 -0
  45. package/dist/service/router.cjs.js +626 -0
  46. package/dist/service/router.cjs.js.map +1 -0
  47. package/dist/types/pagination.cjs.js +30 -0
  48. package/dist/types/pagination.cjs.js.map +1 -0
  49. package/package.json +110 -0
@@ -0,0 +1,72 @@
1
+ 'use strict';
2
+
3
+ var integration = require('@backstage/integration');
4
+ var git = require('./GitWrapper/git.cjs.js');
5
+
6
+ class GitService {
7
+ git;
8
+ logger;
9
+ authenticated;
10
+ author = {
11
+ name: "backstage-orchestrator",
12
+ email: "orchestrator@backstage.io"
13
+ };
14
+ committer = {
15
+ name: "backstage-orchestrator",
16
+ email: "orchestrator@backstage.io"
17
+ };
18
+ constructor(logger, config) {
19
+ this.logger = logger;
20
+ const githubIntegration = integration.ScmIntegrations.fromConfig(config).github.list().pop();
21
+ this.git = git.Git.fromAuth({
22
+ username: "x-access-token",
23
+ password: githubIntegration?.config.token
24
+ });
25
+ this.authenticated = !!githubIntegration?.config.token;
26
+ }
27
+ async clone(repoURL, localPath) {
28
+ this.logger.info(`cloning repo ${repoURL} into ${localPath}`);
29
+ return this.git.clone({
30
+ url: repoURL,
31
+ dir: localPath,
32
+ depth: 1
33
+ }).then(() => this.git.checkout({ dir: localPath, ref: "main" }));
34
+ }
35
+ async push(dir, message) {
36
+ if (!this.authenticated) {
37
+ this.logger.warn(
38
+ "Git integration is required to be configured for push, with the token or credentials"
39
+ );
40
+ return;
41
+ }
42
+ const branch = "main";
43
+ const force = true;
44
+ const remote = "origin";
45
+ const filepath = ".";
46
+ this.git.fetch({ remote, dir }).then(() => this.git.checkout({ dir, ref: branch })).then(() => this.git.add({ dir, filepath })).then(
47
+ () => this.git.commit({
48
+ dir,
49
+ message,
50
+ author: this.author,
51
+ committer: this.committer
52
+ })
53
+ ).then(() => this.git.push({ dir, remote, remoteRef: branch, force })).finally(() => this.logger.info("push completed")).catch((ex) => this.logger.error(ex));
54
+ }
55
+ async pull(localPath) {
56
+ const remoteBranch = "origin/main";
57
+ const localBranch = "main";
58
+ const remote = "origin";
59
+ this.git.fetch({ remote, dir: localPath }).then(() => this.git.checkout({ dir: localPath, ref: localBranch })).then(
60
+ () => this.git.merge({
61
+ dir: localPath,
62
+ ours: localBranch,
63
+ theirs: remoteBranch,
64
+ author: this.author,
65
+ committer: this.committer
66
+ })
67
+ ).finally(() => this.logger.info("merge completed")).catch((ex) => this.logger.error(ex));
68
+ }
69
+ }
70
+
71
+ exports.GitService = GitService;
72
+ //# sourceMappingURL=GitService.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitService.cjs.js","sources":["../../src/service/GitService.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport type { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport { ScmIntegrations } from '@backstage/integration';\n\nimport { Git } from './GitWrapper';\n\nexport class GitService {\n private readonly git: Git;\n\n private readonly logger: LoggerService;\n private authenticated: boolean;\n\n private readonly author = {\n name: 'backstage-orchestrator',\n email: 'orchestrator@backstage.io',\n };\n\n private readonly committer = {\n name: 'backstage-orchestrator',\n email: 'orchestrator@backstage.io',\n };\n\n constructor(logger: LoggerService, config: Config) {\n this.logger = logger;\n const githubIntegration = ScmIntegrations.fromConfig(config)\n .github.list()\n .pop();\n this.git = Git.fromAuth({\n username: 'x-access-token',\n password: githubIntegration?.config.token,\n });\n this.authenticated = !!githubIntegration?.config.token;\n }\n\n async clone(repoURL: string, localPath: string): Promise<void> {\n this.logger.info(`cloning repo ${repoURL} into ${localPath}`);\n return this.git\n .clone({\n url: repoURL,\n dir: localPath,\n depth: 1,\n })\n .then(() => this.git.checkout({ dir: localPath, ref: 'main' }));\n }\n\n async push(dir: string, message: string): Promise<void> {\n if (!this.authenticated) {\n this.logger.warn(\n 'Git integration is required to be configured for push, with the token or credentials',\n );\n return;\n }\n const branch = 'main';\n const force = true;\n const remote = 'origin';\n const filepath = '.';\n this.git\n .fetch({ remote, dir })\n .then(() => this.git.checkout({ dir, ref: branch }))\n .then(() => this.git.add({ dir, filepath }))\n .then(() =>\n this.git.commit({\n dir,\n message,\n author: this.author,\n committer: this.committer,\n }),\n )\n .then(() => this.git.push({ dir, remote, remoteRef: branch, force }))\n .finally(() => this.logger.info('push completed'))\n .catch(ex => this.logger.error(ex));\n }\n\n async pull(localPath: string): Promise<void> {\n const remoteBranch = 'origin/main';\n const localBranch = 'main';\n const remote = 'origin';\n this.git\n .fetch({ remote, dir: localPath })\n .then(() => this.git.checkout({ dir: localPath, ref: localBranch }))\n .then(() =>\n this.git.merge({\n dir: localPath,\n ours: localBranch,\n theirs: remoteBranch,\n author: this.author,\n committer: this.committer,\n }),\n )\n .finally(() => this.logger.info('merge completed'))\n .catch(ex => this.logger.error(ex));\n }\n}\n"],"names":["ScmIntegrations","Git"],"mappings":"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"}
@@ -0,0 +1,219 @@
1
+ 'use strict';
2
+
3
+ var fs = require('fs-extra');
4
+ var git = require('isomorphic-git');
5
+ var http = require('isomorphic-git/http/node');
6
+
7
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
8
+
9
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
10
+ var git__default = /*#__PURE__*/_interopDefaultCompat(git);
11
+ var http__default = /*#__PURE__*/_interopDefaultCompat(http);
12
+
13
+ function isAuthCallbackOptions(options) {
14
+ return "onAuth" in options;
15
+ }
16
+ class Git {
17
+ constructor(config) {
18
+ this.config = config;
19
+ this.onAuth = config.onAuth;
20
+ this.headers = {
21
+ "user-agent": "git/@isomorphic-git",
22
+ ...config.token ? { Authorization: `Bearer ${config.token}` } : {}
23
+ };
24
+ }
25
+ headers;
26
+ async add(options) {
27
+ const { dir, filepath } = options;
28
+ this.config.logger?.info(`Adding file {dir=${dir},filepath=${filepath}}`);
29
+ return git__default.default.add({ fs: fs__default.default, dir, filepath });
30
+ }
31
+ async addRemote(options) {
32
+ const { dir, url, remote, force } = options;
33
+ this.config.logger?.info(
34
+ `Creating new remote {dir=${dir},remote=${remote},url=${url}}`
35
+ );
36
+ return git__default.default.addRemote({ fs: fs__default.default, dir, remote, url, force });
37
+ }
38
+ async deleteRemote(options) {
39
+ const { dir, remote } = options;
40
+ this.config.logger?.info(`Deleting remote {dir=${dir},remote=${remote}}`);
41
+ return git__default.default.deleteRemote({ fs: fs__default.default, dir, remote });
42
+ }
43
+ async checkout(options) {
44
+ const { dir, ref } = options;
45
+ this.config.logger?.info(`Checking out branch {dir=${dir},ref=${ref}}`);
46
+ return git__default.default.checkout({ fs: fs__default.default, dir, ref });
47
+ }
48
+ async branch(options) {
49
+ const { dir, ref } = options;
50
+ this.config.logger?.info(`Creating branch {dir=${dir},ref=${ref}`);
51
+ return git__default.default.branch({ fs: fs__default.default, dir, ref });
52
+ }
53
+ async commit(options) {
54
+ const { dir, message, author, committer } = options;
55
+ this.config.logger?.info(
56
+ `Committing file to repo {dir=${dir},message=${message}}`
57
+ );
58
+ return git__default.default.commit({ fs: fs__default.default, dir, message, author, committer });
59
+ }
60
+ /** https://isomorphic-git.org/docs/en/clone */
61
+ async clone(options) {
62
+ const { url, dir, ref, depth, noCheckout } = options;
63
+ this.config.logger?.info(`Cloning repo {dir=${dir},url=${url}}`);
64
+ try {
65
+ return await git__default.default.clone({
66
+ fs: fs__default.default,
67
+ http: http__default.default,
68
+ url,
69
+ dir,
70
+ ref,
71
+ singleBranch: true,
72
+ depth: depth ?? 1,
73
+ noCheckout,
74
+ onProgress: this.onProgressHandler(),
75
+ headers: this.headers,
76
+ onAuth: this.onAuth
77
+ });
78
+ } catch (ex) {
79
+ this.config.logger?.error(`Failed to clone repo {dir=${dir},url=${url}}`);
80
+ if (ex.data) {
81
+ throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);
82
+ }
83
+ throw ex;
84
+ }
85
+ }
86
+ /** https://isomorphic-git.org/docs/en/currentBranch */
87
+ async currentBranch(options) {
88
+ const { dir, fullName = false } = options;
89
+ return git__default.default.currentBranch({ fs: fs__default.default, dir, fullname: fullName });
90
+ }
91
+ /** https://isomorphic-git.org/docs/en/fetch */
92
+ async fetch(options) {
93
+ const { dir, remote = "origin", tags = false } = options;
94
+ this.config.logger?.info(
95
+ `Fetching remote=${remote} for repository {dir=${dir}}`
96
+ );
97
+ try {
98
+ await git__default.default.fetch({
99
+ fs: fs__default.default,
100
+ http: http__default.default,
101
+ dir,
102
+ remote,
103
+ tags,
104
+ onProgress: this.onProgressHandler(),
105
+ headers: this.headers,
106
+ onAuth: this.onAuth
107
+ });
108
+ } catch (ex) {
109
+ this.config.logger?.error(
110
+ `Failed to fetch repo {dir=${dir},remote=${remote}}`
111
+ );
112
+ if (ex.data) {
113
+ throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);
114
+ }
115
+ throw ex;
116
+ }
117
+ }
118
+ async init(options) {
119
+ const { dir, defaultBranch = "master" } = options;
120
+ this.config.logger?.info(`Init git repository {dir=${dir}}`);
121
+ return git__default.default.init({
122
+ fs: fs__default.default,
123
+ dir,
124
+ defaultBranch
125
+ });
126
+ }
127
+ /** https://isomorphic-git.org/docs/en/merge */
128
+ async merge(options) {
129
+ const { dir, theirs, ours, author, committer } = options;
130
+ this.config.logger?.info(
131
+ `Merging branch '${theirs}' into '${ours}' for repository {dir=${dir}}`
132
+ );
133
+ return git__default.default.merge({
134
+ fs: fs__default.default,
135
+ dir,
136
+ ours,
137
+ theirs,
138
+ author,
139
+ committer
140
+ });
141
+ }
142
+ async push(options) {
143
+ const { dir, remote, remoteRef, force } = options;
144
+ this.config.logger?.info(
145
+ `Pushing directory to remote {dir=${dir},remote=${remote}}`
146
+ );
147
+ try {
148
+ return await git__default.default.push({
149
+ fs: fs__default.default,
150
+ dir,
151
+ http: http__default.default,
152
+ onProgress: this.onProgressHandler(),
153
+ remoteRef,
154
+ force,
155
+ headers: this.headers,
156
+ remote,
157
+ onAuth: this.onAuth
158
+ });
159
+ } catch (ex) {
160
+ this.config.logger?.error(
161
+ `Failed to push to repo {dir=${dir}, remote=${remote}}`
162
+ );
163
+ if (ex.data) {
164
+ throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);
165
+ }
166
+ throw ex;
167
+ }
168
+ }
169
+ /** https://isomorphic-git.org/docs/en/readCommit */
170
+ async readCommit(options) {
171
+ const { dir, sha } = options;
172
+ return git__default.default.readCommit({ fs: fs__default.default, dir, oid: sha });
173
+ }
174
+ /** https://isomorphic-git.org/docs/en/remove */
175
+ async remove(options) {
176
+ const { dir, filepath } = options;
177
+ this.config.logger?.info(
178
+ `Removing file from git index {dir=${dir},filepath=${filepath}}`
179
+ );
180
+ return git__default.default.remove({ fs: fs__default.default, dir, filepath });
181
+ }
182
+ /** https://isomorphic-git.org/docs/en/resolveRef */
183
+ async resolveRef(options) {
184
+ const { dir, ref } = options;
185
+ return git__default.default.resolveRef({ fs: fs__default.default, dir, ref });
186
+ }
187
+ /** https://isomorphic-git.org/docs/en/log */
188
+ async log(options) {
189
+ const { dir, ref } = options;
190
+ return git__default.default.log({
191
+ fs: fs__default.default,
192
+ dir,
193
+ ref: ref ?? "HEAD"
194
+ });
195
+ }
196
+ onAuth;
197
+ onProgressHandler = () => {
198
+ let currentPhase = "";
199
+ return (event) => {
200
+ if (currentPhase !== event.phase) {
201
+ currentPhase = event.phase;
202
+ this.config.logger?.info(event.phase);
203
+ }
204
+ const total = event.total ? `${Math.round(event.loaded / event.total * 100)}%` : event.loaded;
205
+ this.config.logger?.debug(`status={${event.phase},total={${total}}}`);
206
+ };
207
+ };
208
+ static fromAuth = (options) => {
209
+ if (isAuthCallbackOptions(options)) {
210
+ const { onAuth, logger: logger2 } = options;
211
+ return new Git({ onAuth, logger: logger2 });
212
+ }
213
+ const { username, password, token, logger } = options;
214
+ return new Git({ onAuth: () => ({ username, password }), token, logger });
215
+ };
216
+ }
217
+
218
+ exports.Git = Git;
219
+ //# sourceMappingURL=git.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.cjs.js","sources":["../../../src/service/GitWrapper/git.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nimport fs from 'fs-extra';\nimport git, {\n AuthCallback,\n MergeResult,\n ProgressCallback,\n ReadCommitResult,\n} from 'isomorphic-git';\nimport http from 'isomorphic-git/http/node';\n\nfunction isAuthCallbackOptions(\n options: StaticAuthOptions | AuthCallbackOptions,\n): options is AuthCallbackOptions {\n return 'onAuth' in options;\n}\n\n/**\n * Configure static credential for authentication\n * @public\n */\nexport type StaticAuthOptions = {\n username?: string;\n password?: string;\n token?: string;\n logger?: LoggerService;\n};\n\n/**\n * Configure an authentication callback that can provide credentials on demand\n * @public\n */\nexport type AuthCallbackOptions = {\n onAuth: AuthCallback;\n logger?: LoggerService;\n};\n\n/*\nprovider username password\nAzure 'notempty' token\nBitbucket Cloud 'x-token-auth' token\nBitbucket Server username password or token\nGitHub 'x-access-token' token\nGitLab 'oauth2' token\nFrom : https://isomorphic-git.org/docs/en/onAuth with fix for GitHub\nOr token provided as `token` for Bearer auth header\ninstead of Basic Auth (e.g., Bitbucket Server).\n*/\n\n/**\n * A convenience wrapper around the `isomorphic-git` library.\n * @public\n */\n\nexport class Git {\n private readonly headers: {\n [x: string]: string;\n };\n\n private constructor(\n private readonly config: {\n onAuth: AuthCallback;\n token?: string;\n logger?: LoggerService;\n },\n ) {\n this.onAuth = config.onAuth;\n\n this.headers = {\n 'user-agent': 'git/@isomorphic-git',\n ...(config.token ? { Authorization: `Bearer ${config.token}` } : {}),\n };\n }\n\n async add(options: { dir: string; filepath: string }): Promise<void> {\n const { dir, filepath } = options;\n this.config.logger?.info(`Adding file {dir=${dir},filepath=${filepath}}`);\n\n return git.add({ fs, dir, filepath });\n }\n\n async addRemote(options: {\n dir: string;\n remote: string;\n url: string;\n force?: boolean;\n }): Promise<void> {\n const { dir, url, remote, force } = options;\n this.config.logger?.info(\n `Creating new remote {dir=${dir},remote=${remote},url=${url}}`,\n );\n return git.addRemote({ fs, dir, remote, url, force });\n }\n\n async deleteRemote(options: { dir: string; remote: string }): Promise<void> {\n const { dir, remote } = options;\n this.config.logger?.info(`Deleting remote {dir=${dir},remote=${remote}}`);\n return git.deleteRemote({ fs, dir, remote });\n }\n\n async checkout(options: { dir: string; ref: string }): Promise<void> {\n const { dir, ref } = options;\n this.config.logger?.info(`Checking out branch {dir=${dir},ref=${ref}}`);\n\n return git.checkout({ fs, dir, ref });\n }\n\n async branch(options: { dir: string; ref: string }): Promise<void> {\n const { dir, ref } = options;\n this.config.logger?.info(`Creating branch {dir=${dir},ref=${ref}`);\n\n return git.branch({ fs, dir, ref });\n }\n\n async commit(options: {\n dir: string;\n message: string;\n author: { name: string; email: string };\n committer: { name: string; email: string };\n }): Promise<string> {\n const { dir, message, author, committer } = options;\n this.config.logger?.info(\n `Committing file to repo {dir=${dir},message=${message}}`,\n );\n return git.commit({ fs, dir, message, author, committer });\n }\n\n /** https://isomorphic-git.org/docs/en/clone */\n async clone(options: {\n url: string;\n dir: string;\n ref?: string;\n depth?: number;\n noCheckout?: boolean;\n }): Promise<void> {\n const { url, dir, ref, depth, noCheckout } = options;\n this.config.logger?.info(`Cloning repo {dir=${dir},url=${url}}`);\n\n try {\n return await git.clone({\n fs,\n http,\n url,\n dir,\n ref,\n singleBranch: true,\n depth: depth ?? 1,\n noCheckout,\n onProgress: this.onProgressHandler(),\n headers: this.headers,\n onAuth: this.onAuth,\n });\n } catch (ex: any) {\n this.config.logger?.error(`Failed to clone repo {dir=${dir},url=${url}}`);\n if (ex.data) {\n throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);\n }\n throw ex;\n }\n }\n\n /** https://isomorphic-git.org/docs/en/currentBranch */\n async currentBranch(options: {\n dir: string;\n fullName?: boolean;\n }): Promise<string | undefined> {\n const { dir, fullName = false } = options;\n return git.currentBranch({ fs, dir, fullname: fullName }) as Promise<\n string | undefined\n >;\n }\n\n /** https://isomorphic-git.org/docs/en/fetch */\n async fetch(options: {\n dir: string;\n remote?: string;\n tags?: boolean;\n }): Promise<void> {\n const { dir, remote = 'origin', tags = false } = options;\n this.config.logger?.info(\n `Fetching remote=${remote} for repository {dir=${dir}}`,\n );\n\n try {\n await git.fetch({\n fs,\n http,\n dir,\n remote,\n tags,\n onProgress: this.onProgressHandler(),\n headers: this.headers,\n onAuth: this.onAuth,\n });\n } catch (ex: any) {\n this.config.logger?.error(\n `Failed to fetch repo {dir=${dir},remote=${remote}}`,\n );\n if (ex.data) {\n throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);\n }\n throw ex;\n }\n }\n\n async init(options: { dir: string; defaultBranch?: string }): Promise<void> {\n const { dir, defaultBranch = 'master' } = options;\n this.config.logger?.info(`Init git repository {dir=${dir}}`);\n\n return git.init({\n fs,\n dir,\n defaultBranch,\n });\n }\n\n /** https://isomorphic-git.org/docs/en/merge */\n async merge(options: {\n dir: string;\n theirs: string;\n ours?: string;\n author: { name: string; email: string };\n committer: { name: string; email: string };\n }): Promise<MergeResult> {\n const { dir, theirs, ours, author, committer } = options;\n this.config.logger?.info(\n `Merging branch '${theirs}' into '${ours}' for repository {dir=${dir}}`,\n );\n\n // If ours is undefined, current branch is used.\n return git.merge({\n fs,\n dir,\n ours,\n theirs,\n author,\n committer,\n });\n }\n\n async push(options: {\n dir: string;\n remote: string;\n remoteRef?: string;\n force?: boolean;\n }) {\n const { dir, remote, remoteRef, force } = options;\n this.config.logger?.info(\n `Pushing directory to remote {dir=${dir},remote=${remote}}`,\n );\n try {\n return await git.push({\n fs,\n dir,\n http,\n onProgress: this.onProgressHandler(),\n remoteRef,\n force,\n headers: this.headers,\n remote,\n onAuth: this.onAuth,\n });\n } catch (ex: any) {\n this.config.logger?.error(\n `Failed to push to repo {dir=${dir}, remote=${remote}}`,\n );\n if (ex.data) {\n throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);\n }\n throw ex;\n }\n }\n\n /** https://isomorphic-git.org/docs/en/readCommit */\n async readCommit(options: {\n dir: string;\n sha: string;\n }): Promise<ReadCommitResult> {\n const { dir, sha } = options;\n return git.readCommit({ fs, dir, oid: sha });\n }\n\n /** https://isomorphic-git.org/docs/en/remove */\n async remove(options: { dir: string; filepath: string }): Promise<void> {\n const { dir, filepath } = options;\n this.config.logger?.info(\n `Removing file from git index {dir=${dir},filepath=${filepath}}`,\n );\n return git.remove({ fs, dir, filepath });\n }\n\n /** https://isomorphic-git.org/docs/en/resolveRef */\n async resolveRef(options: { dir: string; ref: string }): Promise<string> {\n const { dir, ref } = options;\n return git.resolveRef({ fs, dir, ref });\n }\n\n /** https://isomorphic-git.org/docs/en/log */\n async log(options: {\n dir: string;\n ref?: string;\n }): Promise<ReadCommitResult[]> {\n const { dir, ref } = options;\n return git.log({\n fs,\n dir,\n ref: ref ?? 'HEAD',\n });\n }\n\n private readonly onAuth: AuthCallback;\n\n private readonly onProgressHandler = (): ProgressCallback => {\n let currentPhase = '';\n\n return event => {\n if (currentPhase !== event.phase) {\n currentPhase = event.phase;\n this.config.logger?.info(event.phase);\n }\n const total = event.total\n ? `${Math.round((event.loaded / event.total) * 100)}%`\n : event.loaded;\n this.config.logger?.debug(`status={${event.phase},total={${total}}}`);\n };\n };\n\n static readonly fromAuth = (\n options: StaticAuthOptions | AuthCallbackOptions,\n ) => {\n if (isAuthCallbackOptions(options)) {\n const { onAuth, logger } = options;\n return new Git({ onAuth, logger });\n }\n\n const { username, password, token, logger } = options;\n return new Git({ onAuth: () => ({ username, password }), token, logger });\n };\n}\n"],"names":["git","fs","http","logger"],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ 'use strict';
2
+
3
+ var fs = require('fs-extra');
4
+ var os = require('os');
5
+
6
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
7
+
8
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
9
+ var os__default = /*#__PURE__*/_interopDefaultCompat(os);
10
+
11
+ async function retryAsyncFunction(args) {
12
+ let result;
13
+ for (let i = 0; i < args.maxAttempts; i++) {
14
+ result = await args.asyncFn();
15
+ if (result !== void 0) {
16
+ return result;
17
+ }
18
+ await new Promise((resolve) => setTimeout(resolve, args.delayMs));
19
+ }
20
+ throw new Error("Exceeded maximum number of retries for async function");
21
+ }
22
+ async function getWorkingDirectory(config, logger) {
23
+ if (!config.has("backend.workingDirectory")) {
24
+ return os__default.default.tmpdir();
25
+ }
26
+ const workingDirectory = config.getString("backend.workingDirectory");
27
+ try {
28
+ await fs__default.default.access(workingDirectory, fs__default.default.constants.F_OK | fs__default.default.constants.W_OK);
29
+ logger.info(`using working directory: ${workingDirectory}`);
30
+ } catch (err) {
31
+ logger.error(
32
+ `working directory ${workingDirectory} ${err.code === "ENOENT" ? "does not exist" : "is not writable"}`
33
+ );
34
+ throw err;
35
+ }
36
+ return workingDirectory;
37
+ }
38
+ async function executeWithRetry(action, maxErrors = 15) {
39
+ let response;
40
+ let errorCount = 0;
41
+ const backoff = 5e3;
42
+ while (errorCount < maxErrors) {
43
+ try {
44
+ response = await action();
45
+ if (response.status >= 400) {
46
+ errorCount++;
47
+ await delay(backoff);
48
+ } else {
49
+ return response;
50
+ }
51
+ } catch (e) {
52
+ errorCount++;
53
+ await delay(backoff);
54
+ }
55
+ }
56
+ throw new Error("Unable to execute query.");
57
+ }
58
+ function delay(time) {
59
+ return new Promise((r) => setTimeout(r, time));
60
+ }
61
+
62
+ exports.delay = delay;
63
+ exports.executeWithRetry = executeWithRetry;
64
+ exports.getWorkingDirectory = getWorkingDirectory;
65
+ exports.retryAsyncFunction = retryAsyncFunction;
66
+ //# sourceMappingURL=Helper.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Helper.cjs.js","sources":["../../src/service/Helper.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport type { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\n\nimport fs from 'fs-extra';\n\nimport os from 'os';\n\nexport async function retryAsyncFunction<T>(args: {\n asyncFn: () => Promise<T | undefined>;\n maxAttempts: number;\n delayMs: number;\n}): Promise<T> {\n let result: T | undefined;\n for (let i = 0; i < args.maxAttempts; i++) {\n result = await args.asyncFn();\n if (result !== undefined) {\n return result;\n }\n await new Promise(resolve => setTimeout(resolve, args.delayMs));\n }\n throw new Error('Exceeded maximum number of retries for async function');\n}\n\nexport async function getWorkingDirectory(\n config: Config,\n logger: LoggerService,\n): Promise<string> {\n if (!config.has('backend.workingDirectory')) {\n return os.tmpdir();\n }\n\n const workingDirectory = config.getString('backend.workingDirectory');\n try {\n // Check if working directory exists and is writable\n await fs.access(workingDirectory, fs.constants.F_OK | fs.constants.W_OK);\n logger.info(`using working directory: ${workingDirectory}`);\n } catch (err: any) {\n logger.error(\n `working directory ${workingDirectory} ${\n err.code === 'ENOENT' ? 'does not exist' : 'is not writable'\n }`,\n );\n throw err;\n }\n return workingDirectory;\n}\n\nexport async function executeWithRetry(\n action: () => Promise<Response>,\n maxErrors = 15,\n): Promise<Response> {\n let response: Response;\n let errorCount = 0;\n // execute with retry\n const backoff = 5000;\n while (errorCount < maxErrors) {\n try {\n response = await action();\n if (response.status >= 400) {\n errorCount++;\n // backoff\n await delay(backoff);\n } else {\n return response;\n }\n } catch (e) {\n errorCount++;\n await delay(backoff);\n }\n }\n throw new Error('Unable to execute query.');\n}\n\nexport function delay(time: number) {\n return new Promise(r => setTimeout(r, time));\n}\n"],"names":["os","fs"],"mappings":";;;;;;;;;;AAsBA,eAAsB,mBAAsB,IAI7B,EAAA;AACb,EAAI,IAAA,MAAA,CAAA;AACJ,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,IAAA,CAAK,aAAa,CAAK,EAAA,EAAA;AACzC,IAAS,MAAA,GAAA,MAAM,KAAK,OAAQ,EAAA,CAAA;AAC5B,IAAA,IAAI,WAAW,KAAW,CAAA,EAAA;AACxB,MAAO,OAAA,MAAA,CAAA;AAAA,KACT;AACA,IAAA,MAAM,IAAI,OAAQ,CAAA,CAAA,OAAA,KAAW,WAAW,OAAS,EAAA,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA;AAAA,GAChE;AACA,EAAM,MAAA,IAAI,MAAM,uDAAuD,CAAA,CAAA;AACzE,CAAA;AAEsB,eAAA,mBAAA,CACpB,QACA,MACiB,EAAA;AACjB,EAAA,IAAI,CAAC,MAAA,CAAO,GAAI,CAAA,0BAA0B,CAAG,EAAA;AAC3C,IAAA,OAAOA,oBAAG,MAAO,EAAA,CAAA;AAAA,GACnB;AAEA,EAAM,MAAA,gBAAA,GAAmB,MAAO,CAAA,SAAA,CAAU,0BAA0B,CAAA,CAAA;AACpE,EAAI,IAAA;AAEF,IAAM,MAAAC,mBAAA,CAAG,OAAO,gBAAkB,EAAAA,mBAAA,CAAG,UAAU,IAAO,GAAAA,mBAAA,CAAG,UAAU,IAAI,CAAA,CAAA;AACvE,IAAO,MAAA,CAAA,IAAA,CAAK,CAA4B,yBAAA,EAAA,gBAAgB,CAAE,CAAA,CAAA,CAAA;AAAA,WACnD,GAAU,EAAA;AACjB,IAAO,MAAA,CAAA,KAAA;AAAA,MACL,qBAAqB,gBAAgB,CAAA,CAAA,EACnC,IAAI,IAAS,KAAA,QAAA,GAAW,mBAAmB,iBAC7C,CAAA,CAAA;AAAA,KACF,CAAA;AACA,IAAM,MAAA,GAAA,CAAA;AAAA,GACR;AACA,EAAO,OAAA,gBAAA,CAAA;AACT,CAAA;AAEsB,eAAA,gBAAA,CACpB,MACA,EAAA,SAAA,GAAY,EACO,EAAA;AACnB,EAAI,IAAA,QAAA,CAAA;AACJ,EAAA,IAAI,UAAa,GAAA,CAAA,CAAA;AAEjB,EAAA,MAAM,OAAU,GAAA,GAAA,CAAA;AAChB,EAAA,OAAO,aAAa,SAAW,EAAA;AAC7B,IAAI,IAAA;AACF,MAAA,QAAA,GAAW,MAAM,MAAO,EAAA,CAAA;AACxB,MAAI,IAAA,QAAA,CAAS,UAAU,GAAK,EAAA;AAC1B,QAAA,UAAA,EAAA,CAAA;AAEA,QAAA,MAAM,MAAM,OAAO,CAAA,CAAA;AAAA,OACd,MAAA;AACL,QAAO,OAAA,QAAA,CAAA;AAAA,OACT;AAAA,aACO,CAAG,EAAA;AACV,MAAA,UAAA,EAAA,CAAA;AACA,MAAA,MAAM,MAAM,OAAO,CAAA,CAAA;AAAA,KACrB;AAAA,GACF;AACA,EAAM,MAAA,IAAI,MAAM,0BAA0B,CAAA,CAAA;AAC5C,CAAA;AAEO,SAAS,MAAM,IAAc,EAAA;AAClC,EAAA,OAAO,IAAI,OAAQ,CAAA,CAAA,CAAA,KAAK,UAAW,CAAA,CAAA,EAAG,IAAI,CAAC,CAAA,CAAA;AAC7C;;;;;;;"}
@@ -0,0 +1,119 @@
1
+ 'use strict';
2
+
3
+ class OrchestratorService {
4
+ constructor(sonataFlowService, dataIndexService, workflowCacheService) {
5
+ this.sonataFlowService = sonataFlowService;
6
+ this.dataIndexService = dataIndexService;
7
+ this.workflowCacheService = workflowCacheService;
8
+ }
9
+ // Data Index Service Wrapper
10
+ async abortWorkflowInstance(args) {
11
+ const { instanceId, cacheHandler } = args;
12
+ const definitionId = await this.dataIndexService.fetchDefinitionIdByInstanceId(instanceId);
13
+ const isWorkflowAvailable = this.workflowCacheService.isAvailable(
14
+ definitionId,
15
+ cacheHandler
16
+ );
17
+ return isWorkflowAvailable ? await this.dataIndexService.abortWorkflowInstance(instanceId) : void 0;
18
+ }
19
+ async fetchWorkflowInfo(args) {
20
+ const { definitionId, cacheHandler } = args;
21
+ const isWorkflowAvailable = this.workflowCacheService.isAvailable(
22
+ definitionId,
23
+ cacheHandler
24
+ );
25
+ return isWorkflowAvailable ? await this.dataIndexService.fetchWorkflowInfo(definitionId) : void 0;
26
+ }
27
+ async fetchInstances(args) {
28
+ const definitionIds = args.workflowId ? [args.workflowId] : this.workflowCacheService.definitionIds;
29
+ return await this.dataIndexService.fetchInstances({
30
+ definitionIds,
31
+ pagination: args.pagination,
32
+ filter: args.filter
33
+ });
34
+ }
35
+ async fetchInstancesTotalCount(workflowId, filter) {
36
+ const definitionIds = workflowId ? [workflowId] : this.workflowCacheService.definitionIds;
37
+ return await this.dataIndexService.fetchInstancesTotalCount(
38
+ definitionIds,
39
+ filter
40
+ );
41
+ }
42
+ async fetchWorkflowSource(args) {
43
+ const { definitionId, cacheHandler } = args;
44
+ const isWorkflowAvailable = this.workflowCacheService.isAvailable(
45
+ definitionId,
46
+ cacheHandler
47
+ );
48
+ return isWorkflowAvailable ? await this.dataIndexService.fetchWorkflowSource(definitionId) : void 0;
49
+ }
50
+ async fetchInstanceVariables(args) {
51
+ const { instanceId, cacheHandler } = args;
52
+ const definitionId = await this.dataIndexService.fetchDefinitionIdByInstanceId(instanceId);
53
+ const isWorkflowAvailable = this.workflowCacheService.isAvailable(
54
+ definitionId,
55
+ cacheHandler
56
+ );
57
+ return isWorkflowAvailable ? await this.dataIndexService.fetchInstanceVariables(instanceId) : void 0;
58
+ }
59
+ async fetchInstance(args) {
60
+ const { instanceId, cacheHandler } = args;
61
+ const instance = await this.dataIndexService.fetchInstance(instanceId);
62
+ const isWorkflowAvailable = this.workflowCacheService.isAvailable(
63
+ instance?.processId,
64
+ cacheHandler
65
+ );
66
+ return isWorkflowAvailable ? instance : void 0;
67
+ }
68
+ // SonataFlow Service Wrapper
69
+ async fetchWorkflowInfoOnService(args) {
70
+ const { definitionId, cacheHandler } = args;
71
+ const isWorkflowAvailable = this.workflowCacheService.isAvailable(
72
+ definitionId,
73
+ cacheHandler
74
+ );
75
+ return isWorkflowAvailable ? await this.sonataFlowService.fetchWorkflowInfoOnService(args) : void 0;
76
+ }
77
+ async fetchWorkflowDefinition(args) {
78
+ const { definitionId, cacheHandler } = args;
79
+ const isWorkflowAvailable = this.workflowCacheService.isAvailable(
80
+ definitionId,
81
+ cacheHandler
82
+ );
83
+ return isWorkflowAvailable ? await this.sonataFlowService.fetchWorkflowDefinition(definitionId) : void 0;
84
+ }
85
+ async fetchWorkflowOverviews(args) {
86
+ return await this.sonataFlowService.fetchWorkflowOverviews({
87
+ definitionIds: this.workflowCacheService.definitionIds,
88
+ pagination: args.pagination,
89
+ filter: args.filter
90
+ });
91
+ }
92
+ async executeWorkflow(args) {
93
+ const { definitionId, cacheHandler } = args;
94
+ const isWorkflowAvailable = this.workflowCacheService.isAvailable(
95
+ definitionId,
96
+ cacheHandler
97
+ );
98
+ return isWorkflowAvailable ? await this.sonataFlowService.executeWorkflow(args) : void 0;
99
+ }
100
+ async retriggerWorkflow(args) {
101
+ const { definitionId, cacheHandler } = args;
102
+ const isWorkflowAvailable = this.workflowCacheService.isAvailable(
103
+ definitionId,
104
+ cacheHandler
105
+ );
106
+ return isWorkflowAvailable ? await this.sonataFlowService.retriggerInstance(args) : void 0;
107
+ }
108
+ async fetchWorkflowOverview(args) {
109
+ const { definitionId, cacheHandler } = args;
110
+ const isWorkflowAvailable = this.workflowCacheService.isAvailable(
111
+ definitionId,
112
+ cacheHandler
113
+ );
114
+ return isWorkflowAvailable ? await this.sonataFlowService.fetchWorkflowOverview(definitionId) : void 0;
115
+ }
116
+ }
117
+
118
+ exports.OrchestratorService = OrchestratorService;
119
+ //# sourceMappingURL=OrchestratorService.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrchestratorService.cjs.js","sources":["../../src/service/OrchestratorService.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\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 { CacheHandler, 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\n public async abortWorkflowInstance(args: {\n instanceId: string;\n cacheHandler?: CacheHandler;\n }): Promise<void> {\n const { instanceId, cacheHandler } = args;\n const definitionId =\n await this.dataIndexService.fetchDefinitionIdByInstanceId(instanceId);\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.dataIndexService.abortWorkflowInstance(instanceId)\n : undefined;\n }\n\n public async fetchWorkflowInfo(args: {\n definitionId: string;\n cacheHandler?: CacheHandler;\n }): Promise<WorkflowInfo | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.dataIndexService.fetchWorkflowInfo(definitionId)\n : undefined;\n }\n\n public async fetchInstances(args: {\n pagination?: Pagination;\n filter?: Filter;\n workflowId?: string;\n }): Promise<ProcessInstance[]> {\n const definitionIds = args.workflowId\n ? [args.workflowId]\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 fetchInstancesTotalCount(\n workflowId?: string,\n filter?: Filter,\n ): Promise<number> {\n const definitionIds = workflowId\n ? [workflowId]\n : this.workflowCacheService.definitionIds;\n return await this.dataIndexService.fetchInstancesTotalCount(\n definitionIds,\n filter,\n );\n }\n\n public async fetchWorkflowSource(args: {\n definitionId: string;\n cacheHandler?: CacheHandler;\n }): Promise<string | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.dataIndexService.fetchWorkflowSource(definitionId)\n : undefined;\n }\n\n public async fetchInstanceVariables(args: {\n instanceId: string;\n cacheHandler?: CacheHandler;\n }): Promise<object | undefined> {\n const { instanceId, cacheHandler } = args;\n const definitionId =\n await this.dataIndexService.fetchDefinitionIdByInstanceId(instanceId);\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.dataIndexService.fetchInstanceVariables(instanceId)\n : undefined;\n }\n\n public async fetchInstance(args: {\n instanceId: string;\n cacheHandler?: CacheHandler;\n }): Promise<ProcessInstance | undefined> {\n const { instanceId, cacheHandler } = args;\n const instance = await this.dataIndexService.fetchInstance(instanceId);\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n instance?.processId,\n cacheHandler,\n );\n return isWorkflowAvailable ? instance : undefined;\n }\n\n // SonataFlow Service Wrapper\n\n public async fetchWorkflowInfoOnService(args: {\n definitionId: string;\n serviceUrl: string;\n cacheHandler?: CacheHandler;\n }): Promise<WorkflowInfo | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.sonataFlowService.fetchWorkflowInfoOnService(args)\n : undefined;\n }\n\n public async fetchWorkflowDefinition(args: {\n definitionId: string;\n cacheHandler?: CacheHandler;\n }): Promise<WorkflowDefinition | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.sonataFlowService.fetchWorkflowDefinition(definitionId)\n : undefined;\n }\n\n public async fetchWorkflowOverviews(args: {\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<WorkflowOverview[] | undefined> {\n return await this.sonataFlowService.fetchWorkflowOverviews({\n definitionIds: this.workflowCacheService.definitionIds,\n pagination: args.pagination,\n filter: args.filter,\n });\n }\n\n public async executeWorkflow(args: {\n definitionId: string;\n serviceUrl: string;\n inputData: ProcessInstanceVariables;\n businessKey?: string;\n cacheHandler?: CacheHandler;\n }): Promise<WorkflowExecutionResponse | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.sonataFlowService.executeWorkflow(args)\n : undefined;\n }\n\n public async retriggerWorkflow(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n cacheHandler?: CacheHandler;\n }): Promise<boolean | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.sonataFlowService.retriggerInstance(args)\n : undefined;\n }\n\n public async fetchWorkflowOverview(args: {\n definitionId: string;\n cacheHandler?: CacheHandler;\n }): Promise<WorkflowOverview | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.sonataFlowService.fetchWorkflowOverview(definitionId)\n : undefined;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ 'use strict';
2
+
3
+ var backendCommon = require('@backstage/backend-common');
4
+ var integration = require('@backstage/integration');
5
+ var pluginScaffolderBackend = require('@backstage/plugin-scaffolder-backend');
6
+ var fs = require('fs-extra');
7
+ var crypto = require('crypto');
8
+ var path = require('path');
9
+ var stream = require('stream');
10
+ var Helper = require('./Helper.cjs.js');
11
+
12
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
13
+
14
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
15
+ var path__default = /*#__PURE__*/_interopDefaultCompat(path);
16
+
17
+ class ScaffolderService {
18
+ constructor(logger, config, catalogApi, urlReader) {
19
+ this.logger = logger;
20
+ this.config = config;
21
+ this.catalogApi = catalogApi;
22
+ this.urlReader = urlReader;
23
+ this.actionRegistry = new pluginScaffolderBackend.TemplateActionRegistry();
24
+ }
25
+ actionRegistry;
26
+ streamLogger = new stream.PassThrough();
27
+ loadActions() {
28
+ const actions = [
29
+ ...pluginScaffolderBackend.createBuiltinActions({
30
+ integrations: integration.ScmIntegrations.fromConfig(this.config),
31
+ catalogClient: this.catalogApi,
32
+ reader: this.urlReader,
33
+ config: this.config
34
+ })
35
+ ];
36
+ actions.forEach((a) => this.actionRegistry.register(a));
37
+ }
38
+ getAction(id) {
39
+ return this.actionRegistry.get(id);
40
+ }
41
+ async executeAction(actionExecutionContext) {
42
+ if (this.actionRegistry.list().length === 0) {
43
+ this.loadActions();
44
+ }
45
+ const action = this.getAction(
46
+ actionExecutionContext.actionId
47
+ );
48
+ const stepOutput = {};
49
+ let workspacePath;
50
+ try {
51
+ const workingDirectory = await Helper.getWorkingDirectory(
52
+ this.config,
53
+ this.logger
54
+ );
55
+ workspacePath = path__default.default.join(
56
+ workingDirectory,
57
+ actionExecutionContext.instanceId ?? crypto.randomUUID()
58
+ );
59
+ } catch (err) {
60
+ this.logger.error(
61
+ `Error getting working directory to execute action ${actionExecutionContext.actionId}`,
62
+ err
63
+ );
64
+ throw err;
65
+ }
66
+ const actionContext = {
67
+ input: actionExecutionContext.input,
68
+ workspacePath,
69
+ // TODO: Move this to LoggerService after scaffolder-node moves to LoggerService
70
+ // https://github.com/backstage/backstage/issues/26933
71
+ logger: backendCommon.loggerToWinstonLogger(this.logger),
72
+ logStream: this.streamLogger,
73
+ createTemporaryDirectory: async () => await fs__default.default.mkdtemp(`${workspacePath}_step-${0}-`),
74
+ output(name, value) {
75
+ stepOutput[name] = value;
76
+ },
77
+ getInitiatorCredentials: async () => {
78
+ return {
79
+ $$type: "@backstage/BackstageCredentials",
80
+ principal: "mock-principal"
81
+ };
82
+ },
83
+ checkpoint: async (key, fn) => {
84
+ this.logger.info(`Orchestrator ScaffolderService checkpoint ${key}`);
85
+ return fn();
86
+ }
87
+ };
88
+ await action.handler(actionContext);
89
+ return stepOutput;
90
+ }
91
+ }
92
+
93
+ exports.ScaffolderService = ScaffolderService;
94
+ //# sourceMappingURL=ScaffolderService.cjs.js.map