Explorar o código

dgtown/azure machines (#4542)

d-g-town %!s(int64=2) %!d(string=hai) anos
pai
achega
09b9ec9dbd

+ 27 - 29
dashboard/src/main/home/infrastructure-dashboard/forms/azure/ConfigureAKSCluster.tsx

@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from "react";
+import React, { useContext, useEffect, useState } from "react";
 import { useQuery } from "@tanstack/react-query";
 import { useQuery } from "@tanstack/react-query";
 import { Controller, useFormContext } from "react-hook-form";
 import { Controller, useFormContext } from "react-hook-form";
 
 
@@ -19,6 +19,7 @@ import type {
 } from "lib/clusters/types";
 } from "lib/clusters/types";
 import { useIntercom } from "lib/hooks/useIntercom";
 import { useIntercom } from "lib/hooks/useIntercom";
 
 
+import { Context } from "shared/Context";
 import { valueExists } from "shared/util";
 import { valueExists } from "shared/util";
 
 
 import { useClusterFormContext } from "../../ClusterFormContextProvider";
 import { useClusterFormContext } from "../../ClusterFormContextProvider";
@@ -39,11 +40,12 @@ const ConfigureAKSCluster: React.FC<Props> = ({
   const [customSetupRequired, setCustomSetupRequired] =
   const [customSetupRequired, setCustomSetupRequired] =
     useState<boolean>(false);
     useState<boolean>(false);
   const { showIntercomWithMessage } = useIntercom();
   const { showIntercomWithMessage } = useIntercom();
+  const { user } = useContext(Context);
 
 
   useEffect(() => {
   useEffect(() => {
     if (customSetupRequired) {
     if (customSetupRequired) {
       showIntercomWithMessage({
       showIntercomWithMessage({
-        message: "I need custom configuration for creating  an Azure cluster.",
+        message: "I need help configuring instance types for my Azure cluster.",
       });
       });
     }
     }
   }, [customSetupRequired]);
   }, [customSetupRequired]);
@@ -65,7 +67,7 @@ const ConfigureAKSCluster: React.FC<Props> = ({
   const defaultNodeGroupType = (
   const defaultNodeGroupType = (
     nodeGroupType: NodeGroupType,
     nodeGroupType: NodeGroupType,
     availableMachineTypes: ClientMachineType[]
     availableMachineTypes: ClientMachineType[]
-  ): string => {
+  ): { defaultType: string; notAvailable: boolean } => {
     const availableNonGPUMachineTypes = availableMachineTypes
     const availableNonGPUMachineTypes = availableMachineTypes
       .filter((mt) => !mt.isGPU)
       .filter((mt) => !mt.isGPU)
       .map((mt) => mt.name.toString());
       .map((mt) => mt.name.toString());
@@ -77,7 +79,7 @@ const ConfigureAKSCluster: React.FC<Props> = ({
       NodeGroupType,
       NodeGroupType,
       {
       {
         defaultTypes: string[];
         defaultTypes: string[];
-        fallback: boolean; // if true, will fallback to first available machine type if no default machine types are available
+        fallback: boolean; // if true, will fallback to first available machine type if no default machine types are available; if false, will require custom setup
       }
       }
     > = {
     > = {
       APPLICATION: {
       APPLICATION: {
@@ -109,15 +111,17 @@ const ConfigureAKSCluster: React.FC<Props> = ({
 
 
     for (const machineType of defaultMachineTypes[nodeGroupType].defaultTypes) {
     for (const machineType of defaultMachineTypes[nodeGroupType].defaultTypes) {
       if (availableMachines.includes(machineType)) {
       if (availableMachines.includes(machineType)) {
-        return machineType;
+        return {
+          defaultType: machineType,
+          notAvailable: false,
+        };
       }
       }
     }
     }
 
 
-    if (defaultMachineTypes[nodeGroupType].fallback) {
-      return availableMachines[0];
-    }
-
-    return "";
+    return {
+      defaultType: availableMachines[0],
+      notAvailable: !defaultMachineTypes[nodeGroupType].fallback,
+    };
   };
   };
 
 
   const { data: machineTypes, status: machineTypesStatus } = useQuery(
   const { data: machineTypes, status: machineTypesStatus } = useQuery(
@@ -142,7 +146,9 @@ const ConfigureAKSCluster: React.FC<Props> = ({
   );
   );
 
 
   const regionValid =
   const regionValid =
-    !customSetupRequired && machineTypesStatus !== "loading" && machineTypes;
+    machineTypesStatus !== "loading" &&
+    machineTypes &&
+    (!customSetupRequired || user?.isPorterUser);
 
 
   useEffect(() => {
   useEffect(() => {
     if (
     if (
@@ -156,40 +162,32 @@ const ConfigureAKSCluster: React.FC<Props> = ({
     }
     }
 
 
     let instanceTypeReplaced = false;
     let instanceTypeReplaced = false;
+    let anyCustomSetupRequired = false;
     const substituteBadInstanceTypes = nodeGroups.map((nodeGroup) => {
     const substituteBadInstanceTypes = nodeGroups.map((nodeGroup) => {
-      const defaultMachineType = defaultNodeGroupType(
+      const { defaultType, notAvailable } = defaultNodeGroupType(
         nodeGroup.nodeGroupType,
         nodeGroup.nodeGroupType,
         machineTypes
         machineTypes
       );
       );
 
 
-      if (nodeGroup.instanceType !== defaultMachineType) {
+      if (notAvailable) {
+        anyCustomSetupRequired = true;
+      }
+
+      if (nodeGroup.instanceType !== defaultType) {
         instanceTypeReplaced = true;
         instanceTypeReplaced = true;
         return {
         return {
           ...nodeGroup,
           ...nodeGroup,
-          instanceType: defaultMachineType,
+          instanceType: defaultType,
         };
         };
       }
       }
 
 
       return nodeGroup;
       return nodeGroup;
     });
     });
 
 
-    // if we cannot find a valid machine type for any node group, set custom setup required and exit
-    for (const nodeGroup of substituteBadInstanceTypes) {
-      if (nodeGroup.instanceType === "") {
-        setCustomSetupRequired(true);
-        return;
-      }
-    }
-
-    // if we reach here, custom setup is not required
-    if (customSetupRequired) {
-      setCustomSetupRequired(false);
-    }
+    setCustomSetupRequired(anyCustomSetupRequired);
 
 
-    // if any instance types were replaced, update the form
-    if (instanceTypeReplaced) {
+    instanceTypeReplaced &&
       setValue(`cluster.config.nodeGroups`, substituteBadInstanceTypes);
       setValue(`cluster.config.nodeGroups`, substituteBadInstanceTypes);
-    }
   }, [machineTypes, machineTypesStatus, region]);
   }, [machineTypes, machineTypesStatus, region]);
 
 
   return (
   return (