kubernetes-fluent-client 1.8.3 → 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.
- package/dist/fluent/index.test.js +14 -28
- package/dist/fluent/types.d.ts.map +1 -1
- package/dist/helpers.d.ts +8 -0
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +33 -1
- package/dist/helpers.test.js +6 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/kinds.d.ts.map +1 -1
- package/dist/kinds.js +1 -0
- package/dist/kinds.test.js +6 -1
- package/dist/patch.d.ts +7 -0
- package/dist/patch.d.ts.map +1 -0
- package/dist/patch.js +2 -0
- package/package.json +13 -16
- package/src/fluent/index.test.ts +21 -28
- package/src/fluent/types.ts +4 -2
- package/src/helpers.test.ts +9 -2
- package/src/helpers.ts +35 -0
- package/src/index.ts +2 -0
- package/src/kinds.test.ts +6 -1
- package/src/kinds.ts +1 -0
- package/src/patch.ts +8 -0
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
package/dist/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"
|
|
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;
|
package/dist/helpers.test.js
CHANGED
|
@@ -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
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
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;
|
package/dist/kinds.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kinds.d.ts","sourceRoot":"","sources":["../src/kinds.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"kinds.d.ts","sourceRoot":"","sources":["../src/kinds.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAqkBzD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAErE;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,UAAW,YAAY,oBAAoB,gBAAgB,SAUnF,CAAC"}
|
package/dist/kinds.js
CHANGED
package/dist/kinds.test.js
CHANGED
|
@@ -52,7 +52,12 @@ const testCases = [
|
|
|
52
52
|
{ name: index_1.kind.Ingress, expected: { group: "networking.k8s.io", version: "v1", kind: "Ingress" } },
|
|
53
53
|
{
|
|
54
54
|
name: index_1.kind.NetworkPolicy,
|
|
55
|
-
expected: {
|
|
55
|
+
expected: {
|
|
56
|
+
group: "networking.k8s.io",
|
|
57
|
+
version: "v1",
|
|
58
|
+
kind: "NetworkPolicy",
|
|
59
|
+
plural: "networkpolicies",
|
|
60
|
+
},
|
|
56
61
|
},
|
|
57
62
|
{ name: index_1.kind.Node, expected: { group: "", version: "v1", kind: "Node" } },
|
|
58
63
|
{ name: index_1.kind.PersistentVolume, expected: { group: "", version: "v1", kind: "PersistentVolume" } },
|
package/dist/patch.d.ts
ADDED
|
@@ -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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kubernetes-fluent-client",
|
|
3
|
-
"version": "1.
|
|
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": "
|
|
44
|
-
"type-fest": "4.
|
|
43
|
+
"quicktype-core": "23.0.80",
|
|
44
|
+
"type-fest": "4.8.2",
|
|
45
45
|
"yargs": "17.7.2"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@commitlint/cli": "18.4.
|
|
49
|
-
"@commitlint/config-conventional": "18.4.
|
|
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.
|
|
53
|
-
"@types/yargs": "17.0.
|
|
54
|
-
"@typescript-eslint/eslint-plugin": "6.
|
|
55
|
-
"@typescript-eslint/parser": "6.
|
|
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.
|
|
59
|
-
"prettier": "3.0
|
|
60
|
-
"semantic-release": "22.0.
|
|
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.
|
|
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": [
|
package/src/fluent/index.test.ts
CHANGED
|
@@ -60,8 +60,7 @@ describe("Kube", () => {
|
|
|
60
60
|
});
|
|
61
61
|
|
|
62
62
|
it("should create a resource", async () => {
|
|
63
|
-
const
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
106
|
-
|
|
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
|
-
|
|
120
|
-
|
|
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
|
-
|
|
134
|
-
|
|
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
|
-
|
|
146
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
171
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
});
|
package/src/fluent/types.ts
CHANGED
|
@@ -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
|
-
|
|
171
|
-
|
|
170
|
+
? {
|
|
171
|
+
[K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K]>> : never;
|
|
172
|
+
}[keyof T]
|
|
173
|
+
: "";
|
package/src/helpers.test.ts
CHANGED
|
@@ -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
package/src/kinds.test.ts
CHANGED
|
@@ -54,7 +54,12 @@ const testCases = [
|
|
|
54
54
|
{ name: kind.Ingress, expected: { group: "networking.k8s.io", version: "v1", kind: "Ingress" } },
|
|
55
55
|
{
|
|
56
56
|
name: kind.NetworkPolicy,
|
|
57
|
-
expected: {
|
|
57
|
+
expected: {
|
|
58
|
+
group: "networking.k8s.io",
|
|
59
|
+
version: "v1",
|
|
60
|
+
kind: "NetworkPolicy",
|
|
61
|
+
plural: "networkpolicies",
|
|
62
|
+
},
|
|
58
63
|
},
|
|
59
64
|
{ name: kind.Node, expected: { group: "", version: "v1", kind: "Node" } },
|
|
60
65
|
{ name: kind.PersistentVolume, expected: { group: "", version: "v1", kind: "PersistentVolume" } },
|
package/src/kinds.ts
CHANGED
package/src/patch.ts
ADDED