diff options
author | andre.schmid <andre.schmid@est.tech> | 2019-07-24 08:57:20 +0000 |
---|---|---|
committer | Ofir Sonsino <ofir.sonsino@intl.att.com> | 2019-08-06 09:03:52 +0000 |
commit | 031db8630dda9706e22aa3bbdf0f2dfba33fb86e (patch) | |
tree | 5c0d076c02c6d67e01a154fab5245692232ee89a /openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test | |
parent | d7d87dc3a647e924bcf0e05e60c18f70cba3ed7b (diff) |
Validate PM Dictionary and VES Events YAML Files
Validate, during the package onboarding, YAML files declared in the
manifest as type onap_ves_events or onap_pm_dictionary under
non_mano_artifact_sets. Check if the file is not empty, if has a yaml
extension and if it has a valid yaml content.
Change-Id: I260d0f5355e9e77b6499f553f8aa9f7e6d0693da
Issue-ID: SDC-2475
Signed-off-by: andre.schmid <andre.schmid@est.tech>
Diffstat (limited to 'openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test')
7 files changed, 570 insertions, 16 deletions
diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/ManifestBuilderTest.java b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/ManifestBuilderTest.java index 72f235e287..e022e2fedb 100644 --- a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/ManifestBuilderTest.java +++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/ManifestBuilderTest.java @@ -24,6 +24,8 @@ import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.isEmptyString; +import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation.NonManoArtifactType.ONAP_PM_DICTIONARY; +import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation.NonManoArtifactType.ONAP_VES_EVENTS; import java.io.ByteArrayInputStream; import java.util.Arrays; @@ -109,8 +111,8 @@ public class ManifestBuilderTest { mockManifestSource(); final Map<String, List<String>> expectedNonManoArtifactMap = new TreeMap<>(); - expectedNonManoArtifactMap.put("onap_ves_events", Arrays.asList("Files/Events/MyPnf_Pnf_v1.yaml")); - expectedNonManoArtifactMap.put("onap_pm_dictionary", Arrays.asList("Files/Measurements/PM_Dictionary.yaml")); + expectedNonManoArtifactMap.put(ONAP_VES_EVENTS.getType(), Arrays.asList("Files/Events/MyPnf_Pnf_v1.yaml")); + expectedNonManoArtifactMap.put(ONAP_PM_DICTIONARY.getType(), Arrays.asList("Files/Measurements/PM_Dictionary.yaml")); expectedNonManoArtifactMap.put("onap_yang_modules", Arrays.asList("Files/Yang_module/mynetconf.yang", "Files/Yang_module/mynetconf2.yang")); expectedNonManoArtifactMap diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/SOL004MetaDirectoryValidatorTest.java b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/SOL004MetaDirectoryValidatorTest.java index 6a56db6e34..328f00ca90 100644 --- a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/SOL004MetaDirectoryValidatorTest.java +++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/SOL004MetaDirectoryValidatorTest.java @@ -38,6 +38,7 @@ import org.openecomp.sdc.logging.api.Logger; import org.openecomp.sdc.logging.api.LoggerFactory; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.hamcrest.Matchers.containsInAnyOrder; @@ -60,6 +61,8 @@ import static org.openecomp.sdc.tosca.csar.CSARConstants.VNF_PROVIDER_ID; import static org.openecomp.sdc.tosca.csar.CSARConstants.VNF_PACKAGE_VERSION; import static org.openecomp.sdc.tosca.csar.CSARConstants.VNF_RELEASE_DATE_TIME; +import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation.NonManoArtifactType.ONAP_PM_DICTIONARY; +import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation.NonManoArtifactType.ONAP_VES_EVENTS; import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.validation.TestConstants.*; public class SOL004MetaDirectoryValidatorTest { @@ -130,7 +133,7 @@ public class SOL004MetaDirectoryValidatorTest { handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8)); final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, folderList); - assertTrue(errors.size() == 0); + assertEquals(0, errors.size()); } @Test @@ -141,7 +144,7 @@ public class SOL004MetaDirectoryValidatorTest { final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList()); List<ErrorMessage> errorMessages = errors.get(SdcCommon.UPLOAD_FILE); assertTrue(errors.size() == 1 && errorMessages.size() == 1); - assertTrue(errorMessages.get(0).getLevel() == ErrorLevel.ERROR); + assertSame(ErrorLevel.ERROR, errorMessages.get(0).getLevel()); } /** @@ -209,7 +212,7 @@ public class SOL004MetaDirectoryValidatorTest { handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8)); final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList()); - assertTrue(errors.size() == 0); + assertEquals(0, errors.size()); } @Test @@ -241,7 +244,7 @@ public class SOL004MetaDirectoryValidatorTest { handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8)); final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList()); - assertTrue(errors.size() == 0); + assertEquals(0, errors.size()); } @Test @@ -345,14 +348,14 @@ public class SOL004MetaDirectoryValidatorTest { manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH); final String nonManoSource = "Artifacts/Deployment/Measurements/PM_Dictionary.yaml"; - handler.addFile(nonManoSource, "".getBytes()); - manifestBuilder.withNonManoArtifact("onap_pm_events", nonManoSource); + handler.addFile(nonManoSource, getResourceBytes("/validation.files/measurements/pmEvents-valid.yaml")); + manifestBuilder.withNonManoArtifact(ONAP_PM_DICTIONARY.getType(), nonManoSource); manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH); handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8)); final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList()); - assertTrue(errors.size() == 0); + assertEquals(0, errors.size()); } /** @@ -377,8 +380,8 @@ public class SOL004MetaDirectoryValidatorTest { manifestBuilder.withSource(SAMPLE_DEFINITION_IMPORT_FILE_PATH); String nonManoSource = "Artifacts/Deployment/Measurements/PM_Dictionary.yaml"; - handler.addFile(nonManoSource, "".getBytes()); - manifestBuilder.withNonManoArtifact("onap_pm_events", nonManoSource); + handler.addFile(nonManoSource, getResourceBytes("/validation.files/measurements/pmEvents-valid.yaml")); + manifestBuilder.withNonManoArtifact(ONAP_PM_DICTIONARY.getType(), nonManoSource); manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH); handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8)); @@ -422,7 +425,7 @@ public class SOL004MetaDirectoryValidatorTest { handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8)); final Map<String, List<ErrorMessage>> errors = sol004MetaDirectoryValidator.validateContent(handler, Collections.emptyList()); - assertTrue(errors.size() == 0); + assertEquals(0, errors.size()); } /** @@ -687,7 +690,7 @@ public class SOL004MetaDirectoryValidatorTest { * Tests an imported descriptor with a missing imported file. */ @Test - public void testGivenDefinitionFileWithImportedDescriptor_whenImportedDescriptorImportsMissingFile_thenMissingImportErrorOccur() throws IOException { + public void testGivenDefinitionFileWithImportedDescriptor_whenImportedDescriptorImportsMissingFile_thenMissingImportErrorOccur() { final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder(); handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8)); @@ -757,6 +760,150 @@ public class SOL004MetaDirectoryValidatorTest { assertExpectedErrors(actualErrorMap.get(SdcCommon.UPLOAD_FILE), expectedErrorList); } + @Test + public void givenManifestWithNonManoPmAndVesArtifacts_whenNonManoArtifactsAreValid_thenNoErrorsOccur() { + final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder(); + + handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8)); + manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME); + + handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH)); + manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH); + + handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8)); + manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH); + + final String nonManoPmEventsSource = "Artifacts/Deployment/Measurements/PM_Dictionary.yaml"; + handler.addFile(nonManoPmEventsSource, getResourceBytes("/validation.files/measurements/pmEvents-valid.yaml")); + manifestBuilder.withNonManoArtifact(ONAP_PM_DICTIONARY.getType(), nonManoPmEventsSource); + + final String nonManoVesEventsSource = "Artifacts/Deployment/Events/ves_events.yaml"; + handler.addFile(nonManoVesEventsSource, getResourceBytes("/validation.files/events/vesEvents-valid.yaml")); + manifestBuilder.withNonManoArtifact(ONAP_VES_EVENTS.getType(), nonManoVesEventsSource); + + manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH); + handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8)); + + final Map<String, List<ErrorMessage>> actualErrorMap = sol004MetaDirectoryValidator + .validateContent(handler, Collections.emptyList()); + + assertExpectedErrors(actualErrorMap.get(SdcCommon.UPLOAD_FILE), Collections.emptyList()); + } + + @Test + public void givenManifestWithNonManoPmOrVesArtifacts_whenNonManoArtifactsYamlAreInvalid_thenInvalidYamlErrorOccur() { + final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder(); + + handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8)); + manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME); + + handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH)); + manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH); + + handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8)); + manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH); + + final String nonManoPmEventsSource = "Artifacts/Deployment/Measurements/PM_Dictionary.yaml"; + handler.addFile(nonManoPmEventsSource, getResourceBytes(INVALID_YAML_FILE_PATH)); + manifestBuilder.withNonManoArtifact(ONAP_PM_DICTIONARY.getType(), nonManoPmEventsSource); + + manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH); + handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8)); + + final List<ErrorMessage> expectedErrorList = new ArrayList<>(); + expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR + , Messages.INVALID_YAML_FORMAT_1.formatMessage(nonManoPmEventsSource, "while scanning a simple key\n" + + " in 'reader', line 2, column 1:\n" + + " key {}\n" + + " ^\n" + + "could not find expected ':'\n" + + " in 'reader', line 2, column 7:\n" + + " {}\n" + + " ^\n")) + ); + + final Map<String, List<ErrorMessage>> actualErrorMap = sol004MetaDirectoryValidator + .validateContent(handler, Collections.emptyList()); + + assertExpectedErrors(actualErrorMap.get(SdcCommon.UPLOAD_FILE), expectedErrorList); + } + + @Test + public void givenManifestWithNonManoPmOrVesArtifacts_whenNonManoArtifactsYamlAreEmpty_thenEmptyYamlErrorOccur() { + final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder(); + + handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8)); + manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME); + + handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH)); + manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH); + + handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8)); + manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH); + + final String nonManoPmEventsSource = "Artifacts/Deployment/Measurements/PM_Dictionary.yaml"; + handler.addFile(nonManoPmEventsSource, getResourceBytes(EMPTY_YAML_FILE_PATH)); + manifestBuilder.withNonManoArtifact(ONAP_PM_DICTIONARY.getType(), nonManoPmEventsSource); + + final String nonManoVesEventsSource = "Artifacts/Deployment/Events/ves_events.yaml"; + handler.addFile(nonManoVesEventsSource, getResourceBytes(EMPTY_YAML_FILE_PATH)); + manifestBuilder.withNonManoArtifact(ONAP_VES_EVENTS.getType(), nonManoVesEventsSource); + + manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH); + handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8)); + + final List<ErrorMessage> expectedErrorList = new ArrayList<>(); + expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR + , Messages.EMPTY_YAML_FILE_1.formatMessage(nonManoPmEventsSource)) + ); + expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR + , Messages.EMPTY_YAML_FILE_1.formatMessage(nonManoVesEventsSource)) + ); + + final Map<String, List<ErrorMessage>> actualErrorMap = sol004MetaDirectoryValidator + .validateContent(handler, Collections.emptyList()); + + assertExpectedErrors(actualErrorMap.get(SdcCommon.UPLOAD_FILE), expectedErrorList); + } + + @Test + public void givenManifestWithNonManoPmOrVesArtifacts_whenNonManoArtifactsHaveNotYamlExtension_thenInvalidYamlExtensionErrorOccur() { + final ManifestBuilder manifestBuilder = getVnfManifestSampleBuilder(); + + handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8)); + manifestBuilder.withSource(TOSCA_META_PATH_FILE_NAME); + + handler.addFile(TOSCA_DEFINITION_FILEPATH, getResourceBytes(SAMPLE_DEFINITION_FILE_PATH)); + manifestBuilder.withSource(TOSCA_DEFINITION_FILEPATH); + + handler.addFile(TOSCA_CHANGELOG_FILEPATH, "".getBytes(StandardCharsets.UTF_8)); + manifestBuilder.withSource(TOSCA_CHANGELOG_FILEPATH); + + final String nonManoPmEventsSource = "Artifacts/Deployment/Measurements/PM_Dictionary.y1"; + handler.addFile(nonManoPmEventsSource, "".getBytes()); + manifestBuilder.withNonManoArtifact(ONAP_PM_DICTIONARY.getType(), nonManoPmEventsSource); + + final String nonManoVesEventsSource = "Artifacts/Deployment/Events/ves_events.y2"; + handler.addFile(nonManoVesEventsSource, "".getBytes()); + manifestBuilder.withNonManoArtifact(ONAP_VES_EVENTS.getType(), nonManoVesEventsSource); + + manifestBuilder.withSource(TOSCA_MANIFEST_FILEPATH); + handler.addFile(TOSCA_MANIFEST_FILEPATH, manifestBuilder.build().getBytes(StandardCharsets.UTF_8)); + + final List<ErrorMessage> expectedErrorList = new ArrayList<>(); + expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR + , Messages.INVALID_YAML_EXTENSION.formatMessage(nonManoPmEventsSource)) + ); + expectedErrorList.add(new ErrorMessage(ErrorLevel.ERROR + , Messages.INVALID_YAML_EXTENSION.formatMessage(nonManoVesEventsSource)) + ); + + final Map<String, List<ErrorMessage>> actualErrorMap = sol004MetaDirectoryValidator + .validateContent(handler, Collections.emptyList()); + + assertExpectedErrors(actualErrorMap.get(SdcCommon.UPLOAD_FILE), expectedErrorList); + } + private void assertExpectedErrors(final String testCase, final Map<String, List<ErrorMessage>> errors, final int expectedErrors){ final List<ErrorMessage> errorMessages = errors.get(SdcCommon.UPLOAD_FILE); printErrorMessages(errorMessages); @@ -769,9 +916,9 @@ public class SOL004MetaDirectoryValidatorTest { private void printErrorMessages(final List<ErrorMessage> errorMessages) { if (CollectionUtils.isNotEmpty(errorMessages)) { - errorMessages.forEach(errorMessage -> { - System.out.println(String.format("%s: %s", errorMessage.getLevel(), errorMessage.getMessage())); - }); + errorMessages.forEach(errorMessage -> + System.out.println(String.format("%s: %s", errorMessage.getLevel(), errorMessage.getMessage())) + ); } } @@ -808,6 +955,8 @@ public class SOL004MetaDirectoryValidatorTest { actualErrorList = new ArrayList<>(); } + printErrorMessages(actualErrorList); + assertThat("The actual error list should have the same size as the expected error list" , actualErrorList, hasSize(expectedErrorList.size()) ); diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/TestConstants.java b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/TestConstants.java index 57619646c9..42022fc90b 100644 --- a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/TestConstants.java +++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/TestConstants.java @@ -30,6 +30,8 @@ class TestConstants { public static final String TOSCA_DEFINITION_FILEPATH = "Definitions/MainServiceTemplate.yaml"; public static final String TOSCA_MANIFEST_FILEPATH = "Definitions/MainServiceTemplate.mf"; public static final String TOSCA_CHANGELOG_FILEPATH = "Artifacts/changeLog.text"; + public static final String EMPTY_YAML_FILE_PATH = "/validation.files/empty.yaml"; + public static final String INVALID_YAML_FILE_PATH = "/validation.files/invalid.yaml"; private TestConstants(){ diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/validation.files/empty.yaml b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/validation.files/empty.yaml new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/validation.files/empty.yaml diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/validation.files/events/vesEvents-valid.yaml b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/validation.files/events/vesEvents-valid.yaml new file mode 100644 index 0000000000..83f1d3e8e5 --- /dev/null +++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/validation.files/events/vesEvents-valid.yaml @@ -0,0 +1,213 @@ +--- +event: + presence: required + structure: + commonEventHeader: + presence: required + structure: + domain: {presence: required, value: notification} + eventName: {presence: required, value: Noti_MyPnf-Acme_FileReady} + priority: {presence: required, value: Normal} + eventId: {presence: required} + reportingEntityId: {presence: required} + reportingEntityName: {presence: required} + sequence: {presence: required, value: 0} + sourceId: {presence: required} + sourceName: {presence: required} + version: {presence: required, value: 4.0.1} + vesEventListenerVersion: {presence: required, value: 7.0.1} + startEpochMicrosec: {presence: required} + lastEpochMicrosec: {presence: required} + notificationFields: + presence: required + structure: + changeIdentifier: {presence: required, value: PM_MEAS_FILES} + changeType: {presence: required, value: fileReady} + notificationFieldsVersion: {presence: required, value: 2.0} + arrayOfNamedHashMap: + presence: required + array: + - name: {presence: required} + hashMap: {presence: required, structure: { + keyValuePair: {presence: required, structure: {key: {presence: required, value: location}, value: {presence: required}}}, + keyValuePair: {presence: required, structure: {key: {presence: required, value: compression}, value: {presence: required, value: gzip}}}, + keyValuePair: {presence: required, structure: {key: {presence: required, value: fileFormatType}, value: {presence: required, value: org.3GPP.32.435}}}, + keyValuePair: {presence: required, structure: {key: {presence: required, value: fileFormatVersion}, value: {presence: required, value: V10}}}} + } +... +--- +event: + presence: required + structure: + commonEventHeader: + presence: required + structure: + domain: {presence: required, value: pnfRegistration} + eventId: {presence: required} + eventName: {presence: required, value: PnfReg_MyPnf-Acme_pnfRegistration} + lastEpochMicrosec: {presence: required} + priority: {presence: required, value: Normal} + reportingEntityName: {presence: required} + sequence: {presence: required, value: 0} + sourceName: {presence: required} + startEpochMicrosec: {presence: required} + timeZoneOffset: {presence: required} + version: {presence: required, value: 4.0.1} + vesEventListenerVersion: {presence: required, value: 7.0.1} + pnfRegistrationFields: + presence: required + structure: + modelNumber: {presence: required} + oamV4IpAddress: {presence: optional} + oamV6IpAddress: {presence: optional} + pnfRegistrationFieldsVersion: {presence: required, value: 2.0} + serialNumber: {presence: required} + softwareVersion: {presence: required} + unitFamily: {presence: required, value: BBU} + unitType: {presence: required} + vendorName: {presence: required, value: Acme} +... +--- +event: + presence: required + action: [ any, any, null, null, null ] + comment: " + ALARM NAME: CertMAutomaticEnrollmentFailed, + ALARM DESCRIPTION: ‘See alarm OPI x/1111-ABC 123 4567/1 Uen’, + ALARM EFFECT: 'See alarm OPI x/2222-ABC 123 4567/1 Uen', + MANAGED OBJECT CLASSES: NodeCredential, + EVENT TYPE: 'PROCESSINGERRORALARM', + PROBABLE CAUSE: 'ConfigurationOrCustomizationError', + PROPOSED REPAIR ACTIONS: 'See alarm OPI x/3333-ABC 123 4567/1 Uen', + CLEARING TYPE: Automatic + " + structure: + commonEventHeader: + presence: required + structure: + version: {presence: required, value: 4.0.1} + vesEventListenerVersion: {presence: required, value: 7.0.1} + domain: {presence: required, value: fault} + eventName: {presence: required, value: Fault_MyPnf-Acme_CertMAutomaticEnrollmentFailed} + eventId: {presence: required} + sequence: {presence: required} + priority: {presence: required, value: Normal} + reportingEntityName: {presence: required} + sourceName: {presence: required} + nfVendorName: {presence: required, value: Acme} + startEpochMicrosec: {presence: required} + lastEpochMicrosec: {presence: required} + timeZoneOffset: {presence: required} + faultFields: + presence: required + structure: + faultFieldsVersion: {presence: required, value: 4.0} + alarmCondition: {presence: required, value: 'CertMAutomaticEnrollmentFailed'} + eventCategory: {presence: required, value: 'PROCESSINGERRORALARM'} + eventSourceType: {presence: required} + specificProblem: {presence: required, value: 'Certificate Management Automatic Enrollment Failed'} + eventSeverity: {presence: required} + vfStatus: {presence: required, value: Active} + alarmAdditionalInformation: {presence: required, structure: { + keyValuePair: {presence: required, structure: {key: {presence: required, value: source}, value: {presence: required}}}, + keyValuePair: {presence: required, structure: {key: {presence: required, value: probableCause}, value: {presence: required, value: 'ConfigurationOrCustomizationError'}}}, + keyValuePair: {presence: required, structure: {key: {presence: required, value: additionalText}, value: {presence: optional}}}, + keyValuePair: {presence: required, structure: {key: {presence: required, value: additionalInfo}, value: {presence: optional}}}} + } +... +--- +event: + presence: required + action: [ any, any, null, null, null ] + comment: " + ALARM NAME: PowerLoss, + ALARM DESCRIPTION: 'PNF is losing power', + ALARM EFFECT: 'PNF will shutdown if battery is drained', + MANAGED OBJECT CLASSES: 'BatteryBackup;BatteryUnit', + EVENT TYPE: 'EQUIPMENTALARM', + PROBABLE CAUSE: 'Power Supply Failure', + PROPOSED REPAIR ACTIONS: 'Repair Power Supply', + CLEARING TYPE: Automatic + " + structure: + commonEventHeader: + presence: required + structure: + version: {presence: required, value: 4.0.1} + vesEventListenerVersion: {presence: required, value: 7.0.1} + domain: {presence: required, value: fault} + eventName: {presence: required, value: Fault_MyPnf-Acme_PowerLoss} + eventId: {presence: required} + sequence: {presence: required} + priority: {presence: required, value: Normal} + reportingEntityName: {presence: required} + sourceName: {presence: required} + nfVendorName: {presence: required, value: Acme} + startEpochMicrosec: {presence: required} + lastEpochMicrosec: {presence: required} + timeZoneOffset: {presence: required} + faultFields: + presence: required + structure: + faultFieldsVersion: {presence: required, value: 4.0} + alarmCondition: {presence: required, value: 'PowerLoss'} + eventCategory: {presence: required, value: 'EQUIPMENTALARM'} + eventSourceType: {presence: required} + specificProblem: {presence: required, value: 'Power Supply Failure'} + eventSeverity: {presence: required} + vfStatus: {presence: required, value: Active} + alarmAdditionalInformation: {presence: required, structure: { + keyValuePair: {presence: required, structure: {key: {presence: required, value: source}, value: {presence: required}}}, + keyValuePair: {presence: required, structure: {key: {presence: required, value: probableCause}, value: {presence: required, value: 'Power Supply Failure'}}}, + keyValuePair: {presence: required, structure: {key: {presence: required, value: additionalText}, value: {presence: optional}}}, + keyValuePair: {presence: required, structure: {key: {presence: required, value: additionalInfo}, value: {presence: optional}}}} + } +... +--- +event: + presence: required + action: [ any, any, null, null, null ] + comment: " + ALARM NAME: LogHasReachedFullCapacity, + ALARM DESCRIPTION: 'Log Has Reached Full Capacity', + ALARM EFFECT: 'See alarm OPI x/2223-ABC 123 4567/1 Uen', + MANAGED OBJECT CLASSES: Log, + EVENT TYPE: 'PROCESSINGERRORALARM', + PROBABLE CAUSE: 'FileError', + PROPOSED REPAIR ACTIONS: 'See alarm OPI x/3334-ABC 123 4567/1 Uen', + CLEARING TYPE: Automatic + " + structure: + commonEventHeader: + presence: required + structure: + version: {presence: required, value: 4.0.1} + vesEventListenerVersion: {presence: required, value: 7.0.1} + domain: {presence: required, value: fault} + eventName: {presence: required, value: Fault_MyPnf-Acme_LogHasReachedFullCapacity} + eventId: {presence: required} + sequence: {presence: required} + priority: {presence: required, value: Normal} + reportingEntityName: {presence: required} + sourceName: {presence: required} + nfVendorName: {presence: required, value: Acme} + startEpochMicrosec: {presence: required} + lastEpochMicrosec: {presence: required} + timeZoneOffset: {presence: required} + faultFields: + presence: required + structure: + faultFieldsVersion: {presence: required, value: 4.0} + alarmCondition: {presence: required, value: 'LogHasReachedFullCapacity'} + eventCategory: {presence: required, value: 'PROCESSINGERRORALARM'} + eventSourceType: {presence: required} + specificProblem: {presence: required, value: 'Log Has Reached Full Capacity'} + eventSeverity: {presence: required} + vfStatus: {presence: required, value: Active} + alarmAdditionalInformation: {presence: required, structure: { + keyValuePair: {presence: required, structure: {key: {presence: required, value: source},value: {presence: required}}}, + keyValuePair: {presence: required, structure: {key: {presence: required, value: probableCause},value: {presence: required, value: 'FileError'}}}, + keyValuePair: {presence: required, structure: {key: {presence: required, value: additionalText},value: {presence: optional}}}, + keyValuePair: {presence: required, structure: {key: {presence: required, value: additionalInfo},value: {presence: optional}}}} + } +...
\ No newline at end of file diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/validation.files/invalid.yaml b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/validation.files/invalid.yaml new file mode 100644 index 0000000000..7df3b2b083 --- /dev/null +++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/validation.files/invalid.yaml @@ -0,0 +1,2 @@ +key: 1 +key {}
\ No newline at end of file diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/validation.files/measurements/pmEvents-valid.yaml b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/validation.files/measurements/pmEvents-valid.yaml new file mode 100644 index 0000000000..858951f7b0 --- /dev/null +++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/validation.files/measurements/pmEvents-valid.yaml @@ -0,0 +1,186 @@ +pmDictionary: + presence: required + structure: + pmDictionaryHeader: + presence: required + structure: + pmDefVsn: { presence: required, comment: "Version of the PM Dictionary. Version is vendor defined."} + pmDefSchemaVsn: { presence: required, comment: "Version of the PM Dictionary Schema used for this PM Dictionary. Schema versions are specified in the VES Specifications."} + nfType: { presence: required, comment: "NF type to whom this PM Dictionary applies. nfType is vendor defined and should match the string used in eventName."} + vendor: { presence: required, value: Acme, comment: "Vendor of the NF type to whom this PM Dictionary applies."} + pmDictionaryMeasurements: + presence: required + array: + - measType: { presence: required, comment: "Measurement name used in PM file, in 3GPP format where specified, else vendor defined. Names for 3GPP-defined 4G measurements are specified in 3GPP TS 32.425 item e). Names for 3GPP-defined 5G measurements are specified in 3GPP TS 28.552 item e). Vendor defined names are preceded with VS."} + measDescription: { presence: required, comment: "Text description of the purpose of the measurement, what information does the measurement provide. Descriptions for 3GPP-defined 4G measurements are specified in 3GPP TS 32.425 item a). Descriptions for 3GPP-defined 5G measurements are specified in 3GPP TS 28.552 item a). Vendors are free to augment or modify the 3GPP-provided descriptions to more accurately describe their measurements as needed."} + measCondition: { presence: required, comment: "Text description of the condition that causes the measurement to be updated. Conditions for 3GPP-defined 4G measurements are specified in 3GPP TS 32.425 item c). Conditions for 3GPP-defined 5G measurements are specified in 3GPP TS 28.552 item c). Vendors are free to augment or modify the 3GPP-provided conditions to more accurately describe their measurements as needed."} + measResultType: { presence: required, value: [integer], comment: "Data type of the measurement result. Result data types for 3GPP-defined 4G measurements are specified in 3GPP TS 32.425 item d). Result data types for 3GPP-defined 5G measurements are specified in 3GPP TS 28.552 item d). The measResultType values supported by a vendor are specified in the PM Dictionary YAML using the 'value' attribute and may include vendor-defined data types not specified by 3GPP; for example boolean."} + measResultRange: { presence: optional, comment: "Range for the measurement result. The range is specified as a comma separated list of discrete values or a range of values specified as minimum value-maximum value with no spaces. Result ranges for 3GPP-defined 4G measurements are specified in 3GPP TS 32.425 item d) if applicable. Result ranges for 3GPP-defined 5G measurements are specified in 3GPP TS 28.552 item d) if applicable. "} + measResultUnits: { presence: required, value: [seconds, minutes, nanoseconds, microseconds, kbps], comment: "Unit of measure for the result; e.g. milliseconds, bytes, kilobytes, packets, number. Unit of measure for 3GPP-defined 4G measurements are specified in 3GPP TS 32.425 item d) if applicable. Unit of measure for 3GPP-defined 5G measurements are specified in 3GPP TS 28.552 item d) if applicable. The measResultsUnits values supported by a vendor are specified in the PM Dictionary YAML using the 'value' attribute and may include vendor-defined units of measure not specified by 3GPP; for example ethernet frames."} + measObjClass: { presence: required, value: [NRCellCU, NRCellDU, NRBTS, IPNO, ETHIF], comment: "Measurement Object Class. Object classes for 3GPP-defined 4G measurements are specified in 3GPP TS 32.425 item f). Object classes for 3GPP-defined 5G measurements are specified in 3GPP TS 28.552 item f). The measObjClass values supported by a vendor are specified in the PM Dictionary YAML using the “value” attribute and may include vendor-defined objects not specified by 3GPP; for example IPSEC."} + measCollectionMethod: { presence: required, value: [CC, GUAGE, DER, SI], comment: "Collection Method for the measurement. 3GPP-defined collection methods are CC, SI, DER and Gauge. Collection Methods for 3GPP-defined 4G measurements are specified in 3GPP TS 32.425 item b). Collection Methods for 3GPP-defined 5G measurements are specified in 3GPP TS 28.552 item c). The measCollectionMethod values supported by a vendor are specified in the PM Dictionary YAML using the 'value' attribute and may include vendor-defined collection methods not specified by 3GPP; for example Average."} + measLastChange: { presence: required, comment: "PM Dictionary version the last time this measurement was changed, added or deleted."} + measChangeType: { presence: required, value: [added, modified, deleted], comment: "For the measLastChange, indicates the type of change made for this measurement. Valid values are added, modified or deleted. Deleted measurements may be kept in the PM Dictionary for one release or more or permanently for historical purposes, if desired."} + measInfoId: { presence: required, comment: "Name for a group of related measurements, in 3GPP format where specified, else vendor defined. Family names for 3GPP-defined 4G measurements are specified in 3GPP TS 32.425 Section 3.1. Family names for 3GPP-defined 5G measurements are specified in 3GPP TS 28.552 Section 3.4."} + measFamily: { presence: required, comment: "Abbreviation for a family of measurements, in 3GPP format where specified, else vendor defined. Family name abbreviations for 3GPP-defined 4G measurements are specified in 3GPP TS 32.425 Section 3.1. Family name abbreviations for 3GPP-defined 5G measurements are specified in 3GPP TS 28.552 Section 3.4. "} + measAdditionalFields: { presence: required, comment: "Hashmap of vendor specific PM Dictionary fields in key value pair format.", structure: { + keyValuePair: { presence: required, structure: { key: { presence: required, value: measurementStatus, comment: "Contains the status of the measurement."}, value: { presence: required, value: [USED, DEPRECATED, OBSOLETE, PRELIMINARY] }}}, + keyValuePair: { presence: required, structure: { key: { presence: required, value: initialValue, comment: "The initial value to which the Measurement Type is set at the beginning of a new granularity period."}, value: { presence: required }}}, + keyValuePair: { presence: required, structure: { key: { presence: required, value: acmeParameter1, comment: "Extra vendor specific parameter 1."}, value: { presence: required }}}, + keyValuePair: { presence: optional, structure: { key: { presence: required, value: acmeParameter2, comment: "Extra vendor specific parameter 2."}, value: { presence: required, value: [true, false] }}}, + keyValuePair: { presence: optional, structure: { key: { presence: required, value: acmeParameter3, comment: "Extra vendor specific parameter 3."}, value: { presence: required }}}} + } +--- +pmDictionary: + pmDictionaryHeader: + pmDefVsn: AcmeNumber.1.0 + pmDefSchemaVsn: 1.0 + nfType: myPnf + vendor: Acme + pmDictionaryMeasurements: + + - measType: DRB.UEThpDl + measDescription: Average DL UE throughput in gNB + measCondition: See 3GPP TS 28.552 + measResultType: integer + measResultRange: 0-4294967295 + measResultUnits: kbps + measObjClass: NRCellDU + measCollectionMethod: DER + measLastChange: 1.0 + measChangeType: added + measInfoId: "Data Radio Bearer" + measFamily: DRB + measAdditionalFields: { + "measurementStatus": "USED", + "initialValue": 0, + "acmeParameter1": 0, + "acmeParameter2": true, + "acmeParameter3": "acmeParameterValue3"} + + - measType: VS.ifInDiscards + measDescription: The number of inbound packets which were chosen to be discarded + measCondition: The number of inbound packets which were chosen to be + discarded even though no errors had been detected to prevent + their being deliverable to a higher-layer protocol. One + possible reason for discarding such a packet could be to + free up buffer space. + Discontinuities in the value of this counter can occur at + re-initialization of the management system, and at other + times as indicated by the value of + ifCounterDiscontinuityTime. + measResultType: integer + measResultRange: 0-4294967295 + measResultUnits: number + measObjClass: EthernetPort + measCollectionMethod: CC + measLastChange: 1.0 + measChangeType: added + measInfoId: "IP Management" + measFamily: IP + measAdditionalFields: { + "measurementStatus": "USED", + "initialValue": 0, + "acmeParameter1": 0, + "acmeParameter2": true, + "acmeParameter3": "acmeParameterValue3"} + + - measType: VS.ifInErrors + measDescription: Number of inbound packets that contained errors + measCondition: For packet-oriented interfaces, the number of inbound + packets that contained errors preventing them from being + deliverable to a higher-layer protocol. For character- + oriented or fixed-length interfaces, the number of inbound + transmission units that contained errors preventing them + from being deliverable to a higher-layer protocol. + measResultType: integer + measResultRange: 0-4294967295 + measResultUnits: number + measObjClass: EthernetPort + measCollectionMethod: Gauge + measLastChange: 1.0 + measChangeType: added + measInfoId: "IP Management" + measFamily: IP + measAdditionalFields: { + "measurementStatus": "USED", + "initialValue": 0, + "acmeParameter1": 0, + "acmeParameter3": "acmeParameterValue3"} + + - measType: VS.ifInUnknownProtos + measDescription: Number of inbound packets received via an unknown or usupported protocol + measCondition: For packet-oriented interfaces, the number of packets + received via the interface which were discarded because of + an unknown or unsupported protocol. For character-oriented + or fixed-length interfaces that support protocol + multiplexing the number of transmission units received via + the interface which were discarded because of an unknown or + unsupported protocol. For any interface that does not + support protocol multiplexing, this counter will always be + 0. + measResultType: integer + measResultRange: 0-4294967295 + measResultUnits: number + measObjClass: EthernetPort + measCollectionMethod: CC + measLastChange: 1.0 + measChangeType: added + measInfoId: "IP Management" + measFamily: IP + measAdditionalFields: { + "measurementStatus": "USED", + "initialValue": 0, + "acmeParameter1": 0, + "acmeParameter2": true} + + - measType: VS.ifHCInBroadcastPkts + measDescription: Number of the broadcasted inbound packets delivered to the higher (sub-)layer + measCondition: The number of packets, delivered by this sub-layer to a + higher (sub-)layer, which were addressed to a broadcast + address at this sub-layer. This object is a 64-bit version + of ifInBroadcastPkts. + Discontinuities in the value of this counter can occur at + re-initialization of the management system, and at other + times as indicated by the value of + ifCounterDiscontinuityTime. + measResultType: integer + measResultRange: 0-4294967295 + measResultUnits: number + measObjClass: EthernetPort + measCollectionMethod: CC + measLastChange: 1.0 + measChangeType: added + measInfoId: "IP Management" + measFamily: IP + measAdditionalFields: { + "measurementStatus": "USED", + "initialValue": 0, + "acmeParameter1": 0} + + - measType: VS.ifHCOutBroadcastPkts + measDescription: Number of the broadcasted outsbound packets delivered to the higher (sub-)layer + measCondition: The total number of packets that higher-level protocols + requested be transmitted, and which were addressed to a + broadcast address at this sub-layer, including those that + were discarded or not sent. This object is a 64-bit version + of ifOutBroadcastPkts. + Discontinuities in the value of this counter can occur at + re-initialization of the management system, and at other + times as indicated by the value of + ifCounterDiscontinuityTime. + measResultType: integer + measResultRange: 0-4294967295 + measResultUnits: number + measObjClass: EthernetPort + measCollectionMethod: CC + measLastChange: 1.0 + measChangeType: added + measInfoId: "IP Management" + measFamily: IP + measAdditionalFields: { + "measurementStatus": "USED", + "initialValue": 0, + "acmeParameter1": 0, + "acmeParameter2": true, + "acmeParameter3": "acmeParameterValue3"} |