From bf6af58d80552a16be7a547f772902b138a12fbd Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Thu, 20 Apr 2023 15:49:38 -0400 Subject: [PATCH] fix: Add checks to KubeObject constructor to ensure shape Signed-off-by: Sebastian Malton --- .../core/src/common/k8s-api/kube-object.ts | 20 +++++++++++-- .../__tests__/network-policy-details.test.tsx | 28 ++++++++++++++++--- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/packages/core/src/common/k8s-api/kube-object.ts b/packages/core/src/common/k8s-api/kube-object.ts index c1378f5172..9549cd5917 100644 --- a/packages/core/src/common/k8s-api/kube-object.ts +++ b/packages/core/src/common/k8s-api/kube-object.ts @@ -548,14 +548,30 @@ export class KubeObject< } constructor(data: KubeJsonApiData) { - if (typeof data !== "object") { + if (!isObject(data)) { throw new TypeError(`Cannot create a KubeObject from ${typeof data}`); } - if (!data.metadata || typeof data.metadata !== "object") { + if (!isObject(data.metadata)) { throw new KubeCreationError(`Cannot create a KubeObject from an object without metadata`, data); } + if (!isString(data.metadata.name)) { + throw new KubeCreationError(`Cannot create a KubeObject from an object without metadata.name being a string`, data); + } + + if (!isString(data.metadata.uid)) { + throw new KubeCreationError(`Cannot create a KubeObject from an object without metadata.uid being a string`, data); + } + + if (!isString(data.metadata.resourceVersion)) { + throw new KubeCreationError(`Cannot create a KubeObject from an object without metadata.resourceVersion being a string`, data); + } + + if (!isString(data.metadata.selfLink)) { + throw new KubeCreationError(`Cannot create a KubeObject from an object without metadata.selfLink being a string`, data); + } + Object.assign(this, data); autoBind(this); } diff --git a/packages/core/src/renderer/components/+network-policies/__tests__/network-policy-details.test.tsx b/packages/core/src/renderer/components/+network-policies/__tests__/network-policy-details.test.tsx index b99f41808a..c849a604ac 100644 --- a/packages/core/src/renderer/components/+network-policies/__tests__/network-policy-details.test.tsx +++ b/packages/core/src/renderer/components/+network-policies/__tests__/network-policy-details.test.tsx @@ -22,8 +22,16 @@ describe("NetworkPolicyDetails", () => { it("should render w/o errors", () => { const policy = new NetworkPolicy({ - metadata: {} as never, - spec: {} as never, + metadata: { + name: "some-network-policy-name", + namespace: "some-namespace", + resourceVersion: "1", + selfLink: "/apis/networking.k8s.io/v1/namespace/some-namespace/some-network-policy-name", + uid: "1", + }, + spec: { + podSelector: {}, + }, apiVersion: "networking.k8s.io/v1", kind: "NetworkPolicy", }); @@ -34,7 +42,13 @@ describe("NetworkPolicyDetails", () => { it("should render egress nodeSelector", async () => { const policy = new NetworkPolicy({ - metadata: {} as never, + metadata: { + name: "some-network-policy-name", + namespace: "some-namespace", + resourceVersion: "1", + selfLink: "/apis/networking.k8s.io/v1/namespace/some-namespace/some-network-policy-name", + uid: "1", + }, spec: { egress: [{ to: [{ @@ -58,7 +72,13 @@ describe("NetworkPolicyDetails", () => { it("should not crash if egress nodeSelector doesn't have matchLabels", async () => { const policy = new NetworkPolicy({ - metadata: {} as never, + metadata: { + name: "some-network-policy-name", + namespace: "some-namespace", + resourceVersion: "1", + selfLink: "/apis/networking.k8s.io/v1/namespace/some-namespace/some-network-policy-name", + uid: "1", + }, spec: { egress: [{ to: [{