From 5bd1d079de6f25c821ff5a524ba4d09259575ac3 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Mon, 14 Jun 2021 08:49:55 -0400 Subject: [PATCH] Add checks to block edits to key fields (#2426) - Referece kubetcl:pkg/cmd/util/editor/editoptions.go:649 - disallow editing status field Signed-off-by: Sebastian Malton --- src/renderer/api/kube-object.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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,