pepr 0.36.0 → 0.37.0

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 (96) hide show
  1. package/dist/cli/init/index.d.ts.map +1 -1
  2. package/dist/cli/init/templates.d.ts +3 -1
  3. package/dist/cli/init/templates.d.ts.map +1 -1
  4. package/dist/cli/init/utils.d.ts.map +1 -1
  5. package/dist/cli/init/walkthrough.d.ts +10 -3
  6. package/dist/cli/init/walkthrough.d.ts.map +1 -1
  7. package/dist/cli.js +253 -31
  8. package/dist/controller.js +138 -1
  9. package/dist/lib/adjudicators.d.ts +63 -0
  10. package/dist/lib/adjudicators.d.ts.map +1 -0
  11. package/dist/lib/adjudicators.test.d.ts +2 -0
  12. package/dist/lib/adjudicators.test.d.ts.map +1 -0
  13. package/dist/lib/assets/loader.d.ts.map +1 -1
  14. package/dist/lib/assets/pods.d.ts +1 -0
  15. package/dist/lib/assets/pods.d.ts.map +1 -1
  16. package/dist/lib/capability.d.ts +1 -0
  17. package/dist/lib/capability.d.ts.map +1 -1
  18. package/dist/lib/capability.test.d.ts +2 -0
  19. package/dist/lib/capability.test.d.ts.map +1 -0
  20. package/dist/lib/controller/index.d.ts.map +1 -1
  21. package/dist/lib/controller/store.d.ts +4 -0
  22. package/dist/lib/controller/store.d.ts.map +1 -1
  23. package/dist/lib/controller/store.test.d.ts +2 -0
  24. package/dist/lib/controller/store.test.d.ts.map +1 -0
  25. package/dist/lib/filter.d.ts +2 -3
  26. package/dist/lib/filter.d.ts.map +1 -1
  27. package/dist/lib/filter.test.d.ts +2 -1
  28. package/dist/lib/filter.test.d.ts.map +1 -1
  29. package/dist/lib/finalizer.d.ts +6 -0
  30. package/dist/lib/finalizer.d.ts.map +1 -0
  31. package/dist/lib/finalizer.test.d.ts +2 -0
  32. package/dist/lib/finalizer.test.d.ts.map +1 -0
  33. package/dist/lib/helpers.d.ts +2 -2
  34. package/dist/lib/helpers.d.ts.map +1 -1
  35. package/dist/lib/helpers.test.d.ts +1 -1
  36. package/dist/lib/helpers.test.d.ts.map +1 -1
  37. package/dist/lib/k8s.d.ts.map +1 -1
  38. package/dist/lib/module.d.ts +2 -1
  39. package/dist/lib/module.d.ts.map +1 -1
  40. package/dist/lib/mutate-processor.d.ts +2 -1
  41. package/dist/lib/mutate-processor.d.ts.map +1 -1
  42. package/dist/lib/mutate-request.d.ts +1 -2
  43. package/dist/lib/mutate-request.d.ts.map +1 -1
  44. package/dist/lib/schedule.d.ts +1 -2
  45. package/dist/lib/schedule.d.ts.map +1 -1
  46. package/dist/lib/storage.d.ts.map +1 -1
  47. package/dist/lib/types.d.ts +115 -6
  48. package/dist/lib/types.d.ts.map +1 -1
  49. package/dist/lib/validate-processor.d.ts +4 -2
  50. package/dist/lib/validate-processor.d.ts.map +1 -1
  51. package/dist/lib/validate-request.d.ts +1 -1
  52. package/dist/lib/validate-request.d.ts.map +1 -1
  53. package/dist/lib/watch-processor.d.ts +1 -1
  54. package/dist/lib/watch-processor.d.ts.map +1 -1
  55. package/dist/lib.js +383 -204
  56. package/dist/lib.js.map +4 -4
  57. package/package.json +9 -7
  58. package/src/cli/build.ts +3 -3
  59. package/src/cli/init/index.ts +20 -11
  60. package/src/cli/init/templates.ts +1 -1
  61. package/src/cli/init/utils.test.ts +11 -20
  62. package/src/cli/init/utils.ts +5 -0
  63. package/src/cli/init/walkthrough.test.ts +92 -11
  64. package/src/cli/init/walkthrough.ts +71 -16
  65. package/src/cli/monitor.ts +1 -1
  66. package/src/cli.ts +4 -2
  67. package/src/fixtures/data/create-pod.json +1 -1
  68. package/src/fixtures/data/delete-pod.json +1 -1
  69. package/src/lib/adjudicators.test.ts +1232 -0
  70. package/src/lib/adjudicators.ts +235 -0
  71. package/src/lib/assets/index.ts +1 -1
  72. package/src/lib/assets/loader.ts +1 -0
  73. package/src/lib/assets/webhooks.ts +1 -1
  74. package/src/lib/capability.test.ts +655 -0
  75. package/src/lib/capability.ts +104 -11
  76. package/src/lib/controller/index.ts +7 -4
  77. package/src/lib/controller/store.test.ts +131 -0
  78. package/src/lib/controller/store.ts +43 -5
  79. package/src/lib/filter.test.ts +194 -8
  80. package/src/lib/filter.ts +46 -107
  81. package/src/lib/finalizer.test.ts +236 -0
  82. package/src/lib/finalizer.ts +63 -0
  83. package/src/lib/helpers.test.ts +329 -69
  84. package/src/lib/helpers.ts +141 -100
  85. package/src/lib/k8s.ts +4 -0
  86. package/src/lib/module.ts +3 -3
  87. package/src/lib/mutate-processor.ts +5 -4
  88. package/src/lib/mutate-request.test.ts +1 -2
  89. package/src/lib/mutate-request.ts +1 -3
  90. package/src/lib/schedule.ts +1 -1
  91. package/src/lib/storage.ts +5 -6
  92. package/src/lib/types.ts +151 -5
  93. package/src/lib/validate-processor.ts +5 -2
  94. package/src/lib/validate-request.test.ts +1 -4
  95. package/src/lib/validate-request.ts +1 -1
  96. package/src/lib/watch-processor.ts +19 -5
@@ -5,12 +5,15 @@ import { kind } from "kubernetes-fluent-client";
5
5
 
6
6
  import { Capability } from "./capability";
7
7
  import { shouldSkipRequest } from "./filter";
8
- import { AdmissionRequest, ValidateResponse } from "./k8s";
8
+ import { ValidateResponse } from "./k8s";
9
+ import { AdmissionRequest } from "./types";
9
10
  import Log from "./logger";
10
11
  import { convertFromBase64Map } from "./utils";
11
12
  import { PeprValidateRequest } from "./validate-request";
13
+ import { ModuleConfig } from "./module";
12
14
 
13
15
  export async function validateProcessor(
16
+ config: ModuleConfig,
14
17
  capabilities: Capability[],
15
18
  req: AdmissionRequest,
16
19
  reqMetadata: Record<string, string>,
@@ -41,7 +44,7 @@ export async function validateProcessor(
41
44
  };
42
45
 
43
46
  // Continue to the next action without doing anything if this one should be skipped
44
- if (shouldSkipRequest(action, req, namespaces)) {
47
+ if (shouldSkipRequest(action, req, namespaces, config?.alwaysIgnore?.namespaces)) {
45
48
  continue;
46
49
  }
47
50
 
@@ -3,11 +3,8 @@
3
3
 
4
4
  import { beforeEach, describe, expect, it } from "@jest/globals";
5
5
  import { KubernetesObject } from "kubernetes-fluent-client";
6
-
7
- import { Operation, AdmissionRequest } from "./k8s";
8
- import { ValidateActionResponse } from "./types";
6
+ import { ValidateActionResponse, AdmissionRequest, Operation } from "./types";
9
7
  import { PeprValidateRequest } from "./validate-request";
10
-
11
8
  describe("PeprValidateRequest", () => {
12
9
  let mockRequest: AdmissionRequest<KubernetesObject>;
13
10
 
@@ -6,7 +6,7 @@
6
6
  import { KubernetesObject } from "kubernetes-fluent-client";
7
7
 
8
8
  import { clone } from "ramda";
9
- import { Operation, AdmissionRequest } from "./k8s";
9
+ import { AdmissionRequest, Operation } from "./types";
10
10
  import { ValidateActionResponse } from "./types";
11
11
 
12
12
  /**
@@ -4,6 +4,7 @@ import { K8s, KubernetesObject, WatchCfg, WatchEvent } from "kubernetes-fluent-c
4
4
  import { WatchPhase } from "kubernetes-fluent-client/dist/fluent/types";
5
5
  import { Capability } from "./capability";
6
6
  import { filterNoMatchReason } from "./helpers";
7
+ import { removeFinalizer } from "./finalizer";
7
8
  import Log from "./logger";
8
9
  import { Queue } from "./queue";
9
10
  import { Binding, Event } from "./types";
@@ -72,11 +73,11 @@ const eventToPhaseMap = {
72
73
  *
73
74
  * @param capabilities The capabilities to load watches for
74
75
  */
75
- export function setupWatch(capabilities: Capability[]) {
76
+ export function setupWatch(capabilities: Capability[], ignoredNamespaces?: string[]) {
76
77
  capabilities.map(capability =>
77
78
  capability.bindings
78
79
  .filter(binding => binding.isWatch)
79
- .forEach(bindingElement => runBinding(bindingElement, capability.namespaces)),
80
+ .forEach(bindingElement => runBinding(bindingElement, capability.namespaces, ignoredNamespaces)),
80
81
  );
81
82
  }
82
83
 
@@ -86,7 +87,7 @@ export function setupWatch(capabilities: Capability[]) {
86
87
  * @param binding the binding to watch
87
88
  * @param capabilityNamespaces list of namespaces to filter on
88
89
  */
89
- async function runBinding(binding: Binding, capabilityNamespaces: string[]) {
90
+ async function runBinding(binding: Binding, capabilityNamespaces: string[], ignoredNamespaces?: string[]) {
90
91
  // Get the phases to match, fallback to any
91
92
  const phaseMatch: WatchPhase[] = eventToPhaseMap[binding.event] || eventToPhaseMap[Event.Any];
92
93
 
@@ -98,9 +99,22 @@ async function runBinding(binding: Binding, capabilityNamespaces: string[]) {
98
99
  if (phaseMatch.includes(phase)) {
99
100
  try {
100
101
  // Then, check if the object matches the filter
101
- const filterMatch = filterNoMatchReason(binding, obj, capabilityNamespaces);
102
+ const filterMatch = filterNoMatchReason(binding, obj, capabilityNamespaces, ignoredNamespaces);
102
103
  if (filterMatch === "") {
103
- await binding.watchCallback?.(obj, phase);
104
+ if (binding.isFinalize) {
105
+ if (!obj.metadata?.deletionTimestamp) {
106
+ return;
107
+ }
108
+ try {
109
+ await binding.finalizeCallback?.(obj);
110
+
111
+ // irrespective of callback success / failure, remove pepr finalizer
112
+ } finally {
113
+ await removeFinalizer(binding, obj);
114
+ }
115
+ } else {
116
+ await binding.watchCallback?.(obj, phase);
117
+ }
104
118
  } else {
105
119
  Log.debug(filterMatch);
106
120
  }