diff --git a/x-pack/plugins/snapshot_restore/__jest__/client_integration/policy_add.test.ts b/x-pack/plugins/snapshot_restore/__jest__/client_integration/policy_add.test.ts index d7ce5168be66e..6e884069f1373 100644 --- a/x-pack/plugins/snapshot_restore/__jest__/client_integration/policy_add.test.ts +++ b/x-pack/plugins/snapshot_restore/__jest__/client_integration/policy_add.test.ts @@ -78,29 +78,51 @@ describe('', () => { test('should require a policy name', async () => { const { form, find } = testBed; + // Verify required validation form.setInputValue('nameInput', ''); find('nameInput').simulate('blur'); - expect(form.getErrorsMessages()).toEqual(['Policy name is required.']); + + // Enter valid policy name and verify no error messages + form.setInputValue('nameInput', 'my_policy'); + find('nameInput').simulate('blur'); + + expect(form.getErrorsMessages()).toEqual([]); }); - test('should require a snapshot name', () => { + test('should require a snapshot name that is lowercase', () => { const { form, find } = testBed; + // Verify required validation form.setInputValue('snapshotNameInput', ''); find('snapshotNameInput').simulate('blur'); - expect(form.getErrorsMessages()).toEqual(['Snapshot name is required.']); + + // Verify lowercase validation + form.setInputValue('snapshotNameInput', 'MY_SNAPSHOT'); + find('snapshotNameInput').simulate('blur'); + expect(form.getErrorsMessages()).toEqual(['Snapshot name needs to be lowercase.']); + + // Enter valid snapshot name and verify no error messages + form.setInputValue('snapshotNameInput', 'my_snapshot'); + find('snapshotNameInput').simulate('blur'); + + expect(form.getErrorsMessages()).toEqual([]); }); it('should require a schedule', () => { const { form, find } = testBed; + // Verify required validation find('showAdvancedCronLink').simulate('click'); form.setInputValue('advancedCronInput', ''); find('advancedCronInput').simulate('blur'); - expect(form.getErrorsMessages()).toEqual(['Schedule is required.']); + + // Enter valid schedule and verify no error messages + form.setInputValue('advancedCronInput', '0 30 1 * * ?'); + find('advancedCronInput').simulate('blur'); + expect(form.getErrorsMessages()).toEqual([]); }); }); diff --git a/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/index.ts b/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/index.ts index b71104cc003f0..5e4b71e4ed2a2 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/index.ts +++ b/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/index.ts @@ -6,13 +6,16 @@ */ import { SlmPolicyPayload } from '../../../../../common/types'; -import { PolicyValidation } from '../../../services/validation'; +import { PolicyValidation, ValidatePolicyHelperData } from '../../../services/validation'; export interface StepProps { policy: SlmPolicyPayload; indices: string[]; dataStreams: string[]; - updatePolicy: (updatedSettings: Partial, validationHelperData?: any) => void; + updatePolicy: ( + updatedSettings: Partial, + validationHelperData?: ValidatePolicyHelperData + ) => void; isEditing: boolean; currentUrl: string; errors: PolicyValidation['errors']; diff --git a/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/step_logistics.tsx b/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/step_logistics.tsx index 5545e8a87d99d..6443d774c9ac7 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/step_logistics.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/step_logistics.tsx @@ -46,11 +46,8 @@ export const PolicyStepLogistics: React.FunctionComponent = ({ const { error: errorLoadingRepositories, isLoading: isLoadingRepositories, - data: { repositories, managedRepository } = { + data: { repositories } = { repositories: [], - managedRepository: { - name: undefined, - }, }, resendRequest: reloadRepositories, } = useLoadRepositories(); @@ -119,16 +116,9 @@ export const PolicyStepLogistics: React.FunctionComponent = ({ fullWidth onBlur={() => setTouched({ ...touched, name: true })} onChange={(e) => { - updatePolicy( - { - name: e.target.value, - }, - { - managedRepository, - isEditing, - policyName: policy.name, - } - ); + updatePolicy({ + name: e.target.value, + }); }} placeholder={i18n.translate( 'xpack.snapshotRestore.policyForm.stepLogistics.namePlaceholder', @@ -251,16 +241,9 @@ export const PolicyStepLogistics: React.FunctionComponent = ({ ); } else { if (!policy.repository) { - updatePolicy( - { - repository: repositories[0].name, - }, - { - managedRepository, - isEditing, - policyName: policy.name, - } - ); + updatePolicy({ + repository: repositories[0].name, + }); } } @@ -286,16 +269,9 @@ export const PolicyStepLogistics: React.FunctionComponent = ({ value={!doesRepositoryExist ? '' : policy.repository} onBlur={() => setTouched({ ...touched, repository: true })} onChange={(e) => { - updatePolicy( - { - repository: e.target.value, - }, - { - managedRepository, - isEditing, - policyName: policy.name, - } - ); + updatePolicy({ + repository: e.target.value, + }); }} fullWidth data-test-subj="repositorySelect" @@ -354,16 +330,9 @@ export const PolicyStepLogistics: React.FunctionComponent = ({ defaultValue={policy.snapshotName} fullWidth onChange={(e) => { - updatePolicy( - { - snapshotName: e.target.value, - }, - { - managedRepository, - isEditing, - policyName: policy.name, - } - ); + updatePolicy({ + snapshotName: e.target.value, + }); }} onBlur={() => setTouched({ ...touched, snapshotName: true })} placeholder={i18n.translate( @@ -433,16 +402,9 @@ export const PolicyStepLogistics: React.FunctionComponent = ({ defaultValue={policy.schedule} fullWidth onChange={(e) => { - updatePolicy( - { - schedule: e.target.value, - }, - { - managedRepository, - isEditing, - policyName: policy.name, - } - ); + updatePolicy({ + schedule: e.target.value, + }); }} onBlur={() => setTouched({ ...touched, schedule: true })} placeholder={DEFAULT_POLICY_SCHEDULE} @@ -456,16 +418,9 @@ export const PolicyStepLogistics: React.FunctionComponent = ({ { setIsAdvancedCronVisible(false); - updatePolicy( - { - schedule: simpleCron.expression, - }, - { - managedRepository, - isEditing, - policyName: policy.name, - } - ); + updatePolicy({ + schedule: simpleCron.expression, + }); }} data-test-subj="showBasicCronLink" > @@ -493,16 +448,9 @@ export const PolicyStepLogistics: React.FunctionComponent = ({ frequency, }); setFieldToPreferredValueMap(newFieldToPreferredValueMap); - updatePolicy( - { - schedule: expression, - }, - { - managedRepository, - isEditing, - policyName: policy.name, - } - ); + updatePolicy({ + schedule: expression, + }); }} /> diff --git a/x-pack/plugins/snapshot_restore/public/application/services/validation/validate_policy.ts b/x-pack/plugins/snapshot_restore/public/application/services/validation/validate_policy.ts index f200fe3a8210c..3d6005f86857a 100644 --- a/x-pack/plugins/snapshot_restore/public/application/services/validation/validate_policy.ts +++ b/x-pack/plugins/snapshot_restore/public/application/services/validation/validate_policy.ts @@ -28,12 +28,6 @@ const isSnapshotNameNotLowerCase = (str: string): boolean => { }; export interface ValidatePolicyHelperData { - managedRepository?: { - name: string; - policy: string; - }; - isEditing?: boolean; - policyName?: string; /** * Whether to block on the indices configured for this snapshot. * @@ -58,13 +52,7 @@ export const validatePolicy = ( const i18n = textService.i18n; const { name, snapshotName, schedule, repository, config, retention } = policy; - const { - managedRepository, - isEditing, - policyName, - validateIndicesCount, - repositoryDoesNotExist, - } = validationHelperData; + const { validateIndicesCount, repositoryDoesNotExist } = validationHelperData; const validation: PolicyValidation = { isValid: true, @@ -160,22 +148,6 @@ export const validatePolicy = ( ); } - if ( - managedRepository && - managedRepository.name === repository && - managedRepository.policy && - !(isEditing && managedRepository.policy === policyName) - ) { - validation.errors.repository.push( - i18n.translate('xpack.snapshotRestore.policyValidation.invalidRepoErrorMessage', { - defaultMessage: 'Policy "{policyName}" is already associated with this repository.', - values: { - policyName: managedRepository.policy, - }, - }) - ); - } - if (retention && retention.expireAfterValue && retention.expireAfterValue < 0) { validation.errors.expireAfterValue.push( i18n.translate( diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 74c45a309f197..c78516e18b1ee 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -19880,7 +19880,6 @@ "xpack.snapshotRestore.policyValidation.invalidNegativeDeleteAfterErrorMessage": "次の期間後削除は負数にすることができません。", "xpack.snapshotRestore.policyValidation.invalidNegativeMaxCountErrorMessage": "最大カウントは負数にすることができません。", "xpack.snapshotRestore.policyValidation.invalidNegativeMinCountErrorMessage": "最小カウントは負数にすることができません。", - "xpack.snapshotRestore.policyValidation.invalidRepoErrorMessage": "ポリシー\"{policyName}\"は既にこのリポジトリに関連付けられています。", "xpack.snapshotRestore.policyValidation.nameRequiredErroMessage": "ポリシー名が必要です。", "xpack.snapshotRestore.policyValidation.repositoryRequiredErrorMessage": "レポジトリが必要です。", "xpack.snapshotRestore.policyValidation.scheduleRequiredErrorMessage": "スケジュールが必要です。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 7233fa023a66d..3ec18fe7b0362 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -19926,7 +19926,6 @@ "xpack.snapshotRestore.policyValidation.invalidNegativeDeleteAfterErrorMessage": "“在指定时间后删除”不能为负。", "xpack.snapshotRestore.policyValidation.invalidNegativeMaxCountErrorMessage": "“最大计数”不能为负。", "xpack.snapshotRestore.policyValidation.invalidNegativeMinCountErrorMessage": "“最小计数”不能为负。", - "xpack.snapshotRestore.policyValidation.invalidRepoErrorMessage": "策略“{policyName}”已与此存储库关联。", "xpack.snapshotRestore.policyValidation.nameRequiredErroMessage": "策略名称必填。", "xpack.snapshotRestore.policyValidation.repositoryRequiredErrorMessage": "存储库必填。", "xpack.snapshotRestore.policyValidation.scheduleRequiredErrorMessage": "计划必填。",