kubernetes-fluent-client 1.6.1 → 1.8.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.
@@ -41,7 +41,7 @@ function K8s(model, filters = {}) {
41
41
  * @inheritdoc
42
42
  * @see {@link K8sInit.WithLabel}
43
43
  */
44
- function WithLabel(key, value) {
44
+ function WithLabel(key, value = "") {
45
45
  filters.labels = filters.labels || {};
46
46
  filters.labels[key] = value;
47
47
  return withFilters;
@@ -109,16 +109,17 @@ export type K8sWithFilters<K extends KubernetesObject> = K8sFilteredActions<K> &
109
109
  * K8s(kind.Deployment)
110
110
  * .WithLabel("foo", "bar")
111
111
  * .WithLabel("baz", "qux")
112
+ * .WithLabel("quux")
112
113
  * .Delete(...)
113
114
  * ```
114
115
  *
115
- * Will only delete the Deployment if it has the`foo=bar` and `baz=qux` labels.
116
+ * Will only delete the Deployment if it has the`foo=bar` and `baz=qux` labels and the `quux` label exists.
116
117
  *
117
118
  * @param key - the label key
118
119
  * @param value - the label value
119
120
  * @returns the fluent API
120
121
  */
121
- WithLabel: (key: string, value: string) => K8sWithFilters<K>;
122
+ WithLabel: (key: string, value?: string) => K8sWithFilters<K>;
122
123
  };
123
124
  export type K8sInit<K extends KubernetesObject> = K8sWithFilters<K> & K8sUnfilteredActions<K> & {
124
125
  /**
@@ -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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"}
@@ -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;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAInC;;;;;;;;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;;;GAwBhD;AAED;;;;;;;;;;GAUG;AACH,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,EACrB,QAAQ,GAAE,QAA2B,cA8BtC"}
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;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAInC;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,YAAY,EAChD,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,OAAO,EAChB,WAAW,UAAQ,OAwDpB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,MAAM,CAAC,MAAM,EAAE,YAAY;;;GAwBhD;AAED;;;;;;;;;;GAUG;AACH,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,EACrB,QAAQ,GAAE,QAA2B,cA8BtC"}
@@ -51,7 +51,9 @@ function pathBuilder(serverUrl, model, filters, excludeName = false) {
51
51
  // Add label selectors to the query params
52
52
  if (filters.labels) {
53
53
  const labelSelector = Object.entries(filters.labels)
54
- .map(([key, value]) => `${key}=${value}`)
54
+ // Exists set-based operators only include the key
55
+ // See https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#set-based-requirement
56
+ .map(([key, value]) => (value ? `${key}=${value}` : key))
55
57
  .join(",");
56
58
  url.searchParams.set("labelSelector", labelSelector);
57
59
  }
@@ -16,6 +16,16 @@ globals_1.jest.mock("../fetch");
16
16
  const filters = {};
17
17
  (0, globals_1.expect)(() => (0, utils_1.pathBuilder)("", model, filters)).toThrow("Kind not specified for Unknown");
18
18
  });
19
+ (0, globals_1.it)("should generate a path with a set-based label selector", () => {
20
+ const filters = {
21
+ namespace: "default",
22
+ name: "mypod",
23
+ labels: { iamalabel: "" },
24
+ };
25
+ const result = (0, utils_1.pathBuilder)(serverUrl, upstream_1.Pod, filters);
26
+ const expected = new URL("/api/v1/namespaces/default/pods/mypod?labelSelector=iamalabel", serverUrl);
27
+ (0, globals_1.expect)(result.toString()).toEqual(expected.toString());
28
+ });
19
29
  (0, globals_1.it)("should generate a path for core group kinds (with custom filters)", () => {
20
30
  const filters = {
21
31
  namespace: "default",
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Get an environment variable (Node, Deno or Bun), or throw an error if it's not set.
3
+ *
4
+ * @example
5
+ * const value = fromEnv("MY_ENV_VAR");
6
+ * console.log(value);
7
+ * // => "my-value"
8
+ *
9
+ * @example
10
+ * const value = fromEnv("MY_MISSING_ENV_VAR");
11
+ * // => Error: Environment variable MY_MISSING_ENV_VAR is not set
12
+ *
13
+ * @param name The name of the environment variable to get.
14
+ * @returns The value of the environment variable.
15
+ * @throws An error if the environment variable is not set.
16
+ */
17
+ export declare function fromEnv(name: string): string;
18
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // SPDX-FileCopyrightText: 2023-Present The Kubernetes Fluent Client Authors
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.fromEnv = void 0;
6
+ /**
7
+ * Get an environment variable (Node, Deno or Bun), or throw an error if it's not set.
8
+ *
9
+ * @example
10
+ * const value = fromEnv("MY_ENV_VAR");
11
+ * console.log(value);
12
+ * // => "my-value"
13
+ *
14
+ * @example
15
+ * const value = fromEnv("MY_MISSING_ENV_VAR");
16
+ * // => Error: Environment variable MY_MISSING_ENV_VAR is not set
17
+ *
18
+ * @param name The name of the environment variable to get.
19
+ * @returns The value of the environment variable.
20
+ * @throws An error if the environment variable is not set.
21
+ */
22
+ function fromEnv(name) {
23
+ let envValue;
24
+ // Check for Node.js or Bun
25
+ if (typeof process !== "undefined" && typeof process.env !== "undefined") {
26
+ envValue = process.env[name];
27
+ }
28
+ // Check for Deno
29
+ else if (typeof Deno !== "undefined") {
30
+ envValue = Deno.env.get(name);
31
+ }
32
+ // Otherwise, throw an error
33
+ else {
34
+ throw new Error("Unknown runtime environment");
35
+ }
36
+ if (typeof envValue === "undefined") {
37
+ throw new Error(`Environment variable ${name} is not set`);
38
+ }
39
+ return envValue;
40
+ }
41
+ exports.fromEnv = fromEnv;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=helpers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.test.d.ts","sourceRoot":"","sources":["../src/helpers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // SPDX-FileCopyrightText: 2023-Present The Kubernetes Fluent Client Authors
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ const globals_1 = require("@jest/globals");
6
+ const helpers_1 = require("./helpers");
7
+ (0, globals_1.describe)("helpers", () => {
8
+ (0, globals_1.test)("fromEnv for NodeJS", () => {
9
+ (0, globals_1.expect)(() => {
10
+ (0, helpers_1.fromEnv)("MY_MISSING_ENV_VAR");
11
+ }).toThrowError("Environment variable MY_MISSING_ENV_VAR is not set");
12
+ process.env.MY_ENV_VAR = "my-value";
13
+ (0, globals_1.expect)((0, helpers_1.fromEnv)("MY_ENV_VAR")).toEqual("my-value");
14
+ delete process.env.MY_ENV_VAR;
15
+ });
16
+ });
package/dist/index.d.ts CHANGED
@@ -8,4 +8,5 @@ export { RegisterKind, modelToGroupVersionKind } from "./kinds";
8
8
  export { GenericKind } from "./types";
9
9
  export * from "./types";
10
10
  export * as K8sClientNode from "@kubernetes/client-node";
11
+ export { fromEnv } from "./helpers";
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -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"}
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"}
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.K8sClientNode = exports.GenericKind = exports.modelToGroupVersionKind = exports.RegisterKind = exports.K8s = exports.fetchStatus = exports.fetch = exports.kind = void 0;
31
+ exports.fromEnv = exports.K8sClientNode = exports.GenericKind = exports.modelToGroupVersionKind = exports.RegisterKind = exports.K8s = exports.fetchStatus = 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;
@@ -50,3 +50,5 @@ var types_1 = require("./types");
50
50
  Object.defineProperty(exports, "GenericKind", { enumerable: true, get: function () { return types_1.GenericKind; } });
51
51
  __exportStar(require("./types"), exports);
52
52
  exports.K8sClientNode = __importStar(require("@kubernetes/client-node"));
53
+ var helpers_1 = require("./helpers");
54
+ Object.defineProperty(exports, "fromEnv", { enumerable: true, get: function () { return helpers_1.fromEnv; } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kubernetes-fluent-client",
3
- "version": "1.6.1",
3
+ "version": "1.8.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",
@@ -41,21 +41,21 @@
41
41
  "http-status-codes": "2.3.0",
42
42
  "node-fetch": "2.7.0",
43
43
  "quicktype-core": "23.0.76",
44
- "type-fest": "4.4.0",
44
+ "type-fest": "4.5.0",
45
45
  "yargs": "17.7.2"
46
46
  },
47
47
  "devDependencies": {
48
- "@commitlint/cli": "17.7.2",
49
- "@commitlint/config-conventional": "17.7.0",
48
+ "@commitlint/cli": "18.0.0",
49
+ "@commitlint/config-conventional": "18.0.0",
50
50
  "@jest/globals": "29.7.0",
51
- "@types/byline": "4.2.34",
52
- "@types/readable-stream": "4.0.3",
53
- "@types/yargs": "17.0.28",
54
- "@typescript-eslint/eslint-plugin": "6.7.5",
55
- "@typescript-eslint/parser": "6.7.5",
51
+ "@types/byline": "4.2.35",
52
+ "@types/readable-stream": "4.0.4",
53
+ "@types/yargs": "17.0.29",
54
+ "@typescript-eslint/eslint-plugin": "6.9.0",
55
+ "@typescript-eslint/parser": "6.9.0",
56
56
  "eslint-plugin-jsdoc": "46.8.2",
57
57
  "jest": "29.7.0",
58
- "nock": "13.3.4",
58
+ "nock": "13.3.6",
59
59
  "prettier": "3.0.3",
60
60
  "semantic-release": "22.0.5",
61
61
  "ts-jest": "29.1.1",
@@ -54,7 +54,7 @@ export function K8s<T extends GenericClass, K extends KubernetesObject = Instanc
54
54
  * @inheritdoc
55
55
  * @see {@link K8sInit.WithLabel}
56
56
  */
57
- function WithLabel(key: string, value: string) {
57
+ function WithLabel(key: string, value = "") {
58
58
  filters.labels = filters.labels || {};
59
59
  filters.labels[key] = value;
60
60
  return withFilters;
@@ -128,16 +128,17 @@ export type K8sWithFilters<K extends KubernetesObject> = K8sFilteredActions<K> &
128
128
  * K8s(kind.Deployment)
129
129
  * .WithLabel("foo", "bar")
130
130
  * .WithLabel("baz", "qux")
131
+ * .WithLabel("quux")
131
132
  * .Delete(...)
132
133
  * ```
133
134
  *
134
- * Will only delete the Deployment if it has the`foo=bar` and `baz=qux` labels.
135
+ * Will only delete the Deployment if it has the`foo=bar` and `baz=qux` labels and the `quux` label exists.
135
136
  *
136
137
  * @param key - the label key
137
138
  * @param value - the label value
138
139
  * @returns the fluent API
139
140
  */
140
- WithLabel: (key: string, value: string) => K8sWithFilters<K>;
141
+ WithLabel: (key: string, value?: string) => K8sWithFilters<K>;
141
142
  };
142
143
 
143
144
  export type K8sInit<K extends KubernetesObject> = K8sWithFilters<K> &
@@ -21,6 +21,21 @@ describe("pathBuilder Function", () => {
21
21
  expect(() => pathBuilder("", model, filters)).toThrow("Kind not specified for Unknown");
22
22
  });
23
23
 
24
+ it("should generate a path with a set-based label selector", () => {
25
+ const filters: Filters = {
26
+ namespace: "default",
27
+ name: "mypod",
28
+ labels: { iamalabel: "" },
29
+ };
30
+ const result = pathBuilder(serverUrl, Pod, filters);
31
+ const expected = new URL(
32
+ "/api/v1/namespaces/default/pods/mypod?labelSelector=iamalabel",
33
+ serverUrl,
34
+ );
35
+
36
+ expect(result.toString()).toEqual(expected.toString());
37
+ });
38
+
24
39
  it("should generate a path for core group kinds (with custom filters)", () => {
25
40
  const filters: Filters = {
26
41
  namespace: "default",
@@ -73,7 +73,9 @@ export function pathBuilder<T extends GenericClass>(
73
73
  // Add label selectors to the query params
74
74
  if (filters.labels) {
75
75
  const labelSelector = Object.entries(filters.labels)
76
- .map(([key, value]) => `${key}=${value}`)
76
+ // Exists set-based operators only include the key
77
+ // See https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#set-based-requirement
78
+ .map(([key, value]) => (value ? `${key}=${value}` : key))
77
79
  .join(",");
78
80
 
79
81
  url.searchParams.set("labelSelector", labelSelector);
@@ -0,0 +1,18 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // SPDX-FileCopyrightText: 2023-Present The Kubernetes Fluent Client Authors
3
+
4
+ import { describe, expect, test } from "@jest/globals";
5
+
6
+ import { fromEnv } from "./helpers";
7
+
8
+ describe("helpers", () => {
9
+ test("fromEnv for NodeJS", () => {
10
+ expect(() => {
11
+ fromEnv("MY_MISSING_ENV_VAR");
12
+ }).toThrowError("Environment variable MY_MISSING_ENV_VAR is not set");
13
+
14
+ process.env.MY_ENV_VAR = "my-value";
15
+ expect(fromEnv("MY_ENV_VAR")).toEqual("my-value");
16
+ delete process.env.MY_ENV_VAR;
17
+ });
18
+ });
package/src/helpers.ts ADDED
@@ -0,0 +1,47 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // SPDX-FileCopyrightText: 2023-Present The Kubernetes Fluent Client Authors
3
+
4
+ declare const Deno: {
5
+ env: {
6
+ get(name: string): string | undefined;
7
+ };
8
+ };
9
+
10
+ /**
11
+ * Get an environment variable (Node, Deno or Bun), or throw an error if it's not set.
12
+ *
13
+ * @example
14
+ * const value = fromEnv("MY_ENV_VAR");
15
+ * console.log(value);
16
+ * // => "my-value"
17
+ *
18
+ * @example
19
+ * const value = fromEnv("MY_MISSING_ENV_VAR");
20
+ * // => Error: Environment variable MY_MISSING_ENV_VAR is not set
21
+ *
22
+ * @param name The name of the environment variable to get.
23
+ * @returns The value of the environment variable.
24
+ * @throws An error if the environment variable is not set.
25
+ */
26
+ export function fromEnv(name: string): string {
27
+ let envValue: string | undefined;
28
+
29
+ // Check for Node.js or Bun
30
+ if (typeof process !== "undefined" && typeof process.env !== "undefined") {
31
+ envValue = process.env[name];
32
+ }
33
+ // Check for Deno
34
+ else if (typeof Deno !== "undefined") {
35
+ envValue = Deno.env.get(name);
36
+ }
37
+ // Otherwise, throw an error
38
+ else {
39
+ throw new Error("Unknown runtime environment");
40
+ }
41
+
42
+ if (typeof envValue === "undefined") {
43
+ throw new Error(`Environment variable ${name} is not set`);
44
+ }
45
+
46
+ return envValue;
47
+ }
package/src/index.ts CHANGED
@@ -25,3 +25,5 @@ export { GenericKind } from "./types";
25
25
  export * from "./types";
26
26
 
27
27
  export * as K8sClientNode from "@kubernetes/client-node";
28
+
29
+ export { fromEnv } from "./helpers";