@grnsft/if 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/.devcontainer/devcontainer.json +38 -0
  2. package/.editorconfig +8 -0
  3. package/.env.example +9 -0
  4. package/.eslintignore +4 -0
  5. package/.eslintrc.json +8 -0
  6. package/.github/ISSUE_TEMPLATE/agenda.md +36 -0
  7. package/.github/ISSUE_TEMPLATE/blank-issue.md +10 -0
  8. package/.github/ISSUE_TEMPLATE/feedback.md +42 -0
  9. package/.github/ISSUE_TEMPLATE/model-plugin.md +63 -0
  10. package/.github/ISSUE_TEMPLATE/user-story.md +10 -0
  11. package/.github/PULL_REQUEST_TEMPLATE.md +21 -0
  12. package/.github/workflows/nodejs-ci.yml +34 -0
  13. package/.gitmodules +3 -0
  14. package/.prettierrc.js +3 -0
  15. package/CONTRIBUTING.md +194 -0
  16. package/LICENSE +21 -0
  17. package/Makefile +16 -0
  18. package/README.md +67 -0
  19. package/build/__mocks__/azure/index.d.ts +11 -0
  20. package/build/__mocks__/azure/index.js +132 -0
  21. package/build/__mocks__/boavizta/countries.json +138 -0
  22. package/build/__mocks__/boavizta/instance_types.json +625 -0
  23. package/build/__mocks__/boavizta/providers.json +1 -0
  24. package/build/__mocks__/fs/index.d.ts +3 -0
  25. package/build/__mocks__/fs/index.js +56 -0
  26. package/build/__mocks__/model-universe/index.d.ts +33 -0
  27. package/build/__mocks__/model-universe/index.js +68 -0
  28. package/build/__mocks__/watt-time/data.json +119 -0
  29. package/build/__tests__/integration/ompl/index.test.d.ts +1 -0
  30. package/build/__tests__/integration/ompl/index.test.js +61 -0
  31. package/build/__tests__/unit/lib/azure-importer/index.test.d.ts +1 -0
  32. package/build/__tests__/unit/lib/azure-importer/index.test.js +152 -0
  33. package/build/__tests__/unit/lib/boavizta/index.test.d.ts +1 -0
  34. package/build/__tests__/unit/lib/boavizta/index.test.js +579 -0
  35. package/build/__tests__/unit/lib/case-studies/aveva.test.d.ts +1 -0
  36. package/build/__tests__/unit/lib/case-studies/aveva.test.js +36 -0
  37. package/build/__tests__/unit/lib/case-studies/emem.test.d.ts +1 -0
  38. package/build/__tests__/unit/lib/case-studies/emem.test.js +108 -0
  39. package/build/__tests__/unit/lib/case-studies/eshoppen.test.d.ts +1 -0
  40. package/build/__tests__/unit/lib/case-studies/eshoppen.test.js +53 -0
  41. package/build/__tests__/unit/lib/case-studies/sci-accenture.test.d.ts +1 -0
  42. package/build/__tests__/unit/lib/case-studies/sci-accenture.test.js +23 -0
  43. package/build/__tests__/unit/lib/ccf/index.test.d.ts +1 -0
  44. package/build/__tests__/unit/lib/ccf/index.test.js +223 -0
  45. package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.d.ts +1 -0
  46. package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.js +73 -0
  47. package/build/__tests__/unit/lib/sci/index.test.d.ts +1 -0
  48. package/build/__tests__/unit/lib/sci/index.test.js +106 -0
  49. package/build/__tests__/unit/lib/sci-e/index.test.d.ts +1 -0
  50. package/build/__tests__/unit/lib/sci-e/index.test.js +30 -0
  51. package/build/__tests__/unit/lib/sci-m/index.test.d.ts +1 -0
  52. package/build/__tests__/unit/lib/sci-m/index.test.js +58 -0
  53. package/build/__tests__/unit/lib/sci-o/index.test.d.ts +1 -0
  54. package/build/__tests__/unit/lib/sci-o/index.test.js +42 -0
  55. package/build/__tests__/unit/lib/shell-imp/index.test.d.ts +1 -0
  56. package/build/__tests__/unit/lib/shell-imp/index.test.js +21 -0
  57. package/build/__tests__/unit/lib/tdp-finder/index.test.d.ts +1 -0
  58. package/build/__tests__/unit/lib/tdp-finder/index.test.js +62 -0
  59. package/build/__tests__/unit/lib/teads-aws/index.test.d.ts +1 -0
  60. package/build/__tests__/unit/lib/teads-aws/index.test.js +170 -0
  61. package/build/__tests__/unit/lib/teads-curve/index.test.d.ts +1 -0
  62. package/build/__tests__/unit/lib/teads-curve/index.test.js +146 -0
  63. package/build/__tests__/unit/lib/watt-time/index.test.d.ts +1 -0
  64. package/build/__tests__/unit/lib/watt-time/index.test.js +106 -0
  65. package/build/__tests__/unit/util/args.test.d.ts +1 -0
  66. package/build/__tests__/unit/util/args.test.js +92 -0
  67. package/build/__tests__/unit/util/models-universe.test.d.ts +1 -0
  68. package/build/__tests__/unit/util/models-universe.test.js +211 -0
  69. package/build/__tests__/unit/util/observatory.test.d.ts +1 -0
  70. package/build/__tests__/unit/util/observatory.test.js +91 -0
  71. package/build/__tests__/unit/util/supercomputer.test.d.ts +1 -0
  72. package/build/__tests__/unit/util/supercomputer.test.js +231 -0
  73. package/build/__tests__/unit/util/yaml.test.d.ts +1 -0
  74. package/build/__tests__/unit/util/yaml.test.js +59 -0
  75. package/build/config/config.d.ts +32 -0
  76. package/build/config/config.js +74 -0
  77. package/build/config/index.d.ts +2 -0
  78. package/build/config/index.js +8 -0
  79. package/build/config/strings.d.ts +14 -0
  80. package/build/config/strings.js +30 -0
  81. package/build/index.d.ts +1 -0
  82. package/build/index.js +46 -0
  83. package/build/lib/azure-importer/index.d.ts +55 -0
  84. package/build/lib/azure-importer/index.js +314 -0
  85. package/build/lib/boavizta/index.d.ts +53 -0
  86. package/build/lib/boavizta/index.js +254 -0
  87. package/build/lib/case-studies/aveva-model.d.ts +29 -0
  88. package/build/lib/case-studies/aveva-model.js +53 -0
  89. package/build/lib/case-studies/emem-model.d.ts +42 -0
  90. package/build/lib/case-studies/emem-model.js +93 -0
  91. package/build/lib/case-studies/eshoppen-model.d.ts +24 -0
  92. package/build/lib/case-studies/eshoppen-model.js +123 -0
  93. package/build/lib/case-studies/index.d.ts +4 -0
  94. package/build/lib/case-studies/index.js +21 -0
  95. package/build/lib/case-studies/sci-accenture-model.d.ts +10 -0
  96. package/build/lib/case-studies/sci-accenture-model.js +37 -0
  97. package/build/lib/ccf/aws-embodied.json +5591 -0
  98. package/build/lib/ccf/aws-instances.json +21116 -0
  99. package/build/lib/ccf/aws-use.json +79 -0
  100. package/build/lib/ccf/azure-embodied.json +6547 -0
  101. package/build/lib/ccf/azure-instances.json +8332 -0
  102. package/build/lib/ccf/azure-use.json +58 -0
  103. package/build/lib/ccf/gcp-embodied.json +3049 -0
  104. package/build/lib/ccf/gcp-instances.json +3880 -0
  105. package/build/lib/ccf/gcp-use.json +58 -0
  106. package/build/lib/ccf/index.d.ts +63 -0
  107. package/build/lib/ccf/index.js +338 -0
  108. package/build/lib/cloud-instance-metadata/aws-instances.json +1 -0
  109. package/build/lib/cloud-instance-metadata/azure-instances.json +1 -0
  110. package/build/lib/cloud-instance-metadata/index.d.ts +15 -0
  111. package/build/lib/cloud-instance-metadata/index.js +104 -0
  112. package/build/lib/index.d.ts +15 -0
  113. package/build/lib/index.js +32 -0
  114. package/build/lib/interfaces/ccf.d.ts +19 -0
  115. package/build/lib/interfaces/ccf.js +3 -0
  116. package/build/lib/interfaces/index.d.ts +7 -0
  117. package/build/lib/interfaces/index.js +18 -0
  118. package/build/lib/sci/index.d.ts +13 -0
  119. package/build/lib/sci/index.js +131 -0
  120. package/build/lib/sci-e/index.d.ts +38 -0
  121. package/build/lib/sci-e/index.js +85 -0
  122. package/build/lib/sci-m/index.d.ts +10 -0
  123. package/build/lib/sci-m/index.js +124 -0
  124. package/build/lib/sci-o/index.d.ts +17 -0
  125. package/build/lib/sci-o/index.js +52 -0
  126. package/build/lib/shell-imp/index.d.ts +32 -0
  127. package/build/lib/shell-imp/index.js +82 -0
  128. package/build/lib/tdp-finder/index.d.ts +19 -0
  129. package/build/lib/tdp-finder/index.js +98 -0
  130. package/build/lib/teads-aws/aws-embodied.json +1 -0
  131. package/build/lib/teads-aws/aws-instances.json +1 -0
  132. package/build/lib/teads-aws/index.d.ts +58 -0
  133. package/build/lib/teads-aws/index.js +208 -0
  134. package/build/lib/teads-curve/index.d.ts +52 -0
  135. package/build/lib/teads-curve/index.js +158 -0
  136. package/build/lib/watt-time/index.d.ts +18 -0
  137. package/build/lib/watt-time/index.js +204 -0
  138. package/build/types/azure-importer.d.ts +29 -0
  139. package/build/types/azure-importer.js +3 -0
  140. package/build/types/boavizta.d.ts +7 -0
  141. package/build/types/boavizta.js +3 -0
  142. package/build/types/common.d.ts +7 -0
  143. package/build/types/common.js +9 -0
  144. package/build/types/impl.d.ts +40 -0
  145. package/build/types/impl.js +3 -0
  146. package/build/types/models-universe.d.ts +24 -0
  147. package/build/types/models-universe.js +3 -0
  148. package/build/types/process-args.d.ts +7 -0
  149. package/build/types/process-args.js +3 -0
  150. package/build/types/supercomputer.d.ts +4 -0
  151. package/build/types/supercomputer.js +3 -0
  152. package/build/util/args.d.ts +8 -0
  153. package/build/util/args.js +48 -0
  154. package/build/util/errors.d.ts +6 -0
  155. package/build/util/errors.js +22 -0
  156. package/build/util/helpers.d.ts +4 -0
  157. package/build/util/helpers.js +18 -0
  158. package/build/util/models-universe.d.ts +28 -0
  159. package/build/util/models-universe.js +95 -0
  160. package/build/util/observatory.d.ts +20 -0
  161. package/build/util/observatory.js +31 -0
  162. package/build/util/supercomputer.d.ts +30 -0
  163. package/build/util/supercomputer.js +109 -0
  164. package/build/util/validations.d.ts +25 -0
  165. package/build/util/validations.js +52 -0
  166. package/build/util/yaml.d.ts +13 -0
  167. package/build/util/yaml.js +36 -0
  168. package/coverage/clover.xml +1172 -0
  169. package/coverage/coverage-final.json +27 -0
  170. package/coverage/lcov-report/base.css +224 -0
  171. package/coverage/lcov-report/block-navigation.js +87 -0
  172. package/coverage/lcov-report/config/config.ts.html +310 -0
  173. package/coverage/lcov-report/config/index.html +146 -0
  174. package/coverage/lcov-report/config/index.ts.html +91 -0
  175. package/coverage/lcov-report/config/strings.ts.html +118 -0
  176. package/coverage/lcov-report/favicon.png +0 -0
  177. package/coverage/lcov-report/index.html +341 -0
  178. package/coverage/lcov-report/lib/boavizta/index.html +116 -0
  179. package/coverage/lcov-report/lib/boavizta/index.ts.html +1171 -0
  180. package/coverage/lcov-report/lib/case-studies/aveva-model.ts.html +277 -0
  181. package/coverage/lcov-report/lib/case-studies/emem-model.ts.html +439 -0
  182. package/coverage/lcov-report/lib/case-studies/eshoppen-model.ts.html +550 -0
  183. package/coverage/lcov-report/lib/case-studies/index.html +176 -0
  184. package/coverage/lcov-report/lib/case-studies/index.ts.html +97 -0
  185. package/coverage/lcov-report/lib/case-studies/sci-accenture-model.ts.html +232 -0
  186. package/coverage/lcov-report/lib/ccf/index.html +116 -0
  187. package/coverage/lcov-report/lib/ccf/index.ts.html +1339 -0
  188. package/coverage/lcov-report/lib/cloud-instance-metadata/index.html +116 -0
  189. package/coverage/lcov-report/lib/cloud-instance-metadata/index.ts.html +370 -0
  190. package/coverage/lcov-report/lib/index.html +116 -0
  191. package/coverage/lcov-report/lib/index.ts.html +121 -0
  192. package/coverage/lcov-report/lib/sci/index.html +116 -0
  193. package/coverage/lcov-report/lib/sci/index.ts.html +571 -0
  194. package/coverage/lcov-report/lib/sci-e/index.html +116 -0
  195. package/coverage/lcov-report/lib/sci-e/index.ts.html +403 -0
  196. package/coverage/lcov-report/lib/sci-m/index.html +116 -0
  197. package/coverage/lcov-report/lib/sci-m/index.ts.html +487 -0
  198. package/coverage/lcov-report/lib/sci-o/index.html +116 -0
  199. package/coverage/lcov-report/lib/sci-o/index.ts.html +265 -0
  200. package/coverage/lcov-report/lib/shell-imp/index.html +116 -0
  201. package/coverage/lcov-report/lib/shell-imp/index.ts.html +376 -0
  202. package/coverage/lcov-report/lib/teads-aws/index.html +116 -0
  203. package/coverage/lcov-report/lib/teads-aws/index.ts.html +823 -0
  204. package/coverage/lcov-report/lib/teads-curve/index.html +116 -0
  205. package/coverage/lcov-report/lib/teads-curve/index.ts.html +625 -0
  206. package/coverage/lcov-report/lib/watt-time/index.html +116 -0
  207. package/coverage/lcov-report/lib/watt-time/index.ts.html +829 -0
  208. package/coverage/lcov-report/prettify.css +1 -0
  209. package/coverage/lcov-report/prettify.js +2 -0
  210. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  211. package/coverage/lcov-report/sorter.js +196 -0
  212. package/coverage/lcov-report/types/common.ts.html +109 -0
  213. package/coverage/lcov-report/types/index.html +116 -0
  214. package/coverage/lcov-report/util/args.ts.html +244 -0
  215. package/coverage/lcov-report/util/index.html +176 -0
  216. package/coverage/lcov-report/util/models-universe.ts.html +679 -0
  217. package/coverage/lcov-report/util/observatory.ts.html +229 -0
  218. package/coverage/lcov-report/util/supercomputer.ts.html +466 -0
  219. package/coverage/lcov-report/util/yaml.ts.html +193 -0
  220. package/coverage/lcov.info +2094 -0
  221. package/docs/implementations/tdp-finder.md +36 -0
  222. package/examples/impls/case-studies/accenture.yml +155 -0
  223. package/examples/impls/case-studies/aveva.yaml +48 -0
  224. package/examples/impls/case-studies/azure-yassine.yaml +67 -0
  225. package/examples/impls/case-studies/boavizta.yml +26 -0
  226. package/examples/impls/case-studies/dow_msft.yml +173 -0
  227. package/examples/impls/case-studies/farm-insights.yaml +35 -0
  228. package/examples/impls/case-studies/gsf-website.yaml +93 -0
  229. package/examples/impls/case-studies/msft-eshoppen.yaml +162 -0
  230. package/examples/impls/case-studies/msft-green-ai.yaml +58 -0
  231. package/examples/impls/case-studies/ntt-data-on-premise.yaml +201 -0
  232. package/examples/impls/tdp-finder-test.yml +19 -0
  233. package/examples/impls/test/azure.yml +26 -0
  234. package/examples/impls/test/ccf.yml +19 -0
  235. package/examples/impls/test/complex-pipeline.yml +67 -0
  236. package/examples/impls/test/if-demo.yml +51 -0
  237. package/examples/impls/test/metadata.yml +20 -0
  238. package/examples/impls/test/nesting.yml +65 -0
  239. package/examples/impls/test/sci-e.yml +21 -0
  240. package/examples/impls/test/sci-m.yml +24 -0
  241. package/examples/impls/test/sci-o.yml +28 -0
  242. package/examples/impls/test/sci.yml +27 -0
  243. package/examples/impls/test/shell.yml +18 -0
  244. package/examples/impls/test/toto.yaml +22 -0
  245. package/examples/ompls/azure.yml +145 -0
  246. package/examples/ompls/ccf.yml +27 -0
  247. package/examples/ompls/complex-pipeline.yml +105 -0
  248. package/examples/ompls/full-sci.yml +64 -0
  249. package/examples/ompls/if-demo.yml +493 -0
  250. package/examples/ompls/metadata.yml +29 -0
  251. package/examples/ompls/nesting.yml +107 -0
  252. package/examples/ompls/sci-e.yml +23 -0
  253. package/examples/ompls/sci-m.yml +33 -0
  254. package/examples/ompls/sci-o.yml +29 -0
  255. package/examples/ompls/sci.yml +36 -0
  256. package/examples/ompls/shell.yml +23 -0
  257. package/jest.config.js +14 -0
  258. package/package.json +71 -0
  259. package/scripts/impact-test.sh +12 -0
  260. package/src/__mocks__/boavizta/countries.json +138 -0
  261. package/src/__mocks__/boavizta/instance_types.json +625 -0
  262. package/src/__mocks__/boavizta/providers.json +1 -0
  263. package/src/__mocks__/watt-time/data.json +119 -0
  264. package/src/config/units.yaml +125 -0
  265. package/src/lib/ccf/aws-embodied.json +5591 -0
  266. package/src/lib/ccf/aws-instances.json +21116 -0
  267. package/src/lib/ccf/aws-use.json +79 -0
  268. package/src/lib/ccf/azure-embodied.json +6547 -0
  269. package/src/lib/ccf/azure-instances.json +8332 -0
  270. package/src/lib/ccf/azure-use.json +58 -0
  271. package/src/lib/ccf/gcp-embodied.json +3049 -0
  272. package/src/lib/ccf/gcp-instances.json +3880 -0
  273. package/src/lib/ccf/gcp-use.json +58 -0
  274. package/src/lib/cloud-instance-metadata/aws-instances.json +1 -0
  275. package/src/lib/cloud-instance-metadata/azure-instances.json +1 -0
  276. package/src/lib/shell-imp/sampler +30 -0
  277. package/src/lib/tdp-finder/README.md +7 -0
  278. package/src/lib/tdp-finder/boavizta_data.csv +1768 -0
  279. package/src/lib/tdp-finder/data.csv +4460 -0
  280. package/src/lib/tdp-finder/data2.csv +2162 -0
  281. package/src/lib/teads-aws/aws-embodied.json +1 -0
  282. package/src/lib/teads-aws/aws-instances.json +1 -0
  283. package/tsconfig.test.json +39 -0
  284. package/tsconfig.tsbuildinfo +1 -0
  285. package/yarn-error.log +5854 -0
package/build/index.js ADDED
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const args_1 = require("./util/args");
4
+ const errors_1 = require("./util/errors");
5
+ const helpers_1 = require("./util/helpers");
6
+ const models_universe_1 = require("./util/models-universe");
7
+ const supercomputer_1 = require("./util/supercomputer");
8
+ const validations_1 = require("./util/validations");
9
+ const yaml_1 = require("./util/yaml");
10
+ const config_1 = require("./config");
11
+ const { CliInputError } = errors_1.ERRORS;
12
+ const { DISCLAIMER_MESSAGE, SOMETHING_WRONG } = config_1.STRINGS;
13
+ /**
14
+ * 1. Parses yml input/output process arguments.
15
+ * 2. Opens yaml file as an object.
16
+ * 3. Initializes models.
17
+ * 4. Initializes graph, does computing.
18
+ * 5. Saves processed object as a yaml file.
19
+ * @example run `npx ts-node impact-engine.ts --impl ./test.yml --ompl ./result.yml`
20
+ * @example run `npm run impact-engine -- --impl ./test.yml --ompl ./result.yml`
21
+ */
22
+ const impactEngine = async () => {
23
+ console.log(DISCLAIMER_MESSAGE);
24
+ const processParams = (0, args_1.parseProcessArgument)();
25
+ if (processParams) {
26
+ const { inputPath, outputPath } = processParams;
27
+ const rawImpl = await (0, yaml_1.openYamlFileAsObject)(inputPath);
28
+ // Lifecycle Validation
29
+ const impl = (0, validations_1.validateImpl)(rawImpl);
30
+ // Lifecycle Initialize Models
31
+ const modelsHandbook = new models_universe_1.ModelsUniverse();
32
+ impl.initialize.models.forEach((model) => modelsHandbook.writeDown(model));
33
+ // Lifecycle Computing
34
+ const ateruiComputer = new supercomputer_1.Supercomputer(impl, modelsHandbook);
35
+ const ompl = await ateruiComputer.compute();
36
+ if (!outputPath) {
37
+ console.log(JSON.stringify(ompl));
38
+ return;
39
+ }
40
+ await (0, yaml_1.saveYamlFileAs)(ompl, outputPath);
41
+ return;
42
+ }
43
+ return Promise.reject(new CliInputError(SOMETHING_WRONG));
44
+ };
45
+ impactEngine().catch(helpers_1.andHandle);
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQ0FBaUQ7QUFDakQsMENBQXFDO0FBQ3JDLDRDQUF5QztBQUN6Qyw0REFBc0Q7QUFDdEQsd0RBQW1EO0FBQ25ELG9EQUFnRDtBQUNoRCxzQ0FBaUU7QUFFakUscUNBQWlDO0FBRWpDLE1BQU0sRUFBQyxhQUFhLEVBQUMsR0FBRyxlQUFNLENBQUM7QUFFL0IsTUFBTSxFQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBQyxHQUFHLGdCQUFPLENBQUM7QUFFdEQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFlBQVksR0FBRyxLQUFLLElBQUksRUFBRTtJQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFFaEMsTUFBTSxhQUFhLEdBQUcsSUFBQSwyQkFBb0IsR0FBRSxDQUFDO0lBRTdDLElBQUksYUFBYSxFQUFFO1FBQ2pCLE1BQU0sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFDLEdBQUcsYUFBYSxDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSwyQkFBb0IsRUFBQyxTQUFTLENBQUMsQ0FBQztRQUV0RCx1QkFBdUI7UUFDdkIsTUFBTSxJQUFJLEdBQUcsSUFBQSwwQkFBWSxFQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRW5DLDhCQUE4QjtRQUM5QixNQUFNLGNBQWMsR0FBRyxJQUFJLGdDQUFjLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUM1QyxjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUNoQyxDQUFDO1FBRUYsc0JBQXNCO1FBQ3RCLE1BQU0sY0FBYyxHQUFHLElBQUksNkJBQWEsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDL0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFNUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE9BQU87U0FDUjtRQUVELE1BQU0sSUFBQSxxQkFBYyxFQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUV2QyxPQUFPO0tBQ1I7SUFFRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztBQUM1RCxDQUFDLENBQUM7QUFFRixZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUMsbUJBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtwYXJzZVByb2Nlc3NBcmd1bWVudH0gZnJvbSAnLi91dGlsL2FyZ3MnO1xuaW1wb3J0IHtFUlJPUlN9IGZyb20gJy4vdXRpbC9lcnJvcnMnO1xuaW1wb3J0IHthbmRIYW5kbGV9IGZyb20gJy4vdXRpbC9oZWxwZXJzJztcbmltcG9ydCB7TW9kZWxzVW5pdmVyc2V9IGZyb20gJy4vdXRpbC9tb2RlbHMtdW5pdmVyc2UnO1xuaW1wb3J0IHtTdXBlcmNvbXB1dGVyfSBmcm9tICcuL3V0aWwvc3VwZXJjb21wdXRlcic7XG5pbXBvcnQge3ZhbGlkYXRlSW1wbH0gZnJvbSAnLi91dGlsL3ZhbGlkYXRpb25zJztcbmltcG9ydCB7b3BlbllhbWxGaWxlQXNPYmplY3QsIHNhdmVZYW1sRmlsZUFzfSBmcm9tICcuL3V0aWwveWFtbCc7XG5cbmltcG9ydCB7U1RSSU5HU30gZnJvbSAnLi9jb25maWcnO1xuXG5jb25zdCB7Q2xpSW5wdXRFcnJvcn0gPSBFUlJPUlM7XG5cbmNvbnN0IHtESVNDTEFJTUVSX01FU1NBR0UsIFNPTUVUSElOR19XUk9OR30gPSBTVFJJTkdTO1xuXG4vKipcbiAqIDEuIFBhcnNlcyB5bWwgaW5wdXQvb3V0cHV0IHByb2Nlc3MgYXJndW1lbnRzLlxuICogMi4gT3BlbnMgeWFtbCBmaWxlIGFzIGFuIG9iamVjdC5cbiAqIDMuIEluaXRpYWxpemVzIG1vZGVscy5cbiAqIDQuIEluaXRpYWxpemVzIGdyYXBoLCBkb2VzIGNvbXB1dGluZy5cbiAqIDUuIFNhdmVzIHByb2Nlc3NlZCBvYmplY3QgYXMgYSB5YW1sIGZpbGUuXG4gKiBAZXhhbXBsZSBydW4gYG5weCB0cy1ub2RlIGltcGFjdC1lbmdpbmUudHMgLS1pbXBsIC4vdGVzdC55bWwgLS1vbXBsIC4vcmVzdWx0LnltbGBcbiAqIEBleGFtcGxlIHJ1biBgbnBtIHJ1biBpbXBhY3QtZW5naW5lIC0tIC0taW1wbCAuL3Rlc3QueW1sIC0tb21wbCAuL3Jlc3VsdC55bWxgXG4gKi9cbmNvbnN0IGltcGFjdEVuZ2luZSA9IGFzeW5jICgpID0+IHtcbiAgY29uc29sZS5sb2coRElTQ0xBSU1FUl9NRVNTQUdFKTtcblxuICBjb25zdCBwcm9jZXNzUGFyYW1zID0gcGFyc2VQcm9jZXNzQXJndW1lbnQoKTtcblxuICBpZiAocHJvY2Vzc1BhcmFtcykge1xuICAgIGNvbnN0IHtpbnB1dFBhdGgsIG91dHB1dFBhdGh9ID0gcHJvY2Vzc1BhcmFtcztcbiAgICBjb25zdCByYXdJbXBsID0gYXdhaXQgb3BlbllhbWxGaWxlQXNPYmplY3QoaW5wdXRQYXRoKTtcblxuICAgIC8vIExpZmVjeWNsZSBWYWxpZGF0aW9uXG4gICAgY29uc3QgaW1wbCA9IHZhbGlkYXRlSW1wbChyYXdJbXBsKTtcblxuICAgIC8vIExpZmVjeWNsZSBJbml0aWFsaXplIE1vZGVsc1xuICAgIGNvbnN0IG1vZGVsc0hhbmRib29rID0gbmV3IE1vZGVsc1VuaXZlcnNlKCk7XG4gICAgaW1wbC5pbml0aWFsaXplLm1vZGVscy5mb3JFYWNoKChtb2RlbDogYW55KSA9PlxuICAgICAgbW9kZWxzSGFuZGJvb2sud3JpdGVEb3duKG1vZGVsKVxuICAgICk7XG5cbiAgICAvLyBMaWZlY3ljbGUgQ29tcHV0aW5nXG4gICAgY29uc3QgYXRlcnVpQ29tcHV0ZXIgPSBuZXcgU3VwZXJjb21wdXRlcihpbXBsLCBtb2RlbHNIYW5kYm9vayk7XG4gICAgY29uc3Qgb21wbCA9IGF3YWl0IGF0ZXJ1aUNvbXB1dGVyLmNvbXB1dGUoKTtcblxuICAgIGlmICghb3V0cHV0UGF0aCkge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkob21wbCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHNhdmVZYW1sRmlsZUFzKG9tcGwsIG91dHB1dFBhdGgpO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBDbGlJbnB1dEVycm9yKFNPTUVUSElOR19XUk9ORykpO1xufTtcblxuaW1wYWN0RW5naW5lKCkuY2F0Y2goYW5kSGFuZGxlKTtcbiJdfQ==
@@ -0,0 +1,55 @@
1
+ import { IOutputModelInterface } from '../interfaces';
2
+ export declare class AzureImporterModel implements IOutputModelInterface {
3
+ authParams: object | undefined;
4
+ staticParams: object | undefined;
5
+ name: string | undefined;
6
+ authenticate(authParams: object): void;
7
+ modelIdentifier(): string;
8
+ /**
9
+ * Validates given `inputs` params. If it's valid, then captures params, then passes to monitor.
10
+ * Returns flattened result from Azure monitor client.
11
+ */
12
+ execute(inputs: any[]): Promise<any>;
13
+ /**
14
+ * Gets CPU metrics by calling monitor client.
15
+ */
16
+ private getCPUMetrics;
17
+ /**
18
+ * Gets RAW metrics by calling monitor client.
19
+ */
20
+ private getRawMetrics;
21
+ /**
22
+ * Use DefaultAzureCredential which works with AZURE_TENANT_ID, AZURE_CLIENT_ID, and AZURE_CLIENT_SECRET environment variables.
23
+ * You can also use other credentials provided by @azure/identity package.
24
+ */
25
+ private getVmUsage;
26
+ /**
27
+ * Initalize static params.
28
+ */
29
+ configure(name: string, staticParams: object | undefined): Promise<IOutputModelInterface>;
30
+ /**
31
+ * Takes impl timestamp and duration and returns an Azure formatted `timespan` value.
32
+ */
33
+ private getTimeSpan;
34
+ /**
35
+ * Formats given `amountOfTime` according to given `unit`.
36
+ * Throws error if given `unit` is not supported.
37
+ */
38
+ private timeUnitConverter;
39
+ /**
40
+ * Takes granularity as e.g. "1 m", "1 hr" and translates into ISO8601 as expected by the azure API.
41
+ */
42
+ private getInterval;
43
+ /**
44
+ * Caculates total memory based on data from ComputeManagementClient response.
45
+ */
46
+ private calculateTotalMemory;
47
+ /**
48
+ * Gathers instance metadata.
49
+ */
50
+ private getInstanceMetadata;
51
+ /**
52
+ * Calculates number of seconds covered by each individual input using azure-time-window value
53
+ */
54
+ private calculateDurationPerInput;
55
+ }
@@ -0,0 +1,314 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AzureImporterModel = void 0;
4
+ const identity_1 = require("@azure/identity");
5
+ const arm_monitor_1 = require("@azure/arm-monitor");
6
+ const arm_compute_1 = require("@azure/arm-compute");
7
+ const dotenv = require("dotenv");
8
+ const zod_1 = require("zod");
9
+ /**
10
+ * @todo Move all input validation schemas to separate file.
11
+ */
12
+ const azureInputSchema = zod_1.z
13
+ .object({
14
+ 'azure-observation-window': zod_1.z.string(),
15
+ 'azure-observation-aggregation': zod_1.z.string(),
16
+ 'azure-resource-group': zod_1.z.string(),
17
+ 'azure-vm-name': zod_1.z.string(),
18
+ 'azure-subscription-id': zod_1.z.string(),
19
+ timestamp: zod_1.z.string().datetime(),
20
+ duration: zod_1.z.number(),
21
+ })
22
+ .required()
23
+ .array();
24
+ class AzureImporterModel {
25
+ constructor() {
26
+ this.authParams = undefined;
27
+ /**
28
+ * Gets CPU metrics by calling monitor client.
29
+ */
30
+ this.getCPUMetrics = (monitorClient, params) => {
31
+ const { subscriptionId, resourceGroupName, timespan, interval, aggregation, vmName, } = params;
32
+ const metricnames = 'Percentage CPU';
33
+ return monitorClient.metrics.list(`subscriptions/${subscriptionId}/resourceGroups/${resourceGroupName}/providers/Microsoft.Compute/virtualMachines/${vmName}`, {
34
+ metricnames,
35
+ timespan,
36
+ interval,
37
+ aggregation,
38
+ });
39
+ };
40
+ /**
41
+ * Gets RAW metrics by calling monitor client.
42
+ */
43
+ this.getRawMetrics = (monitorClient, params) => {
44
+ const { subscriptionId, resourceGroupName, timespan, interval, aggregation, vmName, } = params;
45
+ const metricnames = 'Available Memory Bytes';
46
+ return monitorClient.metrics.list(`subscriptions/${subscriptionId}/resourceGroups/${resourceGroupName}/providers/Microsoft.Compute/virtualMachines/${vmName}`, {
47
+ metricnames,
48
+ timespan,
49
+ interval,
50
+ aggregation,
51
+ });
52
+ };
53
+ }
54
+ authenticate(authParams) {
55
+ this.authParams = authParams;
56
+ }
57
+ modelIdentifier() {
58
+ return 'azure';
59
+ }
60
+ /**
61
+ * Validates given `inputs` params. If it's valid, then captures params, then passes to monitor.
62
+ * Returns flattened result from Azure monitor client.
63
+ */
64
+ async execute(inputs) {
65
+ dotenv.config();
66
+ azureInputSchema.parse(inputs);
67
+ const input = inputs[0];
68
+ const params = {
69
+ aggregation: input['azure-observation-aggregation'],
70
+ resourceGroupName: input['azure-resource-group'],
71
+ vmName: input['azure-vm-name'],
72
+ subscriptionId: input['azure-subscription-id'],
73
+ timestamp: input['timestamp'],
74
+ duration: input['duration'],
75
+ window: input['azure-observation-window'],
76
+ timespan: this.getTimeSpan(input['duration'], input['timestamp']),
77
+ interval: this.getInterval(input['azure-observation-window']),
78
+ };
79
+ // Call the function and get data back in AzureOutputs object
80
+ const rawResults = await this.getVmUsage(params);
81
+ const rawMetadataResults = await this.getInstanceMetadata(params.subscriptionId, params.vmName, params.resourceGroupName);
82
+ input['duration'] = this.calculateDurationPerInput(params);
83
+ const enrichedOutputs = rawResults.timestamps.map((timestamp, index) => ({
84
+ timestamp,
85
+ 'cloud-vendor': 'azure',
86
+ 'cpu-util': rawResults.cpu_utils[index],
87
+ 'mem-availableGB': parseFloat(rawResults.memAvailable[index]) * 1e-9,
88
+ 'mem-usedGB': parseFloat(rawMetadataResults.totalMemoryGB) -
89
+ parseFloat(rawResults.memAvailable[index]) * 1e-9,
90
+ 'total-memoryGB': rawMetadataResults.totalMemoryGB,
91
+ 'mem-util': ((parseFloat(rawMetadataResults.totalMemoryGB) -
92
+ parseFloat(rawResults.memAvailable[index]) * 1e-9) /
93
+ parseFloat(rawMetadataResults.totalMemoryGB)) *
94
+ 100,
95
+ location: rawMetadataResults.location,
96
+ 'cloud-instance-type': rawMetadataResults.instanceType,
97
+ }));
98
+ for (let i = 0; i < Object.entries(enrichedOutputs).length; i++) {
99
+ enrichedOutputs[i] = Object.assign(enrichedOutputs[i], input);
100
+ }
101
+ return enrichedOutputs;
102
+ }
103
+ /**
104
+ * Use DefaultAzureCredential which works with AZURE_TENANT_ID, AZURE_CLIENT_ID, and AZURE_CLIENT_SECRET environment variables.
105
+ * You can also use other credentials provided by @azure/identity package.
106
+ */
107
+ async getVmUsage(params) {
108
+ const { subscriptionId, resourceGroupName, vmName, timespan, interval, aggregation, } = params;
109
+ const getMetricParams = {
110
+ subscriptionId,
111
+ resourceGroupName,
112
+ vmName,
113
+ timespan,
114
+ interval,
115
+ aggregation,
116
+ };
117
+ const timestamps = [];
118
+ const cpu_utils = [];
119
+ const memAvailable = [];
120
+ const credential = new identity_1.DefaultAzureCredential();
121
+ const monitorClient = new arm_monitor_1.MonitorClient(credential, subscriptionId);
122
+ const cpuMetricsResponse = await this.getCPUMetrics(monitorClient, getMetricParams);
123
+ // parse CPU util data
124
+ for (const timeSeries of cpuMetricsResponse.value[0].timeseries || []) {
125
+ const timeSeriesData = timeSeries.data || [];
126
+ for (const data of timeSeriesData) {
127
+ try {
128
+ timestamps.push(data.timeStamp.toISOString());
129
+ if (!(data.average === undefined)) {
130
+ cpu_utils.push(data.average.toString());
131
+ }
132
+ }
133
+ catch (error) {
134
+ console.log('error retrieving CPU data');
135
+ }
136
+ }
137
+ }
138
+ const ramMetricsResponse = await this.getRawMetrics(monitorClient, getMetricParams);
139
+ // parse ram util data
140
+ for (const timeSeries of ramMetricsResponse.value[0].timeseries || []) {
141
+ for (const data of timeSeries.data || []) {
142
+ if (!(typeof data.average === 'undefined')) {
143
+ memAvailable.push(data.average.toString());
144
+ }
145
+ }
146
+ }
147
+ return {
148
+ timestamps,
149
+ cpu_utils,
150
+ memAvailable,
151
+ };
152
+ }
153
+ /**
154
+ * Initalize static params.
155
+ */
156
+ async configure(name, staticParams) {
157
+ this.staticParams = staticParams;
158
+ this.name = name;
159
+ return this;
160
+ }
161
+ /**
162
+ * Takes impl timestamp and duration and returns an Azure formatted `timespan` value.
163
+ */
164
+ getTimeSpan(duration, timestamp) {
165
+ const start = new Date(timestamp);
166
+ const end = new Date(start.getTime() + duration * 1000).toISOString();
167
+ return `${start.toISOString()}/${end}`;
168
+ }
169
+ /**
170
+ * Formats given `amountOfTime` according to given `unit`.
171
+ * Throws error if given `unit` is not supported.
172
+ */
173
+ timeUnitConverter(amountOfTime, unit) {
174
+ const seconds = ['seconds', 'second', 'secs', 'sec', 's'];
175
+ const minutes = ['minutes', 'm', 'min', 'mins'];
176
+ const hours = ['hour', 'hours', 'h', 'hr', 'hrs'];
177
+ const days = ['days', 'd'];
178
+ const weeks = ['week', 'weeks', 'w', 'wk', 'wks'];
179
+ const months = ['month', 'months', 'mth'];
180
+ const years = ['year', 'years', 'yr', 'yrs', 'y', 'ys'];
181
+ if (seconds.includes(unit)) {
182
+ throw new Error('The minimum unit of time for azure importer is minutes');
183
+ }
184
+ if (minutes.includes(unit)) {
185
+ return `T${amountOfTime}M`;
186
+ }
187
+ if (hours.includes(unit)) {
188
+ return `T${amountOfTime}H`;
189
+ }
190
+ if (days.includes(unit)) {
191
+ return `${amountOfTime}D`;
192
+ }
193
+ if (weeks.includes(unit)) {
194
+ return `${amountOfTime}W`;
195
+ }
196
+ if (months.includes(unit)) {
197
+ return `${amountOfTime}M`;
198
+ }
199
+ if (years.includes(unit)) {
200
+ return `${amountOfTime}Y`;
201
+ }
202
+ throw new Error('azure-observation-window parameter is malformed');
203
+ }
204
+ /**
205
+ * Takes granularity as e.g. "1 m", "1 hr" and translates into ISO8601 as expected by the azure API.
206
+ */
207
+ getInterval(window) {
208
+ const splits = window.split(' ', 2);
209
+ const floatNumber = parseFloat(splits[0]);
210
+ // if number is a whole number, cast as int to avoid the ".0"
211
+ const amountOfTime = floatNumber % 1 === 0 ? Math.floor(floatNumber) : floatNumber;
212
+ const unit = splits[1];
213
+ const numberInFormat = this.timeUnitConverter(amountOfTime, unit);
214
+ return `P${numberInFormat}`;
215
+ }
216
+ /**
217
+ * Caculates total memory based on data from ComputeManagementClient response.
218
+ */
219
+ async calculateTotalMemory(params) {
220
+ const { client, instanceType, location } = params;
221
+ // here we grab the total memory for the instance
222
+ const memResponseData = [];
223
+ for await (const item of client.resourceSkus.list()) {
224
+ memResponseData.push(item);
225
+ }
226
+ let totalMemoryGB = '';
227
+ const filteredMemData = memResponseData
228
+ .filter(item => item.resourceType === 'virtualMachines')
229
+ .filter(item => item.name === instanceType)
230
+ .filter(item => item.locations !== undefined);
231
+ const vmCapabilitiesData = filteredMemData
232
+ .filter(item => item.locations !== undefined && item.locations[0] === location)
233
+ .map(item => item.capabilities)[0];
234
+ if (vmCapabilitiesData !== undefined) {
235
+ const totalMemoryObject = vmCapabilitiesData.filter((item) => item.name === 'MemoryGB')[0];
236
+ if (totalMemoryObject.value !== undefined) {
237
+ totalMemoryGB = totalMemoryObject.value;
238
+ }
239
+ }
240
+ return totalMemoryGB;
241
+ }
242
+ /**
243
+ * Gathers instance metadata.
244
+ */
245
+ async getInstanceMetadata(subscriptionId, vmName, resourceGroupName) {
246
+ const credential = new identity_1.DefaultAzureCredential();
247
+ const client = new arm_compute_1.ComputeManagementClient(credential, subscriptionId);
248
+ const vmData = [];
249
+ for await (const item of client.virtualMachines.list(resourceGroupName)) {
250
+ vmData.push(item);
251
+ }
252
+ const filteredVmData = vmData.filter(item => item.name === vmName);
253
+ const location = filteredVmData.map(item => item.location ?? 'unknown')[0];
254
+ const instanceType = filteredVmData.map(item => item.hardwareProfile?.vmSize ?? 'unknown')[0];
255
+ const totalMemoryGB = await this.calculateTotalMemory({
256
+ client,
257
+ instanceType,
258
+ location,
259
+ });
260
+ return {
261
+ location,
262
+ instanceType,
263
+ totalMemoryGB,
264
+ };
265
+ }
266
+ /**
267
+ * Calculates number of seconds covered by each individual input using azure-time-window value
268
+ */
269
+ calculateDurationPerInput(params) {
270
+ const window = params.window;
271
+ const splits = window.split(' ', 2);
272
+ const floatNumber = parseFloat(splits[0]);
273
+ const unit = splits[1];
274
+ let duration = 0;
275
+ const seconds = ['seconds', 'second', 'secs', 'sec', 's'];
276
+ const minutes = ['minutes', 'm', 'min', 'mins'];
277
+ const hours = ['hour', 'hours', 'h', 'hr', 'hrs'];
278
+ const days = ['days', 'd'];
279
+ const weeks = ['week', 'weeks', 'w', 'wk', 'wks'];
280
+ const months = ['month', 'months', 'mth'];
281
+ const years = ['year', 'years', 'yr', 'yrs', 'y', 'ys'];
282
+ if (seconds.includes(unit)) {
283
+ const secs_per_unit = 1;
284
+ duration = secs_per_unit * floatNumber;
285
+ }
286
+ if (minutes.includes(unit)) {
287
+ const secs_per_unit = 60;
288
+ duration = secs_per_unit * floatNumber;
289
+ }
290
+ if (hours.includes(unit)) {
291
+ const secs_per_unit = 3600;
292
+ duration = secs_per_unit * floatNumber;
293
+ }
294
+ if (days.includes(unit)) {
295
+ const secs_per_unit = 86400;
296
+ duration = secs_per_unit * floatNumber;
297
+ }
298
+ if (weeks.includes(unit)) {
299
+ const secs_per_unit = 604800;
300
+ duration = secs_per_unit * floatNumber;
301
+ }
302
+ if (months.includes(unit)) {
303
+ const secs_per_unit = 2419200;
304
+ duration = secs_per_unit * floatNumber;
305
+ }
306
+ if (years.includes(unit)) {
307
+ const secs_per_unit = 29030400;
308
+ duration = secs_per_unit * floatNumber;
309
+ }
310
+ return duration;
311
+ }
312
+ }
313
+ exports.AzureImporterModel = AzureImporterModel;
314
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F6dXJlLWltcG9ydGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDhDQUF1RDtBQUN2RCxvREFBaUQ7QUFDakQsb0RBQTJEO0FBQzNELGlDQUFpQztBQUNqQyw2QkFBc0I7QUFVdEI7O0dBRUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLE9BQUM7S0FDdkIsTUFBTSxDQUFDO0lBQ04sMEJBQTBCLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtJQUN0QywrQkFBK0IsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO0lBQzNDLHNCQUFzQixFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDbEMsZUFBZSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDM0IsdUJBQXVCLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNuQyxTQUFTLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNoQyxRQUFRLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtDQUNyQixDQUFDO0tBQ0QsUUFBUSxFQUFFO0tBQ1YsS0FBSyxFQUFFLENBQUM7QUFFWCxNQUFhLGtCQUFrQjtJQUEvQjtRQUNFLGVBQVUsR0FBdUIsU0FBUyxDQUFDO1FBb0UzQzs7V0FFRztRQUNLLGtCQUFhLEdBQUcsQ0FDdEIsYUFBNEIsRUFDNUIsTUFBd0IsRUFDeEIsRUFBRTtZQUNGLE1BQU0sRUFDSixjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixRQUFRLEVBQ1IsV0FBVyxFQUNYLE1BQU0sR0FDUCxHQUFHLE1BQU0sQ0FBQztZQUNYLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDO1lBQ3JDLE9BQU8sYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQy9CLGlCQUFpQixjQUFjLG1CQUFtQixpQkFBaUIsZ0RBQWdELE1BQU0sRUFBRSxFQUMzSDtnQkFD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RCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDekIsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDO1lBQzlCLFFBQVEsR0FBRyxhQUFhLEdBQUcsV0FBVyxDQUFDO1NBQ3hDO1FBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQztZQUMvQixRQUFRLEdBQUcsYUFBYSxHQUFHLFdBQVcsQ0FBQztTQUN4QztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRjtBQTNZRCxnREEyWUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RlZmF1bHRBenVyZUNyZWRlbnRpYWx9IGZyb20gJ0BhenVyZS9pZGVudGl0eSc7XG5pbXBvcnQge01vbml0b3JDbGllbnR9IGZyb20gJ0BhenVyZS9hcm0tbW9uaXRvcic7XG5pbXBvcnQge0NvbXB1dGVNYW5hZ2VtZW50Q2xpZW50fSBmcm9tICdAYXp1cmUvYXJtLWNvbXB1dGUnO1xuaW1wb3J0ICogYXMgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7SU91dHB1dE1vZGVsSW50ZXJmYWNlfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIEF6dXJlSW5wdXRzLFxuICBBenVyZU91dHB1dHMsXG4gIEdldE1ldHJpY3NQYXJhbXMsXG4gIEF6dXJlTWV0YWRhdGFPdXRwdXRzLFxufSBmcm9tICcuLi8uLi90eXBlcy9henVyZS1pbXBvcnRlcic7XG5cbi8qKlxuICogQHRvZG8gTW92ZSBhbGwgaW5wdXQgdmFsaWRhdGlvbiBzY2hlbWFzIHRvIHNlcGFyYXRlIGZpbGUuXG4gKi9cbmNvbnN0IGF6dXJlSW5wdXRTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgICdhenVyZS1vYnNlcnZhdGlvbi13aW5kb3cnOiB6LnN0cmluZygpLFxuICAgICdhenVyZS1vYnNlcnZhdGlvbi1hZ2dyZWdhdGlvbic6IHouc3RyaW5nKCksXG4gICAgJ2F6dXJlLXJlc291cmNlLWdyb3VwJzogei5zdHJpbmcoKSxcbiAgICAnYXp1cmUtdm0tbmFtZSc6IHouc3RyaW5nKCksXG4gICAgJ2F6dXJlLXN1YnNjcmlwdGlvbi1pZCc6IHouc3RyaW5nKCksXG4gICAgdGltZXN0YW1wOiB6LnN0cmluZygpLmRhdGV0aW1lKCksXG4gICAgZHVyYXRpb246IHoubnVtYmVyKCksXG4gIH0pXG4gIC5yZXF1aXJlZCgpXG4gIC5hcnJheSgpO1xuXG5leHBvcnQgY2xhc3MgQXp1cmVJbXBvcnRlck1vZGVsIGltcGxlbWVudHMgSU91dHB1dE1vZGVsSW50ZXJmYWNlIHtcbiAgYXV0aFBhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBzdGF0aWNQYXJhbXM6IG9iamVjdCB8IHVuZGVmaW5lZDtcbiAgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGF1dGhlbnRpY2F0ZShhdXRoUGFyYW1zOiBvYmplY3QpOiB2b2lkIHtcbiAgICB0aGlzLmF1dGhQYXJhbXMgPSBhdXRoUGFyYW1zO1xuICB9XG5cbiAgbW9kZWxJZGVudGlmaWVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdhenVyZSc7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGdpdmVuIGBpbnB1dHNgIHBhcmFtcy4gSWYgaXQncyB2YWxpZCwgdGhlbiBjYXB0dXJlcyBwYXJhbXMsIHRoZW4gcGFzc2VzIHRvIG1vbml0b3IuXG4gICAqIFJldHVybnMgZmxhdHRlbmVkIHJlc3VsdCBmcm9tIEF6dXJlIG1vbml0b3IgY2xpZW50LlxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShpbnB1dHM6IGFueVtdKTogUHJvbWlzZTxhbnk+IHtcbiAgICBkb3RlbnYuY29uZmlnKCk7XG5cbiAgICBhenVyZUlucHV0U2NoZW1hLnBhcnNlKGlucHV0cyk7XG5cbiAgICBjb25zdCBpbnB1dCA9IGlucHV0c1swXTtcblxuICAgIGNvbnN0IHBhcmFtczogQXp1cmVJbnB1dHMgPSB7XG4gICAgICBhZ2dyZWdhdGlvbjogaW5wdXRbJ2F6dXJlLW9ic2VydmF0aW9uLWFnZ3JlZ2F0aW9uJ10sXG4gICAgICByZXNvdXJjZUdyb3VwTmFtZTogaW5wdXRbJ2F6dXJlLXJlc291cmNlLWdyb3VwJ10sXG4gICAgICB2bU5hbWU6IGlucHV0WydhenVyZS12bS1uYW1lJ10sXG4gICAgICBzdWJzY3JpcHRpb25JZDogaW5wdXRbJ2F6dXJlLXN1YnNjcmlwdGlvbi1pZCddLFxuICAgICAgdGltZXN0YW1wOiBpbnB1dFsndGltZXN0YW1wJ10sXG4gICAgICBkdXJhdGlvbjogaW5wdXRbJ2R1cmF0aW9uJ10sXG4gICAgICB3aW5kb3c6IGlucHV0WydhenVyZS1vYnNlcnZhdGlvbi13aW5kb3cnXSxcbiAgICAgIHRpbWVzcGFuOiB0aGlzLmdldFRpbWVTcGFuKGlucHV0WydkdXJhdGlvbiddLCBpbnB1dFsndGltZXN0YW1wJ10pLFxuICAgICAgaW50ZXJ2YWw6IHRoaXMuZ2V0SW50ZXJ2YWwoaW5wdXRbJ2F6dXJlLW9ic2VydmF0aW9uLXdpbmRvdyddKSxcbiAgICB9O1xuXG4gICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24gYW5kIGdldCBkYXRhIGJhY2sgaW4gQXp1cmVPdXRwdXRzIG9iamVjdFxuICAgIGNvbnN0IHJhd1Jlc3VsdHMgPSBhd2FpdCB0aGlzLmdldFZtVXNhZ2UocGFyYW1zKTtcbiAgICBjb25zdCByYXdNZXRhZGF0YVJlc3VsdHMgPSBhd2FpdCB0aGlzLmdldEluc3RhbmNlTWV0YWRhdGEoXG4gICAgICBwYXJhbXMuc3Vic2NyaXB0aW9uSWQsXG4gICAgICBwYXJhbXMudm1OYW1lLFxuICAgICAgcGFyYW1zLnJlc291cmNlR3JvdXBOYW1lXG4gICAgKTtcbiAgICBpbnB1dFsnZHVyYXRpb24nXSA9IHRoaXMuY2FsY3VsYXRlRHVyYXRpb25QZXJJbnB1dChwYXJhbXMpO1xuXG4gICAgY29uc3QgZW5yaWNoZWRPdXRwdXRzID0gcmF3UmVzdWx0cy50aW1lc3RhbXBzLm1hcCgodGltZXN0YW1wLCBpbmRleCkgPT4gKHtcbiAgICAgIHRpbWVzdGFtcCxcbiAgICAgICdjbG91ZC12ZW5kb3InOiAnYXp1cmUnLFxuICAgICAgJ2NwdS11dGlsJzogcmF3UmVzdWx0cy5jcHVfdXRpbHNbaW5kZXhdLFxuICAgICAgJ21lbS1hdmFpbGFibGVHQic6IHBhcnNlRmxvYXQocmF3UmVzdWx0cy5tZW1BdmFpbGFibGVbaW5kZXhdKSAqIDFlLTksXG4gICAgICAnbWVtLXVzZWRHQic6XG4gICAgICAgIHBhcnNlRmxvYXQocmF3TWV0YWRhdGFSZXN1bHRzLnRvdGFsTWVtb3J5R0IpIC1cbiAgICAgICAgcGFyc2VGbG9hdChyYXdSZXN1bHRzLm1lbUF2YWlsYWJsZVtpbmRleF0pICogMWUtOSxcbiAgICAgICd0b3RhbC1tZW1vcnlHQic6IHJhd01ldGFkYXRhUmVzdWx0cy50b3RhbE1lbW9yeUdCLFxuICAgICAgJ21lbS11dGlsJzpcbiAgICAgICAgKChwYXJzZUZsb2F0KHJhd01ldGFkYXRhUmVzdWx0cy50b3RhbE1lbW9yeUdCKSAtXG4gICAgICAgICAgcGFyc2VGbG9hdChyYXdSZXN1bHRzLm1lbUF2YWlsYWJsZVtpbmRleF0pICogMWUtOSkgL1xuICAgICAgICAgIHBhcnNlRmxvYXQocmF3TWV0YWRhdGFSZXN1bHRzLnRvdGFsTWVtb3J5R0IpKSAqXG4gICAgICAgIDEwMCxcbiAgICAgIGxvY2F0aW9uOiByYXdNZXRhZGF0YVJlc3VsdHMubG9jYXRpb24sXG4gICAgICAnY2xvdWQtaW5zdGFuY2UtdHlwZSc6IHJhd01ldGFkYXRhUmVzdWx0cy5pbnN0YW5jZVR5cGUsXG4gICAgfSkpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBPYmplY3QuZW50cmllcyhlbnJpY2hlZE91dHB1dHMpLmxlbmd0aDsgaSsrKSB7XG4gICAgICBlbnJpY2hlZE91dHB1dHNbaV0gPSBPYmplY3QuYXNzaWduKGVucmljaGVkT3V0cHV0c1tpXSwgaW5wdXQpO1xuICAgIH1cbiAgICByZXR1cm4gZW5yaWNoZWRPdXRwdXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgQ1BVIG1ldHJpY3MgYnkgY2FsbGluZyBtb25pdG9yIGNsaWVudC5cbiAgICovXG4gIHByaXZhdGUgZ2V0Q1BVTWV0cmljcyA9IChcbiAgICBtb25pdG9yQ2xpZW50OiBNb25pdG9yQ2xpZW50LFxuICAgIHBhcmFtczogR2V0TWV0cmljc1BhcmFtc1xuICApID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBzdWJzY3JpcHRpb25JZCxcbiAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgdGltZXNwYW4sXG4gICAgICBpbnRlcnZhbCxcbiAgICAgIGFnZ3JlZ2F0aW9uLFxuICAgICAgdm1OYW1lLFxuICAgIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgbWV0cmljbmFtZXMgPSAnUGVyY2VudGFnZSBDUFUnO1xuICAgIHJldHVybiBtb25pdG9yQ2xpZW50Lm1ldHJpY3MubGlzdChcbiAgICAgIGBzdWJzY3JpcHRpb25zLyR7c3Vic2NyaXB0aW9uSWR9L3Jlc291cmNlR3JvdXBzLyR7cmVzb3VyY2VHcm91cE5hbWV9L3Byb3ZpZGVycy9NaWNyb3NvZnQuQ29tcHV0ZS92aXJ0dWFsTWFjaGluZXMvJHt2bU5hbWV9YCxcbiAgICAgIHtcbiAgICAgICAgbWV0cmljbmFtZXMsXG4gICAgICAgIHRpbWVzcGFuLFxuICAgICAgICBpbnRlcnZhbCxcbiAgICAgICAgYWdncmVnYXRpb24sXG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0cyBSQVcgbWV0cmljcyBieSBjYWxsaW5nIG1vbml0b3IgY2xpZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRSYXdNZXRyaWNzID0gKFxuICAgIG1vbml0b3JDbGllbnQ6IE1vbml0b3JDbGllbnQsXG4gICAgcGFyYW1zOiBHZXRNZXRyaWNzUGFyYW1zXG4gICkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHN1YnNjcmlwdGlvbklkLFxuICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICB0aW1lc3BhbixcbiAgICAgIGludGVydmFsLFxuICAgICAgYWdncmVnYXRpb24sXG4gICAgICB2bU5hbWUsXG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCBtZXRyaWNuYW1lcyA9ICdBdmFpbGFibGUgTWVtb3J5IEJ5dGVzJztcbiAgICByZXR1cm4gbW9uaXRvckNsaWVudC5tZXRyaWNzLmxpc3QoXG4gICAgICBgc3Vic2NyaXB0aW9ucy8ke3N1YnNjcmlwdGlvbklkfS9yZXNvdXJjZUdyb3Vwcy8ke3Jlc291cmNlR3JvdXBOYW1lfS9wcm92aWRlcnMvTWljcm9zb2Z0LkNvbXB1dGUvdmlydHVhbE1hY2hpbmVzLyR7dm1OYW1lfWAsXG4gICAgICB7XG4gICAgICAgIG1ldHJpY25hbWVzLFxuICAgICAgICB0aW1lc3BhbixcbiAgICAgICAgaW50ZXJ2YWwsXG4gICAgICAgIGFnZ3JlZ2F0aW9uLFxuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVzZSBEZWZhdWx0QXp1cmVDcmVkZW50aWFsIHdoaWNoIHdvcmtzIHdpdGggQVpVUkVfVEVOQU5UX0lELCBBWlVSRV9DTElFTlRfSUQsIGFuZCBBWlVSRV9DTElFTlRfU0VDUkVUIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICogWW91IGNhbiBhbHNvIHVzZSBvdGhlciBjcmVkZW50aWFscyBwcm92aWRlZCBieSBAYXp1cmUvaWRlbnRpdHkgcGFja2FnZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0Vm1Vc2FnZShwYXJhbXM6IEF6dXJlSW5wdXRzKTogUHJvbWlzZTxBenVyZU91dHB1dHM+IHtcbiAgICBjb25zdCB7XG4gICAgICBzdWJzY3JpcHRpb25JZCxcbiAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgdm1OYW1lLFxuICAgICAgdGltZXNwYW4sXG4gICAgICBpbnRlcnZhbCxcbiAgICAgIGFnZ3JlZ2F0aW9uLFxuICAgIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgZ2V0TWV0cmljUGFyYW1zID0ge1xuICAgICAgc3Vic2NyaXB0aW9uSWQsXG4gICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgIHZtTmFtZSxcbiAgICAgIHRpbWVzcGFuLFxuICAgICAgaW50ZXJ2YWwsXG4gICAgICBhZ2dyZWdhdGlvbixcbiAgICB9O1xuXG4gICAgY29uc3QgdGltZXN0YW1wczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjcHVfdXRpbHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbWVtQXZhaWxhYmxlOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3QgY3JlZGVudGlhbCA9IG5ldyBEZWZhdWx0QXp1cmVDcmVkZW50aWFsKCk7XG4gICAgY29uc3QgbW9uaXRvckNsaWVudCA9IG5ldyBNb25pdG9yQ2xpZW50KGNyZWRlbnRpYWwsIHN1YnNjcmlwdGlvbklkKTtcbiAgICBjb25zdCBjcHVNZXRyaWNzUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldENQVU1ldHJpY3MoXG4gICAgICBtb25pdG9yQ2xpZW50LFxuICAgICAgZ2V0TWV0cmljUGFyYW1zXG4gICAgKTtcblxuICAgIC8vIHBhcnNlIENQVSB1dGlsIGRhdGFcbiAgICBmb3IgKGNvbnN0IHRpbWVTZXJpZXMgb2YgY3B1TWV0cmljc1Jlc3BvbnNlLnZhbHVlWzBdLnRpbWVzZXJpZXMgfHwgW10pIHtcbiAgICAgIGNvbnN0IHRpbWVTZXJpZXNEYXRhID0gdGltZVNlcmllcy5kYXRhIHx8IFtdO1xuICAgICAgZm9yIChjb25zdCBkYXRhIG9mIHRpbWVTZXJpZXNEYXRhKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGltZXN0YW1wcy5wdXNoKGRhdGEudGltZVN0YW1wLnRvSVNPU3RyaW5nKCkpO1xuXG4gICAgICAgICAgaWYgKCEoZGF0YS5hdmVyYWdlID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICBjcHVfdXRpbHMucHVzaChkYXRhLmF2ZXJhZ2UudG9TdHJpbmcoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciByZXRyaWV2aW5nIENQVSBkYXRhJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByYW1NZXRyaWNzUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldFJhd01ldHJpY3MoXG4gICAgICBtb25pdG9yQ2xpZW50LFxuICAgICAgZ2V0TWV0cmljUGFyYW1zXG4gICAgKTtcblxuICAgIC8vIHBhcnNlIHJhbSB1dGlsIGRhdGFcbiAgICBmb3IgKGNvbnN0IHRpbWVTZXJpZXMgb2YgcmFtTWV0cmljc1Jlc3BvbnNlLnZhbHVlWzBdLnRpbWVzZXJpZXMgfHwgW10pIHtcbiAgICAgIGZvciAoY29uc3QgZGF0YSBvZiB0aW1lU2VyaWVzLmRhdGEgfHwgW10pIHtcbiAgICAgICAgaWYgKCEodHlwZW9mIGRhdGEuYXZlcmFnZSA9PT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICAgICAgbWVtQXZhaWxhYmxlLnB1c2goZGF0YS5hdmVyYWdlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRpbWVzdGFtcHMsXG4gICAgICBjcHVfdXRpbHMsXG4gICAgICBtZW1BdmFpbGFibGUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0YWxpemUgc3RhdGljIHBhcmFtcy5cbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhdGljUGFyYW1zOiBvYmplY3QgfCB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxJT3V0cHV0TW9kZWxJbnRlcmZhY2U+IHtcbiAgICB0aGlzLnN0YXRpY1BhcmFtcyA9IHN0YXRpY1BhcmFtcztcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgaW1wbCB0aW1lc3RhbXAgYW5kIGR1cmF0aW9uIGFuZCByZXR1cm5zIGFuIEF6dXJlIGZvcm1hdHRlZCBgdGltZXNwYW5gIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUaW1lU3BhbihkdXJhdGlvbjogbnVtYmVyLCB0aW1lc3RhbXA6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSh0aW1lc3RhbXApO1xuICAgIGNvbnN0IGVuZCA9IG5ldyBEYXRlKHN0YXJ0LmdldFRpbWUoKSArIGR1cmF0aW9uICogMTAwMCkudG9JU09TdHJpbmcoKTtcblxuICAgIHJldHVybiBgJHtzdGFydC50b0lTT1N0cmluZygpfS8ke2VuZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgZ2l2ZW4gYGFtb3VudE9mVGltZWAgYWNjb3JkaW5nIHRvIGdpdmVuIGB1bml0YC5cbiAgICogVGhyb3dzIGVycm9yIGlmIGdpdmVuIGB1bml0YCBpcyBub3Qgc3VwcG9ydGVkLlxuICAgKi9cbiAgcHJpdmF0ZSB0aW1lVW5pdENvbnZlcnRlcihhbW91bnRPZlRpbWU6IG51bWJlciwgdW5pdDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2Vjb25kcyA9IFsnc2Vjb25kcycsICdzZWNvbmQnLCAnc2VjcycsICdzZWMnLCAncyddO1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBbJ21pbnV0ZXMnLCAnbScsICdtaW4nLCAnbWlucyddO1xuICAgIGNvbnN0IGhvdXJzID0gWydob3VyJywgJ2hvdXJzJywgJ2gnLCAnaHInLCAnaHJzJ107XG4gICAgY29uc3QgZGF5cyA9IFsnZGF5cycsICdkJ107XG4gICAgY29uc3Qgd2Vla3MgPSBbJ3dlZWsnLCAnd2Vla3MnLCAndycsICd3aycsICd3a3MnXTtcbiAgICBjb25zdCBtb250aHMgPSBbJ21vbnRoJywgJ21vbnRocycsICdtdGgnXTtcbiAgICBjb25zdCB5ZWFycyA9IFsneWVhcicsICd5ZWFycycsICd5cicsICd5cnMnLCAneScsICd5cyddO1xuXG4gICAgaWYgKHNlY29uZHMuaW5jbHVkZXModW5pdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIG1pbmltdW0gdW5pdCBvZiB0aW1lIGZvciBhenVyZSBpbXBvcnRlciBpcyBtaW51dGVzJyk7XG4gICAgfVxuXG4gICAgaWYgKG1pbnV0ZXMuaW5jbHVkZXModW5pdCkpIHtcbiAgICAgIHJldHVybiBgVCR7YW1vdW50T2ZUaW1lfU1gO1xuICAgIH1cblxuICAgIGlmIChob3Vycy5pbmNsdWRlcyh1bml0KSkge1xuICAgICAgcmV0dXJuIGBUJHthbW91bnRPZlRpbWV9SGA7XG4gICAgfVxuXG4gICAgaWYgKGRheXMuaW5jbHVkZXModW5pdCkpIHtcbiAgICAgIHJldHVybiBgJHthbW91bnRPZlRpbWV9RGA7XG4gICAgfVxuXG4gICAgaWYgKHdlZWtzLmluY2x1ZGVzKHVuaXQpKSB7XG4gICAgICByZXR1cm4gYCR7YW1vdW50T2ZUaW1lfVdgO1xuICAgIH1cblxuICAgIGlmIChtb250aHMuaW5jbHVkZXModW5pdCkpIHtcbiAgICAgIHJldHVybiBgJHthbW91bnRPZlRpbWV9TWA7XG4gICAgfVxuXG4gICAgaWYgKHllYXJzLmluY2x1ZGVzKHVuaXQpKSB7XG4gICAgICByZXR1cm4gYCR7YW1vdW50T2ZUaW1lfVlgO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignYXp1cmUtb2JzZXJ2YXRpb24td2luZG93IHBhcmFtZXRlciBpcyBtYWxmb3JtZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBncmFudWxhcml0eSBhcyBlLmcuIFwiMSBtXCIsIFwiMSBoclwiIGFuZCB0cmFuc2xhdGVzIGludG8gSVNPODYwMSBhcyBleHBlY3RlZCBieSB0aGUgYXp1cmUgQVBJLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRJbnRlcnZhbCh3aW5kb3c6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3BsaXRzID0gd2luZG93LnNwbGl0KCcgJywgMik7XG4gICAgY29uc3QgZmxvYXROdW1iZXI6IG51bWJlciA9IHBhcnNlRmxvYXQoc3BsaXRzWzBdKTtcbiAgICAvLyBpZiBudW1iZXIgaXMgYSB3aG9sZSBudW1iZXIsIGNhc3QgYXMgaW50IHRvIGF2b2lkIHRoZSBcIi4wXCJcbiAgICBjb25zdCBhbW91bnRPZlRpbWUgPVxuICAgICAgZmxvYXROdW1iZXIgJSAxID09PSAwID8gTWF0aC5mbG9vcihmbG9hdE51bWJlcikgOiBmbG9hdE51bWJlcjtcbiAgICBjb25zdCB1bml0OiBzdHJpbmcgPSBzcGxpdHNbMV07XG4gICAgY29uc3QgbnVtYmVySW5Gb3JtYXQgPSB0aGlzLnRpbWVVbml0Q29udmVydGVyKGFtb3VudE9mVGltZSwgdW5pdCk7XG5cbiAgICByZXR1cm4gYFAke251bWJlckluRm9ybWF0fWA7XG4gIH1cblxuICAvKipcbiAgICogQ2FjdWxhdGVzIHRvdGFsIG1lbW9yeSBiYXNlZCBvbiBkYXRhIGZyb20gQ29tcHV0ZU1hbmFnZW1lbnRDbGllbnQgcmVzcG9uc2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNhbGN1bGF0ZVRvdGFsTWVtb3J5KHBhcmFtczogYW55KSB7XG4gICAgY29uc3Qge2NsaWVudCwgaW5zdGFuY2VUeXBlLCBsb2NhdGlvbn0gPSBwYXJhbXM7XG4gICAgLy8gaGVyZSB3ZSBncmFiIHRoZSB0b3RhbCBtZW1vcnkgZm9yIHRoZSBpbnN0YW5jZVxuICAgIGNvbnN0IG1lbVJlc3BvbnNlRGF0YSA9IFtdO1xuXG4gICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIGNsaWVudC5yZXNvdXJjZVNrdXMubGlzdCgpKSB7XG4gICAgICBtZW1SZXNwb25zZURhdGEucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICBsZXQgdG90YWxNZW1vcnlHQiA9ICcnO1xuICAgIGNvbnN0IGZpbHRlcmVkTWVtRGF0YSA9IG1lbVJlc3BvbnNlRGF0YVxuICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0ucmVzb3VyY2VUeXBlID09PSAndmlydHVhbE1hY2hpbmVzJylcbiAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtLm5hbWUgPT09IGluc3RhbmNlVHlwZSlcbiAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtLmxvY2F0aW9ucyAhPT0gdW5kZWZpbmVkKTtcblxuICAgIGNvbnN0IHZtQ2FwYWJpbGl0aWVzRGF0YSA9IGZpbHRlcmVkTWVtRGF0YVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgaXRlbSA9PiBpdGVtLmxvY2F0aW9ucyAhPT0gdW5kZWZpbmVkICYmIGl0ZW0ubG9jYXRpb25zWzBdID09PSBsb2NhdGlvblxuICAgICAgKVxuICAgICAgLm1hcChpdGVtID0+IGl0ZW0uY2FwYWJpbGl0aWVzKVswXTtcblxuICAgIGlmICh2bUNhcGFiaWxpdGllc0RhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdG90YWxNZW1vcnlPYmplY3QgPSB2bUNhcGFiaWxpdGllc0RhdGEuZmlsdGVyKFxuICAgICAgICAoaXRlbTogYW55KSA9PiBpdGVtLm5hbWUgPT09ICdNZW1vcnlHQidcbiAgICAgIClbMF07XG4gICAgICBpZiAodG90YWxNZW1vcnlPYmplY3QudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0b3RhbE1lbW9yeUdCID0gdG90YWxNZW1vcnlPYmplY3QudmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvdGFsTWVtb3J5R0I7XG4gIH1cblxuICAvKipcbiAgICogR2F0aGVycyBpbnN0YW5jZSBtZXRhZGF0YS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0SW5zdGFuY2VNZXRhZGF0YShcbiAgICBzdWJzY3JpcHRpb25JZDogc3RyaW5nLFxuICAgIHZtTmFtZTogc3RyaW5nLFxuICAgIHJlc291cmNlR3JvdXBOYW1lOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxBenVyZU1ldGFkYXRhT3V0cHV0cz4ge1xuICAgIGNvbnN0IGNyZWRlbnRpYWwgPSBuZXcgRGVmYXVsdEF6dXJlQ3JlZGVudGlhbCgpO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBDb21wdXRlTWFuYWdlbWVudENsaWVudChjcmVkZW50aWFsLCBzdWJzY3JpcHRpb25JZCk7XG5cbiAgICBjb25zdCB2bURhdGEgPSBbXTtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgY2xpZW50LnZpcnR1YWxNYWNoaW5lcy5saXN0KHJlc291cmNlR3JvdXBOYW1lKSkge1xuICAgICAgdm1EYXRhLnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyZWRWbURhdGEgPSB2bURhdGEuZmlsdGVyKGl0ZW0gPT4gaXRlbS5uYW1lID09PSB2bU5hbWUpO1xuICAgIGNvbnN0IGxvY2F0aW9uID0gZmlsdGVyZWRWbURhdGEubWFwKGl0ZW0gPT4gaXRlbS5sb2NhdGlvbiA/PyAndW5rbm93bicpWzBdO1xuICAgIGNvbnN0IGluc3RhbmNlVHlwZSA9IGZpbHRlcmVkVm1EYXRhLm1hcChcbiAgICAgIGl0ZW0gPT4gaXRlbS5oYXJkd2FyZVByb2ZpbGU/LnZtU2l6ZSA/PyAndW5rbm93bidcbiAgICApWzBdO1xuXG4gICAgY29uc3QgdG90YWxNZW1vcnlHQiA9IGF3YWl0IHRoaXMuY2FsY3VsYXRlVG90YWxNZW1vcnkoe1xuICAgICAgY2xpZW50LFxuICAgICAgaW5zdGFuY2VUeXBlLFxuICAgICAgbG9jYXRpb24sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9jYXRpb24sXG4gICAgICBpbnN0YW5jZVR5cGUsXG4gICAgICB0b3RhbE1lbW9yeUdCLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBudW1iZXIgb2Ygc2Vjb25kcyBjb3ZlcmVkIGJ5IGVhY2ggaW5kaXZpZHVhbCBpbnB1dCB1c2luZyBhenVyZS10aW1lLXdpbmRvdyB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVEdXJhdGlvblBlcklucHV0KHBhcmFtczogQXp1cmVJbnB1dHMpOiBudW1iZXIge1xuICAgIGNvbnN0IHdpbmRvdyA9IHBhcmFtcy53aW5kb3c7XG4gICAgY29uc3Qgc3BsaXRzID0gd2luZG93LnNwbGl0KCcgJywgMik7XG4gICAgY29uc3QgZmxvYXROdW1iZXIgPSBwYXJzZUZsb2F0KHNwbGl0c1swXSk7XG4gICAgY29uc3QgdW5pdCA9IHNwbGl0c1sxXTtcbiAgICBsZXQgZHVyYXRpb24gPSAwO1xuXG4gICAgY29uc3Qgc2Vjb25kcyA9IFsnc2Vjb25kcycsICdzZWNvbmQnLCAnc2VjcycsICdzZWMnLCAncyddO1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBbJ21pbnV0ZXMnLCAnbScsICdtaW4nLCAnbWlucyddO1xuICAgIGNvbnN0IGhvdXJzID0gWydob3VyJywgJ2hvdXJzJywgJ2gnLCAnaHInLCAnaHJzJ107XG4gICAgY29uc3QgZGF5cyA9IFsnZGF5cycsICdkJ107XG4gICAgY29uc3Qgd2Vla3MgPSBbJ3dlZWsnLCAnd2Vla3MnLCAndycsICd3aycsICd3a3MnXTtcbiAgICBjb25zdCBtb250aHMgPSBbJ21vbnRoJywgJ21vbnRocycsICdtdGgnXTtcbiAgICBjb25zdCB5ZWFycyA9IFsneWVhcicsICd5ZWFycycsICd5cicsICd5cnMnLCAneScsICd5cyddO1xuXG4gICAgaWYgKHNlY29uZHMuaW5jbHVkZXModW5pdCkpIHtcbiAgICAgIGNvbnN0IHNlY3NfcGVyX3VuaXQgPSAxO1xuICAgICAgZHVyYXRpb24gPSBzZWNzX3Blcl91bml0ICogZmxvYXROdW1iZXI7XG4gICAgfVxuICAgIGlmIChtaW51dGVzLmluY2x1ZGVzKHVuaXQpKSB7XG4gICAgICBjb25zdCBzZWNzX3Blcl91bml0ID0gNjA7XG4gICAgICBkdXJhdGlvbiA9IHNlY3NfcGVyX3VuaXQgKiBmbG9hdE51bWJlcjtcbiAgICB9XG4gICAgaWYgKGhvdXJzLmluY2x1ZGVzKHVuaXQpKSB7XG4gICAgICBjb25zdCBzZWNzX3Blcl91bml0ID0gMzYwMDtcbiAgICAgIGR1cmF0aW9uID0gc2Vjc19wZXJfdW5pdCAqIGZsb2F0TnVtYmVyO1xuICAgIH1cbiAgICBpZiAoZGF5cy5pbmNsdWRlcyh1bml0KSkge1xuICAgICAgY29uc3Qgc2Vjc19wZXJfdW5pdCA9IDg2NDAwO1xuICAgICAgZHVyYXRpb24gPSBzZWNzX3Blcl91bml0ICogZmxvYXROdW1iZXI7XG4gICAgfVxuICAgIGlmICh3ZWVrcy5pbmNsdWRlcyh1bml0KSkge1xuICAgICAgY29uc3Qgc2Vjc19wZXJfdW5pdCA9IDYwNDgwMDtcbiAgICAgIGR1cmF0aW9uID0gc2Vjc19wZXJfdW5pdCAqIGZsb2F0TnVtYmVyO1xuICAgIH1cbiAgICBpZiAobW9udGhzLmluY2x1ZGVzKHVuaXQpKSB7XG4gICAgICBjb25zdCBzZWNzX3Blcl91bml0ID0gMjQxOTIwMDtcbiAgICAgIGR1cmF0aW9uID0gc2Vjc19wZXJfdW5pdCAqIGZsb2F0TnVtYmVyO1xuICAgIH1cbiAgICBpZiAoeWVhcnMuaW5jbHVkZXModW5pdCkpIHtcbiAgICAgIGNvbnN0IHNlY3NfcGVyX3VuaXQgPSAyOTAzMDQwMDtcbiAgICAgIGR1cmF0aW9uID0gc2Vjc19wZXJfdW5pdCAqIGZsb2F0TnVtYmVyO1xuICAgIH1cblxuICAgIHJldHVybiBkdXJhdGlvbjtcbiAgfVxufVxuIl19
@@ -0,0 +1,53 @@
1
+ import { IOutputModelInterface } from '../interfaces';
2
+ import { BoaviztaInstanceTypes } from '../../types/boavizta';
3
+ import { KeyValuePair } from '../../types/common';
4
+ declare abstract class BoaviztaOutputModel implements IOutputModelInterface {
5
+ name: string | undefined;
6
+ sharedParams: object | undefined;
7
+ metricType: 'cpu-util' | 'gpu-util' | 'ram-util';
8
+ expectedLifespan: number;
9
+ protected authCredentials: object | undefined;
10
+ authenticate(authParams: object): Promise<void>;
11
+ configure(name: string, staticParams?: object | undefined): Promise<IOutputModelInterface>;
12
+ abstract modelIdentifier(): string;
13
+ abstract fetchData(usageData: object | undefined): Promise<object>;
14
+ supportedLocations(): Promise<string[]>;
15
+ transformToBoaviztaUsage(duration: number, metric: number): KeyValuePair;
16
+ execute(inputs?: object | object[] | undefined): Promise<any[]>;
17
+ addLocationToUsage(usageRaw: KeyValuePair): KeyValuePair;
18
+ protected abstract captureStaticParams(staticParams: object): object;
19
+ protected formatResponse(data: KeyValuePair): KeyValuePair;
20
+ protected calculateUsageForinput(input: KeyValuePair): Promise<KeyValuePair>;
21
+ }
22
+ export declare class BoaviztaCpuOutputModel extends BoaviztaOutputModel implements IOutputModelInterface {
23
+ sharedParams: object | undefined;
24
+ name: string | undefined;
25
+ verbose: boolean;
26
+ allocation: string;
27
+ private readonly componentType;
28
+ constructor();
29
+ modelIdentifier(): string;
30
+ fetchData(usageData: object | undefined): Promise<object>;
31
+ protected captureStaticParams(staticParams: object): Promise<object>;
32
+ }
33
+ export declare class BoaviztaCloudOutputModel extends BoaviztaOutputModel implements IOutputModelInterface {
34
+ sharedParams: object | undefined;
35
+ instanceTypes: BoaviztaInstanceTypes;
36
+ name: string | undefined;
37
+ verbose: boolean;
38
+ allocation: string;
39
+ modelIdentifier(): string;
40
+ validateLocation(staticParamsCast: object): Promise<string | void>;
41
+ validateInstanceType(staticParamsCast: object): Promise<void>;
42
+ validateProvider(staticParamsCast: object): Promise<void>;
43
+ supportedInstancesList(provider: string): Promise<any>;
44
+ supportedProvidersList(): Promise<string[]>;
45
+ fetchData(usageData: object | undefined): Promise<object>;
46
+ protected captureStaticParams(staticParams: object): Promise<object>;
47
+ }
48
+ /**
49
+ * For JSII.
50
+ */
51
+ export { IOutputModelInterface } from '../interfaces';
52
+ export { BoaviztaInstanceTypes, IBoaviztaUsageSCI } from '../../types/boavizta';
53
+ export { KeyValuePair } from '../../types/common';