Просмотр исходного кода

rfac: disable deletes for nginx charts (#2609)

Co-authored-by: Soham Parekh <sohamparekh@soham.parekh-macOS>
meehawk 3 лет назад
Родитель
Сommit
2ded1b087b

+ 11 - 0
dashboard/package-lock.json

@@ -2295,6 +2295,12 @@
         }
       }
     },
+    "@types/traverse": {
+      "version": "0.6.32",
+      "resolved": "https://registry.npmjs.org/@types/traverse/-/traverse-0.6.32.tgz",
+      "integrity": "sha512-RBz2uRZVCXuMg93WD//aTS5B120QlT4lR/gL+935QtGsKHLS6sCtZBaKfWjIfk7ZXv/r8mtGbwjVIee6/3XTow==",
+      "dev": true
+    },
     "@types/uglify-js": {
       "version": "3.13.1",
       "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz",
@@ -9870,6 +9876,11 @@
       "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==",
       "dev": true
     },
+    "traverse": {
+      "version": "0.6.7",
+      "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz",
+      "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg=="
+    },
     "ts-loader": {
       "version": "8.3.0",
       "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.3.0.tgz",

+ 2 - 0
dashboard/package.json

@@ -62,6 +62,7 @@
     "semver": "^7.3.5",
     "stacktrace-js": "^2.0.2",
     "styled-components": "^5.2.0",
+    "traverse": "^0.6.7",
     "valtio": "^1.2.4"
   },
   "scripts": {
@@ -104,6 +105,7 @@
     "@types/semver": "^7.3.5",
     "@types/styled-components": "^5.1.3",
     "@types/terser-webpack-plugin": "^4.2.2",
+    "@types/traverse": "^0.6.32",
     "@types/webpack-dev-server": "^3.11.5",
     "babel-loader": "^8.2.2",
     "babel-plugin-lodash": "^3.3.4",

+ 35 - 6
dashboard/src/main/home/cluster-dashboard/expanded-chart/SettingsSection.tsx

@@ -2,6 +2,7 @@ import React, { useContext, useEffect, useState } from "react";
 import styled from "styled-components";
 import api from "shared/api";
 import yaml from "js-yaml";
+import * as traverse from "traverse";
 
 import { ActionConfigType, ChartType, StorageType } from "shared/types";
 import { Context } from "shared/Context";
@@ -245,11 +246,11 @@ const SettingsSection: React.FC<PropsType> = ({
 
         <>
           <Heading>Canonical Name</Heading>
-          <Helper>Set a canonical name for this application (lowercase letters, numbers, and "-" only)</Helper>
-          <CanonicalName
-            release={currentChart}
-            onSave={() => refreshChart()}
-          />
+          <Helper>
+            Set a canonical name for this application (lowercase letters,
+            numbers, and "-" only)
+          </Helper>
+          <CanonicalName release={currentChart} onSave={() => refreshChart()} />
 
           <Heading>Redeploy Webhook</Heading>
           <Helper>
@@ -305,6 +306,30 @@ const SettingsSection: React.FC<PropsType> = ({
     return true;
   };
 
+  const canBeDeleted = () => {
+    const chart = currentChart;
+
+    if (chart.config) {
+      const values = chart.config;
+      const t = traverse(values);
+      const paths = t.paths();
+
+      return !paths.some((path) => {
+        if (
+          Array.isArray(path) &&
+          path.at(-2) === "nodeSelector" &&
+          path.at(-1) === "porter.run/system"
+        ) {
+          return t.get(path) === true;
+        }
+
+        return false;
+      });
+    }
+
+    return true;
+  };
+
   return (
     <Wrapper>
       {!loadingWebhookToken ? (
@@ -326,7 +351,11 @@ const SettingsSection: React.FC<PropsType> = ({
           )}
 
           <Heading>Additional Settings</Heading>
-          <Button color="#b91133" onClick={() => setShowDeleteOverlay(true)}>
+          <Button
+            color="#b91133"
+            onClick={() => setShowDeleteOverlay(true)}
+            disabled={!canBeDeleted()}
+          >
             Delete {currentChart.name}
           </Button>
         </StyledSettingsSection>