kubernetes-fluent-client 1.0.0 → 1.1.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/README.md +2 -2
- package/dist/fluent/{kube.d.ts → index.d.ts} +3 -3
- package/dist/fluent/index.d.ts.map +1 -0
- package/dist/fluent/{kube.js → index.js} +8 -8
- package/dist/fluent/index.test.d.ts +2 -0
- package/dist/fluent/index.test.d.ts.map +1 -0
- package/dist/fluent/{kube.test.js → index.test.js} +13 -13
- package/dist/fluent/types.d.ts +7 -7
- package/dist/fluent/types.d.ts.map +1 -1
- package/dist/fluent/utils.d.ts +2 -2
- package/dist/fluent/utils.d.ts.map +1 -1
- package/dist/fluent/utils.js +6 -6
- package/dist/fluent/utils.test.js +2 -2
- package/dist/fluent/watch.js +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/package.json +1 -1
- package/src/fluent/{kube.test.ts → index.test.ts} +14 -14
- package/src/fluent/{kube.ts → index.ts} +9 -9
- package/src/fluent/types.ts +8 -8
- package/src/fluent/utils.test.ts +3 -3
- package/src/fluent/utils.ts +3 -3
- package/src/fluent/watch.ts +2 -2
- package/src/index.ts +3 -3
- package/dist/fluent/kube.d.ts.map +0 -1
- package/dist/fluent/kube.test.d.ts +0 -2
- package/dist/fluent/kube.test.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
[](https://npmjs.com/package/kubernetes-fluent-client)
|
|
7
7
|
|
|
8
8
|
```typescript
|
|
9
|
-
import {
|
|
9
|
+
import { K8s, kind } from "kubernetes-fluent-client";
|
|
10
10
|
|
|
11
11
|
async function main() {
|
|
12
|
-
const pods = await
|
|
12
|
+
const pods = await K8s(kind.Pod).Get();
|
|
13
13
|
console.log(pods);
|
|
14
14
|
}
|
|
15
15
|
```
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { KubernetesObject } from "@kubernetes/client-node";
|
|
2
2
|
import { GenericClass } from "../types";
|
|
3
|
-
import { Filters,
|
|
3
|
+
import { Filters, K8sInit } from "./types";
|
|
4
4
|
/**
|
|
5
5
|
* Kubernetes fluent API inspired by Kubectl. Pass in a model, then call filters and actions on it.
|
|
6
6
|
*
|
|
7
7
|
* @param model - the model to use for the API
|
|
8
8
|
* @param filters - (optional) filter overrides, can also be chained
|
|
9
9
|
*/
|
|
10
|
-
export declare function
|
|
11
|
-
//# sourceMappingURL=
|
|
10
|
+
export declare function K8s<T extends GenericClass, K extends KubernetesObject = InstanceType<T>>(model: T, filters?: Filters): K8sInit<K>;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fluent/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwB,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKjF,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAsB,MAAM,SAAS,CAAC;AAI/D;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,gBAAgB,GAAG,YAAY,CAAC,CAAC,CAAC,EACtF,KAAK,EAAE,CAAC,EACR,OAAO,GAAE,OAAY,GACpB,OAAO,CAAC,CAAC,CAAC,CAuGZ"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
// SPDX-FileCopyrightText: 2023-Present The Pepr Authors
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.
|
|
5
|
+
exports.K8s = void 0;
|
|
6
6
|
const http_status_codes_1 = require("http-status-codes");
|
|
7
7
|
const kinds_1 = require("../kinds");
|
|
8
8
|
const utils_1 = require("./utils");
|
|
@@ -13,7 +13,7 @@ const watch_1 = require("./watch");
|
|
|
13
13
|
* @param model - the model to use for the API
|
|
14
14
|
* @param filters - (optional) filter overrides, can also be chained
|
|
15
15
|
*/
|
|
16
|
-
function
|
|
16
|
+
function K8s(model, filters = {}) {
|
|
17
17
|
const withFilters = { WithField, WithLabel, Get, Delete, Watch };
|
|
18
18
|
const matchedKind = filters.kindOverride || (0, kinds_1.modelToGroupVersionKind)(model.name);
|
|
19
19
|
function InNamespace(namespaces) {
|
|
@@ -56,7 +56,7 @@ function Kube(model, filters = {}) {
|
|
|
56
56
|
}
|
|
57
57
|
filters.name = name;
|
|
58
58
|
}
|
|
59
|
-
return (0, utils_1.
|
|
59
|
+
return (0, utils_1.k8sExec)(model, filters, "GET");
|
|
60
60
|
}
|
|
61
61
|
async function Delete(filter) {
|
|
62
62
|
if (typeof filter === "string") {
|
|
@@ -67,7 +67,7 @@ function Kube(model, filters = {}) {
|
|
|
67
67
|
}
|
|
68
68
|
try {
|
|
69
69
|
// Try to delete the resource
|
|
70
|
-
await (0, utils_1.
|
|
70
|
+
await (0, utils_1.k8sExec)(model, filters, "DELETE");
|
|
71
71
|
}
|
|
72
72
|
catch (e) {
|
|
73
73
|
// If the resource doesn't exist, ignore the error
|
|
@@ -79,22 +79,22 @@ function Kube(model, filters = {}) {
|
|
|
79
79
|
}
|
|
80
80
|
async function Apply(resource) {
|
|
81
81
|
syncFilters(resource);
|
|
82
|
-
return (0, utils_1.
|
|
82
|
+
return (0, utils_1.k8sExec)(model, filters, "APPLY", resource);
|
|
83
83
|
}
|
|
84
84
|
async function Create(resource) {
|
|
85
85
|
syncFilters(resource);
|
|
86
|
-
return (0, utils_1.
|
|
86
|
+
return (0, utils_1.k8sExec)(model, filters, "POST", resource);
|
|
87
87
|
}
|
|
88
88
|
async function Patch(payload) {
|
|
89
89
|
// If there are no operations, throw an error
|
|
90
90
|
if (payload.length < 1) {
|
|
91
91
|
throw new Error("No operations specified");
|
|
92
92
|
}
|
|
93
|
-
return (0, utils_1.
|
|
93
|
+
return (0, utils_1.k8sExec)(model, filters, "PATCH", payload);
|
|
94
94
|
}
|
|
95
95
|
async function Watch(callback) {
|
|
96
96
|
await (0, watch_1.ExecWatch)(model, filters, callback);
|
|
97
97
|
}
|
|
98
98
|
return { InNamespace, Apply, Create, Patch, ...withFilters };
|
|
99
99
|
}
|
|
100
|
-
exports.
|
|
100
|
+
exports.K8s = K8s;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/fluent/index.test.ts"],"names":[],"mappings":""}
|
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const globals_1 = require("@jest/globals");
|
|
4
4
|
const upstream_1 = require("../upstream");
|
|
5
|
-
const
|
|
5
|
+
const _1 = require(".");
|
|
6
6
|
const utils_1 = require("./utils");
|
|
7
7
|
// Setup mocks
|
|
8
8
|
globals_1.jest.mock("./utils");
|
|
9
9
|
(0, globals_1.describe)("Kube", () => {
|
|
10
10
|
const fakeResource = { metadata: { name: "fake", namespace: "default" } };
|
|
11
|
-
const mockedKubeExec = globals_1.jest.mocked(utils_1.
|
|
11
|
+
const mockedKubeExec = globals_1.jest.mocked(utils_1.k8sExec).mockResolvedValue(fakeResource);
|
|
12
12
|
(0, globals_1.beforeEach)(() => {
|
|
13
13
|
// Clear all instances and calls to constructor and all methods:
|
|
14
14
|
mockedKubeExec.mockClear();
|
|
15
15
|
});
|
|
16
16
|
(0, globals_1.it)("should create a resource", async () => {
|
|
17
|
-
const kube = (0,
|
|
17
|
+
const kube = (0, _1.K8s)(upstream_1.Pod);
|
|
18
18
|
const result = await kube.Create(fakeResource);
|
|
19
19
|
(0, globals_1.expect)(result).toEqual(fakeResource);
|
|
20
20
|
(0, globals_1.expect)(mockedKubeExec).toHaveBeenCalledWith(upstream_1.Pod, globals_1.expect.objectContaining({
|
|
@@ -23,7 +23,7 @@ globals_1.jest.mock("./utils");
|
|
|
23
23
|
}), "POST", fakeResource);
|
|
24
24
|
});
|
|
25
25
|
(0, globals_1.it)("should delete a resource", async () => {
|
|
26
|
-
const kube = (0,
|
|
26
|
+
const kube = (0, _1.K8s)(upstream_1.Pod);
|
|
27
27
|
await kube.Delete(fakeResource);
|
|
28
28
|
(0, globals_1.expect)(mockedKubeExec).toHaveBeenCalledWith(upstream_1.Pod, globals_1.expect.objectContaining({
|
|
29
29
|
name: "fake",
|
|
@@ -34,13 +34,13 @@ globals_1.jest.mock("./utils");
|
|
|
34
34
|
const patchOperations = [
|
|
35
35
|
{ op: "replace", path: "/metadata/name", value: "new-fake" },
|
|
36
36
|
];
|
|
37
|
-
const kube = (0,
|
|
37
|
+
const kube = (0, _1.K8s)(upstream_1.Pod);
|
|
38
38
|
const result = await kube.Patch(patchOperations);
|
|
39
39
|
(0, globals_1.expect)(result).toEqual(fakeResource);
|
|
40
40
|
(0, globals_1.expect)(mockedKubeExec).toHaveBeenCalledWith(upstream_1.Pod, {}, "PATCH", patchOperations);
|
|
41
41
|
});
|
|
42
42
|
(0, globals_1.it)("should filter with WithField", async () => {
|
|
43
|
-
const kube = (0,
|
|
43
|
+
const kube = (0, _1.K8s)(upstream_1.Pod).WithField("metadata.name", "fake");
|
|
44
44
|
await kube.Get();
|
|
45
45
|
(0, globals_1.expect)(mockedKubeExec).toHaveBeenCalledWith(upstream_1.Pod, globals_1.expect.objectContaining({
|
|
46
46
|
fields: {
|
|
@@ -49,7 +49,7 @@ globals_1.jest.mock("./utils");
|
|
|
49
49
|
}), "GET");
|
|
50
50
|
});
|
|
51
51
|
(0, globals_1.it)("should filter with WithLabel", async () => {
|
|
52
|
-
const kube = (0,
|
|
52
|
+
const kube = (0, _1.K8s)(upstream_1.Pod).WithLabel("app", "fakeApp");
|
|
53
53
|
await kube.Get();
|
|
54
54
|
(0, globals_1.expect)(mockedKubeExec).toHaveBeenCalledWith(upstream_1.Pod, globals_1.expect.objectContaining({
|
|
55
55
|
labels: {
|
|
@@ -58,23 +58,23 @@ globals_1.jest.mock("./utils");
|
|
|
58
58
|
}), "GET");
|
|
59
59
|
});
|
|
60
60
|
(0, globals_1.it)("should use InNamespace", async () => {
|
|
61
|
-
const kube = (0,
|
|
61
|
+
const kube = (0, _1.K8s)(upstream_1.Pod).InNamespace("fakeNamespace");
|
|
62
62
|
await kube.Get();
|
|
63
63
|
(0, globals_1.expect)(mockedKubeExec).toHaveBeenCalledWith(upstream_1.Pod, globals_1.expect.objectContaining({
|
|
64
64
|
namespace: "fakeNamespace",
|
|
65
65
|
}), "GET");
|
|
66
66
|
});
|
|
67
67
|
(0, globals_1.it)("should throw an error if namespace is already specified", async () => {
|
|
68
|
-
const kube = (0,
|
|
68
|
+
const kube = (0, _1.K8s)(upstream_1.Pod, { namespace: "default" });
|
|
69
69
|
(0, globals_1.expect)(() => kube.InNamespace("fakeNamespace")).toThrow("Namespace already specified: default");
|
|
70
70
|
});
|
|
71
71
|
(0, globals_1.it)("should handle Delete when the resource doesn't exist", async () => {
|
|
72
72
|
mockedKubeExec.mockRejectedValueOnce({ status: 404 }); // Not Found on first call
|
|
73
|
-
const kube = (0,
|
|
73
|
+
const kube = (0, _1.K8s)(upstream_1.Pod);
|
|
74
74
|
await (0, globals_1.expect)(kube.Delete("fakeResource")).resolves.toBeUndefined();
|
|
75
75
|
});
|
|
76
76
|
(0, globals_1.it)("should handle Get", async () => {
|
|
77
|
-
const kube = (0,
|
|
77
|
+
const kube = (0, _1.K8s)(upstream_1.Pod);
|
|
78
78
|
const result = await kube.Get("fakeResource");
|
|
79
79
|
(0, globals_1.expect)(result).toEqual(fakeResource);
|
|
80
80
|
(0, globals_1.expect)(mockedKubeExec).toHaveBeenCalledWith(upstream_1.Pod, globals_1.expect.objectContaining({
|
|
@@ -82,11 +82,11 @@ globals_1.jest.mock("./utils");
|
|
|
82
82
|
}), "GET");
|
|
83
83
|
});
|
|
84
84
|
(0, globals_1.it)("should thrown an error if Get is called with a name and filters are already specified a name", async () => {
|
|
85
|
-
const kube = (0,
|
|
85
|
+
const kube = (0, _1.K8s)(upstream_1.Pod, { name: "fake" });
|
|
86
86
|
await (0, globals_1.expect)(kube.Get("fakeResource")).rejects.toThrow("Name already specified: fake");
|
|
87
87
|
});
|
|
88
88
|
(0, globals_1.it)("should throw an error if no patch operations provided", async () => {
|
|
89
|
-
const kube = (0,
|
|
89
|
+
const kube = (0, _1.K8s)(upstream_1.Pod);
|
|
90
90
|
await (0, globals_1.expect)(kube.Patch([])).rejects.toThrow("No operations specified");
|
|
91
91
|
});
|
|
92
92
|
});
|
package/dist/fluent/types.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ export type GetFunction<K extends KubernetesObject> = {
|
|
|
21
21
|
(): Promise<KubernetesListObject<K>>;
|
|
22
22
|
(name: string): Promise<K>;
|
|
23
23
|
};
|
|
24
|
-
export type
|
|
24
|
+
export type K8sFilteredActions<K extends KubernetesObject> = {
|
|
25
25
|
/**
|
|
26
26
|
* Get the resource or resources matching the filters.
|
|
27
27
|
* If no filters are specified, all resources will be returned.
|
|
@@ -41,7 +41,7 @@ export type KubeFilteredActions<K extends KubernetesObject> = {
|
|
|
41
41
|
*/
|
|
42
42
|
Watch: (callback: (payload: K, phase: WatchPhase) => void) => Promise<void>;
|
|
43
43
|
};
|
|
44
|
-
export type
|
|
44
|
+
export type K8sUnfilteredActions<K extends KubernetesObject> = {
|
|
45
45
|
/**
|
|
46
46
|
* Perform a server-side apply of the provided K8s resource.
|
|
47
47
|
*
|
|
@@ -66,7 +66,7 @@ export type KubeUnfilteredActions<K extends KubernetesObject> = {
|
|
|
66
66
|
*/
|
|
67
67
|
Patch: (payload: Operation[]) => Promise<K>;
|
|
68
68
|
};
|
|
69
|
-
export type
|
|
69
|
+
export type K8sWithFilters<K extends KubernetesObject> = K8sFilteredActions<K> & {
|
|
70
70
|
/**
|
|
71
71
|
* Filter the query by the given field.
|
|
72
72
|
* Note multiple calls to this method will result in an AND condition. e.g.
|
|
@@ -84,7 +84,7 @@ export type KubeWithFilters<K extends KubernetesObject> = KubeFilteredActions<K>
|
|
|
84
84
|
* @param value The field value
|
|
85
85
|
* @returns
|
|
86
86
|
*/
|
|
87
|
-
WithField: <P extends Paths<K>>(key: P, value?: string) =>
|
|
87
|
+
WithField: <P extends Paths<K>>(key: P, value?: string) => K8sWithFilters<K>;
|
|
88
88
|
/**
|
|
89
89
|
* Filter the query by the given label. If no value is specified, the label simply must exist.
|
|
90
90
|
* Note multiple calls to this method will result in an AND condition. e.g.
|
|
@@ -101,16 +101,16 @@ export type KubeWithFilters<K extends KubernetesObject> = KubeFilteredActions<K>
|
|
|
101
101
|
* @param key The label key
|
|
102
102
|
* @param value (optional) The label value
|
|
103
103
|
*/
|
|
104
|
-
WithLabel: (key: string, value?: string) =>
|
|
104
|
+
WithLabel: (key: string, value?: string) => K8sWithFilters<K>;
|
|
105
105
|
};
|
|
106
|
-
export type
|
|
106
|
+
export type K8sInit<K extends KubernetesObject> = K8sWithFilters<K> & K8sUnfilteredActions<K> & {
|
|
107
107
|
/**
|
|
108
108
|
* Filter the query by the given namespace.
|
|
109
109
|
*
|
|
110
110
|
* @param namespace
|
|
111
111
|
* @returns
|
|
112
112
|
*/
|
|
113
|
-
InNamespace: (namespace: string) =>
|
|
113
|
+
InNamespace: (namespace: string) => K8sWithFilters<K>;
|
|
114
114
|
};
|
|
115
115
|
export type WatchAction<T extends GenericClass, K extends KubernetesObject = InstanceType<T>> = (update: K, phase: WatchPhase) => Promise<void> | void;
|
|
116
116
|
type Join<K, P> = K extends string | number ? P extends string | number ? `${K}${"" extends P ? "" : "."}${P}` : never : never;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fluent/types.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE1D;;GAEG;AACH,oBAAY,UAAU;IACpB,KAAK,UAAU;IACf,QAAQ,aAAa;IACrB,OAAO,YAAY;CACpB;AAED,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AAE3F,MAAM,WAAW,OAAO;IACtB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,gBAAgB,IAAI;IACpD,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fluent/types.ts"],"names":[],"mappings":"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"}
|
package/dist/fluent/utils.d.ts
CHANGED
|
@@ -23,9 +23,9 @@ export declare function pathBuilder<T extends GenericClass>(serverUrl: string, m
|
|
|
23
23
|
* @param method
|
|
24
24
|
* @returns
|
|
25
25
|
*/
|
|
26
|
-
export declare function
|
|
26
|
+
export declare function k8sCfg(method: FetchMethods): Promise<{
|
|
27
27
|
opts: import("node-fetch").RequestInit;
|
|
28
28
|
serverUrl: string;
|
|
29
29
|
}>;
|
|
30
|
-
export declare function
|
|
30
|
+
export declare function k8sExec<T extends GenericClass, K>(model: T, filters: Filters, method: FetchMethods, payload?: K | unknown): Promise<K>;
|
|
31
31
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/fluent/utils.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAG1B,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAIhD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,YAAY,EAChD,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,OAAO,EAChB,WAAW,UAAQ,OAsDpB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/fluent/utils.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAG1B,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAIhD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,YAAY,EAChD,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,OAAO,EAChB,WAAW,UAAQ,OAsDpB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,MAAM,CAAC,MAAM,EAAE,YAAY;;;GAqBhD;AAED,wBAAsB,OAAO,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,EACrD,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,CAAC,GAAG,OAAO,cA8BtB"}
|
package/dist/fluent/utils.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
// SPDX-FileCopyrightText: 2023-Present The Pepr Authors
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.
|
|
5
|
+
exports.k8sExec = exports.k8sCfg = exports.pathBuilder = void 0;
|
|
6
6
|
const client_node_1 = require("@kubernetes/client-node");
|
|
7
7
|
const url_1 = require("url");
|
|
8
8
|
const fetch_1 = require("../fetch");
|
|
@@ -69,7 +69,7 @@ exports.pathBuilder = pathBuilder;
|
|
|
69
69
|
* @param method
|
|
70
70
|
* @returns
|
|
71
71
|
*/
|
|
72
|
-
async function
|
|
72
|
+
async function k8sCfg(method) {
|
|
73
73
|
const kubeConfig = new client_node_1.KubeConfig();
|
|
74
74
|
kubeConfig.loadFromDefault();
|
|
75
75
|
const cluster = kubeConfig.getCurrentCluster();
|
|
@@ -88,9 +88,9 @@ async function kubeCfg(method) {
|
|
|
88
88
|
});
|
|
89
89
|
return { opts, serverUrl: cluster.server };
|
|
90
90
|
}
|
|
91
|
-
exports.
|
|
92
|
-
async function
|
|
93
|
-
const { opts, serverUrl } = await
|
|
91
|
+
exports.k8sCfg = k8sCfg;
|
|
92
|
+
async function k8sExec(model, filters, method, payload) {
|
|
93
|
+
const { opts, serverUrl } = await k8sCfg(method);
|
|
94
94
|
const url = pathBuilder(serverUrl, model, filters, method === "POST");
|
|
95
95
|
switch (opts.method) {
|
|
96
96
|
case "PATCH":
|
|
@@ -113,4 +113,4 @@ async function kubeExec(model, filters, method, payload) {
|
|
|
113
113
|
}
|
|
114
114
|
throw resp;
|
|
115
115
|
}
|
|
116
|
-
exports.
|
|
116
|
+
exports.k8sExec = k8sExec;
|
|
@@ -67,7 +67,7 @@ globals_1.jest.mock("../fetch");
|
|
|
67
67
|
status: 200,
|
|
68
68
|
statusText: "OK",
|
|
69
69
|
});
|
|
70
|
-
const result = await (0, utils_1.
|
|
70
|
+
const result = await (0, utils_1.k8sExec)(upstream_1.Pod, fakeFilters, fakeMethod, fakePayload);
|
|
71
71
|
(0, globals_1.expect)(result).toEqual(fakePayload);
|
|
72
72
|
(0, globals_1.expect)(mockedFetch).toHaveBeenCalledWith(fakeUrl, globals_1.expect.objectContaining(fakeOpts));
|
|
73
73
|
});
|
|
@@ -80,7 +80,7 @@ globals_1.jest.mock("../fetch");
|
|
|
80
80
|
status: fakeStatus,
|
|
81
81
|
statusText: fakeStatusText,
|
|
82
82
|
});
|
|
83
|
-
await (0, globals_1.expect)((0, utils_1.
|
|
83
|
+
await (0, globals_1.expect)((0, utils_1.k8sExec)(upstream_1.Pod, fakeFilters, fakeMethod, fakePayload)).rejects.toEqual(globals_1.expect.objectContaining({
|
|
84
84
|
status: fakeStatus,
|
|
85
85
|
statusText: fakeStatusText,
|
|
86
86
|
}));
|
package/dist/fluent/watch.js
CHANGED
|
@@ -14,7 +14,7 @@ const utils_1 = require("./utils");
|
|
|
14
14
|
*/
|
|
15
15
|
async function ExecWatch(model, filters, callback) {
|
|
16
16
|
// Build the path and query params for the resource, excluding the name
|
|
17
|
-
const { opts, serverUrl } = await (0, utils_1.
|
|
17
|
+
const { opts, serverUrl } = await (0, utils_1.k8sCfg)("GET");
|
|
18
18
|
const url = (0, utils_1.pathBuilder)(serverUrl, model, filters, true);
|
|
19
19
|
// Enable the watch query param
|
|
20
20
|
url.searchParams.set("watch", "true");
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as kind from "./upstream";
|
|
2
|
-
/**
|
|
2
|
+
/** kind is a collection of K8s types to be used within a K8s call: `K8s(kind.Secret).Apply({})`. */
|
|
3
3
|
export { kind };
|
|
4
4
|
export { fetch } from "./fetch";
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
5
|
+
export { K8s } from "./fluent";
|
|
6
|
+
export { RegisterKind, modelToGroupVersionKind } from "./kinds";
|
|
7
7
|
export * from "./types";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AAEnC,
|
|
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,GAAG,EAAE,MAAM,UAAU,CAAC;AAG/B,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEhE,cAAc,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -28,7 +28,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
28
28
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
29
29
|
};
|
|
30
30
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
-
exports.
|
|
31
|
+
exports.modelToGroupVersionKind = exports.RegisterKind = exports.K8s = exports.fetch = exports.kind = void 0;
|
|
32
32
|
// Export kinds as a single object
|
|
33
33
|
const kind = __importStar(require("./upstream"));
|
|
34
34
|
exports.kind = kind;
|
|
@@ -36,10 +36,10 @@ exports.kind = kind;
|
|
|
36
36
|
var fetch_1 = require("./fetch");
|
|
37
37
|
Object.defineProperty(exports, "fetch", { enumerable: true, get: function () { return fetch_1.fetch; } });
|
|
38
38
|
// Export the fluent API entrypoint
|
|
39
|
-
var
|
|
40
|
-
Object.defineProperty(exports, "
|
|
39
|
+
var fluent_1 = require("./fluent");
|
|
40
|
+
Object.defineProperty(exports, "K8s", { enumerable: true, get: function () { return fluent_1.K8s; } });
|
|
41
41
|
// Export helpers for working with K8s types
|
|
42
42
|
var kinds_1 = require("./kinds");
|
|
43
|
-
Object.defineProperty(exports, "modelToGroupVersionKind", { enumerable: true, get: function () { return kinds_1.modelToGroupVersionKind; } });
|
|
44
43
|
Object.defineProperty(exports, "RegisterKind", { enumerable: true, get: function () { return kinds_1.RegisterKind; } });
|
|
44
|
+
Object.defineProperty(exports, "modelToGroupVersionKind", { enumerable: true, get: function () { return kinds_1.modelToGroupVersionKind; } });
|
|
45
45
|
__exportStar(require("./types"), exports);
|
package/package.json
CHANGED
|
@@ -2,15 +2,15 @@ import { beforeEach, describe, expect, it, jest } from "@jest/globals";
|
|
|
2
2
|
import { Operation } from "fast-json-patch";
|
|
3
3
|
|
|
4
4
|
import { Pod } from "../upstream";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { K8s } from ".";
|
|
6
|
+
import { k8sExec } from "./utils";
|
|
7
7
|
|
|
8
8
|
// Setup mocks
|
|
9
9
|
jest.mock("./utils");
|
|
10
10
|
|
|
11
11
|
describe("Kube", () => {
|
|
12
12
|
const fakeResource = { metadata: { name: "fake", namespace: "default" } };
|
|
13
|
-
const mockedKubeExec = jest.mocked(
|
|
13
|
+
const mockedKubeExec = jest.mocked(k8sExec).mockResolvedValue(fakeResource);
|
|
14
14
|
|
|
15
15
|
beforeEach(() => {
|
|
16
16
|
// Clear all instances and calls to constructor and all methods:
|
|
@@ -18,7 +18,7 @@ describe("Kube", () => {
|
|
|
18
18
|
});
|
|
19
19
|
|
|
20
20
|
it("should create a resource", async () => {
|
|
21
|
-
const kube =
|
|
21
|
+
const kube = K8s(Pod);
|
|
22
22
|
const result = await kube.Create(fakeResource);
|
|
23
23
|
|
|
24
24
|
expect(result).toEqual(fakeResource);
|
|
@@ -34,7 +34,7 @@ describe("Kube", () => {
|
|
|
34
34
|
});
|
|
35
35
|
|
|
36
36
|
it("should delete a resource", async () => {
|
|
37
|
-
const kube =
|
|
37
|
+
const kube = K8s(Pod);
|
|
38
38
|
await kube.Delete(fakeResource);
|
|
39
39
|
|
|
40
40
|
expect(mockedKubeExec).toHaveBeenCalledWith(
|
|
@@ -52,7 +52,7 @@ describe("Kube", () => {
|
|
|
52
52
|
{ op: "replace", path: "/metadata/name", value: "new-fake" },
|
|
53
53
|
];
|
|
54
54
|
|
|
55
|
-
const kube =
|
|
55
|
+
const kube = K8s(Pod);
|
|
56
56
|
const result = await kube.Patch(patchOperations);
|
|
57
57
|
|
|
58
58
|
expect(result).toEqual(fakeResource);
|
|
@@ -60,7 +60,7 @@ describe("Kube", () => {
|
|
|
60
60
|
});
|
|
61
61
|
|
|
62
62
|
it("should filter with WithField", async () => {
|
|
63
|
-
const kube =
|
|
63
|
+
const kube = K8s(Pod).WithField("metadata.name", "fake");
|
|
64
64
|
await kube.Get();
|
|
65
65
|
expect(mockedKubeExec).toHaveBeenCalledWith(
|
|
66
66
|
Pod,
|
|
@@ -74,7 +74,7 @@ describe("Kube", () => {
|
|
|
74
74
|
});
|
|
75
75
|
|
|
76
76
|
it("should filter with WithLabel", async () => {
|
|
77
|
-
const kube =
|
|
77
|
+
const kube = K8s(Pod).WithLabel("app", "fakeApp");
|
|
78
78
|
await kube.Get();
|
|
79
79
|
expect(mockedKubeExec).toHaveBeenCalledWith(
|
|
80
80
|
Pod,
|
|
@@ -88,7 +88,7 @@ describe("Kube", () => {
|
|
|
88
88
|
});
|
|
89
89
|
|
|
90
90
|
it("should use InNamespace", async () => {
|
|
91
|
-
const kube =
|
|
91
|
+
const kube = K8s(Pod).InNamespace("fakeNamespace");
|
|
92
92
|
await kube.Get();
|
|
93
93
|
expect(mockedKubeExec).toHaveBeenCalledWith(
|
|
94
94
|
Pod,
|
|
@@ -100,18 +100,18 @@ describe("Kube", () => {
|
|
|
100
100
|
});
|
|
101
101
|
|
|
102
102
|
it("should throw an error if namespace is already specified", async () => {
|
|
103
|
-
const kube =
|
|
103
|
+
const kube = K8s(Pod, { namespace: "default" });
|
|
104
104
|
expect(() => kube.InNamespace("fakeNamespace")).toThrow("Namespace already specified: default");
|
|
105
105
|
});
|
|
106
106
|
|
|
107
107
|
it("should handle Delete when the resource doesn't exist", async () => {
|
|
108
108
|
mockedKubeExec.mockRejectedValueOnce({ status: 404 }); // Not Found on first call
|
|
109
|
-
const kube =
|
|
109
|
+
const kube = K8s(Pod);
|
|
110
110
|
await expect(kube.Delete("fakeResource")).resolves.toBeUndefined();
|
|
111
111
|
});
|
|
112
112
|
|
|
113
113
|
it("should handle Get", async () => {
|
|
114
|
-
const kube =
|
|
114
|
+
const kube = K8s(Pod);
|
|
115
115
|
const result = await kube.Get("fakeResource");
|
|
116
116
|
|
|
117
117
|
expect(result).toEqual(fakeResource);
|
|
@@ -125,12 +125,12 @@ describe("Kube", () => {
|
|
|
125
125
|
});
|
|
126
126
|
|
|
127
127
|
it("should thrown an error if Get is called with a name and filters are already specified a name", async () => {
|
|
128
|
-
const kube =
|
|
128
|
+
const kube = K8s(Pod, { name: "fake" });
|
|
129
129
|
await expect(kube.Get("fakeResource")).rejects.toThrow("Name already specified: fake");
|
|
130
130
|
});
|
|
131
131
|
|
|
132
132
|
it("should throw an error if no patch operations provided", async () => {
|
|
133
|
-
const kube =
|
|
133
|
+
const kube = K8s(Pod);
|
|
134
134
|
await expect(kube.Patch([])).rejects.toThrow("No operations specified");
|
|
135
135
|
});
|
|
136
136
|
});
|
|
@@ -7,8 +7,8 @@ import { StatusCodes } from "http-status-codes";
|
|
|
7
7
|
|
|
8
8
|
import { modelToGroupVersionKind } from "../kinds";
|
|
9
9
|
import { GenericClass } from "../types";
|
|
10
|
-
import { Filters,
|
|
11
|
-
import {
|
|
10
|
+
import { Filters, K8sInit, Paths, WatchAction } from "./types";
|
|
11
|
+
import { k8sExec } from "./utils";
|
|
12
12
|
import { ExecWatch } from "./watch";
|
|
13
13
|
|
|
14
14
|
/**
|
|
@@ -17,10 +17,10 @@ import { ExecWatch } from "./watch";
|
|
|
17
17
|
* @param model - the model to use for the API
|
|
18
18
|
* @param filters - (optional) filter overrides, can also be chained
|
|
19
19
|
*/
|
|
20
|
-
export function
|
|
20
|
+
export function K8s<T extends GenericClass, K extends KubernetesObject = InstanceType<T>>(
|
|
21
21
|
model: T,
|
|
22
22
|
filters: Filters = {},
|
|
23
|
-
):
|
|
23
|
+
): K8sInit<K> {
|
|
24
24
|
const withFilters = { WithField, WithLabel, Get, Delete, Watch };
|
|
25
25
|
const matchedKind = filters.kindOverride || modelToGroupVersionKind(model.name);
|
|
26
26
|
|
|
@@ -76,7 +76,7 @@ export function Kube<T extends GenericClass, K extends KubernetesObject = Instan
|
|
|
76
76
|
filters.name = name;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
return
|
|
79
|
+
return k8sExec<T, K | KubernetesListObject<K>>(model, filters, "GET");
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
async function Delete(filter?: K | string): Promise<void> {
|
|
@@ -88,7 +88,7 @@ export function Kube<T extends GenericClass, K extends KubernetesObject = Instan
|
|
|
88
88
|
|
|
89
89
|
try {
|
|
90
90
|
// Try to delete the resource
|
|
91
|
-
await
|
|
91
|
+
await k8sExec<T, void>(model, filters, "DELETE");
|
|
92
92
|
} catch (e) {
|
|
93
93
|
// If the resource doesn't exist, ignore the error
|
|
94
94
|
if (e.status === StatusCodes.NOT_FOUND) {
|
|
@@ -101,12 +101,12 @@ export function Kube<T extends GenericClass, K extends KubernetesObject = Instan
|
|
|
101
101
|
|
|
102
102
|
async function Apply(resource: K): Promise<K> {
|
|
103
103
|
syncFilters(resource);
|
|
104
|
-
return
|
|
104
|
+
return k8sExec(model, filters, "APPLY", resource);
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
async function Create(resource: K): Promise<K> {
|
|
108
108
|
syncFilters(resource);
|
|
109
|
-
return
|
|
109
|
+
return k8sExec(model, filters, "POST", resource);
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
async function Patch(payload: Operation[]): Promise<K> {
|
|
@@ -115,7 +115,7 @@ export function Kube<T extends GenericClass, K extends KubernetesObject = Instan
|
|
|
115
115
|
throw new Error("No operations specified");
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
return
|
|
118
|
+
return k8sExec<T, K>(model, filters, "PATCH", payload);
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
async function Watch(callback: WatchAction<T>): Promise<void> {
|
package/src/fluent/types.ts
CHANGED
|
@@ -31,7 +31,7 @@ export type GetFunction<K extends KubernetesObject> = {
|
|
|
31
31
|
(name: string): Promise<K>;
|
|
32
32
|
};
|
|
33
33
|
|
|
34
|
-
export type
|
|
34
|
+
export type K8sFilteredActions<K extends KubernetesObject> = {
|
|
35
35
|
/**
|
|
36
36
|
* Get the resource or resources matching the filters.
|
|
37
37
|
* If no filters are specified, all resources will be returned.
|
|
@@ -54,7 +54,7 @@ export type KubeFilteredActions<K extends KubernetesObject> = {
|
|
|
54
54
|
Watch: (callback: (payload: K, phase: WatchPhase) => void) => Promise<void>;
|
|
55
55
|
};
|
|
56
56
|
|
|
57
|
-
export type
|
|
57
|
+
export type K8sUnfilteredActions<K extends KubernetesObject> = {
|
|
58
58
|
/**
|
|
59
59
|
* Perform a server-side apply of the provided K8s resource.
|
|
60
60
|
*
|
|
@@ -82,7 +82,7 @@ export type KubeUnfilteredActions<K extends KubernetesObject> = {
|
|
|
82
82
|
Patch: (payload: Operation[]) => Promise<K>;
|
|
83
83
|
};
|
|
84
84
|
|
|
85
|
-
export type
|
|
85
|
+
export type K8sWithFilters<K extends KubernetesObject> = K8sFilteredActions<K> & {
|
|
86
86
|
/**
|
|
87
87
|
* Filter the query by the given field.
|
|
88
88
|
* Note multiple calls to this method will result in an AND condition. e.g.
|
|
@@ -100,7 +100,7 @@ export type KubeWithFilters<K extends KubernetesObject> = KubeFilteredActions<K>
|
|
|
100
100
|
* @param value The field value
|
|
101
101
|
* @returns
|
|
102
102
|
*/
|
|
103
|
-
WithField: <P extends Paths<K>>(key: P, value?: string) =>
|
|
103
|
+
WithField: <P extends Paths<K>>(key: P, value?: string) => K8sWithFilters<K>;
|
|
104
104
|
|
|
105
105
|
/**
|
|
106
106
|
* Filter the query by the given label. If no value is specified, the label simply must exist.
|
|
@@ -118,18 +118,18 @@ export type KubeWithFilters<K extends KubernetesObject> = KubeFilteredActions<K>
|
|
|
118
118
|
* @param key The label key
|
|
119
119
|
* @param value (optional) The label value
|
|
120
120
|
*/
|
|
121
|
-
WithLabel: (key: string, value?: string) =>
|
|
121
|
+
WithLabel: (key: string, value?: string) => K8sWithFilters<K>;
|
|
122
122
|
};
|
|
123
123
|
|
|
124
|
-
export type
|
|
125
|
-
|
|
124
|
+
export type K8sInit<K extends KubernetesObject> = K8sWithFilters<K> &
|
|
125
|
+
K8sUnfilteredActions<K> & {
|
|
126
126
|
/**
|
|
127
127
|
* Filter the query by the given namespace.
|
|
128
128
|
*
|
|
129
129
|
* @param namespace
|
|
130
130
|
* @returns
|
|
131
131
|
*/
|
|
132
|
-
InNamespace: (namespace: string) =>
|
|
132
|
+
InNamespace: (namespace: string) => K8sWithFilters<K>;
|
|
133
133
|
};
|
|
134
134
|
|
|
135
135
|
export type WatchAction<T extends GenericClass, K extends KubernetesObject = InstanceType<T>> = (
|
package/src/fluent/utils.test.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { fetch } from "../fetch";
|
|
|
7
7
|
import { GenericClass } from "../types";
|
|
8
8
|
import { ClusterRole, Ingress, Pod } from "../upstream";
|
|
9
9
|
import { Filters } from "./types";
|
|
10
|
-
import {
|
|
10
|
+
import { k8sExec, pathBuilder } from "./utils";
|
|
11
11
|
|
|
12
12
|
jest.mock("https");
|
|
13
13
|
jest.mock("../fetch");
|
|
@@ -83,7 +83,7 @@ describe("kubeExec Function", () => {
|
|
|
83
83
|
statusText: "OK",
|
|
84
84
|
});
|
|
85
85
|
|
|
86
|
-
const result = await
|
|
86
|
+
const result = await k8sExec(Pod, fakeFilters, fakeMethod, fakePayload);
|
|
87
87
|
|
|
88
88
|
expect(result).toEqual(fakePayload);
|
|
89
89
|
expect(mockedFetch).toHaveBeenCalledWith(fakeUrl, expect.objectContaining(fakeOpts));
|
|
@@ -100,7 +100,7 @@ describe("kubeExec Function", () => {
|
|
|
100
100
|
statusText: fakeStatusText,
|
|
101
101
|
});
|
|
102
102
|
|
|
103
|
-
await expect(
|
|
103
|
+
await expect(k8sExec(Pod, fakeFilters, fakeMethod, fakePayload)).rejects.toEqual(
|
|
104
104
|
expect.objectContaining({
|
|
105
105
|
status: fakeStatus,
|
|
106
106
|
statusText: fakeStatusText,
|
package/src/fluent/utils.ts
CHANGED
|
@@ -92,7 +92,7 @@ export function pathBuilder<T extends GenericClass>(
|
|
|
92
92
|
* @param method
|
|
93
93
|
* @returns
|
|
94
94
|
*/
|
|
95
|
-
export async function
|
|
95
|
+
export async function k8sCfg(method: FetchMethods) {
|
|
96
96
|
const kubeConfig = new KubeConfig();
|
|
97
97
|
kubeConfig.loadFromDefault();
|
|
98
98
|
|
|
@@ -115,13 +115,13 @@ export async function kubeCfg(method: FetchMethods) {
|
|
|
115
115
|
return { opts, serverUrl: cluster.server };
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
export async function
|
|
118
|
+
export async function k8sExec<T extends GenericClass, K>(
|
|
119
119
|
model: T,
|
|
120
120
|
filters: Filters,
|
|
121
121
|
method: FetchMethods,
|
|
122
122
|
payload?: K | unknown,
|
|
123
123
|
) {
|
|
124
|
-
const { opts, serverUrl } = await
|
|
124
|
+
const { opts, serverUrl } = await k8sCfg(method);
|
|
125
125
|
const url = pathBuilder(serverUrl, model, filters, method === "POST");
|
|
126
126
|
|
|
127
127
|
switch (opts.method) {
|
package/src/fluent/watch.ts
CHANGED
|
@@ -6,7 +6,7 @@ import readline from "readline";
|
|
|
6
6
|
import fetch from "node-fetch";
|
|
7
7
|
import { GenericClass } from "../types";
|
|
8
8
|
import { Filters, WatchAction, WatchPhase } from "./types";
|
|
9
|
-
import {
|
|
9
|
+
import { k8sCfg, pathBuilder } from "./utils";
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Execute a watch on the specified resource.
|
|
@@ -17,7 +17,7 @@ export async function ExecWatch<T extends GenericClass>(
|
|
|
17
17
|
callback: WatchAction<T>,
|
|
18
18
|
) {
|
|
19
19
|
// Build the path and query params for the resource, excluding the name
|
|
20
|
-
const { opts, serverUrl } = await
|
|
20
|
+
const { opts, serverUrl } = await k8sCfg("GET");
|
|
21
21
|
const url = pathBuilder(serverUrl, model, filters, true);
|
|
22
22
|
|
|
23
23
|
// Enable the watch query param
|
package/src/index.ts
CHANGED
|
@@ -4,16 +4,16 @@
|
|
|
4
4
|
// Export kinds as a single object
|
|
5
5
|
import * as kind from "./upstream";
|
|
6
6
|
|
|
7
|
-
/**
|
|
7
|
+
/** kind is a collection of K8s types to be used within a K8s call: `K8s(kind.Secret).Apply({})`. */
|
|
8
8
|
export { kind };
|
|
9
9
|
|
|
10
10
|
// Export the node-fetch wrapper
|
|
11
11
|
export { fetch } from "./fetch";
|
|
12
12
|
|
|
13
13
|
// Export the fluent API entrypoint
|
|
14
|
-
export {
|
|
14
|
+
export { K8s } from "./fluent";
|
|
15
15
|
|
|
16
16
|
// Export helpers for working with K8s types
|
|
17
|
-
export {
|
|
17
|
+
export { RegisterKind, modelToGroupVersionKind } from "./kinds";
|
|
18
18
|
|
|
19
19
|
export * from "./types";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kube.d.ts","sourceRoot":"","sources":["../../src/fluent/kube.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwB,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKjF,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAsB,MAAM,SAAS,CAAC;AAIhE;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,gBAAgB,GAAG,YAAY,CAAC,CAAC,CAAC,EACvF,KAAK,EAAE,CAAC,EACR,OAAO,GAAE,OAAY,GACpB,QAAQ,CAAC,CAAC,CAAC,CAuGb"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kube.test.d.ts","sourceRoot":"","sources":["../../src/fluent/kube.test.ts"],"names":[],"mappings":""}
|