From f96b78928064f5904c27fa635ccee5ca0932b45d Mon Sep 17 00:00:00 2001 From: Roman Date: Sun, 9 May 2021 23:49:40 +0300 Subject: [PATCH] fix: various app-crashes related to KubeObject.spec.* access from "undefined" fix: config-map-details crash Signed-off-by: Roman --- src/renderer/api/endpoints/cluster.api.ts | 2 +- src/renderer/api/endpoints/crd.api.ts | 2 +- src/renderer/api/endpoints/cron-job.api.ts | 2 +- src/renderer/api/endpoints/hpa.api.ts | 2 +- src/renderer/api/endpoints/ingress.api.ts | 2 +- src/renderer/api/endpoints/limit-range.api.ts | 2 +- src/renderer/api/endpoints/network-policy.api.ts | 2 +- src/renderer/api/endpoints/nodes.api.ts | 2 +- .../api/endpoints/persistent-volume-claims.api.ts | 2 +- src/renderer/api/endpoints/persistent-volume.api.ts | 2 +- .../api/endpoints/poddisruptionbudget.api.ts | 2 +- src/renderer/api/endpoints/podsecuritypolicy.api.ts | 2 +- src/renderer/api/endpoints/resource-quota.api.ts | 2 +- .../api/endpoints/selfsubjectrulesreviews.api.ts | 2 +- src/renderer/api/endpoints/service.api.ts | 2 +- src/renderer/api/kube-object.ts | 3 ++- src/renderer/api/workload-kube-object.ts | 2 -- .../components/+config-maps/config-map-details.tsx | 6 +++--- .../components/+namespaces/namespace.store.ts | 12 ++---------- .../components/+workloads-pods/pod-details-list.tsx | 7 +------ src/renderer/utils/storageHelper.ts | 8 ++++++-- 21 files changed, 29 insertions(+), 39 deletions(-) diff --git a/src/renderer/api/endpoints/cluster.api.ts b/src/renderer/api/endpoints/cluster.api.ts index c97926cff8..b0d6446f01 100644 --- a/src/renderer/api/endpoints/cluster.api.ts +++ b/src/renderer/api/endpoints/cluster.api.ts @@ -54,7 +54,7 @@ export class Cluster extends KubeObject { static kind = "Cluster"; static apiBase = "/apis/cluster.k8s.io/v1alpha1/clusters"; - spec: { + declare spec: { clusterNetwork?: { serviceDomain?: string; pods?: { diff --git a/src/renderer/api/endpoints/crd.api.ts b/src/renderer/api/endpoints/crd.api.ts index 3d55f99ab0..ad5a90eccf 100644 --- a/src/renderer/api/endpoints/crd.api.ts +++ b/src/renderer/api/endpoints/crd.api.ts @@ -22,7 +22,7 @@ export class CustomResourceDefinition extends KubeObject { static namespaced = false; static apiBase = "/apis/apiextensions.k8s.io/v1/customresourcedefinitions"; - spec: { + declare spec: { group: string; version?: string; // deprecated in v1 api names: { diff --git a/src/renderer/api/endpoints/cron-job.api.ts b/src/renderer/api/endpoints/cron-job.api.ts index 4429df2f1a..db22cd5611 100644 --- a/src/renderer/api/endpoints/cron-job.api.ts +++ b/src/renderer/api/endpoints/cron-job.api.ts @@ -48,7 +48,7 @@ export class CronJob extends KubeObject { autoBind(this); } - spec: { + declare spec: { schedule: string; concurrencyPolicy: string; suspend: boolean; diff --git a/src/renderer/api/endpoints/hpa.api.ts b/src/renderer/api/endpoints/hpa.api.ts index 41fc7765e5..60e8cdb649 100644 --- a/src/renderer/api/endpoints/hpa.api.ts +++ b/src/renderer/api/endpoints/hpa.api.ts @@ -43,7 +43,7 @@ export class HorizontalPodAutoscaler extends KubeObject { static namespaced = true; static apiBase = "/apis/autoscaling/v2beta1/horizontalpodautoscalers"; - spec: { + declare spec: { scaleTargetRef: { kind: string; name: string; diff --git a/src/renderer/api/endpoints/ingress.api.ts b/src/renderer/api/endpoints/ingress.api.ts index 775a969137..49ba6b07c9 100644 --- a/src/renderer/api/endpoints/ingress.api.ts +++ b/src/renderer/api/endpoints/ingress.api.ts @@ -72,7 +72,7 @@ export class Ingress extends KubeObject { autoBind(this); } - spec: { + declare spec: { tls: { secretName: string; }[]; diff --git a/src/renderer/api/endpoints/limit-range.api.ts b/src/renderer/api/endpoints/limit-range.api.ts index a97ca28c43..89aa8eeb34 100644 --- a/src/renderer/api/endpoints/limit-range.api.ts +++ b/src/renderer/api/endpoints/limit-range.api.ts @@ -40,7 +40,7 @@ export class LimitRange extends KubeObject { autoBind(this); } - spec: { + declare spec: { limits: LimitRangeItem[]; }; diff --git a/src/renderer/api/endpoints/network-policy.api.ts b/src/renderer/api/endpoints/network-policy.api.ts index 72e828bfc0..7e120d1796 100644 --- a/src/renderer/api/endpoints/network-policy.api.ts +++ b/src/renderer/api/endpoints/network-policy.api.ts @@ -46,7 +46,7 @@ export class NetworkPolicy extends KubeObject { autoBind(this); } - spec: { + declare spec: { podSelector: { matchLabels: { [label: string]: string; diff --git a/src/renderer/api/endpoints/nodes.api.ts b/src/renderer/api/endpoints/nodes.api.ts index f32306db21..4bb7e0ff4a 100644 --- a/src/renderer/api/endpoints/nodes.api.ts +++ b/src/renderer/api/endpoints/nodes.api.ts @@ -39,7 +39,7 @@ export class Node extends KubeObject { autoBind(this); } - spec: { + declare spec: { podCIDR: string; externalID: string; taints?: { diff --git a/src/renderer/api/endpoints/persistent-volume-claims.api.ts b/src/renderer/api/endpoints/persistent-volume-claims.api.ts index 2e9884cb54..500af710e5 100644 --- a/src/renderer/api/endpoints/persistent-volume-claims.api.ts +++ b/src/renderer/api/endpoints/persistent-volume-claims.api.ts @@ -32,7 +32,7 @@ export class PersistentVolumeClaim extends KubeObject { autoBind(this); } - spec: { + declare spec: { accessModes: string[]; storageClassName: string; selector: { diff --git a/src/renderer/api/endpoints/persistent-volume.api.ts b/src/renderer/api/endpoints/persistent-volume.api.ts index c14f7daf1c..ae1daba816 100644 --- a/src/renderer/api/endpoints/persistent-volume.api.ts +++ b/src/renderer/api/endpoints/persistent-volume.api.ts @@ -14,7 +14,7 @@ export class PersistentVolume extends KubeObject { autoBind(this); } - spec: { + declare spec: { capacity: { storage: string; // 8Gi }; diff --git a/src/renderer/api/endpoints/poddisruptionbudget.api.ts b/src/renderer/api/endpoints/poddisruptionbudget.api.ts index 18df957898..a202565398 100644 --- a/src/renderer/api/endpoints/poddisruptionbudget.api.ts +++ b/src/renderer/api/endpoints/poddisruptionbudget.api.ts @@ -13,7 +13,7 @@ export class PodDisruptionBudget extends KubeObject { autoBind(this); } - spec: { + declare spec: { minAvailable: string; maxUnavailable: string; selector: { matchLabels: { [app: string]: string } }; diff --git a/src/renderer/api/endpoints/podsecuritypolicy.api.ts b/src/renderer/api/endpoints/podsecuritypolicy.api.ts index f33d70299e..5ff8537143 100644 --- a/src/renderer/api/endpoints/podsecuritypolicy.api.ts +++ b/src/renderer/api/endpoints/podsecuritypolicy.api.ts @@ -13,7 +13,7 @@ export class PodSecurityPolicy extends KubeObject { autoBind(this); } - spec: { + declare spec: { allowPrivilegeEscalation?: boolean; allowedCSIDrivers?: { name: string; diff --git a/src/renderer/api/endpoints/resource-quota.api.ts b/src/renderer/api/endpoints/resource-quota.api.ts index cbc047f22b..590e137eca 100644 --- a/src/renderer/api/endpoints/resource-quota.api.ts +++ b/src/renderer/api/endpoints/resource-quota.api.ts @@ -40,7 +40,7 @@ export class ResourceQuota extends KubeObject { this.spec = this.spec || {} as any; } - spec: { + declare spec: { hard: IResourceQuotaValues; scopeSelector?: { matchExpressions: { diff --git a/src/renderer/api/endpoints/selfsubjectrulesreviews.api.ts b/src/renderer/api/endpoints/selfsubjectrulesreviews.api.ts index d2a277042e..98f68f95f7 100644 --- a/src/renderer/api/endpoints/selfsubjectrulesreviews.api.ts +++ b/src/renderer/api/endpoints/selfsubjectrulesreviews.api.ts @@ -25,7 +25,7 @@ export class SelfSubjectRulesReview extends KubeObject { static namespaced = false; static apiBase = "/apis/authorization.k8s.io/v1/selfsubjectrulesreviews"; - spec: { + declare spec: { // todo: add more types from api docs namespace?: string; }; diff --git a/src/renderer/api/endpoints/service.api.ts b/src/renderer/api/endpoints/service.api.ts index 6bec79dc66..4723e6f66c 100644 --- a/src/renderer/api/endpoints/service.api.ts +++ b/src/renderer/api/endpoints/service.api.ts @@ -40,7 +40,7 @@ export class Service extends KubeObject { autoBind(this); } - spec: { + declare spec: { type: string; clusterIP: string; externalTrafficPolicy?: string; diff --git a/src/renderer/api/kube-object.ts b/src/renderer/api/kube-object.ts index 2e296496c6..25e6e62e2f 100644 --- a/src/renderer/api/kube-object.ts +++ b/src/renderer/api/kube-object.ts @@ -144,7 +144,8 @@ export class KubeObject implements ItemObject { apiVersion: string; kind: string; metadata: IKubeObjectMetadata; - status?: any; // todo: type-safety support + status?: any; + spec: any = {}; get selfLink() { return this.metadata.selfLink; diff --git a/src/renderer/api/workload-kube-object.ts b/src/renderer/api/workload-kube-object.ts index 185d3d502c..e513c5083b 100644 --- a/src/renderer/api/workload-kube-object.ts +++ b/src/renderer/api/workload-kube-object.ts @@ -47,8 +47,6 @@ export interface IAffinity { } export class WorkloadKubeObject extends KubeObject { - spec: any; // todo: add proper types - getSelectors(): string[] { const selector = this.spec.selector; diff --git a/src/renderer/components/+config-maps/config-map-details.tsx b/src/renderer/components/+config-maps/config-map-details.tsx index bf10eee488..0120c8f45c 100644 --- a/src/renderer/components/+config-maps/config-map-details.tsx +++ b/src/renderer/components/+config-maps/config-map-details.tsx @@ -62,17 +62,17 @@ export class ConfigMapDetails extends React.Component { const { object: configMap } = this.props; if (!configMap) return null; - const dataEntries = Object.entries(this.data); + const data = Array.from(this.data.entries()); return (
{ - dataEntries.length > 0 && ( + data.length > 0 && ( <> { - dataEntries.map(([name, value]) => { + data.map(([name, value]) => { return (
{name}
diff --git a/src/renderer/components/+namespaces/namespace.store.ts b/src/renderer/components/+namespaces/namespace.store.ts index 56ac39bb32..f03b6c641f 100644 --- a/src/renderer/components/+namespaces/namespace.store.ts +++ b/src/renderer/components/+namespaces/namespace.store.ts @@ -1,19 +1,11 @@ -import { - action, - comparer, - computed, - IReactionDisposer, - IReactionOptions, - observable, - reaction, - makeObservable, -} from "mobx"; +import { action, comparer, computed, IReactionDisposer, IReactionOptions, makeObservable, observable, reaction, } from "mobx"; import { autoBind, createStorage } from "../../utils"; import { KubeObjectStore, KubeObjectStoreLoadingParams } from "../../kube-object.store"; import { Namespace, namespacesApi } from "../../api/endpoints/namespaces.api"; import { createPageParam } from "../../navigation"; import { apiManager } from "../../api/api-manager"; +// FIXME: something fishy with sync selected-namespaces with URL const selectedNamespaces = createStorage("selected_namespaces", undefined); export const namespaceUrlParam = createPageParam({ diff --git a/src/renderer/components/+workloads-pods/pod-details-list.tsx b/src/renderer/components/+workloads-pods/pod-details-list.tsx index fe9f99fd35..aecb432382 100644 --- a/src/renderer/components/+workloads-pods/pod-details-list.tsx +++ b/src/renderer/components/+workloads-pods/pod-details-list.tsx @@ -2,7 +2,7 @@ import "./pod-details-list.scss"; import React from "react"; import kebabCase from "lodash/kebabCase"; -import { reaction, makeObservable } from "mobx"; +import { reaction } from "mobx"; import { disposeOnUnmount, observer } from "mobx-react"; import { podsStore } from "./pods.store"; import { Pod } from "../../api/endpoints"; @@ -50,11 +50,6 @@ export class PodDetailsList extends React.Component { [sortBy.memory]: (pod: Pod) => podsStore.getPodKubeMetrics(pod).memory, }; - constructor(props: Props) { - super(props); - makeObservable(this); - } - componentDidMount() { this.metricsWatcher.start(true); disposeOnUnmount(this, [ diff --git a/src/renderer/utils/storageHelper.ts b/src/renderer/utils/storageHelper.ts index c296744a83..5c73112052 100755 --- a/src/renderer/utils/storageHelper.ts +++ b/src/renderer/utils/storageHelper.ts @@ -1,6 +1,6 @@ // Helper for working with storages (e.g. window.localStorage, NodeJS/file-system, etc.) -import { action, IObservableValue, makeObservable, observable, toJS, when, } from "mobx"; +import { action, comparer, IObservableValue, makeObservable, observable, toJS, when, } from "mobx"; import produce, { Draft } from "immer"; import { isEqual, isFunction, isPlainObject } from "lodash"; import logger from "../../main/logger"; @@ -36,7 +36,11 @@ export class StorageHelper { this.storage = options.storage; this.defaultValue = options.defaultValue; - this.data = observable.box(this.defaultValue); + this.data = observable.box(this.defaultValue, { + autoBind: true, + deep: true, + equals: comparer.structural, + }); this.data.observe_(({ newValue, oldValue }) => { this.onChange(newValue as T, oldValue as T);