From ce4d9310aa657d13b4857c25e92d3a029ebec18e Mon Sep 17 00:00:00 2001
From: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
Date: Mon, 21 Mar 2022 10:21:39 -0700
Subject: [PATCH] AWS Marketplace Integration Updates (#1740)
Makes the create tenant for MK AWS updated with new recommendations
Fixes Back Link icon alignment and color
Adds a helpbox for MK AWS
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
---
portal-ui/src/common/BackLink.tsx | 50 ++++----
portal-ui/src/common/utils.ts | 85 ++++++++++++--
.../Console/Tenants/AddTenant/AddTenant.tsx | 67 ++++++++++-
.../Steps/TenantResources/NameTenantMain.tsx | 12 +-
.../Steps/TenantResources/TenantSize.tsx | 23 +++-
.../AddTenant/Steps/TenantResources/utils.tsx | 41 ++++---
.../src/screens/Console/Tenants/actions.ts | 9 ++
.../src/screens/Console/Tenants/reducer.ts | 12 +-
.../Tenants/reducers/add-tenant-reducer.ts | 110 ++++++++++++++++++
.../src/screens/Console/Tenants/types.ts | 9 ++
10 files changed, 356 insertions(+), 62 deletions(-)
create mode 100644 portal-ui/src/screens/Console/Tenants/reducers/add-tenant-reducer.ts
diff --git a/portal-ui/src/common/BackLink.tsx b/portal-ui/src/common/BackLink.tsx
index 9e9168200..997b3f6c8 100644
--- a/portal-ui/src/common/BackLink.tsx
+++ b/portal-ui/src/common/BackLink.tsx
@@ -19,43 +19,47 @@ import { Link } from "react-router-dom";
import { Theme } from "@mui/material/styles";
import createStyles from "@mui/styles/createStyles";
import withStyles from "@mui/styles/withStyles";
-import { BackIcon } from "../icons";
+import { BackSettingsIcon } from "../icons";
import { Box } from "@mui/material";
const styles = (theme: Theme) =>
createStyles({
link: {
- display: "inline-block",
- alignItems: "center",
- justifyContent: "center",
+ display: "block",
textDecoration: "none",
- maxWidth: "40px",
"&:active": {
color: theme.palette.primary.light,
},
},
- icon: {
- marginRight: "11px",
+ iconBox: {
display: "flex",
- alignItems: "center",
- justifyContent: "center",
- height: "35px",
- width: "35px",
- borderRadius: "2px",
+ flexDirection: "row",
"&:hover": {
background: "rgba(234,237,238)",
},
- "& svg.min-icon": {
- width: "18px",
- height: "12px",
+ height: "30px",
+ paddingBottom: 4,
+ paddingTop: 8,
+ paddingRight: 16,
+ paddingLeft: 0,
+ borderRadius: 4,
+ },
+ icon: {
+ lineHeight: 1,
+ marginRight: "14px",
+ alignItems: "center",
+ width: "22px",
+ "& .min-icon": {
+ color: theme.palette.primary.light,
+ width: "16px",
+ height: "16px",
},
},
label: {
- display: "flex",
+ lineHeight: 1,
alignItems: "center",
- height: "35px",
- padding: "0 0px 0 5px",
- fontSize: "18px",
+ paddingTop: 1,
+ fontSize: "14px",
fontWeight: 600,
color: theme.palette.primary.light,
},
@@ -92,11 +96,13 @@ const BackLink = ({
}
}}
>
-
-
+
-
{label}
);
};
diff --git a/portal-ui/src/common/utils.ts b/portal-ui/src/common/utils.ts
index 2cd341bf3..d1aab9676 100644
--- a/portal-ui/src/common/utils.ts
+++ b/portal-ui/src/common/utils.ts
@@ -22,6 +22,12 @@ import {
IStorageFactors,
} from "./types";
import { IPool } from "../screens/Console/Tenants/ListTenants/types";
+import {
+ IMkEnvs,
+ IntegrationConfiguration,
+ mkPanelConfigurations,
+} from "../screens/Console/Tenants/AddTenant/Steps/TenantResources/utils";
+import get from "lodash/get";
const minStReq = 1073741824; // Minimal Space required for MinIO
const minMemReq = 2147483648; // Minimal Memory required for MinIO in bytes
@@ -114,12 +120,21 @@ export const k8sScalarUnitsExcluding = (exclude?: string[]) => {
});
};
-//getBytes, converts from a value and a unit from units array to bytes
+//getBytes, converts from a value and a unit from units array to bytes as a string
export const getBytes = (
value: string,
unit: string,
fromk8s: boolean = false
-) => {
+): string => {
+ return getBytesNumber(value, unit, fromk8s).toString(10);
+};
+
+//getBytesNumber, converts from a value and a unit from units array to bytes
+export const getBytesNumber = (
+ value: string,
+ unit: string,
+ fromk8s: boolean = false
+): number => {
const vl: number = parseFloat(value);
const unitsTake = fromk8s ? k8sCalcUnits : units;
@@ -127,12 +142,12 @@ export const getBytes = (
const powFactor = unitsTake.findIndex((element) => element === unit);
if (powFactor === -1) {
- return "0";
+ return 0;
}
const factor = Math.pow(1024, powFactor);
const total = vl * factor;
- return total.toString(10);
+ return total;
};
//getTotalSize gets the total size of a value & unit
@@ -218,7 +233,9 @@ export const calculateDistribution = (
capacityToUse: ICapacity,
forcedNodes: number = 0,
limitSize: number = 0,
- drivesPerServer: number = 0
+ drivesPerServer: number = 0,
+ marketplaceIntegration?: IMkEnvs,
+ selectedStorageType?: string
): IStorageDistribution => {
const requestedSizeBytes = getBytes(
capacityToUse.value,
@@ -250,7 +267,9 @@ export const calculateDistribution = (
requestedSizeBytes,
forcedNodes,
limitSize,
- drivesPerServer
+ drivesPerServer,
+ marketplaceIntegration,
+ selectedStorageType
);
return numberOfNodes;
@@ -260,7 +279,9 @@ const calculateStorage = (
requestedBytes: string,
forcedNodes: number,
limitSize: number,
- drivesPerServer: number
+ drivesPerServer: number,
+ marketplaceIntegration?: IMkEnvs,
+ selectedStorageType?: string
): IStorageDistribution => {
// Size validation
const intReqBytes = parseInt(requestedBytes, 10);
@@ -272,7 +293,9 @@ const calculateStorage = (
intReqBytes,
maxDiskSize,
limitSize,
- drivesPerServer
+ drivesPerServer,
+ marketplaceIntegration,
+ selectedStorageType
);
};
@@ -281,7 +304,9 @@ const structureCalc = (
desiredCapacity: number,
maxDiskSize: number,
maxClusterSize: number,
- disksPerNode: number = 0
+ disksPerNode: number = 0,
+ marketplaceIntegration?: IMkEnvs,
+ selectedStorageType?: string
): IStorageDistribution => {
if (
isNaN(nodes) ||
@@ -350,6 +375,48 @@ const structureCalc = (
pvSize: 0,
}; // Cannot allocate this volume size
}
+ // validate for integrations
+ if (marketplaceIntegration !== undefined) {
+ const setConfigs = mkPanelConfigurations[marketplaceIntegration];
+ const keyCount = Object.keys(setConfigs).length;
+
+ //Configuration is filled
+ if (keyCount > 0) {
+ const configs: IntegrationConfiguration[] = get(
+ setConfigs,
+ "configurations",
+ []
+ );
+ const mainSelection = configs.find(
+ (item) => item.typeSelection === selectedStorageType
+ );
+
+ if (mainSelection !== undefined && mainSelection.minimumVolumeSize) {
+ const minimumPvSize = getBytesNumber(
+ mainSelection.minimumVolumeSize?.driveSize,
+ mainSelection.minimumVolumeSize?.sizeUnit,
+ true
+ );
+ const storageTypeLabel = setConfigs.variantSelectorValues!.find(
+ (item) => item.value === selectedStorageType
+ );
+
+ if (persistentVolumeSize < minimumPvSize) {
+ return {
+ error: `For the ${
+ storageTypeLabel!.label
+ } storage type the mininum volume size is ${
+ mainSelection.minimumVolumeSize.driveSize
+ }${mainSelection.minimumVolumeSize.sizeUnit}`,
+ nodes: 0,
+ persistentVolumes: 0,
+ disks: 0,
+ pvSize: 0,
+ };
+ }
+ }
+ }
+ }
return {
error: "",
diff --git a/portal-ui/src/screens/Console/Tenants/AddTenant/AddTenant.tsx b/portal-ui/src/screens/Console/Tenants/AddTenant/AddTenant.tsx
index 9c7f834bb..39fecdb90 100644
--- a/portal-ui/src/screens/Console/Tenants/AddTenant/AddTenant.tsx
+++ b/portal-ui/src/screens/Console/Tenants/AddTenant/AddTenant.tsx
@@ -55,6 +55,12 @@ import BackLink from "../../../../common/BackLink";
import TenantResources from "./Steps/TenantResources/TenantResources";
import ConfigLogSearch from "./Steps/ConfigLogSearch";
import ConfigPrometheus from "./Steps/ConfigPrometheus";
+import {
+ IMkEnvs,
+ resourcesConfigurations,
+} from "./Steps/TenantResources/utils";
+import HelpBox from "../../../../common/HelpBox";
+import { StorageIcon } from "../../../../icons";
interface IAddTenantProps {
setErrorSnackMessage: typeof setErrorSnackMessage;
@@ -66,6 +72,7 @@ interface IAddTenantProps {
namespace: string;
validPages: string[];
classes: any;
+ features?: string[];
}
const styles = (theme: Theme) =>
@@ -87,6 +94,7 @@ const AddTenant = ({
validPages,
setErrorSnackMessage,
resetAddTenantForm,
+ features,
}: IAddTenantProps) => {
// Modals
const [showNewCredentials, setShowNewCredentials] = useState
(false);
@@ -95,6 +103,27 @@ const AddTenant = ({
// Fields
const [addSending, setAddSending] = useState(false);
+ const [formRender, setFormRender] = useState(null);
+
+ useEffect(() => {
+ let setConfiguration = IMkEnvs.default;
+
+ if (features && features.length !== 0) {
+ const possibleVariables = Object.keys(resourcesConfigurations);
+
+ possibleVariables.forEach((element) => {
+ if (features.includes(element)) {
+ setConfiguration = get(
+ resourcesConfigurations,
+ element,
+ IMkEnvs.default
+ );
+ }
+ });
+ }
+
+ setFormRender(setConfiguration);
+ }, [features]);
/* Send Information to backend */
useEffect(() => {
@@ -764,20 +793,47 @@ const AddTenant = ({
/>
)}
-
+
{addSending && (
)}
+
+
+
+
+ {formRender === IMkEnvs.aws && (
+
+ }
+ help={
+
+ Performance Optimized: Uses the gp3 EBS storage
+ class class configured at 1,000Mi/s throughput and 16,000
+ IOPS, however the minimum volume size for this type of EBS
+ volume is 32Gi.
+
+
+ Storage Optimized: Uses the sc1 EBS storage
+ class, however the minimum volume size for this type of EBS
+ volume is
+ 16Ti to unlock their maximum throughput speed of
+ 250Mi/s.
+
+ }
+ />
+
+ )}
);
@@ -790,6 +846,7 @@ const mapState = (state: AppState) => ({
certificates: state.tenants.createTenant.certificates,
selectedStorageClass:
state.tenants.createTenant.fields.nameTenant.selectedStorageClass,
+ features: state.console.session.features,
});
const connector = connect(mapState, {
diff --git a/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantResources/NameTenantMain.tsx b/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantResources/NameTenantMain.tsx
index fd9a00ebb..4ffc696c4 100644
--- a/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantResources/NameTenantMain.tsx
+++ b/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantResources/NameTenantMain.tsx
@@ -37,6 +37,7 @@ import { setModalErrorSnackMessage } from "../../../../../../actions";
import {
isPageValid,
setLimitSize,
+ setStorageType,
setStorageClassesList,
updateAddField,
} from "../../../actions";
@@ -87,6 +88,8 @@ interface INameTenantMainScreen {
selectedStorageClass: string;
selectedStorageType: string;
formToRender?: IMkEnvs;
+ features?: string[];
+ setStorageType: typeof setStorageType;
}
const NameTenantMain = ({
@@ -102,6 +105,8 @@ const NameTenantMain = ({
setLimitSize,
isPageValid,
setModalErrorSnackMessage,
+ features,
+ setStorageType,
}: INameTenantMainScreen) => {
const [validationErrors, setValidationErrors] = useState({});
const [emptyNamespace, setEmptyNamespace] = useState(true);
@@ -350,10 +355,7 @@ const NameTenantMain = ({
id="storage_type"
name="storage_type"
onChange={(e: SelectChangeEvent) => {
- updateField(
- "selectedStorageType",
- e.target.value as string
- );
+ setStorageType(e.target.value as string, features);
}}
label={get(
mkPanelConfigurations,
@@ -399,6 +401,7 @@ const mapState = (state: AppState) => ({
selectedStorageType:
state.tenants.createTenant.fields.nameTenant.selectedStorageType,
storageClasses: state.tenants.createTenant.storageClasses,
+ features: state.console.session.features,
});
const connector = connect(mapState, {
@@ -407,6 +410,7 @@ const connector = connect(mapState, {
setStorageClassesList,
setLimitSize,
isPageValid,
+ setStorageType,
});
export default withStyles(styles)(connector(NameTenantMain));
diff --git a/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantResources/TenantSize.tsx b/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantResources/TenantSize.tsx
index 793b1313a..1f39ace28 100644
--- a/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantResources/TenantSize.tsx
+++ b/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantResources/TenantSize.tsx
@@ -45,6 +45,7 @@ import InputBoxWrapper from "../../../../Common/FormComponents/InputBoxWrapper/I
import SelectWrapper from "../../../../Common/FormComponents/SelectWrapper/SelectWrapper";
import TenantSizeResources from "./TenantSizeResources";
import InputUnitMenu from "../../../../Common/FormComponents/InputUnitMenu/InputUnitMenu";
+import { IMkEnvs } from "./utils";
interface ITenantSizeProps {
classes: any;
@@ -64,6 +65,8 @@ interface ITenantSizeProps {
limitSize: any;
selectedStorageClass: string;
untouchedECField: boolean;
+ formToRender?: IMkEnvs;
+ selectedStorageType: string;
}
const styles = (theme: Theme) =>
@@ -106,6 +109,8 @@ const TenantSize = ({
limitSize,
selectedStorageClass,
untouchedECField,
+ formToRender,
+ selectedStorageType,
}: ITenantSizeProps) => {
const [validationErrors, setValidationErrors] = useState({});
const [errorFlag, setErrorFlag] = useState(false);
@@ -174,7 +179,7 @@ const TenantSize = ({
//Validate Cluster Size
const size = volumeSize;
const factor = sizeFactor;
- const limitSize = getBytes("12", "Ti", true);
+ const limitSize = getBytes("16", "Ti", true);
const clusterCapacity: ICapacity = {
unit: factor,
@@ -185,13 +190,23 @@ const TenantSize = ({
clusterCapacity,
parseInt(nodes),
parseInt(limitSize),
- parseInt(drivesPerServer)
+ parseInt(drivesPerServer),
+ formToRender,
+ selectedStorageType
);
updateField("distribution", distrCalculate);
setErrorFlag(false);
setNodeError("");
- }, [nodes, volumeSize, sizeFactor, updateField, drivesPerServer]);
+ }, [
+ nodes,
+ volumeSize,
+ sizeFactor,
+ updateField,
+ drivesPerServer,
+ selectedStorageType,
+ formToRender,
+ ]);
/*Calculate Allocation End*/
@@ -406,6 +421,8 @@ const mapState = (state: AppState) => {
limitSize: state.tenants.createTenant.limitSize,
selectedStorageClass:
state.tenants.createTenant.fields.nameTenant.selectedStorageClass,
+ selectedStorageType:
+ state.tenants.createTenant.fields.nameTenant.selectedStorageType,
};
};
diff --git a/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantResources/utils.tsx b/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantResources/utils.tsx
index 0ea6ce144..7ce804ae2 100644
--- a/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantResources/utils.tsx
+++ b/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantResources/utils.tsx
@@ -17,6 +17,7 @@
import React from "react";
import { Opts } from "../../../ListTenants/utils";
import TenantSizeMK from "./TenantSizeMK";
+import TenantSize from "./TenantSize";
export enum IMkEnvs {
"aws",
@@ -38,11 +39,12 @@ export interface IntegrationConfiguration {
memory: number;
drivesPerServer: number;
driveSize: IDriveSizing;
+ minimumVolumeSize?: IDriveSizing;
}
export const AWSStorageTypes: Opts[] = [
- { label: "NVME", value: "nvme" },
- { label: "HDD", value: "hdd" },
+ { label: "Performance Optimized", value: "performance" },
+ { label: "Capacity Optimized", value: "capacity" },
];
export const AzureStorageTypes: Opts[] = [
@@ -59,20 +61,22 @@ export const resourcesConfigurations = {
export const AWSConfigurations: IntegrationConfiguration[] = [
{
- typeSelection: "nvme",
- storageClass: "nvme-i3en-12xlarge",
- CPU: 48,
- memory: 384,
- driveSize: { driveSize: "7500", sizeUnit: "Gi" },
+ typeSelection: "performance",
+ storageClass: "performance-c6gn-16xlarge",
+ CPU: 64,
+ memory: 128,
+ driveSize: { driveSize: "32", sizeUnit: "Gi" },
drivesPerServer: 4,
+ minimumVolumeSize: { driveSize: "32", sizeUnit: "Gi" },
},
{
- typeSelection: "hdd",
- storageClass: "hdd-d3en-12xlarge",
- CPU: 8,
- memory: 32,
- driveSize: { driveSize: "12.7", sizeUnit: "Ti" },
- drivesPerServer: 4,
+ typeSelection: "capacity",
+ storageClass: "capacity-c6gn-16xlarge",
+ CPU: 64,
+ memory: 128,
+ driveSize: { driveSize: "16", sizeUnit: "Ti" },
+ drivesPerServer: 18,
+ minimumVolumeSize: { driveSize: "16", sizeUnit: "Ti" },
},
];
@@ -132,12 +136,19 @@ export const GCPConfigurations: IntegrationConfiguration[] = [
},
];
-export const mkPanelConfigurations = {
+interface mkConfiguration {
+ variantSelectorLabel?: string;
+ variantSelectorValues?: Opts[];
+ configurations?: IntegrationConfiguration[];
+ sizingComponent?: JSX.Element;
+}
+
+export const mkPanelConfigurations: { [index: number]: mkConfiguration } = {
[IMkEnvs.aws]: {
variantSelectorLabel: "Storage Type",
variantSelectorValues: AWSStorageTypes,
configurations: AWSConfigurations,
- sizingComponent: ,
+ sizingComponent: ,
},
[IMkEnvs.azure]: {
variantSelectorLabel: "VM Size",
diff --git a/portal-ui/src/screens/Console/Tenants/actions.ts b/portal-ui/src/screens/Console/Tenants/actions.ts
index 7307c5a44..a7abe9b59 100644
--- a/portal-ui/src/screens/Console/Tenants/actions.ts
+++ b/portal-ui/src/screens/Console/Tenants/actions.ts
@@ -37,6 +37,7 @@ import {
ADD_TENANT_SET_LIMIT_SIZE,
ADD_TENANT_SET_PAGE_VALID,
ADD_TENANT_SET_STORAGE_CLASSES_LIST,
+ ADD_TENANT_SET_STORAGE_TYPE,
ADD_TENANT_UPDATE_FIELD,
TENANT_DETAILS_SET_CURRENT_TENANT,
TENANT_DETAILS_SET_LOADING,
@@ -84,6 +85,14 @@ export const setStorageClassesList = (storageClasses: Opts[]) => {
};
};
+export const setStorageType = (storageType: string, features?: string[]) => {
+ return {
+ type: ADD_TENANT_SET_STORAGE_TYPE,
+ storageType,
+ features,
+ };
+};
+
export const setLimitSize = (limitSize: any) => {
return {
type: ADD_TENANT_SET_LIMIT_SIZE,
diff --git a/portal-ui/src/screens/Console/Tenants/reducer.ts b/portal-ui/src/screens/Console/Tenants/reducer.ts
index f699cb791..d1cfc00df 100644
--- a/portal-ui/src/screens/Console/Tenants/reducer.ts
+++ b/portal-ui/src/screens/Console/Tenants/reducer.ts
@@ -36,6 +36,7 @@ import {
ADD_TENANT_SET_KEY_PAIR_VALUE,
ADD_TENANT_SET_LIMIT_SIZE,
ADD_TENANT_SET_PAGE_VALID,
+ ADD_TENANT_SET_STORAGE_TYPE,
ADD_TENANT_SET_STORAGE_CLASSES_LIST,
ADD_TENANT_UPDATE_FIELD,
ITenantState,
@@ -47,6 +48,7 @@ import {
} from "./types";
import { KeyPair } from "./ListTenants/utils";
import { getRandomString } from "./utils";
+import { addTenantSetStorageTypeReducer } from "./reducers/add-tenant-reducer";
const initialState: ITenantState = {
createTenant: {
@@ -189,9 +191,9 @@ const initialState: ITenantState = {
},
},
tenantSize: {
- volumeSize: "100",
+ volumeSize: "1024",
sizeFactor: "Gi",
- drivesPerServer: "1",
+ drivesPerServer: "4",
nodes: "4",
memoryNode: "2",
ecParity: "",
@@ -401,6 +403,8 @@ export function tenantsReducer(
},
};
return { ...changeCL };
+ case ADD_TENANT_SET_STORAGE_TYPE:
+ return addTenantSetStorageTypeReducer(action, state);
case ADD_TENANT_SET_LIMIT_SIZE:
const changeSizeLimit = {
...state,
@@ -739,9 +743,9 @@ export function tenantsReducer(
},
},
tenantSize: {
- volumeSize: "100",
+ volumeSize: "1024",
sizeFactor: "Gi",
- drivesPerServer: "1",
+ drivesPerServer: "4",
nodes: "4",
memoryNode: "2",
ecParity: "",
diff --git a/portal-ui/src/screens/Console/Tenants/reducers/add-tenant-reducer.ts b/portal-ui/src/screens/Console/Tenants/reducers/add-tenant-reducer.ts
new file mode 100644
index 000000000..9ff3781df
--- /dev/null
+++ b/portal-ui/src/screens/Console/Tenants/reducers/add-tenant-reducer.ts
@@ -0,0 +1,110 @@
+// This file is part of MinIO Console Server
+// Copyright (c) 2022 MinIO, Inc.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+import { ITenantState, SetStorageType } from "../types";
+import {
+ IMkEnvs,
+ IntegrationConfiguration,
+ mkPanelConfigurations,
+ resourcesConfigurations,
+} from "../AddTenant/Steps/TenantResources/utils";
+import get from "lodash/get";
+import { getBytesNumber } from "../../../../common/utils";
+
+export const addTenantSetStorageTypeReducer = (
+ action: SetStorageType,
+ state: ITenantState
+) => {
+ let size = state.createTenant.fields.tenantSize.volumeSize;
+ let sizeFactor = state.createTenant.fields.tenantSize.sizeFactor;
+ let volumeSize = state.createTenant.fields.tenantSize.volumeSize;
+ // for the aws marketplace integration we have some constraints
+ // on the minimum cluster size
+
+ if (action.features !== undefined && action.features.length > 0) {
+ let formToRender = IMkEnvs.default;
+ const possibleVariables = Object.keys(resourcesConfigurations);
+
+ possibleVariables.forEach((element) => {
+ if (action.features !== undefined && action.features.includes(element)) {
+ formToRender = get(resourcesConfigurations, element, IMkEnvs.default);
+ }
+ });
+
+ // if the size is less than the minimum for the selected storage type
+ // we will override the current total storage entered amount with the minimum
+ if (formToRender !== undefined) {
+ const setConfigs = mkPanelConfigurations[formToRender];
+ const keyCount = Object.keys(setConfigs).length;
+
+ //Configuration is filled
+ if (keyCount > 0) {
+ const configs: IntegrationConfiguration[] = get(
+ setConfigs,
+ "configurations",
+ []
+ );
+ const mainSelection = configs.find(
+ (item) => item.typeSelection === action.storageType
+ );
+ if (mainSelection !== undefined && mainSelection.minimumVolumeSize) {
+ const minimumSize = getBytesNumber(
+ mainSelection.minimumVolumeSize?.driveSize,
+ mainSelection.minimumVolumeSize?.sizeUnit,
+ true
+ );
+
+ const drivesPerServer =
+ state.createTenant.fields.tenantSize.drivesPerServer;
+ const nodes = state.createTenant.fields.tenantSize.drivesPerServer;
+
+ const currentSize = getBytesNumber(size.toString(), sizeFactor, true);
+ if (currentSize < minimumSize) {
+ size = minimumSize.toString(10);
+ const totalSize =
+ parseInt(nodes) *
+ parseInt(drivesPerServer) *
+ parseInt(mainSelection.minimumVolumeSize.driveSize);
+
+ volumeSize = totalSize.toString(10);
+ sizeFactor = mainSelection.minimumVolumeSize.sizeUnit;
+ }
+ }
+ }
+ }
+ }
+
+ const newstate = {
+ ...state,
+ createTenant: {
+ ...state.createTenant,
+ fields: {
+ ...state.createTenant.fields,
+ nameTenant: {
+ ...state.createTenant.fields.nameTenant,
+ selectedStorageType: action.storageType,
+ },
+ tenantSize: {
+ ...state.createTenant.fields.tenantSize,
+ size: size,
+ volumeSize: volumeSize,
+ sizeFactor: sizeFactor,
+ },
+ },
+ },
+ };
+ return { ...newstate };
+};
diff --git a/portal-ui/src/screens/Console/Tenants/types.ts b/portal-ui/src/screens/Console/Tenants/types.ts
index 3011395c5..ac0b6149a 100644
--- a/portal-ui/src/screens/Console/Tenants/types.ts
+++ b/portal-ui/src/screens/Console/Tenants/types.ts
@@ -34,6 +34,8 @@ export const ADD_TENANT_RESET_FORM = "ADD_TENANT/RESET_FORM";
export const ADD_TENANT_SET_STORAGE_CLASSES_LIST =
"ADD_TENANT/SET_STORAGE_CLASSES_LIST";
export const ADD_TENANT_SET_LIMIT_SIZE = "ADD_TENANT/SET_LIMIT_SIZE";
+export const ADD_TENANT_SET_STORAGE_TYPE =
+ "ADD_TENANT/ADD_TENANT_SET_STORAGE_TYPE";
// Security
export const ADD_TENANT_ADD_MINIO_KEYPAIR = "ADD_TENANT/ADD_MINIO_KEYPAIR";
@@ -390,6 +392,12 @@ interface SetLimitSize {
limitSize: any;
}
+export interface SetStorageType {
+ type: typeof ADD_TENANT_SET_STORAGE_TYPE;
+ storageType: string;
+ features?: string[];
+}
+
interface AddMinioKeyPair {
type: typeof ADD_TENANT_ADD_MINIO_KEYPAIR;
}
@@ -519,6 +527,7 @@ export type TenantsManagementTypes =
| UpdateATField
| SetPageValid
| SetStorageClassesList
+ | SetStorageType
| SetLimitSize
| AddMinioKeyPair
| DeleteMinioKeyPair