From c0dddc0f40850e328f0115d398993feb8cf78782 Mon Sep 17 00:00:00 2001 From: Jim Ehrismann <40840436+jim-docker@users.noreply.github.com> Date: Tue, 11 May 2021 23:56:31 -0400 Subject: [PATCH] relax kube api data type validation (to allow metrics-server resources) (#2744) * relax kube api data type validation (to allow metrics-server resources) Signed-off-by: Jim Ehrismann * removed a few now incorrect tests Signed-off-by: Jim Ehrismann * correct PodMetrics kind Signed-off-by: Jim Ehrismann --- .../api/__tests__/kube-object.test.ts | 14 ------------- src/renderer/api/endpoints/pod-metrics.api.ts | 2 +- src/renderer/api/kube-object.ts | 20 +++++++++++++++++-- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/renderer/api/__tests__/kube-object.test.ts b/src/renderer/api/__tests__/kube-object.test.ts index b3f84ea1ae..11ca8b8717 100644 --- a/src/renderer/api/__tests__/kube-object.test.ts +++ b/src/renderer/api/__tests__/kube-object.test.ts @@ -107,19 +107,6 @@ describe("KubeObject", () => { }); } - { - type TestCase = [string, any]; - const tests: TestCase[] = [ - ["metadata.uid", { kind: "", apiVersion: "", metadata: { name: "", resourceVersion: "", selfLink: ""} }], - ["metadata.name", { kind: "", apiVersion: "", metadata: { uid: "", resourceVersion: "", selfLink: "" } }], - ["metadata.resourceVersion", { kind: "", apiVersion: "", metadata: { uid: "", name: "", selfLink: "" } }], - ]; - - it.each(tests)("should reject with missing non-top level field: %s", (missingField, input) => { - expect(KubeObject.isPartialJsonApiData(input)).toBe(false); - }); - } - { type TestCase = [string, any]; const tests: TestCase[] = [ @@ -192,7 +179,6 @@ describe("KubeObject", () => { ["kind", { apiVersion: "", items: [], metadata: { resourceVersion: "", selfLink: "" } }], ["apiVersion", { kind: "", items: [], metadata: { resourceVersion: "", selfLink: "" } }], ["metadata", { kind: "", items: [], apiVersion: "" }], - ["metadata.resourceVersion", { kind: "", items: [], apiVersion: "", metadata: { selfLink: "" } }], ]; it.each(tests)("should reject with missing: %s", (missingField, input) => { diff --git a/src/renderer/api/endpoints/pod-metrics.api.ts b/src/renderer/api/endpoints/pod-metrics.api.ts index acf6e7b20f..abb391b0d1 100644 --- a/src/renderer/api/endpoints/pod-metrics.api.ts +++ b/src/renderer/api/endpoints/pod-metrics.api.ts @@ -2,7 +2,7 @@ import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; export class PodMetrics extends KubeObject { - static kind = "Pod"; + static kind = "PodMetrics"; static namespaced = true; static apiBase = "/apis/metrics.k8s.io/v1beta1/pods"; diff --git a/src/renderer/api/kube-object.ts b/src/renderer/api/kube-object.ts index 8699a3c94f..c7869533bc 100644 --- a/src/renderer/api/kube-object.ts +++ b/src/renderer/api/kube-object.ts @@ -91,7 +91,7 @@ export class KubeObject implements ItemObject { static isKubeJsonApiListMetadata(object: unknown): object is KubeJsonApiListMetadata { return ( isObject(object) - && hasTypedProperty(object, "resourceVersion", isString) + && hasOptionalProperty(object, "resourceVersion", isString) && hasOptionalProperty(object, "selfLink", isString) ); } @@ -112,12 +112,28 @@ export class KubeObject implements ItemObject { ); } + static isPartialJsonApiMetadata(object: unknown): object is Partial { + return ( + isObject(object) + && hasOptionalProperty(object, "uid", isString) + && hasOptionalProperty(object, "name", isString) + && hasOptionalProperty(object, "resourceVersion", isString) + && hasOptionalProperty(object, "selfLink", isString) + && hasOptionalProperty(object, "namespace", isString) + && hasOptionalProperty(object, "creationTimestamp", isString) + && hasOptionalProperty(object, "continue", isString) + && hasOptionalProperty(object, "finalizers", bindPredicate(isTypedArray, isString)) + && hasOptionalProperty(object, "labels", bindPredicate(isRecord, isString, isString)) + && hasOptionalProperty(object, "annotations", bindPredicate(isRecord, isString, isString)) + ); + } + static isPartialJsonApiData(object: unknown): object is Partial { return ( isObject(object) && hasOptionalProperty(object, "kind", isString) && hasOptionalProperty(object, "apiVersion", isString) - && hasOptionalProperty(object, "metadata", KubeObject.isKubeJsonApiMetadata) + && hasOptionalProperty(object, "metadata", KubeObject.isPartialJsonApiMetadata) ); }