diff --git a/src/renderer/api/kube-object.ts b/src/renderer/api/kube-object.ts index b72beb9383..df249f64e6 100644 --- a/src/renderer/api/kube-object.ts +++ b/src/renderer/api/kube-object.ts @@ -29,6 +29,7 @@ import { apiKube } from "./index"; import type { JsonApiParams } from "./json-api"; import { resourceApplierApi } from "./endpoints/resource-applier.api"; import { hasOptionalProperty, hasTypedProperty, isObject, isString, bindPredicate, isTypedArray, isRecord } from "../../common/utils/type-narrowing"; +import _ from "lodash"; export type IKubeObjectConstructor = (new (data: KubeJsonApiData | any) => T) & { kind?: string; @@ -96,6 +97,7 @@ export class KubeObject `${name}=${value}`); } + protected static readonly nonEditableFields = [ + "apiVersion", + "kind", + "metadata.name", + "metadata.selfLink", + "metadata.resourceVersion", + "metadata.uid", + "managedFields", + "status", + ]; + constructor(data: KubeJsonApiData) { Object.assign(this, data); autoBind(this); @@ -267,6 +280,12 @@ export class KubeObject(data: Partial): Promise { + for (const field of KubeObject.nonEditableFields) { + if (!_.isEqual(_.get(this, field), _.get(data, field))) { + throw new Error(`Failed to update Kube Object: ${field} has been modified`); + } + } + return resourceApplierApi.update({ ...this.toPlainObject(), ...data,