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": "计划必填。",