Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions libs/locales/lib/en/translation.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ describe(`Assisted Installer Custom manifests step`, () => {
.fileUploadError()
.should(
'contain.text',
'File type is not supported. File type must be yaml, yml ,json , yaml.patch. or yml.patch.',
'File type is not supported. File type must be yaml, yml, json, yaml.patch. or yml.patch.',
);
commonActions.verifyNextIsDisabled();
});
Expand Down
6 changes: 3 additions & 3 deletions libs/ui-lib/lib/cim/components/Agent/BMCForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -151,14 +151,14 @@ const getValidationSchema = (usedHostnames: string[], origHostname: string, t: T
bmcAddress: bmcAddressValidationSchema(t),
username: Yup.string().required(t('ai:Required field')),
password: Yup.string().required(t('ai:Required field')),
bootMACAddress: macAddressValidationSchema,
bootMACAddress: macAddressValidationSchema(t),
nmState: Yup.string(),
macMapping: Yup.array().of(
Yup.object().shape(
{
macAddress: macAddressValidationSchema.when('name', {
macAddress: macAddressValidationSchema(t).when('name', {
is: (name: string) => !!name,
then: () => macAddressValidationSchema.required(t('ai:MAC has to be specified')),
then: (schema) => schema.required(t('ai:MAC has to be specified')),
}),
name: Yup.string().when('macAddress', {
is: (name: string) => !!name,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Form } from '@patternfly/react-core';
import { useFormikContext } from 'formik';

import {
acmClusterNameValidationMessages,
ExternalPlatformsDropdown,
isMajorMinorVersionEqualOrGreater,
OpenShiftVersionDropdown,
Expand All @@ -11,11 +12,7 @@ import {
import { StaticTextField } from '../../../../common/components/ui/StaticTextField';
import { PullSecret } from '../../../../common/components/clusters';
import { OpenshiftVersionOptionType, SupportedCpuArchitecture } from '../../../../common/types';
import {
InputField,
RichInputField,
acmClusterNameValidationMessages,
} from '../../../../common/components/ui/formik';
import { InputField, RichInputField } from '../../../../common/components/ui/formik';
import { ClusterDetailsValues } from '../../../../common/components/clusterWizard/types';
import { useTranslation } from '../../../../common/hooks/use-translation-wrapper';
import CpuArchitectureDropdown from '../../common/CpuArchitectureDropdown';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,7 @@ const getValidationSchema = (agentClusterInstall: AgentClusterInstallK8sResource
selectedHostIds: values.autoSelectHosts
? Yup.array(Yup.string())
: isSNOCluster
? Yup.array(Yup.string())
.min(1, t('ai:Please select one host for the cluster.'))
.max(1, t('ai:Please select one host for the cluster.')) // TODO(jtomasek): replace this with Yup.array().length() after updating Yup
? Yup.array(Yup.string()).length(1, t('ai:Please select one host for the cluster.'))
: Yup.array(Yup.string()).min(3, t('ai:Please select at least 3 hosts for the cluster.')),
});
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import React from 'react';
import * as Yup from 'yup';
import { TFunction } from 'i18next';

import { INFRAENV_AGENTINSTALL_LABEL_KEY } from '../common';
import { getHostSubnets } from '../../../common/components/clusterConfiguration/utils';
Expand Down Expand Up @@ -47,32 +48,33 @@ const getInfraEnvProxy = (infraEnvs: InfraEnvK8sResource[]) => {
const getNetworkConfigurationValidationSchema = (
initialValues: ClusterDeploymentNetworkingValues,
hostSubnets: HostSubnets,
t: TFunction,
openshiftVersion?: string,
) =>
Yup.lazy((values: ClusterDeploymentNetworkingValues) =>
Yup.object<ClusterDeploymentNetworkingValues>().shape({
clusterNetworks: clusterNetworksValidationSchema.when('stackType', {
clusterNetworks: clusterNetworksValidationSchema(t).when('stackType', {
is: (stackType: NetworkConfigurationValues['stackType']) => stackType === IPV4_STACK,
then: () => clusterNetworksValidationSchema.concat(IPv4ValidationSchema),
then: () => clusterNetworksValidationSchema(t).concat(IPv4ValidationSchema),
otherwise: () =>
clusterNetworksValidationSchema.concat(
dualStackValidationSchema('cluster network', openshiftVersion),
clusterNetworksValidationSchema(t).concat(
dualStackValidationSchema(t('ai:cluster network'), t, openshiftVersion),
),
}),
serviceNetworks: serviceNetworkValidationSchema.when('stackType', {
serviceNetworks: serviceNetworkValidationSchema(t).when('stackType', {
is: (stackType: NetworkConfigurationValues['stackType']) => stackType === IPV4_STACK,
then: () => serviceNetworkValidationSchema.concat(IPv4ValidationSchema),
then: () => serviceNetworkValidationSchema(t).concat(IPv4ValidationSchema),
otherwise: () =>
serviceNetworkValidationSchema.concat(
dualStackValidationSchema('service network', openshiftVersion),
serviceNetworkValidationSchema(t).concat(
dualStackValidationSchema(t('ai:service network'), t, openshiftVersion),
),
}),
apiVips: vipArrayValidationSchema(hostSubnets, values),
ingressVips: vipArrayValidationSchema(hostSubnets, values),
sshPublicKey: sshPublicKeyListValidationSchema,
httpProxy: httpProxyValidationSchema({ values, pairValueName: 'httpsProxy' }),
httpsProxy: httpProxyValidationSchema({ values, pairValueName: 'httpProxy' }), // share the schema, httpS is currently not supported
noProxy: noProxyValidationSchema,
apiVips: vipArrayValidationSchema(hostSubnets, values, t),
ingressVips: vipArrayValidationSchema(hostSubnets, values, t),
sshPublicKey: sshPublicKeyListValidationSchema(t),
httpProxy: httpProxyValidationSchema({ values, pairValueName: 'httpsProxy', t }),
httpsProxy: httpProxyValidationSchema({ values, pairValueName: 'httpProxy', t }), // share the schema, httpS is currently not supported
noProxy: noProxyValidationSchema(t),
}),
);

Expand All @@ -87,6 +89,7 @@ export const useNetworkingFormik = ({
agentClusterInstall,
agents,
}: UseNetworkingFormikArgs) => {
const { t } = useTranslation();
const initialValues = React.useMemo(
() => {
const cluster = getAICluster({
Expand All @@ -112,9 +115,10 @@ export const useNetworkingFormik = ({
return getNetworkConfigurationValidationSchema(
initialValues,
hostSubnets,
t,
cluster.openshiftVersion,
);
}, [initialValues, clusterDeployment, agentClusterInstall, agents]);
}, [clusterDeployment, agentClusterInstall, agents, t, initialValues]);

return {
initialValues,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ const useDetailsFormik: UseDetailsFormik = ({
() =>
Yup.object({
name: nameValidationSchema(t, usedClusterNames),
baseDnsDomain: dnsNameValidationSchema.required('Required'),
pullSecret: pullSecretValidationSchema.required('Required.'),
baseDnsDomain: dnsNameValidationSchema(t).required(t('ai:Required field')),
pullSecret: pullSecretValidationSchema(t).required(t('ai:Required field')),
}),
[usedClusterNames, t],
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,22 @@ import { useTranslation } from '../../../../../common/hooks/use-translation-wrap
const getValidationSchema = (t: TFunction) =>
Yup.lazy((values: NetworkFormValues) =>
Yup.object<NetworkFormValues>().shape({
sshPublicKey: sshPublicKeyValidationSchema.required(t('ai:Required field')),
sshPublicKey: sshPublicKeyValidationSchema(t).required(t('ai:Required field')),
clusterNetworkCidr: values.isAdvanced
? ipBlockValidationSchema(values.serviceNetworkCidr)
? ipBlockValidationSchema(values.serviceNetworkCidr, t)
: Yup.string(),
serviceNetworkCidr: values.isAdvanced
? ipBlockValidationSchema(values.clusterNetworkCidr)
? ipBlockValidationSchema(values.clusterNetworkCidr, t)
: Yup.string(),
clusterNetworkHostPrefix: values.isAdvanced
? hostPrefixValidationSchema(values.clusterNetworkCidr)
? hostPrefixValidationSchema(values.clusterNetworkCidr, t)
: Yup.number(),
httpProxy: httpProxyValidationSchema({ values, pairValueName: 'httpsProxy' }),
httpsProxy: httpProxyValidationSchema({ values, pairValueName: 'httpProxy' }), // share the schema, httpS is currently not supported
noProxy: noProxyValidationSchema,
httpProxy: httpProxyValidationSchema({ values, pairValueName: 'httpsProxy', t }),
httpsProxy: httpProxyValidationSchema({ values, pairValueName: 'httpProxy', t }), // share the schema, httpS is currently not supported
noProxy: noProxyValidationSchema(t),
nodePortAddress:
values.apiPublishingStrategy === 'NodePort'
? day2ApiVipValidationSchema.required(t('ai:Required field'))
? day2ApiVipValidationSchema(t).required(t('ai:Required field'))
: Yup.string(),
}),
);
Expand Down
14 changes: 8 additions & 6 deletions libs/ui-lib/lib/cim/components/InfraEnv/InfraEnvFormPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -76,32 +76,34 @@ const validationSchema = (usedNames: string[], t: TFunction) =>
Yup.lazy((values: EnvironmentStepFormValues) =>
Yup.object<EnvironmentStepFormValues>().shape({
name: richNameValidationSchema(t, usedNames),
location: locationValidationSchema(t).required(t('ai:Location is a required field.')),
pullSecret: pullSecretValidationSchema.required(t('ai:Pull secret is a required field.')),
sshPublicKey: sshPublicKeyValidationSchema,
location: locationValidationSchema(t),
pullSecret: pullSecretValidationSchema(t).required(t('ai:Required field')),
sshPublicKey: sshPublicKeyValidationSchema(t),
httpProxy: httpProxyValidationSchema({
values,
pairValueName: 'httpsProxy',
allowEmpty: true,
t,
}),
httpsProxy: httpProxyValidationSchema({
values,
pairValueName: 'httpProxy',
allowEmpty: true,
t,
}), // share the schema, httpS is currently not supported
noProxy: noProxyValidationSchema,
noProxy: noProxyValidationSchema(t),
labels: Yup.array()
.of(Yup.string())
.test(
'label-equals-validation',
'Label selector needs to be in a `key=value` form',
t('ai:Label needs to be in a `key=value` form'),
(values) =>
(values as string[]).every((value) => {
const parts = value.split('=');
return parts.length === 2;
}),
),
additionalNtpSources: ntpSourceValidationSchema,
additionalNtpSources: ntpSourceValidationSchema(t),
}),
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,15 @@ export const CimConfigurationModal: React.FC<CimConfigurationModalProps> = ({
};

const validationSchema = Yup.object<CimConfigurationValues>({
dbVolSize: Yup.number().min(MIN_DB_VOL_SIZE, t('ai:Minimal value is 1Gi')).required(),
fsVolSize: Yup.number().min(MIN_FS_VOL_SIZE, t('ai:Minimal value is 1Gi')).required(),
imgVolSize: Yup.number().min(MIN_IMG_VOL_SIZE, t('ai:Minimal value is 10Gi')).required(),
dbVolSize: Yup.number()
.min(MIN_DB_VOL_SIZE, t('ai:Minimal value is 1Gi'))
.required(t('ai:Required field')),
fsVolSize: Yup.number()
.min(MIN_FS_VOL_SIZE, t('ai:Minimal value is 1Gi'))
.required(t('ai:Required field')),
imgVolSize: Yup.number()
.min(MIN_IMG_VOL_SIZE, t('ai:Minimal value is 10Gi'))
.required(t('ai:Required field')),
configureLoadBalancer: Yup.boolean(),
ciscoIntersightURL: Yup.string().when('addCiscoIntersightUrl', {
is: true,
Expand Down
9 changes: 6 additions & 3 deletions libs/ui-lib/lib/cim/components/modals/EditProxyModal.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import * as React from 'react';
import * as Yup from 'yup';
import { TFunction } from 'i18next';
import {
Alert,
Button,
Expand All @@ -25,20 +26,22 @@ import {
import { getErrorMessage } from '../../../common/utils';
import { getWarningMessage } from './utils';

const validationSchema = () =>
const validationSchema = (t: TFunction) =>
Yup.lazy((values: ProxyFieldsType) =>
Yup.object<ProxyFieldsType>().shape({
httpProxy: httpProxyValidationSchema({
values,
pairValueName: 'httpsProxy',
allowEmpty: true,
t,
}),
httpsProxy: httpProxyValidationSchema({
values,
pairValueName: 'httpProxy',
allowEmpty: true,
t,
}),
noProxy: noProxyValidationSchema,
noProxy: noProxyValidationSchema(t),
}),
);

Expand Down Expand Up @@ -91,7 +94,7 @@ const EditProxyModal: React.FC<EditProxyModalProps> = ({
noProxy: infraEnv.spec?.proxy?.noProxy,
enableProxy,
}}
validationSchema={validationSchema}
validationSchema={validationSchema(t)}
onSubmit={async (values: ProxyFieldsType) => {
setError(undefined);
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import { useTranslation } from '../../../common/hooks/use-translation-wrapper';

const validationSchema = (t: TFunction) =>
Yup.object({
pullSecret: pullSecretValidationSchema.required(t('ai:Pull secret is a required field.')),
pullSecret: pullSecretValidationSchema(t).required(t('ai:Pull secret is a required field.')),
});

type EditPullSecretFormProps = {
Expand Down
14 changes: 8 additions & 6 deletions libs/ui-lib/lib/cim/components/modals/EditSSHKeyModal.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import * as React from 'react';
import * as Yup from 'yup';
import { TFunction } from 'i18next';
import {
Alert,
Button,
Expand All @@ -20,11 +21,12 @@ import { EditSSHKeyFormikValues } from './types';
import { getWarningMessage } from './utils';
import { useTranslation } from '../../../common/hooks/use-translation-wrapper';

const validationSchema = Yup.object({
sshPublicKey: sshPublicKeyValidationSchema.required(
'An SSH key is required to debug hosts as they register.',
),
});
const validationSchema = (t: TFunction) =>
Yup.object({
sshPublicKey: sshPublicKeyValidationSchema(t).required(
t('ai:An SSH key is required to debug hosts as they register.'),
),
});

export type EditSSHKeyModalProps = {
isOpen: boolean;
Expand Down Expand Up @@ -61,7 +63,7 @@ const EditSSHKeyModal: React.FC<EditSSHKeyModalProps> = ({
initialValues={{
sshPublicKey: infraEnv.spec?.sshAuthorizedKey || '',
}}
validationSchema={validationSchema}
validationSchema={validationSchema(t)}
onSubmit={async (values) => {
try {
await onSubmit(values, infraEnv);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import React from 'react';
import * as Yup from 'yup';
import { TFunction } from 'i18next';
import {
Button,
Form,
Expand All @@ -17,12 +18,12 @@ import {
ImageType,
Proxy,
} from '@openshift-assisted/types/assisted-installer-service';
import { AlertFormikError } from '../../../common/components/ui';
import {
AlertFormikError,
httpProxyValidationSchema,
noProxyValidationSchema,
sshPublicKeyValidationSchema,
} from '../../../common/components/ui';
} from '../../validationSchemas';
import { ProxyFieldsType, StatusErrorType } from '../../types';
import ProxyFields from './ProxyFields';
import UploadSSH from './UploadSSH';
Expand Down Expand Up @@ -55,13 +56,13 @@ export const StaticIPInfo = ({ docVersion }: { docVersion?: string }) => {

export type DiscoveryImageFormValues = ImageCreateParams & ProxyFieldsType;

const getValidationSchema = (allowEmpty: boolean) =>
const getValidationSchema = (allowEmpty: boolean, t: TFunction) =>
Yup.lazy((values: DiscoveryImageFormValues) =>
Yup.object<DiscoveryImageFormValues>().shape({
sshPublicKey: sshPublicKeyValidationSchema,
httpProxy: httpProxyValidationSchema({ values, pairValueName: 'httpsProxy', allowEmpty }),
httpsProxy: httpProxyValidationSchema({ values, pairValueName: 'httpProxy', allowEmpty }), // share the schema, httpS is currently not supported
noProxy: noProxyValidationSchema,
sshPublicKey: sshPublicKeyValidationSchema(t),
httpProxy: httpProxyValidationSchema({ values, pairValueName: 'httpsProxy', allowEmpty, t }),
httpsProxy: httpProxyValidationSchema({ values, pairValueName: 'httpProxy', allowEmpty, t }), // share the schema, httpS is currently not supported
noProxy: noProxyValidationSchema(t),
}),
);

Expand Down Expand Up @@ -108,7 +109,7 @@ export const DiscoveryImageConfigForm: React.FC<DiscoveryImageConfigFormProps> =
<Formik
initialValues={initialValues}
initialStatus={{ error: null }}
validationSchema={getValidationSchema(!!allowEmpty)}
validationSchema={getValidationSchema(!!allowEmpty, t)}
onSubmit={handleSubmit}
>
{({ submitForm, isSubmitting, status }) => {
Expand Down
Loading
Loading