pepr 0.37.2 → 0.37.3

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.
@@ -1,302 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- var __create = Object.create;
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
- var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __getProtoOf = Object.getPrototypeOf;
8
- var __hasOwnProp = Object.prototype.hasOwnProperty;
9
- var __copyProps = (to, from, except, desc) => {
10
- if (from && typeof from === "object" || typeof from === "function") {
11
- for (let key of __getOwnPropNames(from))
12
- if (!__hasOwnProp.call(to, key) && key !== except)
13
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
- }
15
- return to;
16
- };
17
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
18
- // If the importer is in node compatibility mode or this is not an ESM
19
- // file that has been converted to a CommonJS file using a Babel-
20
- // compatible transform (i.e. "__esModule" has not been set), then set
21
- // "default" to the CommonJS "module.exports" for node compatibility.
22
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
- mod
24
- ));
25
-
26
- // src/runtime/controller.ts
27
- var import_child_process = require("child_process");
28
- var import_crypto = __toESM(require("crypto"));
29
- var import_fs = __toESM(require("fs"));
30
- var import_zlib = require("zlib");
31
- var import_kubernetes_fluent_client4 = require("kubernetes-fluent-client");
32
-
33
- // src/lib/logger.ts
34
- var import_pino = require("pino");
35
- var isPrettyLog = process.env.PEPR_PRETTY_LOGS === "true";
36
- var pretty = {
37
- target: "pino-pretty",
38
- options: {
39
- colorize: true
40
- }
41
- };
42
- var transport = isPrettyLog ? pretty : void 0;
43
- var pinoTimeFunction = process.env.PINO_TIME_STAMP === "iso" ? () => import_pino.stdTimeFunctions.isoTime() : () => import_pino.stdTimeFunctions.epochTime();
44
- var Log = (0, import_pino.pino)({
45
- transport,
46
- timestamp: pinoTimeFunction
47
- });
48
- if (process.env.LOG_LEVEL) {
49
- Log.level = process.env.LOG_LEVEL;
50
- }
51
- var logger_default = Log;
52
-
53
- // src/templates/data.json
54
- var packageJSON = { name: "pepr", description: "Kubernetes application engine", author: "Defense Unicorns", homepage: "https://github.com/defenseunicorns/pepr", license: "Apache-2.0", bin: "dist/cli.js", repository: "defenseunicorns/pepr", engines: { node: ">=18.0.0" }, files: ["/dist", "/src"], version: "0.37.2", main: "dist/lib.js", types: "dist/lib.d.ts", scripts: { ci: "npm ci", "gen-data-json": "node hack/build-template-data.js", prebuild: "rm -fr dist/* && npm run gen-data-json", version: "node scripts/set-version.js", build: "tsc && node build.mjs && npm pack", "build:image": "npm run build && docker buildx build --output type=docker --tag pepr:dev .", test: "npm run test:unit && npm run test:journey", "test:unit": "npm run gen-data-json && jest src --coverage --detectOpenHandles --coverageDirectory=./coverage", "test:journey": "npm run test:journey:k3d && npm run build && npm run test:journey:image && npm run test:journey:run", "test:journey:prep": "if [ ! -d ./pepr-upgrade-test ]; then git clone https://github.com/defenseunicorns/pepr-upgrade-test.git ; fi", "test:journey-wasm": "npm run test:journey:k3d && npm run build && npm run test:journey:image && npm run test:journey:run-wasm", "test:journey:k3d": "k3d cluster delete pepr-dev && k3d cluster create pepr-dev --k3s-arg '--debug@server:0' --wait && kubectl rollout status deployment -n kube-system", "test:journey:image": "docker buildx build --output type=docker --tag pepr:dev . && k3d image import pepr:dev -c pepr-dev", "test:journey:run": "jest --detectOpenHandles journey/entrypoint.test.ts && npm run test:journey:prep && npm run test:journey:upgrade", "test:journey:run-wasm": "jest --detectOpenHandles journey/entrypoint-wasm.test.ts", "test:journey:upgrade": "npm run test:journey:k3d && npm run test:journey:image && jest --detectOpenHandles journey/pepr-upgrade.test.ts", "format:check": "eslint src && prettier src --check", "format:fix": "eslint src --fix && prettier src --write", prepare: `if [ "$NODE_ENV" != 'production' ]; then husky; fi` }, dependencies: { "@types/ramda": "0.30.2", express: "4.21.0", "fast-json-patch": "3.1.1", "json-pointer": "^0.6.2", "kubernetes-fluent-client": "3.0.4", pino: "9.4.0", "pino-pretty": "11.2.2", "prom-client": "15.1.3", ramda: "0.30.1" }, devDependencies: { "@commitlint/cli": "19.5.0", "@commitlint/config-conventional": "19.5.0", "@fast-check/jest": "^2.0.1", "@jest/globals": "29.7.0", "@types/eslint": "9.6.1", "@types/express": "5.0.0", "@types/json-pointer": "^1.0.34", "@types/node": "22.x.x", "@types/node-forge": "1.3.11", "@types/uuid": "10.0.0", "fast-check": "^3.19.0", jest: "29.7.0", "js-yaml": "^4.1.0", nock: "^13.5.4", "ts-jest": "29.2.5", husky: "^9.1.6" }, peerDependencies: { "@typescript-eslint/eslint-plugin": "7.18.0", "@typescript-eslint/parser": "7.18.0", commander: "12.1.0", esbuild: "0.23.0", eslint: "8.57.0", "node-forge": "1.3.1", prettier: "3.3.3", "@types/prompts": "2.4.9", prompts: "2.4.2", typescript: "5.3.3", uuid: "10.0.0" } };
55
-
56
- // src/lib/k8s.ts
57
- var import_kubernetes_fluent_client = require("kubernetes-fluent-client");
58
- var PeprStore = class extends import_kubernetes_fluent_client.GenericKind {
59
- };
60
- var peprStoreGVK = {
61
- kind: "PeprStore",
62
- version: "v1",
63
- group: "pepr.dev"
64
- };
65
- (0, import_kubernetes_fluent_client.RegisterKind)(PeprStore, peprStoreGVK);
66
-
67
- // src/lib/assets/store.ts
68
- var { group, version, kind } = peprStoreGVK;
69
- var singular = kind.toLocaleLowerCase();
70
- var plural = `${singular}s`;
71
- var name = `${plural}.${group}`;
72
- var peprStoreCRD = {
73
- apiVersion: "apiextensions.k8s.io/v1",
74
- kind: "CustomResourceDefinition",
75
- metadata: {
76
- name
77
- },
78
- spec: {
79
- group,
80
- versions: [
81
- {
82
- // typescript doesn't know this is really already set, which is kind of annoying
83
- name: version || "v1",
84
- served: true,
85
- storage: true,
86
- schema: {
87
- openAPIV3Schema: {
88
- type: "object",
89
- properties: {
90
- data: {
91
- type: "object",
92
- additionalProperties: {
93
- type: "string"
94
- }
95
- }
96
- }
97
- }
98
- }
99
- }
100
- ],
101
- scope: "Namespaced",
102
- names: {
103
- plural,
104
- singular,
105
- kind
106
- }
107
- }
108
- };
109
-
110
- // src/lib/helpers.ts
111
- var import_kubernetes_fluent_client3 = require("kubernetes-fluent-client");
112
-
113
- // src/sdk/sdk.ts
114
- var import_kubernetes_fluent_client2 = require("kubernetes-fluent-client");
115
-
116
- // src/lib/adjudicators.ts
117
- var import_ramda = require("ramda");
118
- var declaredOperation = (0, import_ramda.pipe)((request) => request?.operation, (0, import_ramda.defaultTo)(""));
119
- var declaredGroup = (0, import_ramda.pipe)((request) => request?.kind?.group, (0, import_ramda.defaultTo)(""));
120
- var declaredVersion = (0, import_ramda.pipe)((request) => request?.kind?.version, (0, import_ramda.defaultTo)(""));
121
- var declaredKind = (0, import_ramda.pipe)((request) => request?.kind?.kind, (0, import_ramda.defaultTo)(""));
122
- var declaredUid = (0, import_ramda.pipe)((request) => request?.uid, (0, import_ramda.defaultTo)(""));
123
- var carriesDeletionTimestamp = (0, import_ramda.pipe)((obj) => !!obj.metadata?.deletionTimestamp, (0, import_ramda.defaultTo)(false));
124
- var missingDeletionTimestamp = (0, import_ramda.complement)(carriesDeletionTimestamp);
125
- var carriedName = (0, import_ramda.pipe)((obj) => obj?.metadata?.name, (0, import_ramda.defaultTo)(""));
126
- var carriesName = (0, import_ramda.pipe)(carriedName, (0, import_ramda.equals)(""), import_ramda.not);
127
- var missingName = (0, import_ramda.complement)(carriesName);
128
- var carriedNamespace = (0, import_ramda.pipe)((obj) => obj?.metadata?.namespace, (0, import_ramda.defaultTo)(""));
129
- var carriesNamespace = (0, import_ramda.pipe)(carriedNamespace, (0, import_ramda.equals)(""), import_ramda.not);
130
- var carriedAnnotations = (0, import_ramda.pipe)((obj) => obj?.metadata?.annotations, (0, import_ramda.defaultTo)({}));
131
- var carriesAnnotations = (0, import_ramda.pipe)(carriedAnnotations, (0, import_ramda.equals)({}), import_ramda.not);
132
- var carriedLabels = (0, import_ramda.pipe)((obj) => obj?.metadata?.labels, (0, import_ramda.defaultTo)({}));
133
- var carriesLabels = (0, import_ramda.pipe)(carriedLabels, (0, import_ramda.equals)({}), import_ramda.not);
134
- var definesDeletionTimestamp = (0, import_ramda.pipe)((binding) => binding?.filters?.deletionTimestamp, (0, import_ramda.defaultTo)(false));
135
- var ignoresDeletionTimestamp = (0, import_ramda.complement)(definesDeletionTimestamp);
136
- var definedName = (0, import_ramda.pipe)((binding) => binding?.filters?.name, (0, import_ramda.defaultTo)(""));
137
- var definesName = (0, import_ramda.pipe)(definedName, (0, import_ramda.equals)(""), import_ramda.not);
138
- var ignoresName = (0, import_ramda.complement)(definesName);
139
- var definedNameRegex = (0, import_ramda.pipe)((binding) => binding?.filters?.regexName, (0, import_ramda.defaultTo)(""));
140
- var definesNameRegex = (0, import_ramda.pipe)(definedNameRegex, (0, import_ramda.equals)(""), import_ramda.not);
141
- var definedNamespaces = (0, import_ramda.pipe)((binding) => binding?.filters?.namespaces, (0, import_ramda.defaultTo)([]));
142
- var definesNamespaces = (0, import_ramda.pipe)(definedNamespaces, (0, import_ramda.equals)([]), import_ramda.not);
143
- var definedNamespaceRegexes = (0, import_ramda.pipe)((binding) => binding?.filters?.regexNamespaces, (0, import_ramda.defaultTo)([]));
144
- var definesNamespaceRegexes = (0, import_ramda.pipe)(definedNamespaceRegexes, (0, import_ramda.equals)([]), import_ramda.not);
145
- var definedAnnotations = (0, import_ramda.pipe)((binding) => binding?.filters?.annotations, (0, import_ramda.defaultTo)({}));
146
- var definesAnnotations = (0, import_ramda.pipe)(definedAnnotations, (0, import_ramda.equals)({}), import_ramda.not);
147
- var definedLabels = (0, import_ramda.pipe)((binding) => binding?.filters?.labels, (0, import_ramda.defaultTo)({}));
148
- var definesLabels = (0, import_ramda.pipe)(definedLabels, (0, import_ramda.equals)({}), import_ramda.not);
149
- var definedEvent = (0, import_ramda.pipe)((binding) => binding?.event, (0, import_ramda.defaultTo)(""));
150
- var definesDelete = (0, import_ramda.pipe)(definedEvent, (0, import_ramda.equals)("DELETE" /* DELETE */));
151
- var definedGroup = (0, import_ramda.pipe)((binding) => binding?.kind?.group, (0, import_ramda.defaultTo)(""));
152
- var definesGroup = (0, import_ramda.pipe)(definedGroup, (0, import_ramda.equals)(""), import_ramda.not);
153
- var definedVersion = (0, import_ramda.pipe)((binding) => binding?.kind?.version, (0, import_ramda.defaultTo)(""));
154
- var definesVersion = (0, import_ramda.pipe)(definedVersion, (0, import_ramda.equals)(""), import_ramda.not);
155
- var definedKind = (0, import_ramda.pipe)((binding) => binding?.kind?.kind, (0, import_ramda.defaultTo)(""));
156
- var definesKind = (0, import_ramda.pipe)(definedKind, (0, import_ramda.equals)(""), import_ramda.not);
157
- var definedCategory = (0, import_ramda.pipe)((binding) => {
158
- return binding.isFinalize ? "Finalize" : binding.isWatch ? "Watch" : binding.isMutate ? "Mutate" : binding.isValidate ? "Validate" : "";
159
- });
160
- var definedCallback = (0, import_ramda.pipe)((binding) => {
161
- return binding.isFinalize ? binding.finalizeCallback : binding.isWatch ? binding.watchCallback : binding.isMutate ? binding.mutateCallback : binding.isValidate ? binding.validateCallback : null;
162
- });
163
- var definedCallbackName = (0, import_ramda.pipe)(definedCallback, (0, import_ramda.defaultTo)({ name: "" }), (cb) => cb.name);
164
- var mismatchedDeletionTimestamp = (0, import_ramda.allPass)([
165
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(0), definesDeletionTimestamp),
166
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(1), missingDeletionTimestamp)
167
- ]);
168
- var mismatchedName = (0, import_ramda.allPass)([
169
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(0), definesName),
170
- (0, import_ramda.pipe)((bnd, obj) => definedName(bnd) !== carriedName(obj))
171
- ]);
172
- var mismatchedNameRegex = (0, import_ramda.allPass)([
173
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(0), definesNameRegex),
174
- (0, import_ramda.pipe)((bnd, obj) => new RegExp(definedNameRegex(bnd)).test(carriedName(obj)), import_ramda.not)
175
- ]);
176
- var bindsToKind = (0, import_ramda.curry)(
177
- (0, import_ramda.allPass)([(0, import_ramda.pipe)((0, import_ramda.nthArg)(0), definedKind, (0, import_ramda.equals)(""), import_ramda.not), (0, import_ramda.pipe)((bnd, knd) => definedKind(bnd) === knd)])
178
- );
179
- var bindsToNamespace = (0, import_ramda.curry)((0, import_ramda.pipe)(bindsToKind(import_ramda.__, "Namespace")));
180
- var misboundNamespace = (0, import_ramda.allPass)([bindsToNamespace, definesNamespaces]);
181
- var mismatchedNamespace = (0, import_ramda.allPass)([
182
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(0), definesNamespaces),
183
- (0, import_ramda.pipe)((bnd, obj) => definedNamespaces(bnd).includes(carriedNamespace(obj)), import_ramda.not)
184
- ]);
185
- var mismatchedNamespaceRegex = (0, import_ramda.allPass)([
186
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(0), definesNamespaceRegexes),
187
- (0, import_ramda.pipe)(
188
- (bnd, obj) => (0, import_ramda.pipe)(
189
- (0, import_ramda.any)((rex) => new RegExp(rex).test(carriedNamespace(obj))),
190
- import_ramda.not
191
- )(definedNamespaceRegexes(bnd))
192
- )
193
- ]);
194
- var metasMismatch = (0, import_ramda.pipe)(
195
- (defined, carried) => {
196
- const result = { defined, carried, unalike: {} };
197
- result.unalike = Object.entries(result.defined).map(([key, val]) => {
198
- const keyMissing = !Object.hasOwn(result.carried, key);
199
- const noValue = !val;
200
- const valMissing = !result.carried[key];
201
- const valDiffers = result.carried[key] !== result.defined[key];
202
- return keyMissing ? { [key]: val } : noValue ? {} : valMissing ? { [key]: val } : valDiffers ? { [key]: val } : {};
203
- }).reduce((acc, cur) => ({ ...acc, ...cur }), {});
204
- return result.unalike;
205
- },
206
- (unalike) => Object.keys(unalike).length > 0
207
- );
208
- var mismatchedAnnotations = (0, import_ramda.allPass)([
209
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(0), definesAnnotations),
210
- (0, import_ramda.pipe)((bnd, obj) => metasMismatch(definedAnnotations(bnd), carriedAnnotations(obj)))
211
- ]);
212
- var mismatchedLabels = (0, import_ramda.allPass)([
213
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(0), definesLabels),
214
- (0, import_ramda.pipe)((bnd, obj) => metasMismatch(definedLabels(bnd), carriedLabels(obj)))
215
- ]);
216
- var uncarryableNamespace = (0, import_ramda.allPass)([
217
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(0), import_ramda.length, (0, import_ramda.gt)(import_ramda.__, 0)),
218
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(1), carriesNamespace),
219
- (0, import_ramda.pipe)((nss, obj) => nss.includes(carriedNamespace(obj)), import_ramda.not)
220
- ]);
221
- var carriesIgnoredNamespace = (0, import_ramda.allPass)([
222
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(0), import_ramda.length, (0, import_ramda.gt)(import_ramda.__, 0)),
223
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(1), carriesNamespace),
224
- (0, import_ramda.pipe)((nss, obj) => nss.includes(carriedNamespace(obj)))
225
- ]);
226
- var unbindableNamespaces = (0, import_ramda.allPass)([
227
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(0), import_ramda.length, (0, import_ramda.gt)(import_ramda.__, 0)),
228
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(1), definesNamespaces),
229
- (0, import_ramda.pipe)((nss, bnd) => (0, import_ramda.difference)(definedNamespaces(bnd), nss), import_ramda.length, (0, import_ramda.equals)(0), import_ramda.not)
230
- ]);
231
- var misboundDeleteWithDeletionTimestamp = (0, import_ramda.allPass)([definesDelete, definesDeletionTimestamp]);
232
- var operationMatchesEvent = (0, import_ramda.anyPass)([
233
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(1), (0, import_ramda.equals)("*" /* Any */)),
234
- (0, import_ramda.pipe)((op, evt) => op === evt),
235
- (0, import_ramda.pipe)((op, evt) => op ? evt.includes(op) : false)
236
- ]);
237
- var mismatchedEvent = (0, import_ramda.pipe)(
238
- (binding, request) => operationMatchesEvent(declaredOperation(request), definedEvent(binding)),
239
- import_ramda.not
240
- );
241
- var mismatchedGroup = (0, import_ramda.allPass)([
242
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(0), definesGroup),
243
- (0, import_ramda.pipe)((binding, request) => definedGroup(binding) !== declaredGroup(request))
244
- ]);
245
- var mismatchedVersion = (0, import_ramda.allPass)([
246
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(0), definesVersion),
247
- (0, import_ramda.pipe)((binding, request) => definedVersion(binding) !== declaredVersion(request))
248
- ]);
249
- var mismatchedKind = (0, import_ramda.allPass)([
250
- (0, import_ramda.pipe)((0, import_ramda.nthArg)(0), definesKind),
251
- (0, import_ramda.pipe)((binding, request) => definedKind(binding) !== declaredKind(request))
252
- ]);
253
-
254
- // src/lib/helpers.ts
255
- var ValidationError = class extends Error {
256
- };
257
- function validateHash(expectedHash) {
258
- const sha256Regex = /^[a-f0-9]{64}$/i;
259
- if (!expectedHash || !sha256Regex.test(expectedHash)) {
260
- logger_default.error(`Invalid hash. Expected a valid SHA-256 hash, got ${expectedHash}`);
261
- throw new ValidationError("Invalid hash");
262
- }
263
- }
264
-
265
- // src/runtime/controller.ts
266
- var { version: version2 } = packageJSON;
267
- function runModule(expectedHash) {
268
- const gzPath = `/app/load/module-${expectedHash}.js.gz`;
269
- const jsPath = `/app/module-${expectedHash}.js`;
270
- logger_default.level = "info";
271
- if (!import_fs.default.existsSync(gzPath)) {
272
- throw new Error(`File not found: ${gzPath}`);
273
- }
274
- try {
275
- logger_default.info(`Loading module ${gzPath}`);
276
- const codeGZ = import_fs.default.readFileSync(gzPath);
277
- const code = (0, import_zlib.gunzipSync)(codeGZ);
278
- const actualHash = import_crypto.default.createHash("sha256").update(code).digest("hex");
279
- if (!import_crypto.default.timingSafeEqual(Buffer.from(expectedHash, "hex"), Buffer.from(actualHash, "hex"))) {
280
- throw new Error(`File hash does not match, expected ${expectedHash} but got ${actualHash}`);
281
- }
282
- logger_default.info(`File hash matches, running module`);
283
- import_fs.default.writeFileSync(jsPath, code);
284
- (0, import_child_process.fork)(jsPath);
285
- } catch (e) {
286
- throw new Error(`Failed to decompress module: ${e}`);
287
- }
288
- }
289
- logger_default.info(`Pepr Controller (v${version2})`);
290
- var hash = process.argv[2];
291
- var startup = async () => {
292
- try {
293
- logger_default.info("Applying the Pepr Store CRD if it doesn't exist");
294
- await (0, import_kubernetes_fluent_client4.K8s)(import_kubernetes_fluent_client4.kind.CustomResourceDefinition).Apply(peprStoreCRD, { force: true });
295
- validateHash(hash);
296
- runModule(hash);
297
- } catch (err) {
298
- logger_default.error(err, `Error starting Pepr Store CRD`);
299
- process.exit(1);
300
- }
301
- };
302
- startup().catch((err) => logger_default.error(err, `Error starting Pepr Controller`));