kubernetes-fluent-client 1.8.4 → 1.9.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.
@@ -55,8 +55,7 @@ const generateFakePodManagedFields = (manager) => {
55
55
  mockedKubeExec.mockClear();
56
56
  });
57
57
  (0, globals_1.it)("should create a resource", async () => {
58
- const kube = (0, _1.K8s)(upstream_1.Pod);
59
- const result = await kube.Create(fakeResource);
58
+ const result = await (0, _1.K8s)(upstream_1.Pod).Create(fakeResource);
60
59
  (0, globals_1.expect)(result).toEqual(fakeResource);
61
60
  (0, globals_1.expect)(mockedKubeExec).toHaveBeenCalledWith(upstream_1.Pod, globals_1.expect.objectContaining({
62
61
  name: "fake",
@@ -64,8 +63,7 @@ const generateFakePodManagedFields = (manager) => {
64
63
  }), "POST", fakeResource);
65
64
  });
66
65
  (0, globals_1.it)("should delete a resource", async () => {
67
- const kube = (0, _1.K8s)(upstream_1.Pod);
68
- await kube.Delete(fakeResource);
66
+ await (0, _1.K8s)(upstream_1.Pod).Delete(fakeResource);
69
67
  (0, globals_1.expect)(mockedKubeExec).toHaveBeenCalledWith(upstream_1.Pod, globals_1.expect.objectContaining({
70
68
  name: "fake",
71
69
  namespace: "default",
@@ -75,14 +73,12 @@ const generateFakePodManagedFields = (manager) => {
75
73
  const patchOperations = [
76
74
  { op: "replace", path: "/metadata/name", value: "new-fake" },
77
75
  ];
78
- const kube = (0, _1.K8s)(upstream_1.Pod);
79
- const result = await kube.Patch(patchOperations);
76
+ const result = await (0, _1.K8s)(upstream_1.Pod).Patch(patchOperations);
80
77
  (0, globals_1.expect)(result).toEqual(fakeResource);
81
78
  (0, globals_1.expect)(mockedKubeExec).toHaveBeenCalledWith(upstream_1.Pod, {}, "PATCH", patchOperations);
82
79
  });
83
80
  (0, globals_1.it)("should filter with WithField", async () => {
84
- const kube = (0, _1.K8s)(upstream_1.Pod).WithField("metadata.name", "fake");
85
- await kube.Get();
81
+ await (0, _1.K8s)(upstream_1.Pod).WithField("metadata.name", "fake").Get();
86
82
  (0, globals_1.expect)(mockedKubeExec).toHaveBeenCalledWith(upstream_1.Pod, globals_1.expect.objectContaining({
87
83
  fields: {
88
84
  "metadata.name": "fake",
@@ -90,8 +86,7 @@ const generateFakePodManagedFields = (manager) => {
90
86
  }), "GET");
91
87
  });
92
88
  (0, globals_1.it)("should filter with WithLabel", async () => {
93
- const kube = (0, _1.K8s)(upstream_1.Pod).WithLabel("app", "fakeApp");
94
- await kube.Get();
89
+ await (0, _1.K8s)(upstream_1.Pod).WithLabel("app", "fakeApp").Get();
95
90
  (0, globals_1.expect)(mockedKubeExec).toHaveBeenCalledWith(upstream_1.Pod, globals_1.expect.objectContaining({
96
91
  labels: {
97
92
  app: "fakeApp",
@@ -99,45 +94,37 @@ const generateFakePodManagedFields = (manager) => {
99
94
  }), "GET");
100
95
  });
101
96
  (0, globals_1.it)("should use InNamespace", async () => {
102
- const kube = (0, _1.K8s)(upstream_1.Pod).InNamespace("fakeNamespace");
103
- await kube.Get();
97
+ await (0, _1.K8s)(upstream_1.Pod).InNamespace("fakeNamespace").Get();
104
98
  (0, globals_1.expect)(mockedKubeExec).toHaveBeenCalledWith(upstream_1.Pod, globals_1.expect.objectContaining({
105
99
  namespace: "fakeNamespace",
106
100
  }), "GET");
107
101
  });
108
102
  (0, globals_1.it)("should throw an error if namespace is already specified", async () => {
109
- const kube = (0, _1.K8s)(upstream_1.Pod, { namespace: "default" });
110
- (0, globals_1.expect)(() => kube.InNamespace("fakeNamespace")).toThrow("Namespace already specified: default");
103
+ (0, globals_1.expect)(() => (0, _1.K8s)(upstream_1.Pod, { namespace: "default" }).InNamespace("fakeNamespace")).toThrow("Namespace already specified: default");
111
104
  });
112
105
  (0, globals_1.it)("should handle Delete when the resource doesn't exist", async () => {
113
106
  mockedKubeExec.mockRejectedValueOnce({ status: 404 }); // Not Found on first call
114
- const kube = (0, _1.K8s)(upstream_1.Pod);
115
- await (0, globals_1.expect)(kube.Delete("fakeResource")).resolves.toBeUndefined();
107
+ await (0, globals_1.expect)((0, _1.K8s)(upstream_1.Pod).Delete("fakeResource")).resolves.toBeUndefined();
116
108
  });
117
109
  (0, globals_1.it)("should handle Get", async () => {
118
- const kube = (0, _1.K8s)(upstream_1.Pod);
119
- const result = await kube.Get("fakeResource");
110
+ const result = await (0, _1.K8s)(upstream_1.Pod).Get("fakeResource");
120
111
  (0, globals_1.expect)(result).toEqual(fakeResource);
121
112
  (0, globals_1.expect)(mockedKubeExec).toHaveBeenCalledWith(upstream_1.Pod, globals_1.expect.objectContaining({
122
113
  name: "fakeResource",
123
114
  }), "GET");
124
115
  });
125
116
  (0, globals_1.it)("should thrown an error if Get is called with a name and filters are already specified a name", async () => {
126
- const kube = (0, _1.K8s)(upstream_1.Pod, { name: "fake" });
127
- await (0, globals_1.expect)(kube.Get("fakeResource")).rejects.toThrow("Name already specified: fake");
117
+ await (0, globals_1.expect)((0, _1.K8s)(upstream_1.Pod, { name: "fake" }).Get("fakeResource")).rejects.toThrow("Name already specified: fake");
128
118
  });
129
119
  (0, globals_1.it)("should throw an error if no patch operations provided", async () => {
130
- const kube = (0, _1.K8s)(upstream_1.Pod);
131
- await (0, globals_1.expect)(kube.Patch([])).rejects.toThrow("No operations specified");
120
+ await (0, globals_1.expect)((0, _1.K8s)(upstream_1.Pod).Patch([])).rejects.toThrow("No operations specified");
132
121
  });
133
122
  (0, globals_1.it)("should allow Apply of deep partials", async () => {
134
- const kube = (0, _1.K8s)(upstream_1.Pod);
135
- const result = await kube.Apply({ metadata: { name: "fake" }, spec: { priority: 3 } });
123
+ const result = await (0, _1.K8s)(upstream_1.Pod).Apply({ metadata: { name: "fake" }, spec: { priority: 3 } });
136
124
  (0, globals_1.expect)(result).toEqual(fakeResource);
137
125
  });
138
126
  (0, globals_1.it)("should allow force apply to resolve FieldManagerConflict", async () => {
139
- const kube = (0, _1.K8s)(upstream_1.Pod);
140
- const result = await kube.Apply({
127
+ const result = await (0, _1.K8s)(upstream_1.Pod).Apply({
141
128
  metadata: { name: "fake", managedFields: generateFakePodManagedFields("kubectl") },
142
129
  spec: { priority: 3 },
143
130
  }, { force: true });
@@ -145,7 +132,6 @@ const generateFakePodManagedFields = (manager) => {
145
132
  });
146
133
  (0, globals_1.it)("should throw an error if a Delete failed for a reason other than Not Found", async () => {
147
134
  mockedKubeExec.mockRejectedValueOnce({ status: 500 }); // Internal Server Error on first call
148
- const kube = (0, _1.K8s)(upstream_1.Pod);
149
- await (0, globals_1.expect)(kube.Delete("fakeResource")).rejects.toEqual(globals_1.expect.objectContaining({ status: 500 }));
135
+ await (0, globals_1.expect)((0, _1.K8s)(upstream_1.Pod).Delete("fakeResource")).rejects.toEqual(globals_1.expect.objectContaining({ status: 500 }));
150
136
  });
151
137
  });
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fluent/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fluent/types.ts"],"names":[],"mappings":"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"}
package/dist/helpers.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { Cluster } from "@kubernetes/client-node";
1
2
  /**
2
3
  * Get an environment variable (Node, Deno or Bun), or throw an error if it's not set.
3
4
  *
@@ -15,4 +16,11 @@
15
16
  * @throws An error if the environment variable is not set.
16
17
  */
17
18
  export declare function fromEnv(name: string): string;
19
+ /**
20
+ * Wait for the Kubernetes cluster to be ready.
21
+ *
22
+ * @param seconds The number of seconds to wait for the cluster to be ready.
23
+ * @returns The current cluster.
24
+ */
25
+ export declare function waitForCluster(seconds?: number): Promise<Cluster>;
18
26
  //# sourceMappingURL=helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqB5C"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAc,MAAM,yBAAyB,CAAC;AAkB9D;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqB5C;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,OAAO,SAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAenE"}
package/dist/helpers.js CHANGED
@@ -2,7 +2,17 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  // SPDX-FileCopyrightText: 2023-Present The Kubernetes Fluent Client Authors
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.fromEnv = void 0;
5
+ exports.waitForCluster = exports.fromEnv = void 0;
6
+ const client_node_1 = require("@kubernetes/client-node");
7
+ /**
8
+ * Sleep for a number of seconds.
9
+ *
10
+ * @param seconds The number of seconds to sleep.
11
+ * @returns A promise that resolves after the specified number of seconds.
12
+ */
13
+ function sleep(seconds) {
14
+ return new Promise(resolve => setTimeout(resolve, seconds * 1000));
15
+ }
6
16
  /**
7
17
  * Get an environment variable (Node, Deno or Bun), or throw an error if it's not set.
8
18
  *
@@ -39,3 +49,25 @@ function fromEnv(name) {
39
49
  return envValue;
40
50
  }
41
51
  exports.fromEnv = fromEnv;
52
+ /**
53
+ * Wait for the Kubernetes cluster to be ready.
54
+ *
55
+ * @param seconds The number of seconds to wait for the cluster to be ready.
56
+ * @returns The current cluster.
57
+ */
58
+ async function waitForCluster(seconds = 30) {
59
+ const kubeConfig = new client_node_1.KubeConfig();
60
+ kubeConfig.loadFromDefault();
61
+ const cluster = kubeConfig.getCurrentCluster();
62
+ if (!cluster) {
63
+ await sleep(1);
64
+ if (seconds > 0) {
65
+ return await waitForCluster(seconds - 1);
66
+ }
67
+ else {
68
+ throw new Error("Cluster not ready");
69
+ }
70
+ }
71
+ return cluster;
72
+ }
73
+ exports.waitForCluster = waitForCluster;
@@ -14,3 +14,9 @@ const helpers_1 = require("./helpers");
14
14
  delete process.env.MY_ENV_VAR;
15
15
  });
16
16
  });
17
+ (0, globals_1.describe)("Cluster Wait Function", () => {
18
+ (0, globals_1.it)("should resolve if the cluster is already ready", async () => {
19
+ const cluster = await (0, helpers_1.waitForCluster)(5);
20
+ (0, globals_1.expect)(cluster).toEqual({ server: "http://jest-test:8080" });
21
+ });
22
+ });
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import "./patch";
1
2
  import * as kind from "./upstream";
2
3
  /** kind is a collection of K8s types to be used within a K8s call: `K8s(kind.Secret).Apply({})`. */
3
4
  export { kind };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AAEnC,oGAAoG;AACpG,OAAO,EAAE,IAAI,EAAE,CAAC;AAGhB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC,OAAO,EAAE,WAAW,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG/D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAG/B,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAGhE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,cAAc,SAAS,CAAC;AAExB,OAAO,KAAK,aAAa,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,SAAS,CAAC;AAGjB,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AAEnC,oGAAoG;AACpG,OAAO,EAAE,IAAI,EAAE,CAAC;AAGhB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC,OAAO,EAAE,WAAW,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG/D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAG/B,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAGhE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,cAAc,SAAS,CAAC;AAExB,OAAO,KAAK,aAAa,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
package/dist/index.js CHANGED
@@ -29,6 +29,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
29
29
  };
30
30
  Object.defineProperty(exports, "__esModule", { value: true });
31
31
  exports.fromEnv = exports.K8sClientNode = exports.GenericKind = exports.modelToGroupVersionKind = exports.RegisterKind = exports.K8s = exports.fetchStatus = exports.fetch = exports.kind = void 0;
32
+ require("./patch");
32
33
  // Export kinds as a single object
33
34
  const kind = __importStar(require("./upstream"));
34
35
  exports.kind = kind;
@@ -0,0 +1,7 @@
1
+ import { V1NetworkPolicyPeer } from "@kubernetes/client-node";
2
+ declare module "@kubernetes/client-node" {
3
+ interface V1NetworkPolicyIngressRule {
4
+ from?: Array<V1NetworkPolicyPeer>;
5
+ }
6
+ }
7
+ //# sourceMappingURL=patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../src/patch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,QAAQ,yBAAyB,CAAC;IACvC,UAAU,0BAA0B;QAClC,IAAI,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;KAEnC;CACF"}
package/dist/patch.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kubernetes-fluent-client",
3
- "version": "1.8.4",
3
+ "version": "1.9.0",
4
4
  "description": "A @kubernetes/client-node fluent API wrapper that leverages K8s Server Side Apply",
5
5
  "bin": "./dist/cli.js",
6
6
  "main": "dist/index.js",
@@ -40,29 +40,26 @@
40
40
  "fast-json-patch": "3.1.1",
41
41
  "http-status-codes": "2.3.0",
42
42
  "node-fetch": "2.7.0",
43
- "quicktype-core": "github:defenseunicorns/temp-quicktype-fork#main",
43
+ "quicktype-core": "23.0.80",
44
44
  "type-fest": "4.8.2",
45
45
  "yargs": "17.7.2"
46
46
  },
47
47
  "devDependencies": {
48
- "@commitlint/cli": "18.4.0",
49
- "@commitlint/config-conventional": "18.4.0",
48
+ "@commitlint/cli": "18.4.3",
49
+ "@commitlint/config-conventional": "18.4.3",
50
50
  "@jest/globals": "29.7.0",
51
51
  "@types/byline": "4.2.36",
52
- "@types/readable-stream": "4.0.5",
53
- "@types/yargs": "17.0.31",
54
- "@typescript-eslint/eslint-plugin": "6.10.0",
55
- "@typescript-eslint/parser": "6.10.0",
52
+ "@types/readable-stream": "4.0.9",
53
+ "@types/yargs": "17.0.32",
54
+ "@typescript-eslint/eslint-plugin": "6.13.1",
55
+ "@typescript-eslint/parser": "6.13.1",
56
56
  "eslint-plugin-jsdoc": "46.9.0",
57
57
  "jest": "29.7.0",
58
- "nock": "13.3.8",
59
- "prettier": "3.0.3",
60
- "semantic-release": "22.0.7",
58
+ "nock": "13.4.0",
59
+ "prettier": "3.1.0",
60
+ "semantic-release": "22.0.8",
61
61
  "ts-jest": "29.1.1",
62
- "typescript": "5.2.2"
63
- },
64
- "overrides": {
65
- "browser-or-node": "github:defenseunicorns/browser-or-node#master"
62
+ "typescript": "5.3.2"
66
63
  },
67
64
  "release": {
68
65
  "branches": [
@@ -60,8 +60,7 @@ describe("Kube", () => {
60
60
  });
61
61
 
62
62
  it("should create a resource", async () => {
63
- const kube = K8s(Pod);
64
- const result = await kube.Create(fakeResource);
63
+ const result = await K8s(Pod).Create(fakeResource);
65
64
 
66
65
  expect(result).toEqual(fakeResource);
67
66
  expect(mockedKubeExec).toHaveBeenCalledWith(
@@ -76,8 +75,7 @@ describe("Kube", () => {
76
75
  });
77
76
 
78
77
  it("should delete a resource", async () => {
79
- const kube = K8s(Pod);
80
- await kube.Delete(fakeResource);
78
+ await K8s(Pod).Delete(fakeResource);
81
79
 
82
80
  expect(mockedKubeExec).toHaveBeenCalledWith(
83
81
  Pod,
@@ -94,16 +92,15 @@ describe("Kube", () => {
94
92
  { op: "replace", path: "/metadata/name", value: "new-fake" },
95
93
  ];
96
94
 
97
- const kube = K8s(Pod);
98
- const result = await kube.Patch(patchOperations);
95
+ const result = await K8s(Pod).Patch(patchOperations);
99
96
 
100
97
  expect(result).toEqual(fakeResource);
101
98
  expect(mockedKubeExec).toHaveBeenCalledWith(Pod, {}, "PATCH", patchOperations);
102
99
  });
103
100
 
104
101
  it("should filter with WithField", async () => {
105
- const kube = K8s(Pod).WithField("metadata.name", "fake");
106
- await kube.Get();
102
+ await K8s(Pod).WithField("metadata.name", "fake").Get();
103
+
107
104
  expect(mockedKubeExec).toHaveBeenCalledWith(
108
105
  Pod,
109
106
  expect.objectContaining({
@@ -116,8 +113,8 @@ describe("Kube", () => {
116
113
  });
117
114
 
118
115
  it("should filter with WithLabel", async () => {
119
- const kube = K8s(Pod).WithLabel("app", "fakeApp");
120
- await kube.Get();
116
+ await K8s(Pod).WithLabel("app", "fakeApp").Get();
117
+
121
118
  expect(mockedKubeExec).toHaveBeenCalledWith(
122
119
  Pod,
123
120
  expect.objectContaining({
@@ -130,8 +127,8 @@ describe("Kube", () => {
130
127
  });
131
128
 
132
129
  it("should use InNamespace", async () => {
133
- const kube = K8s(Pod).InNamespace("fakeNamespace");
134
- await kube.Get();
130
+ await K8s(Pod).InNamespace("fakeNamespace").Get();
131
+
135
132
  expect(mockedKubeExec).toHaveBeenCalledWith(
136
133
  Pod,
137
134
  expect.objectContaining({
@@ -142,19 +139,18 @@ describe("Kube", () => {
142
139
  });
143
140
 
144
141
  it("should throw an error if namespace is already specified", async () => {
145
- const kube = K8s(Pod, { namespace: "default" });
146
- expect(() => kube.InNamespace("fakeNamespace")).toThrow("Namespace already specified: default");
142
+ expect(() => K8s(Pod, { namespace: "default" }).InNamespace("fakeNamespace")).toThrow(
143
+ "Namespace already specified: default",
144
+ );
147
145
  });
148
146
 
149
147
  it("should handle Delete when the resource doesn't exist", async () => {
150
148
  mockedKubeExec.mockRejectedValueOnce({ status: 404 }); // Not Found on first call
151
- const kube = K8s(Pod);
152
- await expect(kube.Delete("fakeResource")).resolves.toBeUndefined();
149
+ await expect(K8s(Pod).Delete("fakeResource")).resolves.toBeUndefined();
153
150
  });
154
151
 
155
152
  it("should handle Get", async () => {
156
- const kube = K8s(Pod);
157
- const result = await kube.Get("fakeResource");
153
+ const result = await K8s(Pod).Get("fakeResource");
158
154
 
159
155
  expect(result).toEqual(fakeResource);
160
156
  expect(mockedKubeExec).toHaveBeenCalledWith(
@@ -167,24 +163,22 @@ describe("Kube", () => {
167
163
  });
168
164
 
169
165
  it("should thrown an error if Get is called with a name and filters are already specified a name", async () => {
170
- const kube = K8s(Pod, { name: "fake" });
171
- await expect(kube.Get("fakeResource")).rejects.toThrow("Name already specified: fake");
166
+ await expect(K8s(Pod, { name: "fake" }).Get("fakeResource")).rejects.toThrow(
167
+ "Name already specified: fake",
168
+ );
172
169
  });
173
170
 
174
171
  it("should throw an error if no patch operations provided", async () => {
175
- const kube = K8s(Pod);
176
- await expect(kube.Patch([])).rejects.toThrow("No operations specified");
172
+ await expect(K8s(Pod).Patch([])).rejects.toThrow("No operations specified");
177
173
  });
178
174
 
179
175
  it("should allow Apply of deep partials", async () => {
180
- const kube = K8s(Pod);
181
- const result = await kube.Apply({ metadata: { name: "fake" }, spec: { priority: 3 } });
176
+ const result = await K8s(Pod).Apply({ metadata: { name: "fake" }, spec: { priority: 3 } });
182
177
  expect(result).toEqual(fakeResource);
183
178
  });
184
179
 
185
180
  it("should allow force apply to resolve FieldManagerConflict", async () => {
186
- const kube = K8s(Pod);
187
- const result = await kube.Apply(
181
+ const result = await K8s(Pod).Apply(
188
182
  {
189
183
  metadata: { name: "fake", managedFields: generateFakePodManagedFields("kubectl") },
190
184
  spec: { priority: 3 },
@@ -196,8 +190,7 @@ describe("Kube", () => {
196
190
 
197
191
  it("should throw an error if a Delete failed for a reason other than Not Found", async () => {
198
192
  mockedKubeExec.mockRejectedValueOnce({ status: 500 }); // Internal Server Error on first call
199
- const kube = K8s(Pod);
200
- await expect(kube.Delete("fakeResource")).rejects.toEqual(
193
+ await expect(K8s(Pod).Delete("fakeResource")).rejects.toEqual(
201
194
  expect.objectContaining({ status: 500 }),
202
195
  );
203
196
  });
@@ -167,5 +167,7 @@ type Join<K, P> = K extends string | number
167
167
  export type Paths<T, D extends number = 10> = [D] extends [never]
168
168
  ? never
169
169
  : T extends object
170
- ? { [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K]>> : never }[keyof T]
171
- : "";
170
+ ? {
171
+ [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K]>> : never;
172
+ }[keyof T]
173
+ : "";
@@ -1,9 +1,9 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  // SPDX-FileCopyrightText: 2023-Present The Kubernetes Fluent Client Authors
3
3
 
4
- import { describe, expect, test } from "@jest/globals";
4
+ import { describe, expect, it, test } from "@jest/globals";
5
5
 
6
- import { fromEnv } from "./helpers";
6
+ import { fromEnv, waitForCluster } from "./helpers";
7
7
 
8
8
  describe("helpers", () => {
9
9
  test("fromEnv for NodeJS", () => {
@@ -16,3 +16,10 @@ describe("helpers", () => {
16
16
  delete process.env.MY_ENV_VAR;
17
17
  });
18
18
  });
19
+
20
+ describe("Cluster Wait Function", () => {
21
+ it("should resolve if the cluster is already ready", async () => {
22
+ const cluster = await waitForCluster(5);
23
+ expect(cluster).toEqual({ server: "http://jest-test:8080" });
24
+ });
25
+ });
package/src/helpers.ts CHANGED
@@ -1,12 +1,24 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  // SPDX-FileCopyrightText: 2023-Present The Kubernetes Fluent Client Authors
3
3
 
4
+ import { Cluster, KubeConfig } from "@kubernetes/client-node";
5
+
4
6
  declare const Deno: {
5
7
  env: {
6
8
  get(name: string): string | undefined;
7
9
  };
8
10
  };
9
11
 
12
+ /**
13
+ * Sleep for a number of seconds.
14
+ *
15
+ * @param seconds The number of seconds to sleep.
16
+ * @returns A promise that resolves after the specified number of seconds.
17
+ */
18
+ function sleep(seconds: number): Promise<void> {
19
+ return new Promise(resolve => setTimeout(resolve, seconds * 1000));
20
+ }
21
+
10
22
  /**
11
23
  * Get an environment variable (Node, Deno or Bun), or throw an error if it's not set.
12
24
  *
@@ -45,3 +57,26 @@ export function fromEnv(name: string): string {
45
57
 
46
58
  return envValue;
47
59
  }
60
+
61
+ /**
62
+ * Wait for the Kubernetes cluster to be ready.
63
+ *
64
+ * @param seconds The number of seconds to wait for the cluster to be ready.
65
+ * @returns The current cluster.
66
+ */
67
+ export async function waitForCluster(seconds = 30): Promise<Cluster> {
68
+ const kubeConfig = new KubeConfig();
69
+ kubeConfig.loadFromDefault();
70
+
71
+ const cluster = kubeConfig.getCurrentCluster();
72
+ if (!cluster) {
73
+ await sleep(1);
74
+ if (seconds > 0) {
75
+ return await waitForCluster(seconds - 1);
76
+ } else {
77
+ throw new Error("Cluster not ready");
78
+ }
79
+ }
80
+
81
+ return cluster;
82
+ }
package/src/index.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  // SPDX-FileCopyrightText: 2023-Present The Kubernetes Fluent Client Authors
3
3
 
4
+ import "./patch";
5
+
4
6
  // Export kinds as a single object
5
7
  import * as kind from "./upstream";
6
8
 
package/src/patch.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { V1NetworkPolicyPeer } from "@kubernetes/client-node";
2
+
3
+ declare module "@kubernetes/client-node" {
4
+ interface V1NetworkPolicyIngressRule {
5
+ from?: Array<V1NetworkPolicyPeer>;
6
+ // No need to redeclare other unchanged properties
7
+ }
8
+ }