@grnsft/if 0.3.4 → 0.4.0-beta.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 (259) hide show
  1. package/.commitlintrc.js +0 -1
  2. package/.lintstagedrc.js +6 -0
  3. package/README.md +12 -8
  4. package/Refactor-migration-guide.md +6 -6
  5. package/build/builtins/coefficient/index.d.ts +3 -0
  6. package/build/builtins/coefficient/index.js +51 -0
  7. package/build/builtins/coefficient/types.d.ts +5 -0
  8. package/build/builtins/coefficient/types.js +3 -0
  9. package/build/builtins/csv-lookup/index.d.ts +2 -0
  10. package/build/builtins/csv-lookup/index.js +181 -0
  11. package/build/builtins/divide/index.d.ts +2 -0
  12. package/build/builtins/divide/index.js +67 -0
  13. package/build/builtins/exponent/index.d.ts +3 -0
  14. package/build/builtins/exponent/index.js +72 -0
  15. package/build/builtins/exponent/types.d.ts +5 -0
  16. package/build/builtins/exponent/types.js +3 -0
  17. package/build/builtins/export-csv-raw.js +4 -1
  18. package/build/builtins/export-csv.js +4 -1
  19. package/build/builtins/export-log.js +4 -2
  20. package/build/builtins/export-yaml.js +4 -1
  21. package/build/builtins/index.d.ts +13 -0
  22. package/build/builtins/index.js +28 -2
  23. package/build/builtins/interpolation/index.d.ts +2 -0
  24. package/build/builtins/interpolation/index.js +146 -0
  25. package/build/builtins/interpolation/types.d.ts +5 -0
  26. package/build/builtins/interpolation/types.js +10 -0
  27. package/build/builtins/mock-observations/helpers/common-generator.d.ts +3 -0
  28. package/build/builtins/mock-observations/helpers/common-generator.js +32 -0
  29. package/build/builtins/mock-observations/helpers/rand-int-generator.d.ts +3 -0
  30. package/build/builtins/mock-observations/helpers/rand-int-generator.js +58 -0
  31. package/build/builtins/mock-observations/index.d.ts +3 -0
  32. package/build/builtins/mock-observations/index.js +116 -0
  33. package/build/builtins/mock-observations/interfaces/index.d.ts +6 -0
  34. package/build/builtins/mock-observations/interfaces/index.js +3 -0
  35. package/build/builtins/mock-observations/types.d.ts +13 -0
  36. package/build/builtins/mock-observations/types.js +3 -0
  37. package/build/builtins/multiply/index.d.ts +3 -0
  38. package/build/builtins/multiply/index.js +63 -0
  39. package/build/builtins/multiply/types.d.ts +4 -0
  40. package/build/builtins/multiply/types.js +3 -0
  41. package/build/builtins/regex/index.d.ts +3 -0
  42. package/build/builtins/regex/index.js +78 -0
  43. package/build/builtins/sci/config.d.ts +1 -0
  44. package/build/builtins/sci/config.js +44 -0
  45. package/build/builtins/sci/index.d.ts +3 -0
  46. package/build/builtins/sci/index.js +69 -0
  47. package/build/builtins/sci-embodied/index.d.ts +2 -0
  48. package/build/builtins/sci-embodied/index.js +115 -0
  49. package/build/builtins/shell/index.d.ts +3 -0
  50. package/build/builtins/shell/index.js +58 -0
  51. package/build/builtins/subtract/index.d.ts +3 -0
  52. package/build/builtins/subtract/index.js +75 -0
  53. package/build/builtins/subtract/types.d.ts +4 -0
  54. package/build/builtins/subtract/types.js +3 -0
  55. package/build/builtins/sum/index.d.ts +3 -0
  56. package/build/builtins/sum/index.js +61 -0
  57. package/build/builtins/sum/types.d.ts +4 -0
  58. package/build/builtins/sum/types.js +3 -0
  59. package/build/config/config.d.ts +8 -2
  60. package/build/config/config.js +34 -1
  61. package/build/config/strings.d.ts +22 -0
  62. package/build/config/strings.js +23 -1
  63. package/build/diff.d.ts +2 -0
  64. package/build/diff.js +41 -0
  65. package/build/index.js +8 -4
  66. package/build/lib/aggregate.js +5 -1
  67. package/build/lib/compare.d.ts +10 -0
  68. package/build/lib/compare.js +56 -0
  69. package/build/lib/compute.js +9 -1
  70. package/build/lib/environment.js +9 -3
  71. package/build/lib/exhaust.js +3 -2
  72. package/build/lib/initialize.js +5 -2
  73. package/build/lib/load.d.ts +48 -0
  74. package/build/lib/load.js +51 -2
  75. package/build/lib/parameterize.js +8 -4
  76. package/build/types/common.d.ts +4 -0
  77. package/build/types/common.js +3 -0
  78. package/build/types/helpers.d.ts +4 -0
  79. package/build/types/helpers.js +3 -0
  80. package/build/types/interface.d.ts +2 -1
  81. package/build/types/interface.js +1 -1
  82. package/build/types/lib/compare.d.ts +7 -0
  83. package/build/types/lib/compare.js +3 -0
  84. package/build/types/process-args.d.ts +7 -1
  85. package/build/types/process-args.js +1 -1
  86. package/build/types/util/args.d.ts +4 -0
  87. package/build/types/util/args.js +3 -0
  88. package/build/util/args.d.ts +7 -2
  89. package/build/util/args.js +49 -11
  90. package/build/util/debug-logger.d.ts +4 -0
  91. package/build/util/debug-logger.js +117 -0
  92. package/build/util/errors.d.ts +1 -1
  93. package/build/util/errors.js +6 -1
  94. package/build/util/helpers.d.ts +23 -0
  95. package/build/util/helpers.js +116 -2
  96. package/build/util/log-memoize.d.ts +1 -1
  97. package/build/util/log-memoize.js +1 -1
  98. package/build/util/validations.d.ts +59 -51
  99. package/build/util/validations.js +49 -18
  100. package/github-processes.md +16 -42
  101. package/manifests/bugs/aggregation-error-wrong-metric.yml +6 -6
  102. package/manifests/bugs/azure-importer-ignoring-defaults.yml +3 -3
  103. package/manifests/bugs/azure-importer-incorrect-calculation.yml +2 -2
  104. package/manifests/bugs/mock-observations-failure-duration-is-zero.yml +34 -0
  105. package/manifests/bugs/pipeline-error-uninitialized-plugin.yml +1 -1
  106. package/manifests/bugs/pipeline-ordering-error.yml +6 -6
  107. package/manifests/bugs/sci-embodied-missing-resources-total.yml +23 -0
  108. package/manifests/examples/generics.yml +3 -3
  109. package/manifests/examples/instance-metadata.yml +36 -0
  110. package/manifests/examples/mock-cpu-util-to-carbon.yml +3 -3
  111. package/manifests/examples/nesting.yml +37 -10
  112. package/manifests/examples/pipeline-teads-sci.yml +17 -9
  113. package/manifests/examples/pipeline-with-aggregate.yml +24 -9
  114. package/manifests/examples/pipeline-with-mocks.yml +26 -9
  115. package/manifests/examples/sci.yml +131 -0
  116. package/manifests/examples/teads-curve.yml +78 -0
  117. package/manifests/features/aggregate-failure-inalid-metrics.yml +43 -0
  118. package/manifests/features/aggregate-failure-missing-metric-in-inputs.yml +43 -0
  119. package/manifests/integrations/cloud-metadata-divide-boavizta.yml +1 -1
  120. package/manifests/integrations/mock-obs-group-by-cloud-meta.yml +51 -0
  121. package/manifests/integrations/mock-obs-groupby.yml +2 -2
  122. package/manifests/integrations/mock-obs-time-sync.yml +1 -1
  123. package/manifests/plugins/cloud-metadata/failure-invalid-instance-type.yaml +21 -0
  124. package/manifests/plugins/cloud-metadata/failure-invalid-vendor.yaml +1 -1
  125. package/manifests/plugins/cloud-metadata/failure-missing-cloud-vendor.yml +21 -0
  126. package/manifests/plugins/cloud-metadata/success.yml +1 -1
  127. package/manifests/plugins/coefficient/failure-invalid-config-input-param.yml +1 -1
  128. package/manifests/plugins/coefficient/failure-output-param-is-null.yaml +24 -0
  129. package/manifests/plugins/coefficient/success.yml +1 -1
  130. package/manifests/plugins/csv-lookup/failure-missing-column.yml +26 -0
  131. package/manifests/plugins/csv-lookup/failure-missing-output.yml +26 -0
  132. package/manifests/plugins/csv-lookup/success-renaming.yml +26 -0
  133. package/manifests/plugins/csv-lookup/success.yml +26 -0
  134. package/manifests/plugins/divide/failure-denominator-equal-zero.yml +39 -0
  135. package/manifests/plugins/divide/failure-invalid-config-denominator.yml +1 -1
  136. package/manifests/plugins/divide/failure-missing-numerator.yml +39 -0
  137. package/manifests/plugins/divide/success.yml +2 -2
  138. package/manifests/plugins/groupby/failure-missing-cloud-instance-type.yml +49 -0
  139. package/manifests/plugins/interpolation/interpolation.yml +24 -0
  140. package/manifests/plugins/mock-observations/failure-invalid-config-cpu-range.yml +1 -1
  141. package/manifests/plugins/mock-observations/failure-invalid-memory-utilization-range.yml +34 -0
  142. package/manifests/plugins/mock-observations/failure-missing-timestamp-from-param.yml +34 -0
  143. package/manifests/plugins/mock-observations/success.yml +2 -2
  144. package/manifests/plugins/multiply/failure-input-parameter-is-missing.yml +1 -1
  145. package/manifests/plugins/multiply/success-with-multiple-inputs.yml +32 -0
  146. package/manifests/plugins/multiply/success.yml +3 -3
  147. package/manifests/plugins/regex/failure-missing-input-param.yml +1 -1
  148. package/manifests/plugins/regex/failure-not-matching-with-regex.yml +24 -0
  149. package/manifests/plugins/regex/success.yml +2 -2
  150. package/manifests/plugins/sci/failure-invalid-config-value.yml +2 -3
  151. package/manifests/plugins/sci/failure-missing-input-param.yml +27 -0
  152. package/manifests/plugins/sci/success.yml +5 -4
  153. package/manifests/plugins/{sci-m → sci-embodied}/failure-invalid-default-emission-value.yml +5 -6
  154. package/manifests/plugins/sci-embodied/failure-missing-expected-lifespan.yml +23 -0
  155. package/manifests/plugins/{sci-m → sci-embodied}/success.yml +5 -6
  156. package/manifests/plugins/shell/failure-invalid-command.yml +1 -1
  157. package/manifests/plugins/shell/success.yml +1 -2
  158. package/manifests/plugins/sum/failure-missing-input-param.yml +1 -1
  159. package/manifests/plugins/sum/failure-missing-output-param.yml +28 -0
  160. package/manifests/plugins/sum/success.yml +1 -1
  161. package/manifests/plugins/tdp-finder/failure-unsupported-physical-processor.yml +19 -0
  162. package/manifests/plugins/time-sync/failure-missing-global-config.yml +34 -0
  163. package/package.json +10 -2
  164. package/src/builtins/README.md +5 -5
  165. package/src/builtins/coefficient/README.md +92 -0
  166. package/src/builtins/csv-lookup/README.md +142 -0
  167. package/src/builtins/divide/README.md +95 -0
  168. package/src/builtins/exponent/README.md +97 -0
  169. package/src/builtins/interpolation/README.md +168 -0
  170. package/src/builtins/mock-observations/README.md +97 -0
  171. package/src/builtins/multiply/README.md +94 -0
  172. package/src/builtins/regex/README.md +91 -0
  173. package/src/builtins/sci/README.md +89 -0
  174. package/src/builtins/sci-embodied/README.md +110 -0
  175. package/src/builtins/shell/README.md +130 -0
  176. package/src/builtins/subtract/README.md +94 -0
  177. package/src/builtins/sum/README.md +91 -0
  178. package/.env +0 -5
  179. package/coverage/clover.xml +0 -1590
  180. package/coverage/coverage-final.json +0 -50
  181. package/coverage/lcov-report/base.css +0 -224
  182. package/coverage/lcov-report/block-navigation.js +0 -87
  183. package/coverage/lcov-report/builtins/coefficient/index.html +0 -116
  184. package/coverage/lcov-report/builtins/coefficient/index.ts.html +0 -295
  185. package/coverage/lcov-report/builtins/csv-lookup/index.html +0 -116
  186. package/coverage/lcov-report/builtins/csv-lookup/index.ts.html +0 -832
  187. package/coverage/lcov-report/builtins/divide/index.html +0 -116
  188. package/coverage/lcov-report/builtins/divide/index.ts.html +0 -361
  189. package/coverage/lcov-report/builtins/exponent/index.html +0 -116
  190. package/coverage/lcov-report/builtins/exponent/index.ts.html +0 -355
  191. package/coverage/lcov-report/builtins/export-csv-raw.ts.html +0 -553
  192. package/coverage/lcov-report/builtins/export-csv.ts.html +0 -433
  193. package/coverage/lcov-report/builtins/export-log.ts.html +0 -145
  194. package/coverage/lcov-report/builtins/export-yaml.ts.html +0 -184
  195. package/coverage/lcov-report/builtins/group-by.ts.html +0 -364
  196. package/coverage/lcov-report/builtins/index.html +0 -206
  197. package/coverage/lcov-report/builtins/index.ts.html +0 -130
  198. package/coverage/lcov-report/builtins/interpolation/index.html +0 -131
  199. package/coverage/lcov-report/builtins/interpolation/index.ts.html +0 -670
  200. package/coverage/lcov-report/builtins/interpolation/types.ts.html +0 -100
  201. package/coverage/lcov-report/builtins/mock-observations/helpers/common-generator.ts.html +0 -181
  202. package/coverage/lcov-report/builtins/mock-observations/helpers/index.html +0 -131
  203. package/coverage/lcov-report/builtins/mock-observations/helpers/rand-int-generator.ts.html +0 -295
  204. package/coverage/lcov-report/builtins/mock-observations/index.html +0 -116
  205. package/coverage/lcov-report/builtins/mock-observations/index.ts.html +0 -613
  206. package/coverage/lcov-report/builtins/multiply/index.html +0 -116
  207. package/coverage/lcov-report/builtins/multiply/index.ts.html +0 -337
  208. package/coverage/lcov-report/builtins/regex/index.html +0 -116
  209. package/coverage/lcov-report/builtins/regex/index.ts.html +0 -379
  210. package/coverage/lcov-report/builtins/sci/config.ts.html +0 -205
  211. package/coverage/lcov-report/builtins/sci/index.html +0 -116
  212. package/coverage/lcov-report/builtins/sci/index.ts.html +0 -331
  213. package/coverage/lcov-report/builtins/sci-embodied/index.html +0 -116
  214. package/coverage/lcov-report/builtins/sci-embodied/index.ts.html +0 -481
  215. package/coverage/lcov-report/builtins/shell/index.html +0 -116
  216. package/coverage/lcov-report/builtins/shell/index.ts.html +0 -283
  217. package/coverage/lcov-report/builtins/subtract/index.html +0 -116
  218. package/coverage/lcov-report/builtins/subtract/index.ts.html +0 -373
  219. package/coverage/lcov-report/builtins/sum/index.html +0 -116
  220. package/coverage/lcov-report/builtins/sum/index.ts.html +0 -340
  221. package/coverage/lcov-report/builtins/time-sync.ts.html +0 -1459
  222. package/coverage/lcov-report/config/config.ts.html +0 -334
  223. package/coverage/lcov-report/config/index.html +0 -161
  224. package/coverage/lcov-report/config/index.ts.html +0 -94
  225. package/coverage/lcov-report/config/params.ts.html +0 -697
  226. package/coverage/lcov-report/config/strings.ts.html +0 -415
  227. package/coverage/lcov-report/favicon.png +0 -0
  228. package/coverage/lcov-report/index.html +0 -386
  229. package/coverage/lcov-report/lib/aggregate.ts.html +0 -331
  230. package/coverage/lcov-report/lib/compare.ts.html +0 -283
  231. package/coverage/lcov-report/lib/compute.ts.html +0 -391
  232. package/coverage/lcov-report/lib/environment.ts.html +0 -343
  233. package/coverage/lcov-report/lib/exhaust.ts.html +0 -283
  234. package/coverage/lcov-report/lib/index.html +0 -221
  235. package/coverage/lcov-report/lib/initialize.ts.html +0 -388
  236. package/coverage/lcov-report/lib/load.ts.html +0 -268
  237. package/coverage/lcov-report/lib/parameterize.ts.html +0 -283
  238. package/coverage/lcov-report/prettify.css +0 -1
  239. package/coverage/lcov-report/prettify.js +0 -2
  240. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  241. package/coverage/lcov-report/sorter.js +0 -196
  242. package/coverage/lcov-report/types/aggregation.ts.html +0 -94
  243. package/coverage/lcov-report/types/index.html +0 -146
  244. package/coverage/lcov-report/types/interface.ts.html +0 -181
  245. package/coverage/lcov-report/types/parameters.ts.html +0 -106
  246. package/coverage/lcov-report/util/aggregation-helper.ts.html +0 -286
  247. package/coverage/lcov-report/util/args.ts.html +0 -508
  248. package/coverage/lcov-report/util/errors.ts.html +0 -232
  249. package/coverage/lcov-report/util/helpers.ts.html +0 -613
  250. package/coverage/lcov-report/util/index.html +0 -266
  251. package/coverage/lcov-report/util/json.ts.html +0 -115
  252. package/coverage/lcov-report/util/log-memoize.ts.html +0 -145
  253. package/coverage/lcov-report/util/logger.ts.html +0 -151
  254. package/coverage/lcov-report/util/os-checker.ts.html +0 -421
  255. package/coverage/lcov-report/util/plugin-storage.ts.html +0 -199
  256. package/coverage/lcov-report/util/validations.ts.html +0 -526
  257. package/coverage/lcov-report/util/yaml.ts.html +0 -193
  258. package/coverage/lcov.info +0 -2811
  259. package/src/__tests__/integration/manifest/sci-e.yaml +0 -23
@@ -0,0 +1,91 @@
1
+ # Regex
2
+
3
+ `regex` is a generic plugin to match part of one string in an `input` and extract it into an output.
4
+
5
+ You provide the name of the value you want to match, and a name to use to add the regex to the output array.
6
+
7
+ For example, `boavizta-cpu` need `cpu/name` to work, however `cloud-metadata` returns `physical-processor` which usually contains a long string of processors that the instance could be separated by `,`, like so:
8
+
9
+ ```
10
+ Intel® Xeon® Platinum 8272CL,Intel® Xeon® 8171M 2.1 GHz,Intel® Xeon® E5-2673 v4 2.3 GHz,Intel® Xeon® E5-2673 v3 2.4 GHz
11
+ ```
12
+
13
+ ## Parameters
14
+
15
+ ### Plugin config
16
+
17
+ - `parameter` - a parameter by a specific configured string
18
+ - `match` - a regex by which needs to match the `parameter`
19
+ - `output` - output parameter name in the input
20
+
21
+ ### Inputs
22
+
23
+ - `parameter` - as input parameter, must be available in the input array
24
+
25
+ ## Returns
26
+
27
+ - `output`: the first match of `parameter` with the parameter name with `match` defined in global config.
28
+
29
+ ## Implementation
30
+
31
+ To run the plugin, you must first create an instance of `Regex`. Then, you can call `execute()`.
32
+
33
+ ```typescript
34
+
35
+ const globalConfig = {
36
+ parameter: 'physical-processor',
37
+ match: '^[^,]+',
38
+ output: 'cpu/name',
39
+ };
40
+ const regex = Regex(globalConfig);
41
+
42
+ const input = [
43
+ {
44
+ timestamp: '2021-01-01T00:00:00Z',
45
+ duration: 3600,
46
+ 'physical-processor':
47
+ 'Intel® Xeon® Platinum 8272CL,Intel® Xeon® 8171M 2.1 GHz,Intel® Xeon® E5-2673 v4 2.3 GHz,Intel® Xeon® E5-2673 v3 2.4 GHz',
48
+ },
49
+ ];
50
+ ```
51
+
52
+ ## Example manifest
53
+
54
+ IF users will typically call the plugin as part of a pipeline defined in a manifest file. In this case, instantiating the plugin is handled by `if` and does not have to be done explicitly by the user. The following is an example manifest that calls `regex`:
55
+
56
+ ```yaml
57
+ name: regex-demo
58
+ description:
59
+ tags:
60
+ initialize:
61
+ outputs:
62
+ - yaml
63
+ plugins:
64
+ regex:
65
+ method: Regex
66
+ path: 'builtin'
67
+ global-config:
68
+ parameter: physical-processor
69
+ match: ^[^,]+
70
+ output: cpu/name
71
+ tree:
72
+ children:
73
+ child:
74
+ pipeline:
75
+ - regex
76
+ config:
77
+ regex:
78
+ inputs:
79
+ - timestamp: 2023-08-06T00:00
80
+ duration: 3600
81
+ physical-processor: Intel® Xeon® Platinum 8272CL,Intel® Xeon® 8171M 2.1 GHz,Intel® Xeon® E5-2673 v4 2.3 GHz,Intel® Xeon® E5-2673 v3 2.4 GHz
82
+ ```
83
+
84
+ You can run this example by saving it as `manifests/plugins/regex.yml` and executing the following command from the project root:
85
+
86
+ ```sh
87
+ npm i -g @grnsft/if
88
+ if --manifest manifests/examples/regex.yml --output manifests/outputs/regex.yml
89
+ ```
90
+
91
+ The results will be saved to a new `yaml` file in `manifests/outputs`.
@@ -0,0 +1,89 @@
1
+ # SCI (software carbon intensity)
2
+
3
+ [SCI](https://sci-guide.greensoftware.foundation/) represents the amount of carbon emitted per [functional unit](https://sci-guide.greensoftware.foundation/R/).
4
+
5
+ ## Parameters
6
+
7
+ ### Plugin global config
8
+
9
+ - `functional-unit`: the name of the functional unit in which to express the carbon impact (required)
10
+
11
+
12
+ ### Inputs
13
+
14
+
15
+ - `carbon`: total carbon in gCO2eq (required)
16
+ - `functional-unit`: whatever `functional-unit` you define in global config also has to be present in each input, for example if you provide `functional-unit: requests` in global config, `requests` must be present in your input data.
17
+
18
+ ## Returns
19
+
20
+ - `sci`: carbon expressed in terms of the given functional unit
21
+
22
+ ## Calculation
23
+
24
+ SCI is calculated as:
25
+
26
+ ```pseudocode
27
+ sci = carbon / functional unit
28
+ ```
29
+
30
+
31
+ ## IF Implementation
32
+
33
+ To run the plugin, you must first create an instance of `Sci`. Then, you can call `execute()` to return `sci`.
34
+
35
+ ```typescript
36
+ import {Sci} from 'builtins';
37
+
38
+ const sci = Sci({'functional-unit': 'requests'});
39
+ const results = await sci.execute(
40
+ [
41
+ {
42
+ 'carbon': 5'
43
+ duration: 1,
44
+ requests: 100,
45
+ },
46
+ ]
47
+ );
48
+ ```
49
+
50
+ ## Example manifest
51
+
52
+ IF users will typically call the plugin as part of a pipeline defined in a `manifest` file. In this case, instantiating the plugin is handled by `ie` and does not have to be done explicitly by the user.
53
+
54
+ The following is an example `manifest` that calls `sci`:
55
+
56
+ ```yaml
57
+ name: sci-demo
58
+ description: example invoking sci plugin
59
+ tags:
60
+ initialize:
61
+ outputs:
62
+ - yaml
63
+ plugins:
64
+ sci:
65
+ method: Sci
66
+ path: 'builtin'
67
+ global-config:
68
+ functional-unit: 'requests'
69
+ tree:
70
+ children:
71
+ child:
72
+ pipeline:
73
+ - sci
74
+ config:
75
+ inputs:
76
+ - timestamp: 2023-07-06T00:00
77
+ carbon: 5
78
+ duration: 1
79
+ requests: 100
80
+ ```
81
+
82
+ You can run this example `manifest` by saving it as `./manifests/plugins/sci.yml` and executing the following command from the project root:
83
+
84
+ ```sh
85
+ npm i -g @grnsft/if
86
+ ie --manifest manifests/plugins/sci.yml --output manifests/outputs/sci.yml
87
+ ```
88
+
89
+ The results will be saved to a new `yaml` file.
@@ -0,0 +1,110 @@
1
+ # SCI-Embodied
2
+
3
+ Software systems cause emissions through the hardware that they operate on, both through the energy that the physical hardware consumes and the emissions associated with manufacturing the hardware. Embodied carbon refers to the carbon emitted during the manufacture and eventual disposal of a component. It is added to the operational carbon (carbon emitted when a component is used) to give an overall SCI score.
4
+
5
+ Read more on [embodied carbon](https://github.com/Green-Software-Foundation/sci/blob/main/Software_Carbon_Intensity/Software_Carbon_Intensity_Specification.md#embodied-emissions)
6
+
7
+ ## Parameters
8
+
9
+ ### Plugin config
10
+
11
+ Not Needed
12
+
13
+ ### Inputs
14
+
15
+ - `device/emissions-embodied`: the sum of Life Cycle Assessment (LCA) emissions for the component
16
+ - `device/expected-lifespan`: the length of time, in seconds, between a component's manufacture and its disposal
17
+ - `resources-reserved`: the number of resources reserved for use by the software
18
+ - `resources-total`: the total number of resources available
19
+ - `duration`: the amount of time covered by an observation, in this context it is used as the share of the total life span of the hardware reserved for use by an application, in seconds.
20
+
21
+ > Note that if you have a plugin pipeline that adds `vcpus-allocated` and `vcpus-total` to each observation, such as the `cloud-metadata` plugin, those values will be used **in preference** to the given `resources-reserved` and `resources-total` fields.
22
+
23
+ ## Returns
24
+
25
+ - `carbon-embodied`: the carbon emitted in manufacturing and disposing of a component, in gCO2eq
26
+
27
+ ## Calculation
28
+
29
+ To calculate the embodied carbon, `m` for a software application, use the equation:
30
+
31
+ ```
32
+ m = te * ts * rs
33
+ ```
34
+
35
+ Where:
36
+
37
+ - `device/emissions-embodied` = Total embodied emissions; the sum of Life Cycle Assessment (LCA) emissions for the component.
38
+
39
+ - `timeShare` = Time-share; the share of the total life span of the hardware reserved for use by an application.
40
+
41
+ - `timeShare` is calculated as `duration/'device/expected-lifespan'`, where:
42
+ - `duration` = the length of time the hardware is reserved for use by the software.
43
+ - `device/expected-lifespan` = Expected lifespan: the length of time, in seconds, between a component's manufacture and its disposal.
44
+
45
+ - `resourceShare` = Resource-share; the share of the total available resources of the hardware reserved for use by an application.
46
+ - `resourceShare` is calculated as `resources-reserved/resources-total`, where:
47
+ - `resources-reserved` = Resources reserved; the number of resources reserved for use by the software.
48
+ - `resources-total` = Total Resources; the total number of resources available.
49
+
50
+ ## Implementation
51
+
52
+ IF implements the plugin based on the logic described above. To run the plugin, you must first create an instance of `SciEmbodied`. Then, you can call `execute()` to return `m`.
53
+
54
+ ## Usage
55
+
56
+ The following snippet demonstrates how to call the `sci-embodied` plugin from Typescript.
57
+
58
+ ```typescript
59
+ import {SciEmbodied} from 'builtins';
60
+
61
+ const sciEmbodied = SciEmbodied();
62
+ const results = await sciEmbodied.execute([
63
+ {
64
+ 'device/emissions-embodied': 200, // in gCO2e for total resource units
65
+ duration: 60 * 60 * 24 * 30, // time reserved in seconds, can point to another field "duration"
66
+ 'device/expected-lifespan': 60 * 60 * 24 * 365 * 4, // lifespan in seconds (4 years)
67
+ 'resources-reserved': 1, // resource units reserved / used
68
+ 'resources-total': 1, // total resource units available
69
+ },
70
+ ]);
71
+ ```
72
+
73
+ ## Example manifest
74
+
75
+ IF users will typically call the plugin as part of a pipeline defined in a `manifest` file. In this case, instantiating the plugin is handled by `ie` and does not have to be done explicitly by the user. The following is an example `manifest` that calls `sci-embodied`:
76
+
77
+ ```yaml
78
+ name: sci-embodied
79
+ description: simple demo invoking sci-embodied
80
+ tags:
81
+ initialize:
82
+ outputs:
83
+ - yaml
84
+ plugins:
85
+ sci-embodied:
86
+ method: SciEmbodied
87
+ path: 'builtins'
88
+ tree:
89
+ children:
90
+ child:
91
+ pipeline:
92
+ - sci-embodied # duration & config -> embodied
93
+ defaults:
94
+ device/emissions-embodied: 1533.120 # gCO2eq
95
+ device/expected-lifespan: 3 # 3 years in seconds
96
+ resources-reserved: 1
97
+ resources-total: 8
98
+ inputs:
99
+ - timestamp: 2023-07-06T00:00
100
+ duration: 3600
101
+ ```
102
+
103
+ You can run this example `manifest` by executing the following command from the project root:
104
+
105
+ ```sh
106
+ npm i -g @grnsft/if
107
+ ie --manifest manifests/plugins/sci-embodied.yml --output manifests/outputs/sci-embodied.yml
108
+ ```
109
+
110
+ The results will be saved to a new `yaml` file in `./examples/outputs`.
@@ -0,0 +1,130 @@
1
+ # Shell Plugin
2
+
3
+ The `shell` is a wrapper enabling plugins implemented in any other programming language to be executed as a part of IF pipeline. For example, you might have a standalone plugin written in Python. `shell` spawns a subprocess to execute that Python plugin in a dedicated shell and pipes the results back into IF's Typescript process.
4
+
5
+ ## Parameters
6
+
7
+ ### Plugin global config
8
+
9
+ The plugin should be initialized as follows:
10
+
11
+ ```
12
+ initialize:
13
+ plugins:
14
+ shell:
15
+ method: Shell
16
+ path: 'builtin'
17
+ global-config:
18
+ command: python3 /usr/local/bin/sampler
19
+ ```
20
+
21
+ The `shell` plugin interface requires a path to the plugin command. This path is provided in the plugin configuration with the name command. The path should be appended by the execution command, for example, if the executable is a binary, the path would be prepended with `./` on a Linux system. If the plugin is a Python script, you can prepend `python`.
22
+
23
+ - `command`: the path to the plugin executable along with the execution command as it would be entered into a shell.
24
+
25
+ ### Inputs
26
+
27
+ The parameters included in the `inputs` field in the `manifest` depend entirely on the plugin itself. A typical plugin might expect the following common data to be provided as `inputs`:
28
+
29
+ - `timestamp`: A timestamp for the specific input
30
+ - `duration`: The length of time these specific inputs cover
31
+
32
+ ## Returns
33
+
34
+ The specific return types depend on the plugin being invoked. Typically, we would expect some kind of energy or carbon metric as an output, but it is also possible that plugins target different parts of the pipeline, such as data importers, adaptor plugins etc. Therefore, we do not specify return data for external plugins.
35
+
36
+ ## Implementation
37
+
38
+ To run the plugin, you must first create an instance of `Shell` and call its `execute()` to run the external plugin.
39
+
40
+ ```typescript
41
+ const output = Shell({command: '/usr/local/bin/sampler'});
42
+ const result = await output.execute([
43
+ {
44
+ timestamp: '2021-01-01T00:00:00Z',
45
+ duration: 3600,
46
+ 'cpu/energy': 0.002,
47
+ 'memory/energy': 0.000005,
48
+ },
49
+ ]);
50
+ ```
51
+
52
+ ## Considerations
53
+
54
+ The `shell` is designed to run arbitrary external plugins. This means IF does not necessarily know what calculations are being executed in the external plugin. There is no strict requirement on the return type, as this depends upon the calculations and the position of the external plugin in a plugin pipeline. For example, one external plugin might carry out the entire end-to-end SCI calculation, taking in usage inputs and returning `sci`. In this case, the plugin is expected to return `sci` and it would be the only plugin invoked in the `manifest`.
55
+
56
+ However, it is also entirely possible to have external plugins that only deliver some small part of the overall pipeline, and rely on IF other plugins to do the rest.
57
+
58
+ Since the design space for external plugins is so large, it is up to external plugin developers to ensure compatibility with IF built-ins.
59
+
60
+ ## Example manifest
61
+
62
+ IF users will typically call the shell plugin as part of a pipeline defined in a `manifest` file. In this case, instantiating and configuring the plugin is handled by and does not have to be done explicitly by the user. The following is an example `manifest` that calls an external plugin via `shell`. It assumes the plugin takes `cpu/energy` and `memory/energy` as inputs and returns `energy`:
63
+
64
+ ```yaml
65
+ name: shell-demo
66
+ description:
67
+ tags:
68
+ initialize:
69
+ outputs:
70
+ - yaml
71
+ plugins:
72
+ sampler:
73
+ method: Shell
74
+ path: 'builtin'
75
+ global-config:
76
+ command: python3 /usr/local/bin/sampler
77
+ tree:
78
+ children:
79
+ child:
80
+ pipeline:
81
+ - sampler
82
+ inputs:
83
+ - timestamp: 2023-07-06T00:00
84
+ duration: 1 # Secs
85
+ cpu/energy: 0.002
86
+ memory/energy: 0.000005
87
+ ```
88
+
89
+ In this hypothetical example, the plugin is written in Python and invoked by executing `python3 /usr/local/bin/sampler` in a shell.
90
+ The plugin should return an `output` looking as follows:
91
+
92
+ ```yaml
93
+ name: shell-demo
94
+ description:
95
+ tags:
96
+ initialize:
97
+ outputs:
98
+ - yaml
99
+ plugins:
100
+ sampler:
101
+ method: Shell
102
+ path: 'builtin'
103
+ global-config:
104
+ command: python3 /usr/local/bin/sampler
105
+ tree:
106
+ children:
107
+ child:
108
+ pipeline:
109
+ - sampler
110
+ inputs:
111
+ - timestamp: 2023-07-06T00:00
112
+ duration: 1 # Secs
113
+ cpu/energy: 0.002
114
+ memory/energy: 0.000005
115
+ outputs:
116
+ - timestamp: 2023-07-06T00:00
117
+ duration: 1 # Secs
118
+ cpu/energy: 0.002
119
+ memory/energy: 0.000005
120
+ energy: 0.02 # added by plugin
121
+ ```
122
+
123
+ You can run this example `manifest` by saving it as `manifests/plugins/shell.yml` and executing the following command from the project root:
124
+
125
+ ```sh
126
+ npm i -g @grnsft/if
127
+ ie --manifest manifests/plugins/shell.yml --output manifests/outputs/shell.yml
128
+ ```
129
+
130
+ The results will be saved to a new `yaml` file.
@@ -0,0 +1,94 @@
1
+ # Subtract
2
+
3
+ `subtract` is a generic plugin for doing arithmetic subtractions of two or more values in an `input` array.
4
+
5
+ You provide the names of the values you want to subtract, and a name to use to add the subtraction to the output array.
6
+
7
+ For example, you could subtract `cpu/energy` and `network/energy` and name the result `offset/energy`. `offset/energy` would then be added to every observation in your input array as the diff of `cpu/energy` and `network/energy`.
8
+
9
+ ## Parameters
10
+
11
+ ### Plugin config
12
+
13
+ Two parameters are required in global config: `input-parameters` and `output-parameter`.
14
+
15
+ `input-parameters`: an array of strings. Each string should match an existing key in the `inputs` array
16
+ `output-parameter`: a string defining the name to use to add the result of the diff to the output array.
17
+
18
+ ### Inputs
19
+
20
+ All of `input-parameters` must be available in the input array.
21
+
22
+ ## Returns
23
+
24
+ - `output-parameter`: the subtraction of all `input-parameters` with the parameter name defined by `output-parameter` in global config.
25
+
26
+ ## Calculation
27
+
28
+ ```pseudocode
29
+ output = input0 - input1 - input2 ... - inputN
30
+ ```
31
+
32
+ ## Implementation
33
+
34
+ To run the plugin, you must first create an instance of `Subtract`. Then, you can call `execute()`.
35
+
36
+ ```typescript
37
+ import {Subtract} from 'builtins';
38
+
39
+ const config = {
40
+ inputParameters: ['cpu/energy', 'network/energy'],
41
+ outputParameter: 'offset/energy',
42
+ };
43
+
44
+ const subtract = Subtract(config);
45
+ const result = subtract subtract.execute([
46
+ {
47
+ duration: 3600,
48
+ timestamp: '2021-01-01T00:00:00Z',
49
+ 'cpu/energy': 0.005,
50
+ 'memory/energy': 0.0001,
51
+ },
52
+ ]);
53
+ ```
54
+
55
+ ## Example manifest
56
+
57
+ IF users will typically call the plugin as part of a pipeline defined in a manifest file. In this case, instantiating the plugin is handled by and does not have to be done explicitly by the user. The following is an example manifest that calls `subtract`:
58
+
59
+ ```yaml
60
+ name: subtract demo
61
+ description:
62
+ tags:
63
+ initialize:
64
+ outputs:
65
+ - yaml
66
+ plugins:
67
+ subtract:
68
+ method: Subtract
69
+ path: 'builtin'
70
+ global-config:
71
+ input-parameters: ['cpu/energy', 'network/energy']
72
+ output-parameter: 'energy/diff'
73
+ tree:
74
+ children:
75
+ child:
76
+ pipeline:
77
+ - subtract
78
+ config:
79
+ subtract:
80
+ inputs:
81
+ - timestamp: 2023-08-06T00:00
82
+ duration: 3600
83
+ cpu/energy: 0.003
84
+ network/energy: 0.001
85
+ ```
86
+
87
+ You can run this example by saving it as `./examples/manifests/test/subrtact.yml` and executing the following command from the project root:
88
+
89
+ ```sh
90
+ npm i -g @grnsft/if
91
+ ie --manifest /manifests/plugins/subtract.yml --output manifests/outputs/subtract.yml
92
+ ```
93
+
94
+ The results will be saved to a new `yaml` file in `manifests/outputs`.
@@ -0,0 +1,91 @@
1
+ # Sum
2
+
3
+ `sum` is a generic plugin for doing arithmetic sums of two or more values in an `input` array.
4
+
5
+ You provide the names of the values you want to sum, and a name to use to add the sum to the output array.
6
+
7
+ For example, you could add `cpu/energy` and `network/energy` and name the result `energy`. `energy` would then be added to every observation in your input array as the sum of `cpu/energy` and `network/energy`.
8
+
9
+ ## Parameters
10
+
11
+ ### Plugin config
12
+
13
+ Two parameters are required in global config: `input-parameters` and `output-parameter`.
14
+
15
+ `input-parameters`: an array of strings. Each string should match an existing key in the `inputs` array
16
+ `output-parameter`: a string defining the name to use to add the result of summing the input parameters to the output array.
17
+
18
+ ### Inputs
19
+
20
+ All of `input-parameters` must be available in the input array.
21
+
22
+ ## Returns
23
+
24
+ - `output-parameter`: the sum of all `input-parameters` with the parameter name defined by `output-parameter` in global config.
25
+
26
+ ## Calculation
27
+
28
+ ```pseudocode
29
+ output = input0 + input1 + input2 ... inputN
30
+ ```
31
+
32
+ ## Implementation
33
+
34
+ To run the plugin, you must first create an instance of `Sum`. Then, you can call `execute()`.
35
+
36
+ ```typescript
37
+ const config = {
38
+ inputParameters: ['cpu/energy', 'network/energy'],
39
+ outputParameter: 'energy',
40
+ };
41
+
42
+ const sum = Sum(config);
43
+ const result = sum.execute([
44
+ {
45
+ timestamp: '2021-01-01T00:00:00Z',
46
+ duration: 3600,
47
+ 'cpu/energy': 0.001,
48
+ 'memory/energy': 0.0005,
49
+ },
50
+ ]);
51
+ ```
52
+
53
+ ## Example manifest
54
+
55
+ IF users will typically call the plugin as part of a pipeline defined in a manifest file. In this case, instantiating the plugin is handled by and does not have to be done explicitly by the user. The following is an example manifest that calls `sum`:
56
+
57
+ ```yaml
58
+ name: sum demo
59
+ description:
60
+ tags:
61
+ initialize:
62
+ outputs:
63
+ - yaml
64
+ plugins:
65
+ sum:
66
+ method: Sum
67
+ path: 'builtin'
68
+ global-config:
69
+ input-parameters: ['cpu/energy', 'network/energy']
70
+ output-parameter: 'energy'
71
+ tree:
72
+ children:
73
+ child:
74
+ pipeline:
75
+ - sum
76
+ config:
77
+ sum:
78
+ inputs:
79
+ - timestamp: 2023-08-06T00:00
80
+ duration: 3600
81
+ cpu/energy: 0.001
82
+ network/energy: 0.001
83
+ ```
84
+
85
+ You can run this example by saving it as `./examples/manifests/sum.yml` and executing the following command from the project root:
86
+
87
+ ```sh
88
+ ie --manifest ./examples/manifests/sum.yml --output ./examples/outputs/sum.yml
89
+ ```
90
+
91
+ The results will be saved to a new `yaml` file in `./examples/outputs`.
package/.env DELETED
@@ -1,5 +0,0 @@
1
- # WATT_TIME_USERNAME=manushak
2
- # WATT_TIME_PASSWORD=S7Ub&_tNF=s{
3
-
4
- WATT_TIME_USERNAME=m_test
5
- WATT_TIME_PASSWORD=@watt-time17