Skip to content

Commit

Permalink
Everest-777 | new resources defaults (#734)
Browse files Browse the repository at this point in the history
* chore: remove unused export

* chore: DEFAULT_SIZES -> NODES_DEFAULT_SIZES

* chore: different node sizes per db type

* feat: add new default proxy resources

* fix: set proper default resources on db type change

* chore: further improve setDefaultsForDbType()

* chore: add back minimum limits for cpu & memory

* fix: resource matching on edition

* fix: do not allow disk update on edit modal

* fix: reset touched state for number of proxies

* fix: e2e test

* feat: use memory units

* Revert "feat: use memory units"

This reverts commit f5a9814.

* fix: e2e test
  • Loading branch information
fabio-silva authored Oct 8, 2024
1 parent 78905ea commit b6b1783
Show file tree
Hide file tree
Showing 10 changed files with 205 additions and 77 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -216,13 +216,13 @@ test.describe('DB Cluster creation', () => {
expect(addedCluster).not.toBeUndefined();
expect(addedCluster?.spec.engine.type).toBe('psmdb');
expect(addedCluster?.spec.engine.replicas).toBe(3);
expect(['600m', '0.6']).toContain(
addedCluster?.spec.engine.resources?.cpu.toString()
);
expect(addedCluster?.spec.engine.resources?.memory.toString()).toBe('1G');
expect(addedCluster?.spec.engine.storage.size.toString()).toBe('1Gi');
expect(addedCluster?.spec.engine.resources?.cpu.toString()).toBe('1');
expect(addedCluster?.spec.engine.resources?.memory.toString()).toBe('4G');
expect(addedCluster?.spec.engine.storage.size.toString()).toBe('25Gi');
expect(addedCluster?.spec.proxy.expose.type).toBe('internal');
expect(addedCluster?.spec.proxy.replicas).toBe(3);
expect(addedCluster?.spec.proxy.replicas).toBe(1);
expect(addedCluster?.spec.proxy.resources.cpu).toBe('1');
expect(addedCluster?.spec.proxy.resources.memory).toBe('2G');
// expect(addedCluster?.spec.proxy.expose.ipSourceRanges).toEqual([
// '192.168.1.1/24',
// '192.168.1.0',
Expand Down
116 changes: 99 additions & 17 deletions ui/apps/everest/src/components/cluster-form/resources/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,19 @@ const resourceToNumber = (minimum = 0) =>
);

export const matchFieldsValueToResourceSize = (
dbType: DbType,
resources?: Resources
): ResourceSize => {
if (!resources) {
return ResourceSize.custom;
}
const memory = memoryParser(resources.memory.toString());

const res = Object.values(DEFAULT_SIZES).findIndex(
const res = Object.values(NODES_DEFAULT_SIZES[dbType]).findIndex(
(item) => item.cpu === Number(resources.cpu) && item.memory === memory.value
);
return res !== -1
? (Object.keys(DEFAULT_SIZES)[res] as ResourceSize)
? (Object.keys(NODES_DEFAULT_SIZES[dbType])[res] as ResourceSize)
: ResourceSize.custom;
};

Expand All @@ -50,21 +51,102 @@ export const humanizedResourceSizeMap: Record<ResourceSize, string> = {
[ResourceSize.custom]: 'Custom',
};

export const DEFAULT_SIZES = {
[ResourceSize.small]: {
[DbWizardFormFields.cpu]: 1,
[DbWizardFormFields.memory]: 2,
[DbWizardFormFields.disk]: 25,
export const NODES_DEFAULT_SIZES = {
[DbType.Mysql]: {
[ResourceSize.small]: {
[DbWizardFormFields.cpu]: 1,
[DbWizardFormFields.memory]: 2,
[DbWizardFormFields.disk]: 25,
},
[ResourceSize.medium]: {
[DbWizardFormFields.cpu]: 4,
[DbWizardFormFields.memory]: 8,
[DbWizardFormFields.disk]: 100,
},
[ResourceSize.large]: {
[DbWizardFormFields.cpu]: 8,
[DbWizardFormFields.memory]: 32,
[DbWizardFormFields.disk]: 200,
},
},
[ResourceSize.medium]: {
[DbWizardFormFields.cpu]: 4,
[DbWizardFormFields.memory]: 8,
[DbWizardFormFields.disk]: 100,
[DbType.Mongo]: {
[ResourceSize.small]: {
[DbWizardFormFields.cpu]: 1,
[DbWizardFormFields.memory]: 4,
[DbWizardFormFields.disk]: 25,
},
[ResourceSize.medium]: {
[DbWizardFormFields.cpu]: 4,
[DbWizardFormFields.memory]: 8,
[DbWizardFormFields.disk]: 100,
},
[ResourceSize.large]: {
[DbWizardFormFields.cpu]: 8,
[DbWizardFormFields.memory]: 32,
[DbWizardFormFields.disk]: 200,
},
},
[ResourceSize.large]: {
[DbWizardFormFields.cpu]: 8,
[DbWizardFormFields.memory]: 32,
[DbWizardFormFields.disk]: 200,
[DbType.Postresql]: {
[ResourceSize.small]: {
[DbWizardFormFields.cpu]: 1,
[DbWizardFormFields.memory]: 2,
[DbWizardFormFields.disk]: 25,
},
[ResourceSize.medium]: {
[DbWizardFormFields.cpu]: 4,
[DbWizardFormFields.memory]: 8,
[DbWizardFormFields.disk]: 100,
},
[ResourceSize.large]: {
[DbWizardFormFields.cpu]: 8,
[DbWizardFormFields.memory]: 32,
[DbWizardFormFields.disk]: 200,
},
},
};

export const PROXIES_DEFAULT_SIZES = {
[DbType.Mysql]: {
[ResourceSize.small]: {
[DbWizardFormFields.cpu]: 0.2,
[DbWizardFormFields.memory]: 0.2,
},
[ResourceSize.medium]: {
[DbWizardFormFields.cpu]: 0.5,
[DbWizardFormFields.memory]: 0.8,
},
[ResourceSize.large]: {
[DbWizardFormFields.cpu]: 0.8,
[DbWizardFormFields.memory]: 3,
},
},
[DbType.Mongo]: {
[ResourceSize.small]: {
[DbWizardFormFields.cpu]: 1,
[DbWizardFormFields.memory]: 2,
},
[ResourceSize.medium]: {
[DbWizardFormFields.cpu]: 2,
[DbWizardFormFields.memory]: 4,
},
[ResourceSize.large]: {
[DbWizardFormFields.cpu]: 4,
[DbWizardFormFields.memory]: 16,
},
},
[DbType.Postresql]: {
[ResourceSize.small]: {
[DbWizardFormFields.cpu]: 1,
[DbWizardFormFields.memory]: 0.03,
},
[ResourceSize.medium]: {
[DbWizardFormFields.cpu]: 4,
[DbWizardFormFields.memory]: 0.06,
},
[ResourceSize.large]: {
[DbWizardFormFields.cpu]: 8,
[DbWizardFormFields.memory]: 0.1,
},
},
};

Expand All @@ -90,8 +172,8 @@ export const resourcesFormSchema = (passthrough?: boolean) => {
[DbWizardFormFields.resourceSizePerNode]: z.nativeEnum(ResourceSize),
[DbWizardFormFields.numberOfNodes]: z.string(),
[DbWizardFormFields.customNrOfNodes]: z.string().optional(),
[DbWizardFormFields.proxyCpu]: resourceToNumber(0.6),
[DbWizardFormFields.proxyMemory]: resourceToNumber(0.512),
[DbWizardFormFields.proxyCpu]: resourceToNumber(0),
[DbWizardFormFields.proxyMemory]: resourceToNumber(0),
[DbWizardFormFields.resourceSizePerProxy]: z.nativeEnum(ResourceSize),
[DbWizardFormFields.numberOfProxies]: z.string(),
[DbWizardFormFields.customNrOfProxies]: z.string().optional(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,17 @@ import { useKubernetesClusterResourcesInfo } from 'hooks/api/kubernetesClusters/
import { useActiveBreakpoint } from 'hooks/utils/useActiveBreakpoint';
import {
CUSTOM_NR_UNITS_INPUT_VALUE,
DEFAULT_SIZES,
NODES_DEFAULT_SIZES,
humanizedResourceSizeMap,
NODES_DB_TYPE_MAP,
ResourceSize,
SHARDING_DEFAULTS,
PROXIES_DEFAULT_SIZES,
} from './constants';
import { DbWizardFormFields } from 'consts';
import { DbType } from '@percona/types';
import { getProxyUnitNamesFromDbType } from './utils';

import { ResourcesTogglesProps, ResourceInputProps } from './resources.types';
import { Messages } from './messages';

Expand Down Expand Up @@ -124,6 +126,7 @@ const ResourcesToggles = ({
unit = 'node',
unitPlural = `${unit}s`,
options,
sizeOptions,
resourceSizePerUnitInputName,
cpuInputName,
diskInputName = '',
Expand Down Expand Up @@ -166,11 +169,11 @@ const ResourcesToggles = ({

useEffect(() => {
if (resourceSizePerUnit && resourceSizePerUnit !== ResourceSize.custom) {
setValue(cpuInputName, DEFAULT_SIZES[resourceSizePerUnit].cpu);
setValue(cpuInputName, sizeOptions[resourceSizePerUnit].cpu);
if (allowDiskInputUpdate) {
setValue(diskInputName, DEFAULT_SIZES[resourceSizePerUnit].disk);
setValue(diskInputName, sizeOptions[resourceSizePerUnit].disk);
}
setValue(memoryInputName, DEFAULT_SIZES[resourceSizePerUnit].memory);
setValue(memoryInputName, sizeOptions[resourceSizePerUnit].memory);
}
}, [resourceSizePerUnit, allowDiskInputUpdate, setValue]);

Check warning on line 178 in ui/apps/everest/src/components/cluster-form/resources/resources.tsx

View workflow job for this annotation

GitHub Actions / CI_checks (lint)

React Hook useEffect has missing dependencies: 'cpuInputName', 'diskInputName', 'memoryInputName', and 'sizeOptions'. Either include them or remove the dependency array

Expand All @@ -183,7 +186,7 @@ const ResourcesToggles = ({
useEffect(() => {
if (
resourceSizePerUnit !== ResourceSize.custom &&
cpu !== DEFAULT_SIZES[resourceSizePerUnit].cpu
cpu !== sizeOptions[resourceSizePerUnit].cpu
) {
setValue(resourceSizePerUnitInputName, ResourceSize.custom);
}
Expand All @@ -192,7 +195,7 @@ const ResourcesToggles = ({
useEffect(() => {
if (
resourceSizePerUnit !== ResourceSize.custom &&
disk !== DEFAULT_SIZES[resourceSizePerUnit].disk
disk !== sizeOptions[resourceSizePerUnit].disk
) {
setValue(resourceSizePerUnitInputName, ResourceSize.custom);
}
Expand All @@ -201,7 +204,7 @@ const ResourcesToggles = ({
useEffect(() => {
if (
resourceSizePerUnit !== ResourceSize.custom &&
memory !== DEFAULT_SIZES[resourceSizePerUnit].memory
memory !== sizeOptions[resourceSizePerUnit].memory
) {
setValue(resourceSizePerUnitInputName, ResourceSize.custom);
}
Expand Down Expand Up @@ -481,6 +484,7 @@ const ResourcesForm = ({
<ResourcesToggles
dbType={dbType}
options={NODES_DB_TYPE_MAP[dbType]}
sizeOptions={NODES_DEFAULT_SIZES[dbType]}
resourceSizePerUnitInputName={DbWizardFormFields.resourceSizePerNode}
cpuInputName={DbWizardFormFields.cpu}
diskInputName={DbWizardFormFields.disk}
Expand Down Expand Up @@ -510,6 +514,7 @@ const ResourcesForm = ({
unit={proxyUnitNames.singular}
unitPlural={proxyUnitNames.plural}
options={NODES_DB_TYPE_MAP[dbType]}
sizeOptions={PROXIES_DEFAULT_SIZES[dbType]}
resourceSizePerUnitInputName={DbWizardFormFields.resourceSizePerProxy}
cpuInputName={DbWizardFormFields.proxyCpu}
memoryInputName={DbWizardFormFields.proxyMemory}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import { DbType } from '@percona/types';

type Resources = Omit<Record<'cpu' | 'memory' | 'disk', number>, 'disk'> &
Partial<Pick<Record<'cpu' | 'memory' | 'disk', number>, 'disk'>>;

export type ResourcesTogglesProps = {
unit?: string;
unitPlural?: string;
options: string[];
sizeOptions: Record<'small' | 'medium' | 'large', Resources>;
resourceSizePerUnitInputName: string;
cpuInputName: string;
diskInputName?: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ import { filterAvailableDbVersionsForDbEngineEdition } from 'components/cluster-
import { useDatabasePageDefaultValues } from '../../../useDatabaseFormDefaultValues.ts';
import { useNamespacePermissionsForResource } from 'hooks/rbac';
import { useDBEnginesForNamespaces } from 'hooks/api/namespaces/useNamespaces.ts';
import {
NODES_DEFAULT_SIZES,
PROXIES_DEFAULT_SIZES,
ResourceSize,
} from 'components/cluster-form';
import { DbVersion } from 'components/cluster-form/db-version';
import { generateShortUID } from 'utils/generateShortUID';

Expand Down Expand Up @@ -157,6 +162,41 @@ export const FirstStep = ({ loadingDefaultsForEdition }: StepProps) => {
const setDefaultsForDbType = useCallback((dbType: DbType) => {
setValue(DbWizardFormFields.dbType, dbType);
setValue(DbWizardFormFields.numberOfNodes, DEFAULT_NODES[dbType]);
setValue(DbWizardFormFields.numberOfProxies, DEFAULT_NODES[dbType]);
setValue(DbWizardFormFields.resourceSizePerNode, ResourceSize.small);
setValue(DbWizardFormFields.resourceSizePerProxy, ResourceSize.small);
setValue(DbWizardFormFields.cpu, NODES_DEFAULT_SIZES[dbType].small.cpu);
setValue(
DbWizardFormFields.proxyCpu,
PROXIES_DEFAULT_SIZES[dbType].small.cpu
);
setValue(
DbWizardFormFields.memory,
NODES_DEFAULT_SIZES[dbType].small.memory
);
setValue(
DbWizardFormFields.proxyMemory,
PROXIES_DEFAULT_SIZES[dbType].small.memory
);
setValue(DbWizardFormFields.disk, NODES_DEFAULT_SIZES[dbType].small.disk);
setValue(DbWizardFormFields.shardNr, DB_WIZARD_DEFAULTS.shardNr);
setValue(
DbWizardFormFields.shardConfigServers,
DB_WIZARD_DEFAULTS.shardConfigServers
);

resetField(DbWizardFormFields.numberOfProxies, {
keepTouched: false,
});
resetField(DbWizardFormFields.shardNr, {
keepError: false,
});
resetField(DbWizardFormFields.shardConfigServers, {
keepError: false,
});
resetField(DbWizardFormFields.sharding, {
keepError: false,
});
}, []);

const onDbTypeChange = useCallback(
Expand All @@ -169,27 +209,7 @@ export const FirstStep = ({ loadingDefaultsForEdition }: StepProps) => {
setRandomDbName(newDbType);
}

setValue(DbWizardFormFields.numberOfNodes, DEFAULT_NODES[newDbType]);
resetField(DbWizardFormFields.numberOfProxies, {
keepTouched: false,
});
setValue(DbWizardFormFields.numberOfProxies, DEFAULT_NODES[newDbType], {
shouldTouch: false,
});
setValue(DbWizardFormFields.shardNr, DB_WIZARD_DEFAULTS.shardNr);
setValue(
DbWizardFormFields.shardConfigServers,
DB_WIZARD_DEFAULTS.shardConfigServers
);
resetField(DbWizardFormFields.shardNr, {
keepError: false,
});
resetField(DbWizardFormFields.shardConfigServers, {
keepError: false,
});
resetField(DbWizardFormFields.sharding, {
keepError: false,
});
setDefaultsForDbType(newDbType);
updateDbVersions();
},
[getFieldState, resetField, setRandomDbName, updateDbVersions, setValue]
Expand Down
Loading

0 comments on commit b6b1783

Please sign in to comment.