From 3bf5f124a3a707ee6bc1af0d91b33502ec40d234 Mon Sep 17 00:00:00 2001 From: ecarrill Date: Thu, 3 Aug 2023 10:46:48 -0700 Subject: [PATCH 01/11] feature: [M3-6787] - Change HA implementation --- .../CreateCluster/CreateCluster.tsx | 88 +++++++++++-------- .../CreateCluster/HAControlPlane.test.tsx | 53 +++++++++++ .../CreateCluster/HAControlPlane.tsx | 75 ++++++++++++++++ .../KubeCheckoutBar/KubeCheckoutBar.test.tsx | 2 +- .../KubeCheckoutBar/KubeCheckoutBar.tsx | 28 ++---- .../UpgradeClusterDialog.tsx | 2 +- .../src/features/Kubernetes/kubeUtils.ts | 13 +++ 7 files changed, 203 insertions(+), 58 deletions(-) create mode 100644 packages/manager/src/features/Kubernetes/CreateCluster/HAControlPlane.test.tsx create mode 100644 packages/manager/src/features/Kubernetes/CreateCluster/HAControlPlane.tsx diff --git a/packages/manager/src/features/Kubernetes/CreateCluster/CreateCluster.tsx b/packages/manager/src/features/Kubernetes/CreateCluster/CreateCluster.tsx index ae80420e379..10675843889 100644 --- a/packages/manager/src/features/Kubernetes/CreateCluster/CreateCluster.tsx +++ b/packages/manager/src/features/Kubernetes/CreateCluster/CreateCluster.tsx @@ -18,10 +18,15 @@ import { RegionSelect } from 'src/components/EnhancedSelect/variants/RegionSelec import { ErrorState } from 'src/components/ErrorState/ErrorState'; import LandingHeader from 'src/components/LandingHeader'; import { Notice } from 'src/components/Notice/Notice'; +import { Paper } from 'src/components/Paper'; import { ProductInformationBanner } from 'src/components/ProductInformationBanner/ProductInformationBanner'; import { RegionHelperText } from 'src/components/SelectRegionPanel/RegionHelperText'; import { TextField } from 'src/components/TextField'; -import { Paper } from 'src/components/Paper'; +import { + getKubeHighAvailability, + getLatestVersion, +} from 'src/features/Kubernetes/kubeUtils'; +import { useAccount } from 'src/queries/account'; import { reportAgreementSigningError, useMutateAccountAgreements, @@ -39,6 +44,7 @@ import { plansNoticesUtils } from 'src/utilities/planNotices'; import scrollErrorIntoView from 'src/utilities/scrollErrorIntoView'; import KubeCheckoutBar from '../KubeCheckoutBar'; +import { HAControlPlane } from './HAControlPlane'; import { NodePoolPanel } from './NodePoolPanel'; const useStyles = makeStyles((theme: Theme) => ({ @@ -112,22 +118,41 @@ const useStyles = makeStyles((theme: Theme) => ({ export const CreateCluster = () => { const classes = useStyles(); + const [selectedRegionID, setSelectedRegionID] = React.useState(''); + const [nodePools, setNodePools] = React.useState([]); + const [label, setLabel] = React.useState(); + const [version, setVersion] = React.useState | undefined>(); + const [errors, setErrors] = React.useState(); + const [submitting, setSubmitting] = React.useState(false); + const [hasAgreed, setAgreed] = React.useState(false); + const { mutateAsync: updateAccountAgreements } = useMutateAccountAgreements(); + const [highAvailability, setHighAvailability] = React.useState( + false + ); + const [ + hasHAControlPlaneSelection, + setHAControlPlaneSelection, + ] = React.useState(false); + + const { data, error: regionsError } = useRegionsQuery(); + const regionsData = data ?? []; + const history = useHistory(); + const { data: account } = useAccount(); + const { showHighAvailability } = getKubeHighAvailability(account); + const { data: allTypes, error: typesError, isLoading: typesLoading, } = useAllTypes(); + // Only want to use current types here. + const typesData = filterCurrentTypes(allTypes?.map(extendType)); + const { mutateAsync: createKubernetesCluster, } = useCreateKubernetesClusterMutation(); - const { data, error: regionsError } = useRegionsQuery(); - const regionsData = data ?? []; - - // Only want to use current types here. - const typesData = filterCurrentTypes(allTypes?.map(extendType)); - // Only include regions that have LKE capability const filteredRegions = React.useMemo(() => { return regionsData @@ -137,26 +162,15 @@ export const CreateCluster = () => { : []; }, [regionsData]); - const [selectedRegionID, setSelectedRegionID] = React.useState(''); - const [nodePools, setNodePools] = React.useState([]); - const [label, setLabel] = React.useState(); - const [highAvailability, setHighAvailability] = React.useState( - false - ); - const [version, setVersion] = React.useState | undefined>(); - const [errors, setErrors] = React.useState(); - const [submitting, setSubmitting] = React.useState(false); - const [hasAgreed, setAgreed] = React.useState(false); - const { mutateAsync: updateAccountAgreements } = useMutateAccountAgreements(); const { data: versionData, isError: versionLoadError, } = useKubernetesVersionQuery(); + const versions = (versionData ?? []).map((thisVersion) => ({ label: thisVersion.id, value: thisVersion.id, })); - const history = useHistory(); React.useEffect(() => { if (filteredRegions.length === 1 && !selectedRegionID) { @@ -164,17 +178,19 @@ export const CreateCluster = () => { } }, [filteredRegions, selectedRegionID]); + React.useEffect(() => { + if (versions.length > 0) { + setVersion(getLatestVersion(versions)); + } + }, [versionData]); + const createCluster = () => { const { push } = history; - setErrors(undefined); setSubmitting(true); - const k8s_version = version ? version.value : undefined; - /** - * Only type and count to the API. - */ + // Only type and count to the API. const node_pools = nodePools.map( pick(['type', 'count']) ) as CreateNodePoolData[]; @@ -223,10 +239,7 @@ export const CreateCluster = () => { }; const updateLabel = (newLabel: string) => { - /** - * If the new label is an empty string, use undefined. - * This allows it to pass Yup validation. - */ + // If the new label is an empty string, use undefined. This allows it to pass Yup validation. setLabel(newLabel ? newLabel : undefined); }; @@ -247,11 +260,7 @@ export const CreateCluster = () => { }); if (typesError || regionsError || versionLoadError) { - /** - * This information is necessary to create a Cluster. - * Otherwise, show an error state. - */ - + // This information is necessary to create a Cluster. Otherwise, show an error state. return ; } @@ -297,16 +306,25 @@ export const CreateCluster = () => {