aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Banka <michal.banka@nokia.com>2020-07-14 11:00:33 +0200
committerMichal Banka <michal.banka@nokia.com>2020-07-30 15:18:12 +0200
commit678b02832f8847941e7e31c51aa648350e9c9f1f (patch)
tree7317aced16e3739cad59c687becfb77bef95db3d
parent81ee9a28d2906c68c6add107dec3b7d5b02e9cfd (diff)
Implement external-schema-manager submodule
Change-Id: I298b7b4a3310c2ad338882e0bc5a0852eb949621 Signed-off-by: Michal Banka <michal.banka@nokia.com> Issue-ID: DCAEGEN2-2254
-rw-r--r--services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/exception/IncorrectInternalFileReferenceException.java (renamed from services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/externalschemamanager/MainTest.java)10
-rw-r--r--services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/exception/NoLocalReferenceException.java (renamed from services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/externalschemamanager/Main.java)9
-rw-r--r--services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/model/SchemaReference.java58
-rw-r--r--services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/FileReader.java62
-rw-r--r--services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/JsonFragmentRetriever.java33
-rw-r--r--services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceJsonGenerator.java45
-rw-r--r--services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceMapper.java55
-rw-r--r--services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceResolver.java81
-rw-r--r--services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/StndDefinedValidator.java151
-rw-r--r--services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/UrlMapper.java48
-rw-r--r--services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/UrlMapperFactory.java107
-rw-r--r--services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/ValidatorCache.java91
-rw-r--r--services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/FileReaderTest.java78
-rw-r--r--services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/JsonFragmentRetrieverTest.java67
-rw-r--r--services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceJsonGeneratorTest.java61
-rw-r--r--services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceMapperTest.java70
-rw-r--r--services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceResolverTest.java106
-rw-r--r--services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/StndDefinedValidatorBuilderTest.java109
-rw-r--r--services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/StndDefinedValidatorTest.java153
-rw-r--r--services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/UrlMapperTest.java98
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/incorrectHashEvent.json54
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/invalidEvent.json54
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_EmptyContent.yaml0
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_FaultMNS.yaml1144
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_HeartBeatMNS.yaml23
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_IncorrectFormat.yaml1144
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_PerformanceMNS.yaml272
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_PerformanceThresholdMNS.yaml102
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_ProvisioningMNS.yaml579
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_StreamingDataReportingMNS.yaml453
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/NewAlarmSchema.yaml734
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-empty-content.json26
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-incorrect-yaml-format.json26
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-no-json-format.json26
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-no-local-resource.json26
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-wrong-field-name.json26
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/schema-map.json26
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/validEvent.json54
-rw-r--r--services/external-schema-manager/src/main/test/resources/externalRepo/validNoHashEvent.json54
-rw-r--r--services/external-schema-manager/src/main/test/resources/file_with_one_line.json3
-rw-r--r--services/external-schema-manager/src/main/test/resources/schema-map-to-tests.json18
41 files changed, 6331 insertions, 5 deletions
diff --git a/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/externalschemamanager/MainTest.java b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/exception/IncorrectInternalFileReferenceException.java
index da219d07..32617567 100644
--- a/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/externalschemamanager/MainTest.java
+++ b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/exception/IncorrectInternalFileReferenceException.java
@@ -18,8 +18,12 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcaegen2.services.sdk.services.externalschemamanager;
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.exception;
-class MainTest {
+public class IncorrectInternalFileReferenceException extends RuntimeException {
-} \ No newline at end of file
+ public IncorrectInternalFileReferenceException(String message) {
+ super(message);
+ }
+
+}
diff --git a/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/externalschemamanager/Main.java b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/exception/NoLocalReferenceException.java
index c60cff39..f51ff2e6 100644
--- a/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/externalschemamanager/Main.java
+++ b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/exception/NoLocalReferenceException.java
@@ -18,7 +18,12 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.dcaegen2.services.sdk.services.externalschemamanager;
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.exception;
+
+public class NoLocalReferenceException extends RuntimeException {
+
+ public NoLocalReferenceException(String message) {
+ super(message);
+ }
-public class Main {
}
diff --git a/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/model/SchemaReference.java b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/model/SchemaReference.java
new file mode 100644
index 00000000..5da34430
--- /dev/null
+++ b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/model/SchemaReference.java
@@ -0,0 +1,58 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.model;
+
+import org.onap.dcaegen2.services.sdk.services.external.schema.manager.service.SchemaReferenceResolver;
+
+public class SchemaReference {
+
+ public static final String URL_SEPARATOR = "#";
+
+ private final String url;
+ private final String internalReference;
+
+ public SchemaReference(SchemaReferenceResolver schemaReferenceResolver) {
+ this.url = schemaReferenceResolver.resolveUrl();
+ this.internalReference = schemaReferenceResolver.resolveInternalReference();
+ }
+
+ public SchemaReference(String url, String internalReference) {
+ this.url = url;
+ this.internalReference = internalReference;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public String getInternalReference() {
+ return internalReference;
+ }
+
+ /**
+ * Creates full schema reference as <path to yaml file>#<reference to part of yaml file with specific schema>
+ *
+ * @return <path to yaml file>#<reference to part of yaml file with specific schema>
+ */
+ public String getFullSchemaReference() {
+ return url + URL_SEPARATOR + internalReference;
+ }
+}
diff --git a/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/FileReader.java b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/FileReader.java
new file mode 100644
index 00000000..e49266e3
--- /dev/null
+++ b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/FileReader.java
@@ -0,0 +1,62 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+class FileReader {
+
+ private static final Logger logger = LoggerFactory.getLogger(FileReader.class);
+
+ private final String filename;
+
+ FileReader(String filename) {
+ this.filename = filename;
+ }
+
+ String readFile() {
+ String fileContent = "";
+ try {
+ fileContent = getFileContent();
+ } catch (IOException e) {
+ logger.error("Error while reading file. Filename: {}", filename);
+ }
+ return fileContent;
+ }
+
+ boolean doesFileExists() {
+ return new File(filename).exists();
+ }
+
+ private String getFileContent() throws IOException {
+ return new String(readBytes());
+ }
+
+ private byte[] readBytes() throws IOException {
+ return Files.readAllBytes(Paths.get(filename));
+ }
+} \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/JsonFragmentRetriever.java b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/JsonFragmentRetriever.java
new file mode 100644
index 00000000..71f300fc
--- /dev/null
+++ b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/JsonFragmentRetriever.java
@@ -0,0 +1,33 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+final class JsonFragmentRetriever {
+
+ private JsonFragmentRetriever() {
+ }
+
+ static JsonNode getFragment(JsonNode event, String fragmentPath) {
+ return event.at(fragmentPath);
+ }
+}
diff --git a/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceJsonGenerator.java b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceJsonGenerator.java
new file mode 100644
index 00000000..50ca6421
--- /dev/null
+++ b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceJsonGenerator.java
@@ -0,0 +1,45 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.onap.dcaegen2.services.sdk.services.external.schema.manager.model.SchemaReference;
+
+import java.io.IOException;
+
+final class SchemaReferenceJsonGenerator {
+
+ private SchemaReferenceJsonGenerator() {
+ }
+
+ static JsonNode getSchemaReferenceJson(SchemaReference schemaReference) throws IOException {
+ return toJsonNode(getReferenceJson(schemaReference));
+ }
+
+ private static JsonNode toJsonNode(String content) throws IOException {
+ return new ObjectMapper().readTree(content);
+ }
+
+ private static String getReferenceJson(SchemaReference url) {
+ return "{\"$ref\":\"" + url.getFullSchemaReference() + "\"}";
+ }
+}
diff --git a/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceMapper.java b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceMapper.java
new file mode 100644
index 00000000..79108f01
--- /dev/null
+++ b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceMapper.java
@@ -0,0 +1,55 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import org.onap.dcaegen2.services.sdk.services.external.schema.manager.model.SchemaReference;
+
+import java.io.File;
+
+class SchemaReferenceMapper {
+
+ private final UrlMapper urlMapper;
+ private final String schemasPath;
+
+ SchemaReferenceMapper(UrlMapper urlMapper, String schemasPath) {
+ this.urlMapper = urlMapper;
+ this.schemasPath = schemasPath;
+ }
+
+ UrlMapper getUrlMapper() {
+ return urlMapper;
+ }
+
+ SchemaReference mapToLocalSchema(SchemaReference schemaReference) {
+ String publicUrl = schemaReference.getUrl();
+ String localUrl = urlMapper.mapToLocalUrl(publicUrl);
+ return createLocalSchemaReference(localUrl, schemaReference.getInternalReference());
+ }
+
+ private SchemaReference createLocalSchemaReference(String localUrl, String internalReference) {
+ String relativeLocalUrl = getRelativeLocalUrl(localUrl);
+ return new SchemaReference(relativeLocalUrl, internalReference);
+ }
+
+ private String getRelativeLocalUrl(String localUrl) {
+ return schemasPath + File.separator + localUrl;
+ }
+}
diff --git a/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceResolver.java b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceResolver.java
new file mode 100644
index 00000000..0dd1b805
--- /dev/null
+++ b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceResolver.java
@@ -0,0 +1,81 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import org.onap.dcaegen2.services.sdk.services.external.schema.manager.model.SchemaReference;
+
+
+public class SchemaReferenceResolver {
+
+ private static final String ROOT_REFERENCE = "/";
+ private static final int URL_INDEX = 0;
+ private static final int INTERNAL_REFERENCE_INDEX = 1;
+ private static final int REFERENCE_FRAGMENTS_CONTAINING_INTERNAL_REF_SIZE = 2;
+
+ private final String schemaReference;
+
+ public SchemaReferenceResolver(String schemaReference) {
+ this.schemaReference = schemaReference;
+ }
+
+ /**
+ * Extracts the schema reference fragment, provided in the event, corresponding to the url path (before #).
+ *
+ * @return url path
+ */
+ public String resolveUrl() {
+ String[] referenceFragments = schemaReference.split(SchemaReference.URL_SEPARATOR);
+ return referenceFragments[URL_INDEX];
+ }
+
+ /**
+ * Returns internal reference (after #) if it is present in schema reference and add "/" on the beginning if it's
+ * not present, otherwise returns "/".
+ *
+ * @return resolved internal reference
+ */
+ public String resolveInternalReference() {
+ String reference;
+ String[] referenceFragments = schemaReference.split(SchemaReference.URL_SEPARATOR);
+ if (internalReferenceExists(referenceFragments)) {
+ String internalReference = referenceFragments[INTERNAL_REFERENCE_INDEX];
+ reference = prepareExistingInternalReference(internalReference);
+ } else {
+ reference = ROOT_REFERENCE;
+ }
+
+ return reference;
+ }
+
+ private boolean internalReferenceExists(String[] referenceFragments) {
+ return referenceFragments.length == REFERENCE_FRAGMENTS_CONTAINING_INTERNAL_REF_SIZE;
+ }
+
+ private String prepareExistingInternalReference(String internalReference) {
+ return (!isAbsolute(internalReference)) ? ROOT_REFERENCE + internalReference : internalReference;
+ }
+
+ private boolean isAbsolute(String internalReference) {
+ return internalReference.startsWith(ROOT_REFERENCE);
+ }
+
+
+}
diff --git a/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/StndDefinedValidator.java b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/StndDefinedValidator.java
new file mode 100644
index 00000000..0b343394
--- /dev/null
+++ b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/StndDefinedValidator.java
@@ -0,0 +1,151 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import org.onap.dcaegen2.services.sdk.services.external.schema.manager.exception.IncorrectInternalFileReferenceException;
+import org.onap.dcaegen2.services.sdk.services.external.schema.manager.exception.NoLocalReferenceException;
+import org.openapi4j.core.validation.ValidationException;
+import org.openapi4j.schema.validator.v3.SchemaValidator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+
+public class StndDefinedValidator {
+ private static final Logger logger = LoggerFactory.getLogger(StndDefinedValidator.class);
+ private final String schemaRefPath;
+ private final String stndDefinedDataPath;
+ private final ValidatorCache validatorCache;
+
+ private StndDefinedValidator(String schemaRefPath, String stndDefinedDataPath, ValidatorCache validatorCache) {
+ this.schemaRefPath = schemaRefPath;
+ this.stndDefinedDataPath = stndDefinedDataPath;
+ this.validatorCache = validatorCache;
+ }
+
+ ValidatorCache getValidatorCache() {
+ return validatorCache;
+ }
+
+ /**
+ * Validates incoming event
+ *
+ * @param event as JsonNode
+ * @return validation result
+ * @throws IncorrectInternalFileReferenceException when reference to part of openApi yaml file with schemas is incorrect.
+ * @throws NoLocalReferenceException when mapping for public url is not present in schema mapping file.
+ */
+ public boolean validate(JsonNode event) throws IncorrectInternalFileReferenceException, NoLocalReferenceException {
+ boolean validationResult = false;
+ try {
+ JsonNode stndDefinedData = JsonFragmentRetriever.getFragment(event, this.stndDefinedDataPath);
+ SchemaValidator schemaValidator = validatorCache.resolveValidator(event, schemaRefPath);
+ schemaValidator.validate(stndDefinedData);
+ logger.info("Validation of stndDefinedDomain has been successful");
+ validationResult = true;
+ } catch (ValidationException ex) {
+ logger.error(String.valueOf(ex.results()));
+ } catch (IOException ex){
+ logger.error("Schema reference has invalid characters", ex);
+ }
+ return validationResult;
+ }
+
+ public static final class ValidatorBuilder {
+
+ public static final String DEFAULT_MAPPING_FILE_PATH = "etc/externalRepo/schema-map.json";
+ public static final String DEFAULT_SCHEMA_REF_PATH = "/event/stndDefinedFields/schemaReference";
+ public static final String DEFAULT_STND_DEFINED_DATA_PATH = "/event/stndDefinedFields/data";
+ public static final String DEFAULT_SCHEMAS_PATH = "etc/externalRepo";
+
+ private String mappingFilePath = DEFAULT_MAPPING_FILE_PATH;
+ private String schemaRefPath = DEFAULT_SCHEMA_REF_PATH;
+ private String stndDefinedDataPath = DEFAULT_STND_DEFINED_DATA_PATH;
+ private String schemasPath = DEFAULT_SCHEMAS_PATH;
+
+ /**
+ * @param mappingFilePath relative path to the file with mappings of schemas from the context in which
+ * the application is running.
+ * @return builder reference
+ * @implNote example mapping file:
+ * [
+ * {
+ * "publicURL": "http://localhost:8080/external1",
+ * "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_FaultMNS.yaml"
+ * }
+ * ]
+ * @implNote default mapping file path: "etc/externalRepo/schema-map.json"
+ */
+ public ValidatorBuilder mappingFilePath(String mappingFilePath) {
+ this.mappingFilePath = mappingFilePath;
+ return this;
+ }
+
+ /**
+ * @param schemaRefPath schema reference path in json.
+ * @return builder reference
+ * @implNote default: "/event/stndDefinedFields/schemaReference"
+ */
+ public ValidatorBuilder schemaRefPath(String schemaRefPath) {
+ this.schemaRefPath = schemaRefPath;
+ return this;
+ }
+
+ /**
+ * @param stndDefinedDataPath path to stndDefined data in json.
+ * @return builder reference
+ * @implNote default: "/event/stndDefinedFields/data"
+ */
+ public ValidatorBuilder stndDefinedDataPath(String stndDefinedDataPath) {
+ this.stndDefinedDataPath = stndDefinedDataPath;
+ return this;
+ }
+
+ /**
+ * @param schemasPath relative path to schemas directory from the context in which the application is running.
+ * @return builder reference
+ * @implNote default: "etc/externalRepo"
+ */
+ public ValidatorBuilder schemasPath(String schemasPath) {
+ this.schemasPath = new File(schemasPath).getAbsolutePath();
+ return this;
+ }
+
+ /**
+ * Builds stndDefined Validator. May log warnings when:
+ * - schema mapping file does not exist
+ * - schema mapping file has invalid format
+ * - any of schema files does not exist
+ * - any of schema files has invalid yaml format
+ * - any of schema files is empty
+ *
+ * @return stndDefinedValidator with cached schemas
+ */
+ public StndDefinedValidator build() {
+ UrlMapper urlMapper = new UrlMapperFactory().getUrlMapper(mappingFilePath, schemasPath);
+ SchemaReferenceMapper schemaReferenceMapper = new SchemaReferenceMapper(urlMapper, schemasPath);
+ ValidatorCache validatorCache = new ValidatorCache(schemaReferenceMapper);
+ return new StndDefinedValidator(schemaRefPath, stndDefinedDataPath, validatorCache);
+ }
+ }
+}
diff --git a/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/UrlMapper.java b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/UrlMapper.java
new file mode 100644
index 00000000..06864b31
--- /dev/null
+++ b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/UrlMapper.java
@@ -0,0 +1,48 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import org.onap.dcaegen2.services.sdk.services.external.schema.manager.exception.NoLocalReferenceException;
+
+import java.util.Map;
+
+final class UrlMapper {
+
+ private final Map<String, String> mappingsCache;
+
+ UrlMapper(Map<String, String> mappings) {
+ this.mappingsCache = Map.copyOf(mappings);
+ }
+
+ Map<String, String> getMappingsCache() {
+ return Map.copyOf(mappingsCache);
+ }
+
+ String mapToLocalUrl(String publicUrl) {
+ String externalUrl = mappingsCache.get(publicUrl);
+ if (externalUrl == null) {
+ throw new NoLocalReferenceException("Couldn't find mapping for public url. PublicURL: " + publicUrl);
+ }
+ return externalUrl;
+ }
+
+
+} \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/UrlMapperFactory.java b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/UrlMapperFactory.java
new file mode 100644
index 00000000..730bc17e
--- /dev/null
+++ b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/UrlMapperFactory.java
@@ -0,0 +1,107 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+public class UrlMapperFactory {
+
+ private static final Logger logger = LoggerFactory.getLogger(UrlMapperFactory.class);
+
+ UrlMapper getUrlMapper(String mappingFilePath, String schemasPath) {
+ Map<String, String> mappings = new HashMap<>();
+ try {
+ mappings = readMappingFile(mappingFilePath, schemasPath);
+ } catch (IOException ex) {
+ logger.warn("Unable to read mapping file. Mapping file path: {}", mappingFilePath);
+ } catch (NullPointerException ex) {
+ mappings = Collections.emptyMap();
+ logger.warn("Schema mapping file has incorrect format. Mapping file path: {}", mappingFilePath);
+ }
+
+ return new UrlMapper(mappings);
+ }
+
+ private Map<String, String> readMappingFile(String mappingFilePath, String schemasPath) throws IOException {
+ ObjectMapper objectMapper = new ObjectMapper();
+ FileReader fileReader = new FileReader(mappingFilePath);
+ Map<String, String> mappings = new HashMap<>();
+
+ for (JsonNode mapping : objectMapper.readTree(fileReader.readFile())) {
+ String localURL = mapping.get("localURL").asText();
+ if (isMappingValid(schemasPath, localURL)) {
+ mappings.put(mapping.get("publicURL").asText(), localURL);
+ } else {
+ logger.warn("Mapping for publicURL ({}) will not be added to validator.", mapping.get("publicURL"));
+ }
+ }
+ return mappings;
+ }
+
+ private boolean isMappingValid(String schemasPath, String localURL) throws IOException {
+ String schemaRelativePath = schemasPath + File.separator + localURL;
+ return doesLocalFileExist(schemaRelativePath) && isFileValidSchema(schemaRelativePath);
+ }
+
+ private boolean isFileValidSchema(String schemaRelativePath) throws IOException {
+ String schemaContent = new FileReader(schemaRelativePath).readFile();
+ return isNotEmpty(schemaContent, schemaRelativePath) && isYaml(schemaContent, schemaRelativePath);
+ }
+
+ private boolean isNotEmpty(String schemaContent, String schemaRelativePath) {
+ if (schemaContent.isEmpty()) {
+ logger.warn("Schema file is empty. Schema path: {}", schemaRelativePath);
+ return false;
+ }
+ return true;
+ }
+
+ private boolean isYaml(String schemaContent, String schemaRelativePath) throws IOException {
+ ObjectMapper yamlMapper = new ObjectMapper(new YAMLFactory()).findAndRegisterModules();
+ try {
+ yamlMapper.readTree(schemaContent);
+ } catch (JsonParseException e) {
+ logger.warn("Schema has incorrect YAML structure. Schema path: {}", schemaRelativePath);
+ return false;
+ }
+ return true;
+ }
+
+ private boolean doesLocalFileExist(String schemaRelativePath) {
+ FileReader fileReader = new FileReader(schemaRelativePath);
+ if (!fileReader.doesFileExists()) {
+ logger.warn("Local schema resource missing. Schema file with path {} has not been found.", schemaRelativePath);
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/ValidatorCache.java b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/ValidatorCache.java
new file mode 100644
index 00000000..e67f0ebc
--- /dev/null
+++ b/services/external-schema-manager/src/main/java/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/ValidatorCache.java
@@ -0,0 +1,91 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import org.onap.dcaegen2.services.sdk.services.external.schema.manager.model.SchemaReference;
+import org.onap.dcaegen2.services.sdk.services.external.schema.manager.exception.IncorrectInternalFileReferenceException;
+import org.openapi4j.core.exception.ResolutionException;
+import org.openapi4j.schema.validator.v3.SchemaValidator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+class ValidatorCache {
+
+ private static final Logger logger = LoggerFactory.getLogger(ValidatorCache.class);
+ private final SchemaReferenceMapper schemaReferenceMapper;
+ private final Map<String, SchemaValidator> cache;
+
+ ValidatorCache(SchemaReferenceMapper schemaReferenceMapper) {
+ this.schemaReferenceMapper = schemaReferenceMapper;
+ this.cache = new HashMap<>();
+ }
+
+ SchemaReferenceMapper getSchemaReferenceMapper() {
+ return schemaReferenceMapper;
+ }
+
+ synchronized SchemaValidator resolveValidator(JsonNode event, String schemaRefPath) throws IOException {
+ SchemaReference schemaReference = resolveSchemaReference(event, schemaRefPath);
+ schemaReference = schemaReferenceMapper.mapToLocalSchema(schemaReference);
+ SchemaValidator validator = cache.get(schemaReference.getUrl());
+ if (!isValidatorCached(validator)) {
+ validator = createNewValidator(schemaReference);
+ }
+ return validator;
+ }
+
+ private SchemaReference resolveSchemaReference(JsonNode event, String schemaRefPath) {
+ String publicSchemaReference = JsonFragmentRetriever.getFragment(event, schemaRefPath).asText();
+ SchemaReferenceResolver schemaReferenceResolver = new SchemaReferenceResolver(publicSchemaReference);
+ return new SchemaReference(schemaReferenceResolver);
+ }
+
+ private boolean isValidatorCached(SchemaValidator validator) {
+ return validator != null;
+ }
+
+ private SchemaValidator createNewValidator(SchemaReference schemaReference) throws IOException {
+ logger.info("Creating new stndDefined schema validator");
+ JsonNode schemaRefNode = SchemaReferenceJsonGenerator.getSchemaReferenceJson(schemaReference);
+ SchemaValidator schemaValidator = handleValidatorCreation(schemaRefNode);
+ cacheSchemaValidator(schemaReference.getFullSchemaReference(), schemaValidator);
+ return schemaValidator;
+ }
+
+ private SchemaValidator handleValidatorCreation(JsonNode schemaNode) {
+ try {
+ return new SchemaValidator("StndDefinedSchemaValidator", schemaNode);
+ } catch (ResolutionException e) {
+ throw new IncorrectInternalFileReferenceException("Schema reference refer to existing file, " +
+ "but internal reference (after #) is incorrect. " + e.getMessage());
+ }
+ }
+
+ private void cacheSchemaValidator(String localSchemaReference, SchemaValidator schemaValidator) {
+ logger.info("Adding new stndDefined schema validator to cache");
+ cache.put(localSchemaReference, schemaValidator);
+ }
+}
diff --git a/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/FileReaderTest.java b/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/FileReaderTest.java
new file mode 100644
index 00000000..5d391a69
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/FileReaderTest.java
@@ -0,0 +1,78 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class FileReaderTest {
+
+ public static final String TEST_RESOURCES = "src/main/test/resources/";
+
+ @Test
+ public void shouldReturnEmptyStringWhenFileNotFound() {
+ //given
+ String expectedContent = "";
+ String fileName = "dummyFileName";
+
+ //when
+ String actualContent = new FileReader(fileName).readFile();
+
+ //then
+ assertEquals(expectedContent, actualContent);
+ }
+
+ @Test
+ public void shouldReturnFileContentWhenFileExists() {
+ //given
+ String expectedContent = "{\n" +
+ " \"someObject\": \"dummyValue\"\n" +
+ "}";
+ String filename = TEST_RESOURCES + "file_with_one_line.json";
+
+ //when
+ String actualContent = new FileReader(filename).readFile();
+
+ //then
+ assertEquals(expectedContent, actualContent);
+ }
+
+ @Test
+ public void shouldReturnFalseWhenFileDoesNotExist() {
+ //when
+ boolean doesFileExists = new FileReader("dummyFileName").doesFileExists();
+
+ //then
+ assertFalse(doesFileExists);
+ }
+
+ @Test
+ public void shouldReturnTrueWhenFileExists() {
+ //when
+ boolean doesFileExists = new FileReader(TEST_RESOURCES + "file_with_one_line.json").doesFileExists();
+
+ //then
+ assertTrue(doesFileExists);
+ }
+} \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/JsonFragmentRetrieverTest.java b/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/JsonFragmentRetrieverTest.java
new file mode 100644
index 00000000..f1cae3f5
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/JsonFragmentRetrieverTest.java
@@ -0,0 +1,67 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+class JsonFragmentRetrieverTest {
+
+ public static final String VALID_JSON_CONTENT = "{\n" +
+ " \"validObject\":{\n" +
+ " \"someEvent\":{\n" +
+ " \"someObject\":true\n" +
+ " }\n" +
+ " }\n" +
+ "}";
+ private ObjectMapper objectMapper = new ObjectMapper();
+
+ @Test
+ public void shouldReturnJsonFragmentAtValidPath() throws IOException {
+ //given
+ JsonNode jsonContent = objectMapper.readTree(VALID_JSON_CONTENT);
+ JsonNode expectedJsonNode = objectMapper.readTree("true");
+ String validPath = "/validObject/someEvent/someObject";
+
+ //when
+ JsonNode actualJsonNode = JsonFragmentRetriever.getFragment(jsonContent, validPath);
+
+ //then
+ assertEquals(expectedJsonNode, actualJsonNode);
+ }
+
+ @Test
+ public void shouldThrowErrorWhenPathDoesNotExistInJsonContent() throws IOException {
+ //given
+ JsonNode jsonContent = objectMapper.readTree(VALID_JSON_CONTENT);
+ String dummyPath = "dummyPath";
+
+ //when
+ //then
+ assertThrows(IllegalArgumentException.class, () -> JsonFragmentRetriever.getFragment(jsonContent, dummyPath));
+ }
+} \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceJsonGeneratorTest.java b/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceJsonGeneratorTest.java
new file mode 100644
index 00000000..42bc21c1
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceJsonGeneratorTest.java
@@ -0,0 +1,61 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.jupiter.api.Test;
+import org.onap.dcaegen2.services.sdk.services.external.schema.manager.model.SchemaReference;
+
+import java.io.IOException;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+class SchemaReferenceJsonGeneratorTest {
+
+ @Test
+ public void shouldReturnValidSchemaReferenceWhenUrlIsInValidFormat() throws IOException {
+ //given
+ String validUrl = "src/main/test/resources/file_with_one_line.json#/elo";
+ String schemaReferenceContent = "{\"$ref\":\"" + validUrl + "\"}";
+ JsonNode expectedSchemaReference = new ObjectMapper().readTree(schemaReferenceContent);
+ SchemaReferenceResolver schemaReferenceResolver = new SchemaReferenceResolver(validUrl);
+ SchemaReference schemaReference = new SchemaReference(schemaReferenceResolver);
+
+ //when
+ JsonNode actualSchemaReference = SchemaReferenceJsonGenerator.getSchemaReferenceJson(schemaReference);
+
+ //then
+ assertEquals(expectedSchemaReference, actualSchemaReference);
+ }
+
+ @Test
+ public void shouldThrowErrorWhenUrlIsInInvalidFormat() {
+ //given
+ String invalidFormatUrl = "\"someDummyValue\n\t";
+ SchemaReferenceResolver schemaReferenceResolver = new SchemaReferenceResolver(invalidFormatUrl);
+ SchemaReference schemaReference = new SchemaReference(schemaReferenceResolver);
+ //when
+ //then
+ assertThrows(IOException.class, () -> SchemaReferenceJsonGenerator.getSchemaReferenceJson(schemaReference));
+ }
+} \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceMapperTest.java b/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceMapperTest.java
new file mode 100644
index 00000000..1f5ddfb2
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceMapperTest.java
@@ -0,0 +1,70 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import org.junit.jupiter.api.Test;
+import org.onap.dcaegen2.services.sdk.services.external.schema.manager.model.SchemaReference;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class SchemaReferenceMapperTest {
+
+ public static final String SCHEMAS_PATH = "src/main/test/resources";
+
+ @Test
+ public void shouldReturnProperReferenceWhenSchemaReferenceHasNoHash() {
+ //given
+ SchemaReferenceMapper schemaReferenceMapper = getSchemaReferenceMapper();
+ String publicUrlWithoutHash = "http://someExternalUrl/external";
+ SchemaReferenceResolver schemaReferenceResolver = new SchemaReferenceResolver(publicUrlWithoutHash);
+ SchemaReference schemaReference = new SchemaReference(schemaReferenceResolver);
+
+ String expectedReference = SCHEMAS_PATH + "/file_with_one_line.json#/";
+
+ //when
+ String actualReference = schemaReferenceMapper.mapToLocalSchema(schemaReference).getFullSchemaReference();
+
+ //then
+ assertEquals(expectedReference, actualReference);
+ }
+
+ @Test
+ public void shouldReturnProperReferenceWhenSchemaReferenceContainsHash() {
+ //given
+ SchemaReferenceMapper schemaReferenceMapper = getSchemaReferenceMapper();
+ String publicUrlWithHash = "http://someExternalUrl/external#someString";
+ SchemaReferenceResolver schemaReferenceResolver = new SchemaReferenceResolver(publicUrlWithHash);
+ SchemaReference schemaReference = new SchemaReference(schemaReferenceResolver);
+ String expectedReference = SCHEMAS_PATH + "/file_with_one_line.json#/someString";
+
+ //when
+ String actualReference = schemaReferenceMapper.mapToLocalSchema(schemaReference).getFullSchemaReference();
+
+ //then
+ assertEquals(expectedReference, actualReference);
+ }
+
+ private SchemaReferenceMapper getSchemaReferenceMapper() {
+ String mappingFilePath = "src/main/test/resources/schema-map-to-tests.json";
+ UrlMapper urlMapper = new UrlMapperFactory().getUrlMapper(mappingFilePath, SCHEMAS_PATH);
+ return new SchemaReferenceMapper(urlMapper, SCHEMAS_PATH);
+ }
+} \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceResolverTest.java b/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceResolverTest.java
new file mode 100644
index 00000000..2fe7239f
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/SchemaReferenceResolverTest.java
@@ -0,0 +1,106 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class SchemaReferenceResolverTest {
+
+ @Test
+ void shouldResolveUrlFromSchemaReference() {
+ //given
+ String expectedUrl = "http://localhost:8080/test";
+ String schemaReference = expectedUrl + "#test/internal/ref";
+
+ //when
+ String actualUrl = new SchemaReferenceResolver(schemaReference).resolveUrl();
+
+ //then
+ assertEquals(expectedUrl, actualUrl);
+ }
+
+ @Test
+ void shouldResolveUrlFromSchemaReferenceWhenInternalReferenceDoesNotExist() {
+ //given
+ String expectedUrl = "http://localhost:8080/test";
+
+ //when
+ String actualUrl = new SchemaReferenceResolver(expectedUrl).resolveUrl();
+
+ //then
+ assertEquals(expectedUrl, actualUrl);
+ }
+
+ @Test
+ void shouldResolveInternalReferenceFromSchemaReference() {
+ //given
+ String schemaReference = "http://localhost:8080/test#/internal/ref/test";
+ String expectedInternalReference = "/internal/ref/test";
+
+ //when
+ String actualInternalReference = new SchemaReferenceResolver(schemaReference).resolveInternalReference();
+
+ //then
+ assertEquals(expectedInternalReference, actualInternalReference);
+ }
+
+ @Test
+ void shouldResolveInternalReferenceFromSchemaReferenceWhenInternalReferenceDoesNotExist() {
+ //given
+ String schemaReference = "http://localhost:8080/test";
+ String expectedInternalReference = "/";
+
+ //when
+ String actualInternalReference = new SchemaReferenceResolver(schemaReference).resolveInternalReference();
+
+ //then
+ assertEquals(expectedInternalReference, actualInternalReference);
+ }
+
+ @Test
+ void shouldResolveInternalReferenceFromSchemaReferenceWhenInternalReferenceIsRoot() {
+ //given
+ String schemaReference = "http://localhost:8080/test#/";
+ String expectedInternalReference = "/";
+
+ //when
+ String actualInternalReference = new SchemaReferenceResolver(schemaReference).resolveInternalReference();
+
+ //then
+ assertEquals(expectedInternalReference, actualInternalReference);
+ }
+
+ @Test
+ void shouldResolveInternalReferenceFromSchemaReferenceWhenInternalReferenceIsEmpty() {
+ //given
+ String schemaReference = "http://localhost:8080/test#";
+ String expectedInternalReference = "/";
+
+ //when
+ String actualInternalReference = new SchemaReferenceResolver(schemaReference).resolveInternalReference();
+
+ //then
+ assertEquals(expectedInternalReference, actualInternalReference);
+ }
+} \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/StndDefinedValidatorBuilderTest.java b/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/StndDefinedValidatorBuilderTest.java
new file mode 100644
index 00000000..56631543
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/StndDefinedValidatorBuilderTest.java
@@ -0,0 +1,109 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class StndDefinedValidatorBuilderTest {
+
+ private static final String TEST_RESOURCES = "src/main/test/resources/externalRepo/";
+
+ @Test
+ void shouldGenerateValidatorWithAllSchemaMappings() {
+ //when
+ StndDefinedValidator validator = getValidator("schema-map.json");
+
+ Map<String, String> mappingsCache = getMappingsCache(validator);
+
+ //then
+ assertThat(mappingsCache.size()).isEqualTo(6);
+ }
+
+ @Test
+ void shouldGenerateValidatorWithoutSchemaMappingsWithReferenceToNotExistingLocalResource() {
+ //when
+ StndDefinedValidator validator = getValidator("schema-map-no-local-resource.json");
+ Map<String, String> mappingsCache = getMappingsCache(validator);
+
+ //then
+ assertThat(mappingsCache.size()).isEqualTo(5);
+ }
+
+ @Test
+ void shouldGenerateValidatorWithoutSchemaMappingsWithEmptyLocalFileContent() {
+ //when
+ StndDefinedValidator validator = getValidator("schema-map-empty-content.json");
+ Map<String, String> mappingsCache = getMappingsCache(validator);
+
+ //then
+ assertThat(mappingsCache.size()).isEqualTo(4);
+ }
+
+ @Test
+ void shouldGenerateValidatorWithoutSchemaMappingsWithIncorrectYamlFormat() {
+ //when
+ StndDefinedValidator validator = getValidator("schema-map-incorrect-yaml-format.json");
+ Map<String, String> mappingsCache = getMappingsCache(validator);
+
+ //then
+ assertThat(mappingsCache.size()).isEqualTo(3);
+ }
+
+ @Test
+ void shouldGenerateValidatorWithoutSchemaMappingsWhenSchemaMappingFileHasNotJsonFormat() {
+ //when
+ StndDefinedValidator validator = getValidator("schema-map-no-json-format.json");
+ Map<String, String> mappingsCache = getMappingsCache(validator);
+
+ //then
+ assertThat(mappingsCache.size()).isEqualTo(0);
+ }
+
+ @Test
+ void shouldGenerateValidatorWithoutSchemaMappingsWhenSchemaMappingFileHasWrongFieldName() {
+ //when
+ StndDefinedValidator validator = getValidator("schema-map-wrong-field-name.json");
+ Map<String, String> mappingsCache = getMappingsCache(validator);
+
+ //then
+ assertThat(mappingsCache.size()).isEqualTo(0);
+ }
+
+ private StndDefinedValidator getValidator(String mappingFilePath) {
+ return new StndDefinedValidator.ValidatorBuilder()
+ .mappingFilePath(TEST_RESOURCES + mappingFilePath)
+ .schemasPath(TEST_RESOURCES)
+ .schemaRefPath("/event/stndDefinedFields/schemaReference")
+ .stndDefinedDataPath("/event/stndDefinedFields/data")
+ .build();
+ }
+
+ private Map<String, String> getMappingsCache(StndDefinedValidator validator) {
+ return validator.getValidatorCache()
+ .getSchemaReferenceMapper()
+ .getUrlMapper()
+ .getMappingsCache();
+ }
+} \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/StndDefinedValidatorTest.java b/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/StndDefinedValidatorTest.java
new file mode 100644
index 00000000..be4bea9d
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/StndDefinedValidatorTest.java
@@ -0,0 +1,153 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.jupiter.api.Test;
+import org.onap.dcaegen2.services.sdk.services.external.schema.manager.exception.IncorrectInternalFileReferenceException;
+import org.onap.dcaegen2.services.sdk.services.external.schema.manager.exception.NoLocalReferenceException;
+
+import java.io.IOException;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class StndDefinedValidatorTest {
+
+ private static final String TEST_RESOURCES = "src/main/test/resources/";
+ private static final String MAPPING_FILE_PATH = TEST_RESOURCES + "externalRepo/schema-map.json";
+ private static final String SCHEMAS_PATH = TEST_RESOURCES + "externalRepo";
+
+ private static final String VALID_EVENT_PATH = TEST_RESOURCES + "externalRepo/validEvent.json";
+ private static final String INVALID_EVENT_PATH = TEST_RESOURCES + "externalRepo/invalidEvent.json";
+ private static final String VALID_NO_HASH_EVENT_PATH = TEST_RESOURCES + "externalRepo/validNoHashEvent.json";
+ private static final String INCORRECT_INTERNAL_REF_EVENT_PATH = TEST_RESOURCES + "externalRepo/incorrectHashEvent.json";
+
+ private final ObjectMapper objectMapper = new ObjectMapper();
+ private final StndDefinedValidator validator = new StndDefinedValidator.ValidatorBuilder()
+ .mappingFilePath(MAPPING_FILE_PATH)
+ .schemasPath(SCHEMAS_PATH)
+ .build();
+
+ @Test
+ void shouldValidateStndDefinedFieldsInEventAndReturnTrueWhenValidEventIsGiven()
+ throws IOException {
+ //given
+ FileReader fileReader = new FileReader(VALID_EVENT_PATH);
+ JsonNode validEventNode = objectMapper.readTree(fileReader.readFile());
+
+ //when
+ boolean validationResult = validator.validate(validEventNode);
+
+ //then
+ assertTrue(validationResult);
+ }
+
+ @Test
+ void shouldValidateStndDefinedFieldsInEventAndReturnFalseWhenInvalidEventIsGiven()
+ throws IOException {
+ //given
+ FileReader fileReader = new FileReader(INVALID_EVENT_PATH);
+ JsonNode invalidEventNode = objectMapper.readTree(fileReader.readFile());
+
+ //when
+ boolean validationResult = validator.validate(invalidEventNode);
+
+ //then
+ assertFalse(validationResult);
+ }
+
+ @Test
+ void shouldValidateStndDefinedFieldsInEventAndReturnTrueWhenValidSchemaReferenceHasNoHash()
+ throws IOException {
+ //given
+ FileReader fileReader = new FileReader(VALID_NO_HASH_EVENT_PATH);
+ JsonNode validEventNode = objectMapper.readTree(fileReader.readFile());
+
+ //when
+ boolean validationResult = validator.validate(validEventNode);
+
+ //then
+ assertTrue(validationResult);
+ }
+
+ @Test
+ void shouldValidateStndDefinedFieldsInEventAndReturnExceptionWhenEventReferToNotExistingLocalSchema()
+ throws IOException {
+ //given
+ String noLocalResourceMappingFilePath = TEST_RESOURCES + "externalRepo/schema-map-no-local-resource.json";
+ StndDefinedValidator validator = getValidator(noLocalResourceMappingFilePath);
+ FileReader fileReader = new FileReader(VALID_EVENT_PATH);
+ JsonNode validEventNode = objectMapper.readTree(fileReader.readFile());
+
+ //when
+ //then
+ assertThrows(NoLocalReferenceException.class, () -> validator.validate(validEventNode));
+ }
+
+ @Test
+ void shouldValidateStndDefinedFieldsInEventAndReturnExceptionWhenEventReferToEmptySchema()
+ throws IOException {
+ //given
+ String noLocalResourceMappingFilePath = TEST_RESOURCES + "externalRepo/schema-map-empty-content.json";
+ StndDefinedValidator validator = getValidator(noLocalResourceMappingFilePath);
+ FileReader fileReader = new FileReader(VALID_EVENT_PATH);
+ JsonNode validEventNode = objectMapper.readTree(fileReader.readFile());
+
+ //when
+ //then
+ assertThrows(NoLocalReferenceException.class, () -> validator.validate(validEventNode));
+ }
+
+ @Test
+ void shouldValidateStndDefinedFieldsInEventAndReturnExceptionWhenEventReferToIncorrectYamlFormatSchema()
+ throws IOException {
+ //given
+ String noLocalResourceMappingFilePath = TEST_RESOURCES + "externalRepo/schema-map-incorrect-yaml-format.json";
+ StndDefinedValidator validator = getValidator(noLocalResourceMappingFilePath);
+ JsonNode validEventNode = objectMapper.readTree(new FileReader(VALID_EVENT_PATH).readFile());
+
+ //when
+ //then
+ assertThrows(NoLocalReferenceException.class, () -> validator.validate(validEventNode));
+ }
+
+ @Test
+ void shouldValidateStndDefinedFieldsInEventAndReturnExceptionWhenEventReferToIncorrectInternalFileReference()
+ throws IOException {
+ //given
+ JsonNode validEventNode = objectMapper.readTree(new FileReader(INCORRECT_INTERNAL_REF_EVENT_PATH).readFile());
+
+ //when
+ //then
+ assertThrows(IncorrectInternalFileReferenceException.class, () -> validator.validate(validEventNode));
+ }
+
+
+ private StndDefinedValidator getValidator(String noLocalResourceMappingFilePath) {
+ return new StndDefinedValidator.ValidatorBuilder()
+ .mappingFilePath(noLocalResourceMappingFilePath)
+ .schemasPath(SCHEMAS_PATH)
+ .build();
+ }
+} \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/UrlMapperTest.java b/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/UrlMapperTest.java
new file mode 100644
index 00000000..60214eb8
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/org/onap/dcaegen2/services/sdk/services/external/schema/manager/service/UrlMapperTest.java
@@ -0,0 +1,98 @@
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.sdk.services.external.schema.manager.service;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.onap.dcaegen2.services.sdk.services.external.schema.manager.exception.NoLocalReferenceException;
+
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+class UrlMapperTest {
+ private static final String MAPPING_FILE_PATH = "src/main/test/resources/schema-map-to-tests.json";
+ private static final String SCHEMAS_PATH = "src/main/test/resources";
+ private static UrlMapper urlMapper;
+
+ @BeforeAll
+ public static void setUp() {
+ urlMapper = new UrlMapperFactory().getUrlMapper(MAPPING_FILE_PATH, SCHEMAS_PATH);
+ }
+
+ @Test
+ public void shouldThrowExceptionWhenNoMappingExists() {
+ //given
+ String notMappedPublicUrl = "http://localhost:8080/notExisting";
+
+ //when
+ //then
+ assertThrows(NoLocalReferenceException.class, () -> urlMapper.mapToLocalUrl(notMappedPublicUrl));
+ }
+
+ @Test
+ public void shouldThrowExceptionWhenLocalSchemaFileIsEmpty() {
+ //given
+ String publicUrlToEmptyLocal = "http://someExternalUrl/emptySchema";
+
+ //when
+ //then
+ assertThrows(NoLocalReferenceException.class, () -> urlMapper.mapToLocalUrl(publicUrlToEmptyLocal));
+ }
+
+ @Test
+ public void shouldThrowExceptionWhenFileHasInvalidYamlStructure() {
+ //given
+ String publicUrlToInvalidYamlLocal = "http://someExternalUrl/invalidYamlFile";
+
+ //when
+ //then
+ assertThrows(NoLocalReferenceException.class, () -> urlMapper.mapToLocalUrl(publicUrlToInvalidYamlLocal));
+ }
+
+ @Test
+ public void shouldThrowExceptionWhenLocalFileDoesNotExist() {
+ //given
+ String publicUrlToNotExistingLocalFile = "http://someExternalUrl/missingFile";
+
+ //when
+ //then
+ assertThrows(NoLocalReferenceException.class, () -> urlMapper.mapToLocalUrl(publicUrlToNotExistingLocalFile));
+ }
+
+ @Test
+ public void shouldReturnLocalUrlWhenFileValidAndFound() {
+ //given
+ String publicUrl = "http://someExternalUrl/external";
+
+ //when
+ //then
+ assertEquals("file_with_one_line.json", urlMapper.mapToLocalUrl(publicUrl));
+ }
+
+ @Test
+ public void shouldNotThrowExceptionWhenMappingFileDoesNotExist() {
+ String invalidMappingFilePath = "src/main/test/resources/missing-schema.json";
+
+ Assertions.assertDoesNotThrow(() -> new UrlMapperFactory().getUrlMapper(invalidMappingFilePath, SCHEMAS_PATH));
+ }
+} \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/incorrectHashEvent.json b/services/external-schema-manager/src/main/test/resources/externalRepo/incorrectHashEvent.json
new file mode 100644
index 00000000..a39450d4
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/incorrectHashEvent.json
@@ -0,0 +1,54 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "version": "4",
+ "vesEventListenerVersion": 7,
+ "domain": "fault",
+ "eventId": "stndDefined-gNB_Nokia000001",
+ "eventName": "stndDefined-gNB-Nokia-PowerLost",
+ "stndDefinedNamespace": "3GPP-FaultSupervision",
+ "startEpochMicrosec": 1413378172000000,
+ "lastEpochMicrosec": 1413378172000000,
+ "reportingEntityName": "ibcx0001vm002oam001",
+ "sourceName": "scfx0001vm002cap001",
+ "sequence": 1,
+ "priority": "High"
+ },
+ "stndDefinedFields": {
+ "schemaReference": "http://localhost:8080/external1#invalid/components-test/test-schemas/NotifyNewAlarm123",
+ "data": {
+ "href": 1,
+ "uri": "1",
+ "notificationId": 1,
+ "notificationType": "notifyNewAlarm",
+ "eventTime": "xyz",
+ "systemDN": "xyz",
+ "probableCause": 1,
+ "perceivedSeverity": "INDETERMINATE",
+ "rootCauseIndicator": false,
+ "specificProblem": "xyz",
+ "correlatedNotifications": [],
+ "backedUpStatus": true,
+ "backUpObject": "xyz",
+ "trendIndication": "MORE_SEVERE",
+ "thresholdInfo": {
+ "observedMeasurement": "new",
+ "observedValue": 123
+ },
+ "stateChangeDefinition": {
+ },
+ "monitoredAttributes": {
+ "newAtt": "new"
+ },
+ "proposedRepairActions": "xyz",
+ "additionalText": "xyz",
+ "additionalInformation": {
+ "addInfo": "new"
+ },
+ "alarmId": "1",
+ "alarmType": "COMMUNICATIONS_ALARM"
+ },
+ "stndDefinedFieldsVersion": "1.0"
+ }
+ }
+} \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/invalidEvent.json b/services/external-schema-manager/src/main/test/resources/externalRepo/invalidEvent.json
new file mode 100644
index 00000000..b66346cf
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/invalidEvent.json
@@ -0,0 +1,54 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "version": "4",
+ "vesEventListenerVersion": 7,
+ "domain": "fault",
+ "eventId": "stndDefined-gNB_Nokia000001",
+ "eventName": "stndDefined-gNB-Nokia-PowerLost",
+ "stndDefinedNamespace": "3GPP-FaultSupervision",
+ "startEpochMicrosec": 1413378172000000,
+ "lastEpochMicrosec": 1413378172000000,
+ "reportingEntityName": "ibcx0001vm002oam001",
+ "sourceName": "scfx0001vm002cap001",
+ "sequence": 1,
+ "priority": "High"
+ },
+ "stndDefinedFields": {
+ "schemaReference": "http://localhost:8080/external1#components/schemas/NotifyNewAlarm",
+ "data": {
+ "href": 1,
+ "uri": "1",
+ "notificationId": 1,
+ "notificationType": "notifyNewAlarm",
+ "eventTime": "xyz",
+ "systemDN": "xyz",
+ "probableCause": 1,
+ "perceivedSeverity": "INDETERMINATE",
+ "rootCauseIndicator": false,
+ "specificProblem": "xyz",
+ "correlatedNotifications": [],
+ "backedUpStatus": true,
+ "backUpObject": "xyz",
+ "trendIndication": "MORE_SEVERE",
+ "thresholdInfo": {
+ "observedMeasurement": "new",
+ "observedValue": 123
+ },
+ "stateChangeDefinition": {
+ },
+ "monitoredAttributes": {
+ "newAtt": "new"
+ },
+ "proposedRepairActions": "xyz",
+ "additionalText": "xyz",
+ "additionalInformation": {
+ "addInfo": "new"
+ },
+ "alarmId": 1,
+ "alarmType": "COMMUNICATIONS_ALARM_INVALID"
+ },
+ "stndDefinedFieldsVersion": "1.0"
+ }
+ }
+} \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_EmptyContent.yaml b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_EmptyContent.yaml
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_EmptyContent.yaml
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_FaultMNS.yaml b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_FaultMNS.yaml
new file mode 100644
index 00000000..ef15579c
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_FaultMNS.yaml
@@ -0,0 +1,1144 @@
+openapi: 3.0.1
+info:
+ title: Fault Supervision MnS
+ version: 16.4.0
+ description: >-
+ OAS 3.0.1 definition of the Fault Supervision MnS
+ © 2020, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TSDSI, TTA, TTC).
+ All rights reserved.
+externalDocs:
+ description: 3GPP TS 28.532 V16.4.0; Generic management services
+ url: http://www.3gpp.org/ftp/Specs/archive/28_series/28.532/
+servers:
+ - url: '{MnSRoot}/FaultSupervisionMnS/{version}'
+ variables:
+ MnSRoot:
+ description: See subclause 4.4.3 of TS 32.158
+ default: http://example.com/3GPPManagement
+ version:
+ description: Version number of the OpenAPI definition
+ default: XXX
+paths:
+ /alarms:
+ get:
+ summary: Retrieve multiple alarms
+ description: >-
+ Retrieves the alarms identified by alarmAckState, baseObjectInstance
+ and filter.
+ parameters:
+ - name: alarmAckState
+ in: query
+ required: false
+ schema:
+ $ref: '#/components/schemas/AlarmAckState'
+ - name: baseObjectInstance
+ in: query
+ required: false
+ schema:
+ $ref: '#/components/schemas/Dn'
+ - name: filter
+ in: query
+ required: false
+ schema:
+ $ref: '#/components/schemas/Filter'
+ responses:
+ '200':
+ description: >-
+ Success case ("200 OK").
+ Returns the alarms identified in the request. The alarmId is the key
+ of the map.
+ content:
+ application/json:
+ schema:
+ type: object
+ additionalProperties:
+ type: object
+ allOf:
+ - type: object
+ properties:
+ lastNotificationHeader:
+ $ref: '#/components/schemas/NotificationHeader'
+ - $ref: '#/components/schemas/AlarmRecord'
+ - type: object
+ properties:
+ comments:
+ $ref: '#/components/schemas/Comments'
+ default:
+ description: Response in case of error.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ patch:
+ summary: 'Clear, acknowledge or unacknowledge multiple alarms'
+ description: >-
+ Clears, acknowledges or unacknowledges multiple alarms using patch. Depending
+ on which action is to be performed, different merge patch documents need
+ to be used.
+ requestBody:
+ description: >-
+ Patch documents for acknowledging and unacknowledging, or clearing multiple
+ alarms. The keys in the map are the alarmIds to be patched.
+ content:
+ application/merge-patch+json:
+ schema:
+ oneOf:
+ - type: object
+ additionalProperties:
+ $ref: '#/components/schemas/MergePatchAcknowledgeAlarm'
+ - type: object
+ additionalProperties:
+ $ref: '#/components/schemas/MergePatchClearAlarm'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No content").
+ The response message body is empty.
+ default:
+ description: Response in case of error.
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/FailedAlarm'
+ /alarms/alarmCount:
+ get:
+ summary: Get the alarm count per perceived severity
+ parameters:
+ - name: alarmAckState
+ in: query
+ required: false
+ schema:
+ $ref: '#/components/schemas/AlarmAckState'
+ - name: filter
+ in: query
+ required: false
+ schema:
+ type: string
+ responses:
+ '200':
+ description: >-
+ Success case ("200 OK").
+ The alarm count per perceived severity is returned.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AlarmCount'
+ default:
+ description: Response in case of error. The error case needs rework.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ /alarms/{alarmId}:
+ patch:
+ summary: 'Clear, acknowledge or unacknowledge a single alarm'
+ description: >-
+ Clears, acknowledges or uncknowldeges a single alarm by patching the alarm
+ information. A conditional acknowledge request based on the perceived
+ severity is not supported.
+ parameters:
+ - name: alarmId
+ in: path
+ description: Identifies the alarm to be patched.
+ required: true
+ schema:
+ type: string
+ requestBody:
+ required: true
+ content:
+ application/merge-patch+json:
+ schema:
+ oneOf:
+ - $ref: '#/components/schemas/MergePatchAcknowledgeAlarm'
+ - $ref: '#/components/schemas/MergePatchClearAlarm'
+ responses:
+ '204':
+ description: >-
+ Success case (204 No content).
+ The response message body is absent.
+ default:
+ description: Response in case of error.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ /alarms/{alarmId}/comments:
+ post:
+ summary: Add a comment to a single alarm
+ description: >-
+ Adds a comment to an alarm identified by alarmId. The id of the new comment
+ is allocated by the producer.
+ parameters:
+ - name: alarmId
+ in: path
+ description: Identifies the alarm to which the comment shall be added.
+ required: true
+ schema:
+ type: string
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Comment'
+ responses:
+ '201':
+ description: >-
+ Success case (201 Created).
+ The representation of the newly created comment resource shall be returned.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Comment'
+ headers:
+ Location:
+ description: URI of the newly created comment resource.
+ required: true
+ schema:
+ type: string
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+
+ /subscriptions:
+ post:
+ summary: Create a subscription
+ description: >-
+ To create a subscription the representation of the subscription is
+ POSTed on the /subscriptions collection resource.
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Subscription'
+ responses:
+ '201':
+ description: >-
+ Success case ("201 Created").
+ The representation of the newly created subscription resource shall
+ be returned.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Subscription'
+ headers:
+ Location:
+ description: URI of the newly created subscription resource
+ required: true
+ schema:
+ type: string
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ callbacks:
+ notifyNewAlarm:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ oneOf:
+ - $ref: '#/components/schemas/NotifyNewAlarm'
+ - $ref: '#/components/schemas/NotifyNewSecAlarm'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ notifyClearedAlarm:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NotifyClearedAlarm'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ notifyChangedAlarm:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NotifyChangedAlarm'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ notifyChangedAlarmGeneral:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ oneOf:
+ - $ref: '#/components/schemas/NotifyChangedAlarmGeneral'
+ - $ref: '#/components/schemas/NotifyChangedSecAlarmGeneral'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ notifyCorrelatedNotificationChanged:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NotifyCorrelatedNotificationChanged'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ notifyAckStateChanged:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NotifyAckStateChanged'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ notifyComments:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NotifyComments'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ notifyPotentialFaultyAlarmList:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NotifyPotentialFaultyAlarmList'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ notifyAlarmListRebuilt:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NotifyAlarmListRebuilt'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ /subscriptions/{subscriptionId}:
+ delete:
+ summary: Delete a subscription
+ description: >-
+ The subscription is deleted by deleting the corresponding subscription
+ resource. The resource to be deleted is identified with the path
+ component of the URI.
+ parameters:
+ - name: subscriptionId
+ in: path
+ description: Identifies the subscription to be deleted.
+ required: true
+ schema:
+ type: string
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The subscription resource has been deleted. The response message body
+ is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+
+components:
+ schemas:
+
+ #---- Definitions to be moved to comDefs.yaml --------------------------------------#
+
+ Long:
+ type: string
+ format: long
+ Float:
+ type: string
+ format: float
+ DateTime:
+ type: string
+ format: date-Time
+
+ Dn:
+ type: string
+ Uri:
+ type: string
+
+ AttributeNameValuePairSet:
+ type: object
+ minProperties: 1
+ AttributeValueChangeSet:
+ description: >-
+ The key in this map is the attribute name. The value of each key is an array.
+ When only one item is present in the array, it carries the new attribute
+ value. If two items are present, then the first item carries the old value
+ and the second item the new value. The items can be of any type including null.
+ type: object
+ additionalProperties:
+ type: array
+ minItems: 1
+ maxItems: 2
+ items:
+ nullable: true
+
+ Filter:
+ type: string
+ SystemDN:
+ type: string
+
+ NotificationId:
+ type: integer
+ NotificationHeader:
+ description: >-
+ Header used for all notification types
+ type: object
+ required:
+ - href
+ - notificationId
+ - notificationType
+ - eventTime
+ - systemDN
+ properties:
+ uri:
+ $ref: '#/components/schemas/Uri'
+ notificationId:
+ $ref: '#/components/schemas/NotificationId'
+ notificationType:
+ oneOf:
+ - $ref: '#/components/schemas/AlarmNotificationTypes'
+ #- $ref: 'faultMnS.yaml#/components/schemas/AlarmNotificationTypes'
+ #- $ref: 'provMnS.yaml#/components/schemas/CmNotificationTypes'
+ # more to be added
+ eventTime:
+ $ref: '#/components/schemas/DateTime'
+ systemDN:
+ $ref: '#/components/schemas/SystemDN'
+
+ ErrorResponse:
+ description: >-
+ Default schema for the response message body in case the request is not
+ successful.
+ type: object
+ properties:
+ error:
+ type: object
+ properties:
+ errorInfo:
+ type: string
+
+ #---- End of definitions to be moved to comDefs.yaml -------------------------------#
+
+ #---- Definition of AlarmRecord ----------------------------------------------------#
+
+ AlarmId:
+ type: string
+ AlarmType:
+ type: string
+ enum:
+ - COMMUNICATIONS_ALARM
+ - QUALITY_OF_SERVICE_ALARM
+ - PROCESSING_ERROR_ALARM
+ - EQUIPMENT_ALARM
+ - ENVIRONMENTAL_ALARM
+ - INTEGRITY_VIOLATION
+ - OPERATIONAL_VIOLATION
+ - PHYSICAL_VIOLATION
+ - SECURITY_SERVICE_OR_MECHANISM_VIOLATION
+ - TIME_DOMAIN_VIOLATION
+ ProbableCause:
+ description: >-
+ The value of the probable cause may be a specific standardized string, or any
+ vendor provided string. Probable cause strings are not standardized in the
+ present document. They may be added in a future version. Up to then the
+ mapping of the generic probable cause strings "PROBABLE_CAUSE_001" to
+ "PROBABLE_CAUSE_005" is vendor specific.
+ The value of the probable cause may also be an integer. The mapping of integer
+ values to probable causes is vendor specific.
+ oneOf:
+ - anyOf:
+ - type: string
+ enum:
+ - PROBABLE_CAUSE_001
+ - PROBABLE_CAUSE_002
+ - PROBABLE_CAUSE_003
+ - PROBABLE_CAUSE_004
+ - PROBABLE_CAUSE_005
+ - type: string
+ - type: integer
+ SpecificProblem:
+ oneOf:
+ - type: string
+ - type: integer
+ PerceivedSeverity:
+ type: string
+ enum:
+ - INDETERMINATE
+ - CRITICAL
+ - MAJOR
+ - MINOR
+ - WARNING
+ - CLEARED
+ TrendIndication:
+ type: string
+ enum:
+ - MORE_SEVERE
+ - NO_CHANGE
+ - LESS_SEVERE
+ ThresholdHysteresis:
+ type: object
+ required:
+ - high
+ properties:
+ high:
+ oneOf:
+ - type: integer
+ - $ref: '#/components/schemas/Float'
+ low:
+ $ref: '#/components/schemas/Float'
+ ThresholdLevelInd:
+ type: object
+ required:
+ - up
+ properties:
+ up:
+ $ref: '#/components/schemas/ThresholdHysteresis'
+ low:
+ $ref: '#/components/schemas/ThresholdHysteresis'
+ ThresholdInfo:
+ type: object
+ required:
+ - observedMeasurement
+ - observedValue
+ properties:
+ observedMeasurement:
+ type: string
+ observedValue:
+ oneOf:
+ - type: integer
+ - $ref: '#/components/schemas/Float'
+ thresholdLevelInd:
+ $ref: '#/components/schemas/ThresholdLevelInd'
+ armTime:
+ $ref: '#/components/schemas/DateTime'
+ CorrelatedNotification:
+ type: object
+ required:
+ - source
+ - notificationId
+ properties:
+ sourceObjectInstance:
+ $ref: '#/components/schemas/Dn'
+ notificationIds:
+ type: array
+ items:
+ $ref: '#/components/schemas/NotificationId'
+ CorrelatedNotifications:
+ type: array
+ items:
+ $ref: '#/components/schemas/CorrelatedNotification'
+ AckState:
+ type: string
+ enum:
+ - ACKNOWLEDGED
+ - UNACKNOWLEDGED
+
+ AlarmRecord:
+ description: >-
+ The alarmId is not a property of an alarm record. It is used as key
+ in the map of alarm records instead.
+ type: object
+ properties:
+ # alarmId:
+ # $ref: '#/components/schemas/AlarmId'
+ objectInstance:
+ $ref: '#/components/schemas/Dn'
+ notificationId:
+ $ref: '#/components/schemas/NotificationId'
+ alarmRaisedTime:
+ $ref: '#/components/schemas/DateTime'
+ alarmChangedTime:
+ $ref: '#/components/schemas/DateTime'
+ alarmClearedTime:
+ $ref: '#/components/schemas/DateTime'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ specificProblem:
+ $ref: '#/components/schemas/SpecificProblem'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ backedUpStatus:
+ type: boolean
+ backUpObject:
+ $ref: '#/components/schemas/Dn'
+ trendIndication:
+ $ref: '#/components/schemas/TrendIndication'
+ thresholdinfo:
+ $ref: '#/components/schemas/ThresholdInfo'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ stateChangeDefinition:
+ $ref: '#/components/schemas/AttributeValueChangeSet'
+ monitoredAttributes:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ proposedRepairActions:
+ type: string
+ additionalText:
+ type: string
+ additionalInformation:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+
+ rootCauseIndicator:
+ type: boolean
+
+ ackTime:
+ $ref: '#/components/schemas/DateTime'
+ ackUserId:
+ type: string
+ ackSystemId:
+ type: string
+ ackState:
+ $ref: '#/components/schemas/AckState'
+
+ clearUserId:
+ type: string
+ clearSystemId:
+ type: string
+ serviceUser:
+ type: string
+ serviceProvider:
+ type: string
+ securityAlarmDetector:
+ type: string
+
+ #---- Definition of alarm notifications --------------------------------------------#
+
+ AlarmNotificationTypes:
+ type: string
+ enum:
+ - notifyNewAlarm
+ - notifyChangedAlarm
+ - notifyChangedAlarmGeneral
+ - notifyAckStateChanged
+ - notifyCorrelatedNotificationChanged
+ - notifyComments
+ - notifyClearedAlarm
+ - notifyAlarmListRebuiltAlarm
+ - notifyPotentialFaultyAlarmList
+ AlarmListAlignmentRequirement:
+ type: string
+ enum:
+ - ALIGNMENT_REQUIRED
+ - ALIGNMENT_NOT_REQUIRED
+
+ NotifyNewAlarm:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ specificProblem:
+ $ref: '#/components/schemas/SpecificProblem'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ backedUpStatus:
+ type: boolean
+ backUpObject:
+ $ref: '#/components/schemas/Dn'
+ trendIndication:
+ $ref: '#/components/schemas/TrendIndication'
+ thresholdInfo:
+ $ref: '#/components/schemas/ThresholdInfo'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ stateChangeDefinition:
+ $ref: '#/components/schemas/AttributeValueChangeSet'
+ monitoredAttributes:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ proposedRepairActions:
+ type: string
+ additionalText:
+ type: string
+ additionalInformation:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ rootCauseIndicator:
+ type: boolean
+ NotifyNewSecAlarm:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ - serviceUser
+ - serviceProvider
+ - securityAlarmDetector
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ additionalText:
+ type: string
+ additionalInformation:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ rootCauseIndicator:
+ type: boolean
+ serviceUser:
+ type: string
+ serviceProvider:
+ type: string
+ securityAlarmDetector:
+ type: string
+ NotifyClearedAlarm:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ clearUserId:
+ type: string
+ clearSystemId:
+ type: string
+ NotifyChangedAlarm:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ NotifyChangedAlarmGeneral:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ - changedAlarmAttributes
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ specificProblem:
+ $ref: '#/components/schemas/SpecificProblem'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ backedUpStatus:
+ type: boolean
+ backUpObject:
+ $ref: '#/components/schemas/Dn'
+ trendIndication:
+ $ref: '#/components/schemas/TrendIndication'
+ thresholdInfo:
+ $ref: '#/components/schemas/ThresholdInfo'
+ stateChangeDefinition:
+ $ref: '#/components/schemas/AttributeValueChangeSet'
+ monitoredAttributes:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ proposedRepairActions:
+ type: string
+ additionalText:
+ type: string
+ additionalInformation:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ rootCauseIndicator:
+ type: boolean
+ changedAlarmAttributes:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ NotifyChangedSecAlarmGeneral:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ - serviceUser
+ - serviceProvider
+ - securityAlarmDetector
+ - changedAlarmAttributes
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ additionalText:
+ type: string
+ additionalInformation:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ rootCauseIndicator:
+ type: boolean
+ serviceUser:
+ type: string
+ serviceProvider:
+ type: string
+ securityAlarmDetector:
+ type: string
+ changedAlarmAttributes:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ NotifyCorrelatedNotificationChanged:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - correlatedNotifications
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ rootCauseIndicator:
+ type: boolean
+ NotifyAckStateChanged:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ - ackState
+ - ackUserId
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ ackState:
+ $ref: '#/components/schemas/AckState'
+ ackUserId:
+ type: string
+ ackSystemId:
+ type: string
+ NotifyComments:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ - comments
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ comments:
+ $ref: '#/components/schemas/Comments'
+ NotifyPotentialFaultyAlarmList:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - reason
+ properties:
+ reason:
+ type: string
+ NotifyAlarmListRebuilt:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - reason
+ properties:
+ reason:
+ type: string
+ alarmListAlignmentRequirement:
+ $ref: '#/components/schemas/AlarmListAlignmentRequirement'
+
+ #---- Definition of query parameters -----------------------------------------------#
+
+ AlarmAckState:
+ type: string
+ enum:
+ - ALL_ALARMS
+ - ALL_ACTIVE_ALARMS
+ - ALL_ACTIVE_AND_ACKNOWLEDGED_ALARMS
+ - ALL_ACTIVE_AND_UNACKNOWLEDGED_ALARMS
+ - ALL_CLEARED_AND_UNACKNOWLEDGED_ALARMS
+ - ALL_UNACKNOWLEDGED_ALARMS
+
+ #---- Definition of patch documents ------------------------------------------------#
+
+ MergePatchAcknowledgeAlarm:
+ description: >-
+ Patch document acknowledging or unacknowledging a single alarm. For
+ acknowleding an alarm the value of ackState is ACKNOWLEDGED, for unacknowleding
+ an alarm the value of ackState is UNACKNOWLEDGED.
+ type: object
+ required:
+ - ackUserId
+ - ackState
+ properties:
+ ackUserId:
+ type: string
+ ackSystemId:
+ type: string
+ ackState:
+ $ref: '#/components/schemas/AckState'
+ MergePatchClearAlarm:
+ description: Patch document for clearing a single alarm
+ type: object
+ required:
+ - clearUserId
+ - perceivedSeverity
+ properties:
+ clearUserId:
+ type: string
+ clearSystemId:
+ type: string
+ perceivedSeverity:
+ type: string
+ enum:
+ - CLEARED
+
+ #---- Definition of method responses -----------------------------------------------#
+
+ FailedAlarm:
+ type: object
+ required:
+ - alarmId
+ - failureReason
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ failureReason:
+ type: string
+
+ #---- Definition of resources ------------------------------------------------------#
+
+ AlarmCount:
+ type: object
+ required:
+ - criticalCount
+ - majorCount
+ - minorCount
+ - warningCount
+ - indeterminateCount
+ - clearedCount
+ properties:
+ criticalCount:
+ type: integer
+ majorCount:
+ type: integer
+ minorCount:
+ type: integer
+ warningCount:
+ type: integer
+ indeterminateCount:
+ type: integer
+ clearedCount:
+ type: integer
+ Comment:
+ type: object
+ properties:
+ commentTime:
+ $ref: '#/components/schemas/DateTime'
+ commentUserId:
+ type: string
+ commentSystemId:
+ type: string
+ commentText:
+ type: string
+ Comments:
+ description: >-
+ Collection of comments. The comment identifiers are allocated by the
+ MnS producer and used as key in the map.
+ type: object
+ additionalProperties:
+ $ref: '#/components/schemas/Comment'
+ Subscription:
+ type: object
+ properties:
+ consumerReference:
+ $ref: '#/components/schemas/Uri'
+ timeTick:
+ $ref: '#/components/schemas/Long'
+ filter:
+ $ref: '#/components/schemas/Filter'
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_HeartBeatMNS.yaml b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_HeartBeatMNS.yaml
new file mode 100644
index 00000000..0e2199ac
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_HeartBeatMNS.yaml
@@ -0,0 +1,23 @@
+openapi: 3.0.1
+info:
+ title: Heartbeat notification
+ version: 16.3.0
+ description: >-
+ OAS 3.0.1 specification of the heartbeat notification
+ © 2020, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TSDSI, TTA, TTC).
+ All rights reserved.
+externalDocs:
+ description: 3GPP TS 28.532 V16.3.0; Heartbeat notification
+ url: http://www.3gpp.org/ftp/Specs/archive/28_series/28.6532/
+paths: {}
+components:
+ schemas:
+ hearbeatNtfPeriod-Type:
+ type: integer
+ notifyHeartbeat-NotifType:
+ allOf:
+ - $ref: 'provMnS.yaml#/components/schemas/header-Type'
+ - type: object
+ properties:
+ heartbeatNtfPeriod:
+ $ref: '#/components/schemas/hearbeatNtfPeriod-Type'
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_IncorrectFormat.yaml b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_IncorrectFormat.yaml
new file mode 100644
index 00000000..dfeee910
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_IncorrectFormat.yaml
@@ -0,0 +1,1144 @@
+openapi: 2.0.1
+ info
+title: Fault Supervision MnS
+version: 16.4.0
+ description: >-
+ OAS 3.0.1 definition of the Fault Supervision MnS
+ © 2020, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TSDSI, TTA, TTC).
+ All rights reserved.
+externalDocs:
+ description: 3GPP TS 28.532 V16.4.0; Generic management services
+ url: http://www.3gpp.org/ftp/Specs/archive/28_series/28.532/
+ servers
+- url: '{MnSRoot}/FaultSupervisionMnS/{version}'
+ variables
+ MnSRoot:
+ description: See subclause 4.4.3 of TS 32.158
+ default: http://example.com/3GPPManagement
+ version:
+ description: Version number of the OpenAPI definition
+ default: XXX
+paths:
+ /alarms:
+ get:
+ summary: Retrieve multiple alarms
+ description: >-
+ Retrieves the alarms identified by alarmAckState, baseObjectInstance
+ and filter.
+ parameters:
+ - name: alarmAckState
+ in: query
+ required: false
+ schema:
+ $ref: '#/components/schemas/AlarmAckState'
+ - name: baseObjectInstance
+ in: query
+ required: false
+ schema:
+ $ref: '#/components/schemas/Dn'
+ - name: filter
+ in: query
+ required: false
+ schema:
+ $ref: '#/components/schemas/Filter'
+ responses:
+ '200':
+ description: >-
+ Success case ("200 OK").
+ Returns the alarms identified in the request. The alarmId is the key
+ of the map.
+ content:
+ application/json:
+ schema:
+ type: object
+ additionalProperties:
+ type: object
+ allOf:
+ - type: object
+ properties:
+ lastNotificationHeader:
+ $ref: '#/components/schemas/NotificationHeader'
+ - $ref: '#/components/schemas/AlarmRecord'
+ - type: object
+ properties:
+ comments:
+ $ref: '#/components/schemas/Comments'
+ default:
+ description: Response in case of error.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ patch:
+ summary: 'Clear, acknowledge or unacknowledge multiple alarms'
+ description: >-
+ Clears, acknowledges or unacknowledges multiple alarms using patch. Depending
+ on which action is to be performed, different merge patch documents need
+ to be used.
+ requestBody:
+ description: >-
+ Patch documents for acknowledging and unacknowledging, or clearing multiple
+ alarms. The keys in the map are the alarmIds to be patched.
+ content:
+ application/merge-patch+json:
+ schema:
+ oneOf:
+ - type: object
+ additionalProperties:
+ $ref: '#/components/schemas/MergePatchAcknowledgeAlarm'
+ - type: object
+ additionalProperties:
+ $ref: '#/components/schemas/MergePatchClearAlarm'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No content").
+ The response message body is empty.
+ default:
+ description: Response in case of error.
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/FailedAlarm'
+ /alarms/alarmCount:
+ get:
+ summary: Get the alarm count per perceived severity
+ parameters:
+ - name: alarmAckState
+ in: query
+ required: false
+ schema:
+ $ref: '#/components/schemas/AlarmAckState'
+ - name: filter
+ in: query
+ required: false
+ schema:
+ type: string
+ responses:
+ '200':
+ description: >-
+ Success case ("200 OK").
+ The alarm count per perceived severity is returned.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AlarmCount'
+ default:
+ description: Response in case of error. The error case needs rework.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ /alarms/{alarmId}:
+ patch:
+ summary: 'Clear, acknowledge or unacknowledge a single alarm'
+ description: >-
+ Clears, acknowledges or uncknowldeges a single alarm by patching the alarm
+ information. A conditional acknowledge request based on the perceived
+ severity is not supported.
+ parameters:
+ - name: alarmId
+ in: path
+ description: Identifies the alarm to be patched.
+ required: true
+ schema:
+ type: string
+ requestBody:
+ required: true
+ content:
+ application/merge-patch+json:
+ schema:
+ oneOf:
+ - $ref: '#/components/schemas/MergePatchAcknowledgeAlarm'
+ - $ref: '#/components/schemas/MergePatchClearAlarm'
+ responses:
+ '204':
+ description: >-
+ Success case (204 No content).
+ The response message body is absent.
+ default:
+ description: Response in case of error.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ /alarms/{alarmId}/comments:
+ post:
+ summary: Add a comment to a single alarm
+ description: >-
+ Adds a comment to an alarm identified by alarmId. The id of the new comment
+ is allocated by the producer.
+ parameters:
+ - name: alarmId
+ in: path
+ description: Identifies the alarm to which the comment shall be added.
+ required: true
+ schema:
+ type: string
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Comment'
+ responses:
+ '201':
+ description: >-
+ Success case (201 Created).
+ The representation of the newly created comment resource shall be returned.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Comment'
+ headers:
+ Location:
+ description: URI of the newly created comment resource.
+ required: true
+ schema:
+ type: string
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+
+ /subscriptions:
+ post:
+ summary: Create a subscription
+ description: >-
+ To create a subscription the representation of the subscription is
+ POSTed on the /subscriptions collection resource.
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Subscription'
+ responses:
+ '201':
+ description: >-
+ Success case ("201 Created").
+ The representation of the newly created subscription resource shall
+ be returned.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Subscription'
+ headers:
+ Location:
+ description: URI of the newly created subscription resource
+ required: true
+ schema:
+ type: string
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ callbacks:
+ notifyNewAlarm:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ oneOf:
+ - $ref: '#/components/schemas/NotifyNewAlarm'
+ - $ref: '#/components/schemas/NotifyNewSecAlarm'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ notifyClearedAlarm:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NotifyClearedAlarm'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ notifyChangedAlarm:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NotifyChangedAlarm'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ notifyChangedAlarmGeneral:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ oneOf:
+ - $ref: '#/components/schemas/NotifyChangedAlarmGeneral'
+ - $ref: '#/components/schemas/NotifyChangedSecAlarmGeneral'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ notifyCorrelatedNotificationChanged:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NotifyCorrelatedNotificationChanged'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ notifyAckStateChanged:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NotifyAckStateChanged'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ notifyComments:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NotifyComments'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ notifyPotentialFaultyAlarmList:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NotifyPotentialFaultyAlarmList'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ notifyAlarmListRebuilt:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NotifyAlarmListRebuilt'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response message
+ body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+ /subscriptions/{subscriptionId}:
+ delete:
+ summary: Delete a subscription
+ description: >-
+ The subscription is deleted by deleting the corresponding subscription
+ resource. The resource to be deleted is identified with the path
+ component of the URI.
+ parameters:
+ - name: subscriptionId
+ in: path
+ description: Identifies the subscription to be deleted.
+ required: true
+ schema:
+ type: string
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The subscription resource has been deleted. The response message body
+ is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ErrorResponse'
+
+components:
+ schemas:
+
+ #---- Definitions to be moved to comDefs.yaml --------------------------------------#
+
+ Long:
+ type: string
+ format: long
+ Float:
+ type: string
+ format: float
+ DateTime:
+ type: string
+ format: date-Time
+
+ Dn:
+ type: string
+ Uri:
+ type: string
+
+ AttributeNameValuePairSet:
+ type: object
+ minProperties: 1
+ AttributeValueChangeSet:
+ description: >-
+ The key in this map is the attribute name. The value of each key is an array.
+ When only one item is present in the array, it carries the new attribute
+ value. If two items are present, then the first item carries the old value
+ and the second item the new value. The items can be of any type including null.
+ type: object
+ additionalProperties:
+ type: array
+ minItems: 1
+ maxItems: 2
+ items:
+ nullable: true
+
+ Filter:
+ type: string
+ SystemDN:
+ type: string
+
+ NotificationId:
+ type: integer
+ NotificationHeader:
+ description: >-
+ Header used for all notification types
+ type: object
+ required:
+ - href
+ - notificationId
+ - notificationType
+ - eventTime
+ - systemDN
+ properties:
+ uri:
+ $ref: '#/components/schemas/Uri'
+ notificationId:
+ $ref: '#/components/schemas/NotificationId'
+ notificationType:
+ oneOf:
+ - $ref: '#/components/schemas/AlarmNotificationTypes'
+ #- $ref: 'faultMnS.yaml#/components/schemas/AlarmNotificationTypes'
+ #- $ref: 'provMnS.yaml#/components/schemas/CmNotificationTypes'
+ # more to be added
+ eventTime:
+ $ref: '#/components/schemas/DateTime'
+ systemDN:
+ $ref: '#/components/schemas/SystemDN'
+
+ ErrorResponse:
+ description: >-
+ Default schema for the response message body in case the request is not
+ successful.
+ type: object
+ properties:
+ error:
+ type: object
+ properties:
+ errorInfo:
+ type: string
+
+ #---- End of definitions to be moved to comDefs.yaml -------------------------------#
+
+ #---- Definition of AlarmRecord ----------------------------------------------------#
+
+ AlarmId:
+ type: string
+ AlarmType:
+ type: string
+ enum:
+ - COMMUNICATIONS_ALARM
+ - QUALITY_OF_SERVICE_ALARM
+ - PROCESSING_ERROR_ALARM
+ - EQUIPMENT_ALARM
+ - ENVIRONMENTAL_ALARM
+ - INTEGRITY_VIOLATION
+ - OPERATIONAL_VIOLATION
+ - PHYSICAL_VIOLATION
+ - SECURITY_SERVICE_OR_MECHANISM_VIOLATION
+ - TIME_DOMAIN_VIOLATION
+ ProbableCause:
+ description: >-
+ The value of the probable cause may be a specific standardized string, or any
+ vendor provided string. Probable cause strings are not standardized in the
+ present document. They may be added in a future version. Up to then the
+ mapping of the generic probable cause strings "PROBABLE_CAUSE_001" to
+ "PROBABLE_CAUSE_005" is vendor specific.
+ The value of the probable cause may also be an integer. The mapping of integer
+ values to probable causes is vendor specific.
+ oneOf:
+ - anyOf:
+ - type: string
+ enum:
+ - PROBABLE_CAUSE_001
+ - PROBABLE_CAUSE_002
+ - PROBABLE_CAUSE_003
+ - PROBABLE_CAUSE_004
+ - PROBABLE_CAUSE_005
+ - type: string
+ - type: integer
+ SpecificProblem:
+ oneOf:
+ - type: string
+ - type: integer
+ PerceivedSeverity:
+ type: string
+ enum:
+ - INDETERMINATE
+ - CRITICAL
+ - MAJOR
+ - MINOR
+ - WARNING
+ - CLEARED
+ TrendIndication:
+ type: string
+ enum:
+ - MORE_SEVERE
+ - NO_CHANGE
+ - LESS_SEVERE
+ ThresholdHysteresis:
+ type: object
+ required:
+ - high
+ properties:
+ high:
+ oneOf:
+ - type: integer
+ - $ref: '#/components/schemas/Float'
+ low:
+ $ref: '#/components/schemas/Float'
+ ThresholdLevelInd:
+ type: object
+ required:
+ - up
+ properties:
+ up:
+ $ref: '#/components/schemas/ThresholdHysteresis'
+ low:
+ $ref: '#/components/schemas/ThresholdHysteresis'
+ ThresholdInfo:
+ type: object
+ required:
+ - observedMeasurement
+ - observedValue
+ properties:
+ observedMeasurement:
+ type: string
+ observedValue:
+ oneOf:
+ - type: integer
+ - $ref: '#/components/schemas/Float'
+ thresholdLevelInd:
+ $ref: '#/components/schemas/ThresholdLevelInd'
+ armTime:
+ $ref: '#/components/schemas/DateTime'
+ CorrelatedNotification:
+ type: object
+ required:
+ - source
+ - notificationId
+ properties:
+ sourceObjectInstance:
+ $ref: '#/components/schemas/Dn'
+ notificationIds:
+ type: array
+ items:
+ $ref: '#/components/schemas/NotificationId'
+ CorrelatedNotifications:
+ type: array
+ items:
+ $ref: '#/components/schemas/CorrelatedNotification'
+ AckState:
+ type: string
+ enum:
+ - ACKNOWLEDGED
+ - UNACKNOWLEDGED
+
+ AlarmRecord:
+ description: >-
+ The alarmId is not a property of an alarm record. It is used as key
+ in the map of alarm records instead.
+ type: object
+ properties:
+ # alarmId:
+ # $ref: '#/components/schemas/AlarmId'
+ objectInstance:
+ $ref: '#/components/schemas/Dn'
+ notificationId:
+ $ref: '#/components/schemas/NotificationId'
+ alarmRaisedTime:
+ $ref: '#/components/schemas/DateTime'
+ alarmChangedTime:
+ $ref: '#/components/schemas/DateTime'
+ alarmClearedTime:
+ $ref: '#/components/schemas/DateTime'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ specificProblem:
+ $ref: '#/components/schemas/SpecificProblem'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ backedUpStatus:
+ type: boolean
+ backUpObject:
+ $ref: '#/components/schemas/Dn'
+ trendIndication:
+ $ref: '#/components/schemas/TrendIndication'
+ thresholdinfo:
+ $ref: '#/components/schemas/ThresholdInfo'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ stateChangeDefinition:
+ $ref: '#/components/schemas/AttributeValueChangeSet'
+ monitoredAttributes:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ proposedRepairActions:
+ type: string
+ additionalText:
+ type: string
+ additionalInformation:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+
+ rootCauseIndicator:
+ type: boolean
+
+ ackTime:
+ $ref: '#/components/schemas/DateTime'
+ ackUserId:
+ type: string
+ ackSystemId:
+ type: string
+ ackState:
+ $ref: '#/components/schemas/AckState'
+
+ clearUserId:
+ type: string
+ clearSystemId:
+ type: string
+ serviceUser:
+ type: string
+ serviceProvider:
+ type: string
+ securityAlarmDetector:
+ type: string
+
+ #---- Definition of alarm notifications --------------------------------------------#
+
+ AlarmNotificationTypes:
+ type: string
+ enum:
+ - notifyNewAlarm
+ - notifyChangedAlarm
+ - notifyChangedAlarmGeneral
+ - notifyAckStateChanged
+ - notifyCorrelatedNotificationChanged
+ - notifyComments
+ - notifyClearedAlarm
+ - notifyAlarmListRebuiltAlarm
+ - notifyPotentialFaultyAlarmList
+ AlarmListAlignmentRequirement:
+ type: string
+ enum:
+ - ALIGNMENT_REQUIRED
+ - ALIGNMENT_NOT_REQUIRED
+
+ NotifyNewAlarm:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ specificProblem:
+ $ref: '#/components/schemas/SpecificProblem'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ backedUpStatus:
+ type: boolean
+ backUpObject:
+ $ref: '#/components/schemas/Dn'
+ trendIndication:
+ $ref: '#/components/schemas/TrendIndication'
+ thresholdInfo:
+ $ref: '#/components/schemas/ThresholdInfo'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ stateChangeDefinition:
+ $ref: '#/components/schemas/AttributeValueChangeSet'
+ monitoredAttributes:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ proposedRepairActions:
+ type: string
+ additionalText:
+ type: string
+ additionalInformation:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ rootCauseIndicator:
+ type: boolean
+ NotifyNewSecAlarm:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ - serviceUser
+ - serviceProvider
+ - securityAlarmDetector
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ additionalText:
+ type: string
+ additionalInformation:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ rootCauseIndicator:
+ type: boolean
+ serviceUser:
+ type: string
+ serviceProvider:
+ type: string
+ securityAlarmDetector:
+ type: string
+ NotifyClearedAlarm:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ clearUserId:
+ type: string
+ clearSystemId:
+ type: string
+ NotifyChangedAlarm:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ NotifyChangedAlarmGeneral:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ - changedAlarmAttributes
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ specificProblem:
+ $ref: '#/components/schemas/SpecificProblem'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ backedUpStatus:
+ type: boolean
+ backUpObject:
+ $ref: '#/components/schemas/Dn'
+ trendIndication:
+ $ref: '#/components/schemas/TrendIndication'
+ thresholdInfo:
+ $ref: '#/components/schemas/ThresholdInfo'
+ stateChangeDefinition:
+ $ref: '#/components/schemas/AttributeValueChangeSet'
+ monitoredAttributes:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ proposedRepairActions:
+ type: string
+ additionalText:
+ type: string
+ additionalInformation:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ rootCauseIndicator:
+ type: boolean
+ changedAlarmAttributes:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ NotifyChangedSecAlarmGeneral:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ - serviceUser
+ - serviceProvider
+ - securityAlarmDetector
+ - changedAlarmAttributes
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ additionalText:
+ type: string
+ additionalInformation:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ rootCauseIndicator:
+ type: boolean
+ serviceUser:
+ type: string
+ serviceProvider:
+ type: string
+ securityAlarmDetector:
+ type: string
+ changedAlarmAttributes:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ NotifyCorrelatedNotificationChanged:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - correlatedNotifications
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ rootCauseIndicator:
+ type: boolean
+ NotifyAckStateChanged:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ - ackState
+ - ackUserId
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ ackState:
+ $ref: '#/components/schemas/AckState'
+ ackUserId:
+ type: string
+ ackSystemId:
+ type: string
+ NotifyComments:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ - comments
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ comments:
+ $ref: '#/components/schemas/Comments'
+ NotifyPotentialFaultyAlarmList:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - reason
+ properties:
+ reason:
+ type: string
+ NotifyAlarmListRebuilt:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - reason
+ properties:
+ reason:
+ type: string
+ alarmListAlignmentRequirement:
+ $ref: '#/components/schemas/AlarmListAlignmentRequirement'
+
+ #---- Definition of query parameters -----------------------------------------------#
+
+ AlarmAckState:
+ type: string
+ enum:
+ - ALL_ALARMS
+ - ALL_ACTIVE_ALARMS
+ - ALL_ACTIVE_AND_ACKNOWLEDGED_ALARMS
+ - ALL_ACTIVE_AND_UNACKNOWLEDGED_ALARMS
+ - ALL_CLEARED_AND_UNACKNOWLEDGED_ALARMS
+ - ALL_UNACKNOWLEDGED_ALARMS
+
+ #---- Definition of patch documents ------------------------------------------------#
+
+ MergePatchAcknowledgeAlarm:
+ description: >-
+ Patch document acknowledging or unacknowledging a single alarm. For
+ acknowleding an alarm the value of ackState is ACKNOWLEDGED, for unacknowleding
+ an alarm the value of ackState is UNACKNOWLEDGED.
+ type: object
+ required:
+ - ackUserId
+ - ackState
+ properties:
+ ackUserId:
+ type: string
+ ackSystemId:
+ type: string
+ ackState:
+ $ref: '#/components/schemas/AckState'
+ MergePatchClearAlarm:
+ description: Patch document for clearing a single alarm
+ type: object
+ required:
+ - clearUserId
+ - perceivedSeverity
+ properties:
+ clearUserId:
+ type: string
+ clearSystemId:
+ type: string
+ perceivedSeverity:
+ type: string
+ enum:
+ - CLEARED
+
+ #---- Definition of method responses -----------------------------------------------#
+
+ FailedAlarm:
+ type: object
+ required:
+ - alarmId
+ - failureReason
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ failureReason:
+ type: string
+
+ #---- Definition of resources ------------------------------------------------------#
+
+ AlarmCount:
+ type: object
+ required:
+ - criticalCount
+ - majorCount
+ - minorCount
+ - warningCount
+ - indeterminateCount
+ - clearedCount
+ properties:
+ criticalCount:
+ type: integer
+ majorCount:
+ type: integer
+ minorCount:
+ type: integer
+ warningCount:
+ type: integer
+ indeterminateCount:
+ type: integer
+ clearedCount:
+ type: integer
+ Comment:
+ type: object
+ properties:
+ commentTime:
+ $ref: '#/components/schemas/DateTime'
+ commentUserId:
+ type: string
+ commentSystemId:
+ type: string
+ commentText:
+ type: string
+ Comments:
+ description: >-
+ Collection of comments. The comment identifiers are allocated by the
+ MnS producer and used as key in the map.
+ type: object
+ additionalProperties:
+ $ref: '#/components/schemas/Comment'
+ Subscription:
+ type: object
+ properties:
+ consumerReference:
+ $ref: '#/components/schemas/Uri'
+ timeTick:
+ $ref: '#/components/schemas/Long'
+ filter:
+ $ref: '#/components/schemas/Filter'
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_PerformanceMNS.yaml b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_PerformanceMNS.yaml
new file mode 100644
index 00000000..54a7ec26
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_PerformanceMNS.yaml
@@ -0,0 +1,272 @@
+openapi: 3.0.1
+info:
+ title: TS 28.532 Performance data file reporting Service
+ version: 16.4.0
+ description: >-
+ OAS 3.0.1 specification of the Performance data file reporting Management Service © 2020,
+ 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TSDSI, TTA, TTC). All
+ rights reserved.
+externalDocs:
+ description: 3GPP TS 28.532 V16.4.0; Generic management services
+ url: 'http://www.3gpp.org/ftp/Specs/archive/28_series/28.532/'
+servers:
+ - url: '{MnSRoot}/PerfDataFileReportMnS/v1640'
+ variables:
+ MnSRoot:
+ description: See subclause 4.4 of TS 32.158
+ default: http://example.com/3GPPManagement
+paths:
+ /Files:
+ get:
+ summary: Read resources of information of available files
+ description: 'With HTTP GET, resources of information of available files are read. The resources to be read are identified with the path component (base resource) and the query component (managementDataType, beginTime and endTime) of the URI. The fields query component allows to select the resource properties to be returned.'
+ parameters:
+ - name: managementDataType
+ in: query
+ description: This parameter identifies the type of management data that the file contains to select the resources from the collection resources identified with the path component of the URI.
+ required: true
+ $ref: '#/components/schemas/managementDataType-Type'
+ - name: beginTime
+ in: query
+ description: This parameter identifies the time stamp no later than which the file became available to select the resources from the collection resources identified with the path component of the URI.
+ required: true
+ $ref: '#/components/schemas/dateTime-Type'
+ - name: endTime
+ in: query
+ description: This parameter identifies the time stamp no earlier than which the file became available to select the resources from the collection resources identified with the path component of the URI.
+ required: true
+ $ref: '#/components/schemas/dateTime-Type'
+ responses:
+ '200':
+ description: 'Success case ("200 OK"). The resources identified in the request for retrieval are returned in the response message body. In case the fields query parameter is used, the selected resources are returned.'
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/fileInfoRetrieval-ResponseType'
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/error-ResponseType'
+ /subscriptions:
+ post:
+ summary: Create a subscription
+ description: To create a subscription the representation of the subscription is POSTed on the /subscriptions collection resource.
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/subscription-RequestType'
+ responses:
+ '201':
+ description: Success case ("201 Created"). The representation of the newly created subscription resource shall be returned.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/subscription-ResponseType'
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/error-ResponseType'
+ callbacks:
+ notifyFileReady:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/notifyFileReady-NotifType'
+ responses:
+ '204':
+ description: Success case ("204 No Content"). The notification is successfully delivered. The response message body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/error-ResponseType'
+ notifyFilePreparationError:
+ '{request.body#/consumerReference}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/notifyFilePreparationError-NotifType'
+ responses:
+ '204':
+ description: Success case ("204 No Content"). The notification is successfully delivered. The response message body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/error-ResponseType'
+ delete:
+ summary: Delete all subscriptions made with a specific consumerReferenceId
+ description: The subscriptions are deleted by deleting the corresponding subscription resources. The resources to be deleted are identified with the path component of the URI pointing to the /subscription collection resource and filtering on the consumerReferenceId provided in the query part.
+ parameters:
+ - name: consumerReferenceId
+ in: query
+ description: Identifies the subscriptions to be deleted.
+ required: true
+ schema:
+ $ref: '#/components/schemas/consumerReferenceId-QueryType'
+ responses:
+ '204':
+ description: Success case ("204 No Content"). The subscription resources have been deleted. The response message body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/error-ResponseType'
+ '/subscriptions/{subscriptionId}':
+ delete:
+ summary: Delete a single subscription
+ description: The subscription is deleted by deleting the corresponding subscription resource. The resource to be deleted is identified with the path component of the URI.
+ parameters:
+ - name: subscriptionId
+ in: path
+ description: Identifies the subscription to be deleted.
+ required: true
+ schema:
+ $ref: '#/components/schemas/subscriptionId-PathType'
+ responses:
+ '204':
+ description: Success case ("204 No Content"). The subscription resource has been deleted. The response message body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/error-ResponseType'
+components:
+ schemas:
+ dateTime-Type:
+ type: string
+ format: date-Time
+ uri-Type:
+ type: string
+ long-Type:
+ type: string
+ format: long
+ additionalText-Type:
+ type: string
+ reason-Type:
+ type: string
+ fileInfoRetrieval-ResponseType:
+ type: object
+ properties:
+ data:
+ type: array
+ items:
+ $ref: '#/components/schemas/fileInfo-Type'
+ fileInfo-Type:
+ type: object
+ properties:
+ fileLocation:
+ $ref: '#/components/schemas/uri-Type'
+ fileSize:
+ $ref: '#/components/schemas/long-Type'
+ fileReadyTime:
+ $ref: '#/components/schemas/dateTime-Type'
+ fileExpirationTime:
+ $ref: '#/components/schemas/dateTime-Type'
+ fileCompression:
+ type: string
+ fileFormat:
+ type: string
+ error-ResponseType:
+ type: object
+ properties:
+ error:
+ type: object
+ properties:
+ errorInfo:
+ type: string
+ managementDataType-Type:
+ type: string
+ enum:
+ - PM
+ header-Type:
+ description: Header used in notifications as notification header
+ type: object
+ properties:
+ uri:
+ $ref: '#/components/schemas/uri-Type'
+ notificationId:
+ $ref: '#/components/schemas/notificationId-Type'
+ notificationType:
+ $ref: '#/components/schemas/notificationType-Type'
+ eventTime:
+ $ref: '#/components/schemas/dateTime-Type'
+ subscriptionId-PathType:
+ type: string
+ filter-Type:
+ type: string
+ notificationId-Type:
+ $ref: '#/components/schemas/long-Type'
+ notificationType-Type:
+ type: string
+ enum:
+ - notifyFileReady
+ - notifyFilePreparationError
+ subscription-ResourceType:
+ type: object
+ properties:
+ consumerReference:
+ $ref: '#/components/schemas/uri-Type'
+ timeTick:
+ $ref: '#/components/schemas/long-Type'
+ filter:
+ $ref: '#/components/schemas/filter-Type'
+ subscription-RequestType:
+ type: object
+ properties:
+ data:
+ $ref: '#/components/schemas/subscription-ResourceType'
+ subscription-ResponseType:
+ type: object
+ properties:
+ data:
+ $ref: '#/components/schemas/subscription-ResourceType'
+ consumerReferenceId-QueryType:
+ $ref: '#/components/schemas/uri-Type'
+ notifyFileReady-NotifType:
+ type: object
+ properties:
+ header:
+ $ref: '#/components/schemas/header-Type'
+ body:
+ type: object
+ properties:
+ fileInfoList:
+ type: array
+ items:
+ $ref: '#/components/schemas/fileInfo-Type'
+ additionalText:
+ $ref: '#/components/schemas/additionalText-Type'
+ notifyFilePreparationError-NotifType:
+ type: object
+ properties:
+ header:
+ $ref: '#/components/schemas/header-Type'
+ body:
+ type: object
+ properties:
+ fileInfoList:
+ type: array
+ items:
+ $ref: '#/components/schemas/fileInfo-Type'
+ reason:
+ $ref: '#/components/schemas/reason-Type'
+ additionalText:
+ $ref: '#/components/schemas/additionalText-Type'
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_PerformanceThresholdMNS.yaml b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_PerformanceThresholdMNS.yaml
new file mode 100644
index 00000000..1bae6a76
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_PerformanceThresholdMNS.yaml
@@ -0,0 +1,102 @@
+openapi: 3.0.1
+info:
+ title: TS 28.532 Performance Threshold Monitoring Service
+ version: 16.4.0
+ description: OAS 3.0.1 specification of the Performance Threshold Monitoring Service
+servers:
+ - url: 'http://{monitoringNotifTarget}'
+ variables:
+ monitoringNotifTarget:
+ description: >-
+ The open API server of the performance threshold monitoring service is
+ located in the consumer side, see monitoringNotifTarget attribute of
+ the IOC ThresholdMonitor defined in 3GPP TS 28.622 [11].
+ default: example.com
+paths:
+ /notificationSink:
+ post:
+ summary: Send notifications about performance threshold crossing
+ description: To send a notifyThresholdCrossing notification
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/notifyThresholdCrossing-NotifType'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content"). The notification is successfully
+ delivered. The response message body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/error-ResponseType'
+components:
+ schemas:
+ dateTime-Type:
+ type: string
+ format: date-Time
+ uri-Type:
+ type: string
+ long-Type:
+ type: string
+ format: long
+ thresholdLevel-Type:
+ type: integer
+ measurementTypeName-Type:
+ type: string
+ measurementValue-Type:
+ type: string
+ additionalText-Type:
+ type: string
+ error-ResponseType:
+ type: object
+ properties:
+ error:
+ type: object
+ properties:
+ errorInfo:
+ type: string
+ header-Type:
+ description: Header used in notifications as notification header
+ type: object
+ properties:
+ uri:
+ $ref: '#/components/schemas/uri-Type'
+ notificationId:
+ $ref: '#/components/schemas/notificationId-Type'
+ notificationType:
+ $ref: '#/components/schemas/notificationType-Type'
+ eventTime:
+ $ref: '#/components/schemas/dateTime-Type'
+ notificationId-Type:
+ $ref: '#/components/schemas/long-Type'
+ notificationType-Type:
+ type: string
+ enum:
+ - notifyThresholdCrossing
+ notifyThresholdCrossing-NotifType:
+ type: object
+ properties:
+ header:
+ $ref: '#/components/schemas/header-Type'
+ body:
+ type: object
+ properties:
+ startOfMonitoringGP:
+ $ref: '#/components/schemas/dateTime-Type'
+ endOfMonitoringGP:
+ $ref: '#/components/schemas/dateTime-Type'
+ monitoredObjectInstance:
+ $ref: '#/components/schemas/uri-Type'
+ thresholdLevel:
+ $ref: '#/components/schemas/thresholdLevel-Type'
+ measurementTypeName:
+ $ref: '#/components/schemas/measurementTypeName-Type'
+ measurementValue:
+ $ref: '#/components/schemas/measurementValue-Type'
+ additionalText:
+ $ref: '#/components/schemas/additionalText-Type'
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_ProvisioningMNS.yaml b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_ProvisioningMNS.yaml
new file mode 100644
index 00000000..9c5f4714
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_ProvisioningMNS.yaml
@@ -0,0 +1,579 @@
+openapi: 3.0.1
+info:
+ title: Provisioning MnS
+ version: 16.4.0
+ description: >-
+ OAS 3.0.1 definition of the Provisioning MnS
+ © 2020, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TSDSI, TTA, TTC).
+ All rights reserved.
+externalDocs:
+ description: 3GPP TS 28.532 V16.4.0; Generic management services
+ url: http://www.3gpp.org/ftp/Specs/archive/28_series/28.532/
+servers:
+ - url: 'http://{URI-DN-prefix}/{root}/ProvMnS/v1640/{LDN-first-part}'
+ variables:
+ URI-DN-prefix:
+ description: See subclause 4.4 of TS 32.158
+ default: example.com
+ root:
+ description: See subclause 4.4 of TS 32.158
+ default: 3GPPManagement
+ LDN-first-part:
+ description: See subclause 4.4 of TS 32.158
+ default: ''
+paths:
+ '/{className}={id}':
+ parameters:
+ - name: className
+ in: path
+ required: true
+ schema:
+ $ref: '#/components/schemas/className-PathType'
+ - name: id
+ in: path
+ required: true
+ schema:
+ $ref: '#/components/schemas/id-PathType'
+ put:
+ summary: Replaces a complete single resource or creates it if it does not exist
+ description: >-
+ With HTTP PUT a complete resource is replaced or created if it does not
+ exist. The target resource is identified by the target URI.
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/resourcePut-RequestType'
+ responses:
+ '200':
+ description: >-
+ Success case ("200 OK").
+ This status code shall be returned when the resource is replaced, and
+ when the replaced resource representation is not identical to the resource
+ representation in the request.
+ This status code may be retourned when the resource is updated and when the
+ updated resource representation is identical to the resource representation
+ in the request.
+ The representation of the updated resource is returned in the response
+ message body.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/resourceUpdate-ResponseType'
+ '201':
+ description: >-
+ Success case ("201 Created").
+ This status code shall be returned when the resource is created.
+ The representation of the created resource is returned in the response
+ message body.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/resourceCreation-ResponseType'
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ This status code may be returned only when the replaced resource
+ representation is identical to the representation in the request.
+ The response has no message body.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/error-ResponseType'
+ callbacks:
+ notifyMOICreation:
+ '{request.body#/notificationRecipientAddress}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/notifyMOICreation-NotifType'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response
+ has no message body.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/error-ResponseType'
+ notifyMOIDeletion:
+ '{request.body#/notificationRecipientAddress}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/notifyMOIDeletion-NotifType'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response
+ has no message body.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/error-ResponseType'
+ notifyMOIAttributeValueChange:
+ '{request.body#/notificationRecipientAddress}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/notifyMOIAttributeValueChange-NotifType'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response
+ has no message body.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/error-ResponseType'
+ notifyMOIChanges:
+ '{request.body#/notificationRecipientAddress}':
+ post:
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/notifyMOIChanges-NotifType'
+ responses:
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ The notification is successfully delivered. The response
+ has no message body.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/error-ResponseType'
+ get:
+ summary: Reads one or multiple resources
+ description: >-
+ With HTTP GET resources are read. The resources to be retrieved are
+ identified with the target URI. The attributes and fields parameter
+ of the query components allow to select the resource properties to be returned.
+ parameters:
+ - name: scope
+ in: query
+ description: >-
+ This parameter extends the set of targeted resources beyond the base
+ resource identified with the path component of the URI. No scoping
+ mechanism is specified in the present document.
+ required: false
+ schema:
+ $ref: '#/components/schemas/scope-QueryType'
+ style: form
+ explode: true
+ - name: filter
+ in: query
+ description: >-
+ This parameter reduces the targeted set of resources by applying a
+ filter to the scoped set of resource representations. Only resource
+ representations for which the filter construct evaluates to "true"
+ are targeted. No filter language is specified in the present
+ document.
+ required: false
+ schema:
+ $ref: '#/components/schemas/filter-QueryType'
+ - name: attributes
+ in: query
+ description: >-
+ This parameter specifies the attributes of the scoped resources that
+ are returned.
+ required: true
+ schema:
+ $ref: '#/components/schemas/attributes-QueryType'
+ style: form
+ explode: false
+ - name: fields
+ in: query
+ description: >-
+ This parameter specifies the attribute field of the scoped resources
+ that are returned.
+ required: false
+ schema:
+ $ref: '#/components/schemas/fields-QueryType'
+ style: form
+ explode: false
+ responses:
+ '200':
+ description: >-
+ Success case ("200 OK").
+ The resources identified in the request for retrieval are returned
+ in the response message body. In case the attributes or fields query
+ parameters are used, only the selected attributes or sub-attributes are
+ returned. The response message body is constructed according to the
+ hierarchical response construction method (TS 32.158 [15]).
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/resourceRetrieval-ResponseType'
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/error-ResponseType'
+ patch:
+ summary: Patches one or multiple resources
+ description: >-
+ With HTTP PATCH resources are created, updated or deleted. The resources
+ to be modified are identified with the target URI (base resource) and
+ the patch document included in the request message body.
+ requestBody:
+ description: >-
+ The request body describes changes to be made to the target resources.
+ The following patch media types are available
+ - "application/merge-patch+json" (RFC 7396)
+ - "application/3gpp-merge-patch+json" (TS 32.158)
+ - "application/json-patch+json" (RFC 6902)
+ - "application/3gpp-json-patch+json" (TS 32.158)
+ required: true
+ content:
+ application/merge-patch+json:
+ schema:
+ $ref: '#/components/schemas/jsonMergePatch-RequestType'
+ application/3gpp-merge-patch+json:
+ schema:
+ $ref: '#/components/schemas/3gppJsonMergePatch-RequestType'
+ application/json-patch+json:
+ schema:
+ $ref: '#/components/schemas/jsonPatch-RequestType'
+ application/3gpp-json-patch+json:
+ schema:
+ $ref: '#/components/schemas/3gppJsonPatch-RequestType'
+ responses:
+ '200':
+ description: >-
+ Success case ("200 OK").
+ This status code is returned when the updated the resource representations
+ shall be returned for some reason.
+ The resource representations are returned in the response message body. The
+ response message body is constructed according to the hierarchical response
+ construction method (TS 32.158 [15])
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/resourceUpdate-ResponseType'
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ This status code is returned when there is no need to return the updated
+ resource representations.
+ The response message body is empty.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/error-ResponseType'
+ delete:
+ summary: Deletes one or multiple resources
+ description: >-
+ With HTTP DELETE resources are deleted. The resources to be deleted are
+ identified with the target URI.
+ parameters:
+ - name: scope
+ in: query
+ description: >-
+ This parameter extends the set of targeted resources beyond the base
+ resource identified with the path component of the URI. No scoping
+ mechanism is specified in the present document.
+ required: false
+ schema:
+ $ref: '#/components/schemas/scope-QueryType'
+ - name: filter
+ in: query
+ description: >-
+ This parameter reduces the targeted set of resources by applying a
+ filter to the scoped set of resource representations. Only resources
+ representations for which the filter construct evaluates to "true"
+ are returned. No filter language is specified in the present
+ document.
+ required: false
+ schema:
+ $ref: '#/components/schemas/filter-QueryType'
+ responses:
+ '200':
+ description: >-
+ Success case ("200 OK").
+ This status code shall be returned, when query parameters are present in
+ the request and one or multiple resources are deleted.
+ The URIs of the deleted resources are returned in the response message body.
+ '204':
+ description: >-
+ Success case ("204 No Content").
+ This status code shall be returned, when no query parameters are present in
+ the request and only one resource is deleted.
+ The message body is empty.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/resourceDeletion-ResponseType'
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/error-ResponseType'
+components:
+ schemas:
+ dateTime-Type:
+ type: string
+ format: date-time
+ long-Type:
+ type: integer
+ format: int64
+ uri-Type:
+ type: string
+ correlatedNotification-Type:
+ type: object
+ properties:
+ source:
+ $ref: '#/components/schemas/uri-Type'
+ notificationIds:
+ type: array
+ items:
+ $ref: '#/components/schemas/notificationId-Type'
+ notificationId-Type:
+ $ref: '#/components/schemas/long-Type'
+ notificationType-Type:
+ type: string
+ enum:
+ - notifyMOICreation
+ - notifyMOIDeletion
+ - notifyMOIAttributeValueChange
+ systemDN-Type:
+ type: string
+ additionalText-Type:
+ type: string
+ sourceIndicator-Type:
+ type: string
+ enum:
+ - resourceOperation
+ - mangementOperation
+ - sONOperation
+ - unknown
+ header-Type:
+ type: object
+ properties:
+ href:
+ $ref: '#/components/schemas/uri-Type'
+ notificationId:
+ $ref: '#/components/schemas/notificationId-Type'
+ notificationType:
+ $ref: '#/components/schemas/notificationType-Type'
+ eventTime:
+ $ref: '#/components/schemas/dateTime-Type'
+ systemDN:
+ $ref: '#/components/schemas/systemDN-Type'
+ required:
+ - href
+ - notificationId
+ - notificationType
+ - eventTime
+ - systemDN
+ scopeType-Type:
+ type: string
+ enum:
+ - BASE_ONLY
+ - BASE_NTH_LEVEL
+ - BASE_SUBTREE
+ - BASE_ALL
+ scopeLevel-Type:
+ type: integer
+ className-PathType:
+ type: string
+ id-PathType:
+ type: string
+ attributes-QueryType:
+ type: array
+ items:
+ type: string
+ fields-QueryType:
+ type: array
+ items:
+ type: string
+ filter-QueryType:
+ type: string
+ scope-QueryType:
+ type: object
+ properties:
+ scopeType:
+ $ref: '#/components/schemas/scopeType-Type'
+ scopeLevel:
+ $ref: '#/components/schemas/scopeLevel-Type'
+
+ resourcePut-RequestType:
+ $ref: '#/components/schemas/resourceRepresentation-Type'
+ jsonMergePatch-RequestType:
+ $ref: '#/components/schemas/resourceRepresentation-Type'
+ 3gppJsonMergePatch-RequestType:
+ $ref: '#/components/schemas/resourceRepresentation-Type'
+ jsonPatch-RequestType:
+ type: array
+ items:
+ type: object
+ 3gppJsonPatch-RequestType:
+ type: array
+ items:
+ type: object
+
+ error-ResponseType:
+ type: object
+ properties:
+ error:
+ type: object
+ properties:
+ errorInfo:
+ type: string
+ resourceRetrieval-ResponseType:
+ $ref: '#/components/schemas/resourceRepresentation-Type'
+ resourceCreation-ResponseType:
+ $ref: '#/components/schemas/resourceRepresentation-Type'
+ resourceUpdate-ResponseType:
+ $ref: '#/components/schemas/resourceRepresentation-Type'
+ resourceDeletion-ResponseType:
+ type: array
+ items:
+ $ref: '#/components/schemas/uri-Type'
+
+ resourceRepresentation-Type:
+ oneOf:
+ - type: object
+ properties:
+ id:
+ type: string
+ attributes:
+ type: object
+ additionalProperties:
+ type: array
+ items:
+ type: object
+ - anyOf:
+ - $ref: 'genericNrm.yaml#/components/schemas/resources-genericNrm'
+ - $ref: 'nrNrm.yaml#/components/schemas/resources-nrNrm'
+ - $ref: '5gcNrm.yaml#/components/schemas/resources-5gcNrm'
+ - $ref: 'sliceNrm.yaml#/components/schemas/resources-sliceNrm'
+
+ mOIChange-Type:
+ type: object
+ properties:
+ notificationId:
+ $ref: '#/components/schemas/notificationId-Type'
+ correlatedNotifications:
+ type: array
+ items:
+ $ref: '#/components/schemas/correlatedNotification-Type'
+ additionalText:
+ $ref: '#/components/schemas/additionalText-Type'
+ sourceIndicator:
+ $ref: '#/components/schemas/sourceIndicator-Type'
+ path:
+ $ref: '#/components/schemas/uri-Type'
+ operation:
+ type: string
+ enum:
+ - CREATE
+ - DELETE
+ - REPLACE
+ value:
+ oneOf:
+ - type: object
+ additionalProperties:
+ nullable: true
+ - type: array
+ items:
+ type: object
+ minItems: 1
+ maxItems: 2
+
+ notifyMOICreation-NotifType:
+ allOf:
+ - $ref: '#/components/schemas/header-Type'
+ - type: object
+ properties:
+ correlatedNotifications:
+ type: array
+ items:
+ $ref: '#/components/schemas/correlatedNotification-Type'
+ additionalText:
+ $ref: '#/components/schemas/additionalText-Type'
+ sourceIndicator:
+ $ref: '#/components/schemas/sourceIndicator-Type'
+ attributeList:
+ type: object
+ additionalProperties:
+ nullable: true
+ notifyMOIDeletion-NotifType:
+ allOf:
+ - $ref: '#/components/schemas/header-Type'
+ - type: object
+ properties:
+ correlatedNotifications:
+ type: array
+ items:
+ $ref: '#/components/schemas/correlatedNotification-Type'
+ additionalText:
+ $ref: '#/components/schemas/additionalText-Type'
+ sourceIndicator:
+ $ref: '#/components/schemas/sourceIndicator-Type'
+ attributeList:
+ type: object
+ additionalProperties: true
+ notifyMOIAttributeValueChange-NotifType:
+ allOf:
+ - $ref: '#/components/schemas/header-Type'
+ - type: object
+ properties:
+ correlatedNotifications:
+ type: array
+ items:
+ $ref: '#/components/schemas/correlatedNotification-Type'
+ additionalText:
+ $ref: '#/components/schemas/additionalText-Type'
+ sourceIndicator:
+ $ref: '#/components/schemas/sourceIndicator-Type'
+ attributeValueChange:
+ type: object
+ additionalProperties:
+ type: array
+ minItems: 1
+ maxItems: 2
+ items:
+ nullable: true
+ required:
+ - attributeValueChange
+ notifyMOIChanges-NotifType:
+ allOf:
+ - $ref: '#/components/schemas/header-Type'
+ - type: object
+ properties:
+ mOIChanges:
+ type: array
+ items:
+ $ref: '#/components/schemas/mOIChange-Type'
+ required:
+ - mOIChanges
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_StreamingDataReportingMNS.yaml b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_StreamingDataReportingMNS.yaml
new file mode 100644
index 00000000..e14aa388
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_StreamingDataReportingMNS.yaml
@@ -0,0 +1,453 @@
+openapi: 3.0.1
+info:
+ title: TS 28.532 Streaming data reporting service
+ version: 16.4.0
+ description: OAS 3.0.1 specification for the Streaming data reporting service (Streaming MnS)
+servers:
+ - url: '{protocol}://{root}/StreamingDataReportingMnS/{version}'
+ variables:
+ protocol:
+ description: Protocol used
+ enum:
+ - http
+ - https
+ - wss
+ default: https
+ root:
+ description: Indicates the host name and optional port, and an optional sequence of path segments that together represent a prefix path.
+ default: example.com
+ version:
+ description: Indicates the current version of the specification
+ default: 16.4.0
+paths:
+ '/connections':
+ post:
+ summary: Inform consumer about reporting streams to be carried by the new connection and receive a new connection id.
+ description: Exchange of meta-data (producer informs consumer about its own identity and the nature of the data to be reported via streaming) phase of the connection establishement by streaming data reporting producer to the streaming data reporting consumer (i.e. streaming target).
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/connectionRequest-Type'
+ responses:
+ '201':
+ description: Success case (201 Created).
+ headers:
+ Location:
+ description: Location of the created connection resource.
+ schema:
+ $ref: '#/components/schemas/connectionId-Type'
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/failedConnectionResponse-Type'
+ get:
+ summary: Obtain information about connections.
+ description: Enables the streaming data reporting service producer to obtain information about one or more streaming connections.
+ parameters:
+ - name: connectionIdList
+ in: query
+ description: The list of connectionId for which the connection information is to be returned.
+ required: false
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/connectionId-Type'
+ responses:
+ '200':
+ description: Success case (200 OK). The resources identified in the request for retrieval are returned in the response message body. In case the fields query parameter is used, the selected resources are returned.
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/connectionInfo-Type'
+ '202':
+ description: Partial success case (202 Partially retrieved). Subset of the resources identified in the request for retrieval are returned in the response message body.
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/connectionInfo-Type'
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/errorResponse-Type'
+ '/connections/{connectionId}':
+ get:
+ summary: Obtain information about a connection.
+ description: Enables the streaming data reporting service producer to obtain information about one streaming connection.
+ parameters:
+ - name: connectionId
+ in: path
+ description: Indicate the ID (URI) of the connection for which the information is being retrieved
+ required: true
+ schema:
+ $ref: '#/components/schemas/connectionId-Type'
+ - name: Connection
+ in: header
+ schema:
+ $ref: '#/components/schemas/websocketHeaderConnection-Type'
+ - name: Sec-WebSocket-Extensions
+ in: header
+ schema:
+ $ref: '#/components/schemas/websocketHeader-Sec-WebSocket-Extensions-Type'
+ - name: Sec-WebSocket-Key
+ in: header
+ schema:
+ $ref: '#/components/schemas/websocketHeader-Sec-WebSocket-Key-Type'
+ - name: Sec-WebSocket-Protocol
+ in: header
+ schema:
+ $ref: '#/components/schemas/websocketHeader-Sec-WebSocket-Protocol-Type'
+ - name: Sec-WebSocket-Version
+ in: header
+ schema:
+ $ref: '#/components/schemas/websocketHeader-Sec-WebSocket-Version-Type'
+ responses:
+ '101':
+ description: Success case (101 Switching Protocols). The connection has been successfully switched to WebSocket. The response message body is absent.
+ headers:
+ Upgrade:
+ schema:
+ $ref: '#/components/schemas/websocketHeaderUpgrade-Type'
+ Connection:
+ schema:
+ $ref: '#/components/schemas/websocketHeaderConnection-Type'
+ Sec-WebSocket-Accept:
+ schema:
+ $ref: '#/components/schemas/websocketHeader-Sec-WebSocket-Accept-Type'
+ '200':
+ description: Success case (200 OK). The resource identified in the request for retrieval returned in the response message body.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/connectionInfo-Type'
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/errorResponse-Type'
+ '/connections/{connectionId}/streams':
+ post:
+ summary: Inform consumer about new reporting streams on an existing connection.
+ description: Allows the producer to add one or more reporting streams to an already established streaming connection.
+ parameters:
+ - name: connectionId
+ in: path
+ description: Indicate the ID (URI) of the connection for which the reporting stream information is being added.
+ required: true
+ schema:
+ $ref: '#/components/schemas/connectionId-Type'
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/streamInfo-Type'
+ responses:
+ '201':
+ description: Success case (201 Posted).
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/streamInfo-Type'
+ '202':
+ description: Partial success case (202 Posted).
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/streamInfo-Type'
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/errorResponse-Type'
+ delete:
+ summary: Remove reporting streams from an existing connection
+ description: Allows the producer to remove one or more reporting streams from an already established streaming connection.
+ parameters:
+ - name: connectionId
+ in: path
+ description: Indicate the ID (URI) of the connection for which the reporting stream information is being removed.
+ required: true
+ schema:
+ $ref: '#/components/schemas/connectionId-Type'
+ - name: streamIds
+ in: query
+ description: The list of streamId for the stream(s) to be deleted.
+ required: true
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/streamId-Type'
+ responses:
+ '204':
+ description: Success case (204 No Content). The stream information resource has been deleted. The response message body is absent.
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/errorResponse-Type'
+ get:
+ summary: Obtain information about streams.
+ description: Enables the streaming data reporting service producer to obtain information about one or more reporting streams.
+ parameters:
+ - name: connectionId
+ in: path
+ description: Indicate the ID (URI) of the connection for which the information is being retrieved
+ required: true
+ schema:
+ $ref: '#/components/schemas/connectionId-Type'
+ - name: streamIds
+ in: query
+ description: The list of streamId for which the stream information is to be retrieved.
+ required: true
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/streamId-Type'
+ responses:
+ '200':
+ description: Success case (200 OK).
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/streamInfoWithReporters-Type'
+ '202':
+ description: Partial success case (202 Partially retrieved).
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/streamInfoWithReporters-Type'
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/errorResponse-Type'
+ '/connections/{connectionId}/streams/{streamId}':
+ get:
+ summary: Obtain information about stream
+ description: Enables the streaming data reporting service producer to obtain information about a reporting stream.
+ parameters:
+ - name: connectionId
+ in: path
+ description: Indicate the ID (URI) of the connection for which the information is being retrieved
+ required: true
+ schema:
+ $ref: '#/components/schemas/connectionId-Type'
+ - name: streamId
+ in: path
+ description: Indicate the ID of the reporting stream for which the information is being retrieved
+ required: true
+ schema:
+ $ref: '#/components/schemas/streamId-Type'
+ responses:
+ '200':
+ description: Success case (200 OK).
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/streamInfoWithReporters-Type'
+ default:
+ description: Error case.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/errorResponse-Type'
+components:
+ schemas:
+ analyticsInfo-Type:
+ description: Information specific to analytics reporting.
+ type: object
+ properties:
+ activityDetails:
+ type: string
+ connectionId-Type:
+ $ref: '#/components/schemas/uri-Type'
+ connectionInfo-Type:
+ type: object
+ properties:
+ connection:
+ $ref: '#/components/schemas/connectionId-Type'
+ producer:
+ $ref: '#/components/schemas/producerId-Type'
+ streams:
+ type: array
+ items:
+ $ref: '#/components/schemas/streamId-Type'
+ connectionRequest-Type:
+ type: object
+ properties:
+ producer:
+ $ref: '#/components/schemas/producerId-Type'
+ streams:
+ type: array
+ items:
+ $ref: '#/components/schemas/streamInfo-Type'
+ errorResponse-Type:
+ type: object
+ properties:
+ error:
+ type: object
+ properties:
+ errorInfo:
+ type: string
+ failedConnectionResponse-Type:
+ type: object
+ properties:
+ error:
+ type: array
+ items:
+ type: object
+ properties:
+ streamId:
+ $ref: '#/components/schemas/streamId-Type'
+ errorReason:
+ type: string
+ measObjDn-Type:
+ description: DN of the measured object instance (see 3GPP TS 28.550)
+ allOf:
+ - $ref: '#/components/schemas/systemDN-Type'
+ measTypes-Type:
+ description: an ordered list of measurement type or KPI whose measurement values or KPI result values are to be reported by the Performance Data Stream Units (see Annex C of TS 28.550) via this stream
+ type: array
+ items:
+ type: string
+ performanceInfo-Type:
+ description: Information specific to performance data reporting
+ type: object
+ properties:
+ measObjDn:
+ $ref: '#/components/schemas/measObjDn-Type'
+ measTypes:
+ $ref: '#/components/schemas/measTypes-Type'
+ measurementReaderId:
+ $ref: '#/components/schemas/systemDN-Type'
+ jobId:
+ type: string
+ required:
+ - measObjDn
+ - measTypes
+ producerId-Type:
+ description: DN of the streaming data reporting MnS producer.
+ allOf:
+ - $ref: '#/components/schemas/systemDN-Type'
+ serializationFormat-Type:
+ type: string
+ enum:
+ - GPB
+ - ASN1
+ streamId-Type:
+ description: globally unique stream identifier
+ type: string
+ example: '26F452550021'
+ streamInfo-Type:
+ description: Reporting stream meta-data.
+ type: object
+ properties:
+ streamType:
+ $ref: '#/components/schemas/streamType-Type'
+ serializationFormat:
+ $ref: '#/components/schemas/serializationFormat-Type'
+ streamId:
+ oneOf:
+ - $ref: '#/components/schemas/streamId-Type'
+ - $ref: '#/components/schemas/traceReference-Type'
+ additionalInfo:
+ oneOf:
+ - $ref: '#/components/schemas/traceInfo-Type'
+ - $ref: '#/components/schemas/performanceInfo-Type'
+ - $ref: '#/components/schemas/analyticsInfo-Type'
+ - $ref: '#/components/schemas/vsDataContainer-Type'
+ required:
+ - streamType
+ - serializationFormat
+ - streamId
+ streamInfoWithReporters-Type:
+ description: Reporting stream meta-data with added information about reporters.
+ type: object
+ properties:
+ streamInfo:
+ $ref: '#/components/schemas/streamInfo-Type'
+ reporters:
+ type: array
+ items:
+ $ref: '#/components/schemas/producerId-Type'
+ systemDN-Type:
+ description: See 3GPP TS 32.300 for details
+ type: string
+ example: 'SubNetwork=ABCNetwork,SubNetwork=MUC01,GNBDUFunction=XYZ0100'
+ streamType-Type:
+ type: string
+ enum:
+ - TRACE
+ - PERFORMANCE
+ - ANALYTICS
+ - PROPRIETARY
+ traceInfo-Type:
+ description: Information specific to trace data reporting
+ allOf:
+ - $ref: 'genericNrm.yaml#/components/schemas/TraceJob-Attr'
+ traceReference-Type:
+ description: Trace Reference (see clause 5.6 of 3GPP TS 32.422) as stream identifier for streaming trace data reporting
+ type: string
+ example: '4358070034D7'
+ uri-Type:
+ description: Resource URI
+ type: string
+ vsDataContainer-Type:
+ description: container for vendor specific data (see 3GPP TS 28.622)
+ type: object
+ properties:
+ vsDataType:
+ type: string
+ vsData:
+ type: string
+ vsDataFormatVersion:
+ type: string
+ websocketHeaderConnection-Type:
+ description: Header value for the upgrade request and response.
+ type: string
+ enum:
+ - Upgrade
+ websocketHeaderUpgrade-Type:
+ description: Header value for the upgrade to WebSocket request and response.
+ type: string
+ enum:
+ - websocket
+ websocketHeader-Sec-WebSocket-Accept-Type:
+ description: Header value for secure WebSocket response. Carries hash.
+ type: string
+ websocketHeader-Sec-WebSocket-Extensions-Type:
+ description: Header value for secure WebSocket request. Carries protocol extensions.
+ type: string
+ websocketHeader-Sec-WebSocket-Key-Type:
+ description: Header value for secure WebSocket request. Provides information to the server which is needed in order to confirm that the client is entitled to request an upgrade to WebSocket.
+ type: string
+ websocketHeader-Sec-WebSocket-Protocol-Type:
+ description: Header value for secure WebSocket request. Carries a comma-separated list of subprotocol names, in the order of preference.
+ type: string
+ websocketHeader-Sec-WebSocket-Version-Type:
+ description: Header value for secure WebSocket request and response. Carries the WebSocket protocol version to be used.
+ type: string
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/NewAlarmSchema.yaml b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/NewAlarmSchema.yaml
new file mode 100644
index 00000000..722cbc13
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/rel-16.4/NewAlarmSchema.yaml
@@ -0,0 +1,734 @@
+openapi: 3.0.1
+info:
+ title: Fault Supervision MnS
+ version: 16.4.0
+ description: >-
+ OAS 3.0.1 definition of the Fault Supervision MnS
+ © 2020, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TSDSI, TTA, TTC).
+ All rights reserved.
+
+properties:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ specificProblem:
+ $ref: '#/components/schemas/SpecificProblem'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ backedUpStatus:
+ type: boolean
+ backUpObject:
+ $ref: '#/components/schemas/Dn'
+ trendIndication:
+ $ref: '#/components/schemas/TrendIndication'
+ thresholdInfo:
+ $ref: '#/components/schemas/ThresholdInfo'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ stateChangeDefinition:
+ $ref: '#/components/schemas/AttributeValueChangeSet'
+ monitoredAttributes:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ proposedRepairActions:
+ type: string
+ additionalText:
+ type: string
+ additionalInformation:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ rootCauseIndicator:
+ type: boolean
+
+components:
+ schemas:
+
+ #---- Definitions to be moved to comDefs.yaml --------------------------------------#
+
+ Long:
+ type: string
+ format: long
+ Float:
+ type: string
+ format: float
+ DateTime:
+ type: string
+ format: date-Time
+
+ Dn:
+ type: string
+ Uri:
+ type: string
+
+ AttributeNameValuePairSet:
+ type: object
+ minProperties: 1
+ AttributeValueChangeSet:
+ description: >-
+ The key in this map is the attribute name. The value of each key is an array.
+ When only one item is present in the array, it carries the new attribute
+ value. If two items are present, then the first item carries the old value
+ and the second item the new value. The items can be of any type including null.
+ type: object
+ additionalProperties:
+ type: array
+ minItems: 1
+ maxItems: 2
+ items:
+ nullable: true
+
+ Filter:
+ type: string
+ SystemDN:
+ type: string
+
+ NotificationId:
+ type: integer
+ NotificationHeader:
+ description: >-
+ Header used for all notification types
+ type: object
+ required:
+ - href
+ - notificationId
+ - notificationType
+ - eventTime
+ - systemDN
+ properties:
+ uri:
+ $ref: '#/components/schemas/Uri'
+ notificationId:
+ $ref: '#/components/schemas/NotificationId'
+ notificationType:
+ oneOf:
+ - $ref: '#/components/schemas/AlarmNotificationTypes'
+ #- $ref: 'faultMnS.yaml#/components/schemas/AlarmNotificationTypes'
+ #- $ref: 'provMnS.yaml#/components/schemas/CmNotificationTypes'
+ # more to be added
+ eventTime:
+ $ref: '#/components/schemas/DateTime'
+ systemDN:
+ $ref: '#/components/schemas/SystemDN'
+
+ ErrorResponse:
+ description: >-
+ Default schema for the response message body in case the request is not
+ successful.
+ type: object
+ properties:
+ error:
+ type: object
+ properties:
+ errorInfo:
+ type: string
+
+ #---- End of definitions to be moved to comDefs.yaml -------------------------------#
+
+ #---- Definition of AlarmRecord ----------------------------------------------------#
+
+ AlarmId:
+ type: string
+ AlarmType:
+ type: string
+ enum:
+ - COMMUNICATIONS_ALARM
+ - QUALITY_OF_SERVICE_ALARM
+ - PROCESSING_ERROR_ALARM
+ - EQUIPMENT_ALARM
+ - ENVIRONMENTAL_ALARM
+ - INTEGRITY_VIOLATION
+ - OPERATIONAL_VIOLATION
+ - PHYSICAL_VIOLATION
+ - SECURITY_SERVICE_OR_MECHANISM_VIOLATION
+ - TIME_DOMAIN_VIOLATION
+ ProbableCause:
+ description: >-
+ The value of the probable cause may be a specific standardized string, or any
+ vendor provided string. Probable cause strings are not standardized in the
+ present document. They may be added in a future version. Up to then the
+ mapping of the generic probable cause strings "PROBABLE_CAUSE_001" to
+ "PROBABLE_CAUSE_005" is vendor specific.
+ The value of the probable cause may also be an integer. The mapping of integer
+ values to probable causes is vendor specific.
+ oneOf:
+ - anyOf:
+ - type: string
+ enum:
+ - PROBABLE_CAUSE_001
+ - PROBABLE_CAUSE_002
+ - PROBABLE_CAUSE_003
+ - PROBABLE_CAUSE_004
+ - PROBABLE_CAUSE_005
+ - type: string
+ - type: integer
+ SpecificProblem:
+ oneOf:
+ - type: string
+ - type: integer
+ PerceivedSeverity:
+ type: string
+ enum:
+ - INDETERMINATE
+ - CRITICAL
+ - MAJOR
+ - MINOR
+ - WARNING
+ - CLEARED
+ TrendIndication:
+ type: string
+ enum:
+ - MORE_SEVERE
+ - NO_CHANGE
+ - LESS_SEVERE
+ ThresholdHysteresis:
+ type: object
+ required:
+ - high
+ properties:
+ high:
+ oneOf:
+ - type: integer
+ - $ref: '#/components/schemas/Float'
+ low:
+ $ref: '#/components/schemas/Float'
+ ThresholdLevelInd:
+ type: object
+ required:
+ - up
+ properties:
+ up:
+ $ref: '#/components/schemas/ThresholdHysteresis'
+ low:
+ $ref: '#/components/schemas/ThresholdHysteresis'
+ ThresholdInfo:
+ type: object
+ required:
+ - observedMeasurement
+ - observedValue
+ properties:
+ observedMeasurement:
+ type: string
+ observedValue:
+ oneOf:
+ - type: integer
+ - $ref: '#/components/schemas/Float'
+ thresholdLevelInd:
+ $ref: '#/components/schemas/ThresholdLevelInd'
+ armTime:
+ $ref: '#/components/schemas/DateTime'
+ CorrelatedNotification:
+ type: object
+ required:
+ - source
+ - notificationId
+ properties:
+ sourceObjectInstance:
+ $ref: '#/components/schemas/Dn'
+ notificationIds:
+ type: array
+ items:
+ $ref: '#/components/schemas/NotificationId'
+ CorrelatedNotifications:
+ type: array
+ items:
+ $ref: '#/components/schemas/CorrelatedNotification'
+ AckState:
+ type: string
+ enum:
+ - ACKNOWLEDGED
+ - UNACKNOWLEDGED
+
+ AlarmRecord:
+ description: >-
+ The alarmId is not a property of an alarm record. It is used as key
+ in the map of alarm records instead.
+ type: object
+ properties:
+ # alarmId:
+ # $ref: '#/components/schemas/AlarmId'
+ objectInstance:
+ $ref: '#/components/schemas/Dn'
+ notificationId:
+ $ref: '#/components/schemas/NotificationId'
+ alarmRaisedTime:
+ $ref: '#/components/schemas/DateTime'
+ alarmChangedTime:
+ $ref: '#/components/schemas/DateTime'
+ alarmClearedTime:
+ $ref: '#/components/schemas/DateTime'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ specificProblem:
+ $ref: '#/components/schemas/SpecificProblem'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ backedUpStatus:
+ type: boolean
+ backUpObject:
+ $ref: '#/components/schemas/Dn'
+ trendIndication:
+ $ref: '#/components/schemas/TrendIndication'
+ thresholdinfo:
+ $ref: '#/components/schemas/ThresholdInfo'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ stateChangeDefinition:
+ $ref: '#/components/schemas/AttributeValueChangeSet'
+ monitoredAttributes:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ proposedRepairActions:
+ type: string
+ additionalText:
+ type: string
+ additionalInformation:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+
+ rootCauseIndicator:
+ type: boolean
+
+ ackTime:
+ $ref: '#/components/schemas/DateTime'
+ ackUserId:
+ type: string
+ ackSystemId:
+ type: string
+ ackState:
+ $ref: '#/components/schemas/AckState'
+
+ clearUserId:
+ type: string
+ clearSystemId:
+ type: string
+ serviceUser:
+ type: string
+ serviceProvider:
+ type: string
+ securityAlarmDetector:
+ type: string
+
+ #---- Definition of alarm notifications --------------------------------------------#
+
+ AlarmNotificationTypes:
+ type: string
+ enum:
+ - notifyNewAlarm
+ - notifyChangedAlarm
+ - notifyChangedAlarmGeneral
+ - notifyAckStateChanged
+ - notifyCorrelatedNotificationChanged
+ - notifyComments
+ - notifyClearedAlarm
+ - notifyAlarmListRebuiltAlarm
+ - notifyPotentialFaultyAlarmList
+ AlarmListAlignmentRequirement:
+ type: string
+ enum:
+ - ALIGNMENT_REQUIRED
+ - ALIGNMENT_NOT_REQUIRED
+
+ NotifyNewAlarm:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ specificProblem:
+ $ref: '#/components/schemas/SpecificProblem'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ backedUpStatus:
+ type: boolean
+ backUpObject:
+ $ref: '#/components/schemas/Dn'
+ trendIndication:
+ $ref: '#/components/schemas/TrendIndication'
+ thresholdInfo:
+ $ref: '#/components/schemas/ThresholdInfo'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ stateChangeDefinition:
+ $ref: '#/components/schemas/AttributeValueChangeSet'
+ monitoredAttributes:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ proposedRepairActions:
+ type: string
+ additionalText:
+ type: string
+ additionalInformation:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ rootCauseIndicator:
+ type: boolean
+ NotifyNewSecAlarm:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ - serviceUser
+ - serviceProvider
+ - securityAlarmDetector
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ additionalText:
+ type: string
+ additionalInformation:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ rootCauseIndicator:
+ type: boolean
+ serviceUser:
+ type: string
+ serviceProvider:
+ type: string
+ securityAlarmDetector:
+ type: string
+ NotifyClearedAlarm:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ clearUserId:
+ type: string
+ clearSystemId:
+ type: string
+ NotifyChangedAlarm:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ NotifyChangedAlarmGeneral:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ - changedAlarmAttributes
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ specificProblem:
+ $ref: '#/components/schemas/SpecificProblem'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ backedUpStatus:
+ type: boolean
+ backUpObject:
+ $ref: '#/components/schemas/Dn'
+ trendIndication:
+ $ref: '#/components/schemas/TrendIndication'
+ thresholdInfo:
+ $ref: '#/components/schemas/ThresholdInfo'
+ stateChangeDefinition:
+ $ref: '#/components/schemas/AttributeValueChangeSet'
+ monitoredAttributes:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ proposedRepairActions:
+ type: string
+ additionalText:
+ type: string
+ additionalInformation:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ rootCauseIndicator:
+ type: boolean
+ changedAlarmAttributes:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ NotifyChangedSecAlarmGeneral:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ - serviceUser
+ - serviceProvider
+ - securityAlarmDetector
+ - changedAlarmAttributes
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ additionalText:
+ type: string
+ additionalInformation:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ rootCauseIndicator:
+ type: boolean
+ serviceUser:
+ type: string
+ serviceProvider:
+ type: string
+ securityAlarmDetector:
+ type: string
+ changedAlarmAttributes:
+ $ref: '#/components/schemas/AttributeNameValuePairSet'
+ NotifyCorrelatedNotificationChanged:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - correlatedNotifications
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ correlatedNotifications:
+ $ref: '#/components/schemas/CorrelatedNotifications'
+ rootCauseIndicator:
+ type: boolean
+ NotifyAckStateChanged:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ - ackState
+ - ackUserId
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ ackState:
+ $ref: '#/components/schemas/AckState'
+ ackUserId:
+ type: string
+ ackSystemId:
+ type: string
+ NotifyComments:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - alarmId
+ - alarmType
+ - probableCause
+ - perceivedSeverity
+ - comments
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ alarmType:
+ $ref: '#/components/schemas/AlarmType'
+ probableCause:
+ $ref: '#/components/schemas/ProbableCause'
+ perceivedSeverity:
+ $ref: '#/components/schemas/PerceivedSeverity'
+ comments:
+ $ref: '#/components/schemas/Comments'
+ NotifyPotentialFaultyAlarmList:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - reason
+ properties:
+ reason:
+ type: string
+ NotifyAlarmListRebuilt:
+ allOf:
+ - $ref: '#/components/schemas/NotificationHeader'
+ - type: object
+ required:
+ - reason
+ properties:
+ reason:
+ type: string
+ alarmListAlignmentRequirement:
+ $ref: '#/components/schemas/AlarmListAlignmentRequirement'
+
+ #---- Definition of query parameters -----------------------------------------------#
+
+ AlarmAckState:
+ type: string
+ enum:
+ - ALL_ALARMS
+ - ALL_ACTIVE_ALARMS
+ - ALL_ACTIVE_AND_ACKNOWLEDGED_ALARMS
+ - ALL_ACTIVE_AND_UNACKNOWLEDGED_ALARMS
+ - ALL_CLEARED_AND_UNACKNOWLEDGED_ALARMS
+ - ALL_UNACKNOWLEDGED_ALARMS
+
+ #---- Definition of patch documents ------------------------------------------------#
+
+ MergePatchAcknowledgeAlarm:
+ description: >-
+ Patch document acknowledging or unacknowledging a single alarm. For
+ acknowleding an alarm the value of ackState is ACKNOWLEDGED, for unacknowleding
+ an alarm the value of ackState is UNACKNOWLEDGED.
+ type: object
+ required:
+ - ackUserId
+ - ackState
+ properties:
+ ackUserId:
+ type: string
+ ackSystemId:
+ type: string
+ ackState:
+ $ref: '#/components/schemas/AckState'
+ MergePatchClearAlarm:
+ description: Patch document for clearing a single alarm
+ type: object
+ required:
+ - clearUserId
+ - perceivedSeverity
+ properties:
+ clearUserId:
+ type: string
+ clearSystemId:
+ type: string
+ perceivedSeverity:
+ type: string
+ enum:
+ - CLEARED
+
+ #---- Definition of method responses -----------------------------------------------#
+
+ FailedAlarm:
+ type: object
+ required:
+ - alarmId
+ - failureReason
+ properties:
+ alarmId:
+ $ref: '#/components/schemas/AlarmId'
+ failureReason:
+ type: string
+
+ #---- Definition of resources ------------------------------------------------------#
+
+ AlarmCount:
+ type: object
+ required:
+ - criticalCount
+ - majorCount
+ - minorCount
+ - warningCount
+ - indeterminateCount
+ - clearedCount
+ properties:
+ criticalCount:
+ type: integer
+ majorCount:
+ type: integer
+ minorCount:
+ type: integer
+ warningCount:
+ type: integer
+ indeterminateCount:
+ type: integer
+ clearedCount:
+ type: integer
+ Comment:
+ type: object
+ properties:
+ commentTime:
+ $ref: '#/components/schemas/DateTime'
+ commentUserId:
+ type: string
+ commentSystemId:
+ type: string
+ commentText:
+ type: string
+ Comments:
+ description: >-
+ Collection of comments. The comment identifiers are allocated by the
+ MnS producer and used as key in the map.
+ type: object
+ additionalProperties:
+ $ref: '#/components/schemas/Comment'
+ Subscription:
+ type: object
+ properties:
+ consumerReference:
+ $ref: '#/components/schemas/Uri'
+ timeTick:
+ $ref: '#/components/schemas/Long'
+ filter:
+ $ref: '#/components/schemas/Filter'
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-empty-content.json b/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-empty-content.json
new file mode 100644
index 00000000..f039efc7
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-empty-content.json
@@ -0,0 +1,26 @@
+[
+ {
+ "publicURL": "http://localhost:8080/external1",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_EmptyContent.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external2",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_HeartBeatMNS.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external3",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_EmptyContent.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external4",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_PerformanceThresholdMNS.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external5",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_ProvisioningMNS.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external6",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_StreamingDataReportingMNS.yaml"
+ }
+] \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-incorrect-yaml-format.json b/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-incorrect-yaml-format.json
new file mode 100644
index 00000000..27b2d9c2
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-incorrect-yaml-format.json
@@ -0,0 +1,26 @@
+[
+ {
+ "publicURL": "http://localhost:8080/external1",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_IncorrectFormat.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external2",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_HeartBeatMNS.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external3",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_IncorrectFormat.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external4",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_PerformanceThresholdMNS.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external5",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_IncorrectFormat.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external6",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_StreamingDataReportingMNS.yaml"
+ }
+] \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-no-json-format.json b/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-no-json-format.json
new file mode 100644
index 00000000..22517bf1
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-no-json-format.json
@@ -0,0 +1,26 @@
+[
+ "publicURL"
+ "http://localhost:8080/external1",
+ "localURL"
+ :
+ "rel-16.4/2020-07-10-3GPP_TS28532_FaultMNS.yaml"
+ }
+ {
+ "publicURL": "http://localhost:8080/external2",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_HeartBeatMNS.yaml
+ },
+ {
+ "publicURL": "http://localhost:8080/external3",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_PerformanceMNS.yaml",
+ {
+ "publicURL": "http://localhost:8080/external4",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_PerformanceThresholdMNS.yaml"
+ },
+ {
+ "publicURL"
+ "http://localhost:8080/external5",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_ProvisioningMNS.yaml",
+ {
+ "publicURL": "http://localhost:8080/external6",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_StreamingDataReportingMNS.yaml"
+ }
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-no-local-resource.json b/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-no-local-resource.json
new file mode 100644
index 00000000..90a8703e
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-no-local-resource.json
@@ -0,0 +1,26 @@
+[
+ {
+ "publicURL": "http://localhost:8080/external1",
+ "localURL": "rel-16.4/not-exisiting-1.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external2",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_HeartBeatMNS.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external3",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_PerformanceMNS.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external4",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_PerformanceThresholdMNS.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external5",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_ProvisioningMNS.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external6",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_StreamingDataReportingMNS.yaml"
+ }
+] \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-wrong-field-name.json b/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-wrong-field-name.json
new file mode 100644
index 00000000..3d79c6fb
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map-wrong-field-name.json
@@ -0,0 +1,26 @@
+[
+ {
+ "externalURL": "http://localhost:8080/external1",
+ "localUrl": "rel-16.4/2020-07-10-3GPP_TS28532_FaultMNS.yaml"
+ },
+ {
+ "publicurl": "http://localhost:8080/external2",
+ "localUrl": "rel-16.4/2020-07-10-3GPP_TS28532_HeartBeatMNS.yaml"
+ },
+ {
+ "INCORRECTFIELD": "http://localhost:8080/external3",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_PerformanceMNS.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external4",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_PerformanceThresholdMNS.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external5",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_ProvisioningMNS.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external6",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_StreamingDataReportingMNS.yaml"
+ }
+] \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map.json b/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map.json
new file mode 100644
index 00000000..57238345
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/schema-map.json
@@ -0,0 +1,26 @@
+[
+ {
+ "publicURL": "http://localhost:8080/external1",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_FaultMNS.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external2",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_HeartBeatMNS.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external3",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_PerformanceMNS.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external4",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_PerformanceThresholdMNS.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/externalNoHash",
+ "localURL": "rel-16.4/NewAlarmSchema.yaml"
+ },
+ {
+ "publicURL": "http://localhost:8080/external6",
+ "localURL": "rel-16.4/2020-07-10-3GPP_TS28532_StreamingDataReportingMNS.yaml"
+ }
+] \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/validEvent.json b/services/external-schema-manager/src/main/test/resources/externalRepo/validEvent.json
new file mode 100644
index 00000000..2f9b159b
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/validEvent.json
@@ -0,0 +1,54 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "version": "4",
+ "vesEventListenerVersion": 7,
+ "domain": "fault",
+ "eventId": "stndDefined-gNB_Nokia000001",
+ "eventName": "stndDefined-gNB-Nokia-PowerLost",
+ "stndDefinedNamespace": "3GPP-FaultSupervision",
+ "startEpochMicrosec": 1413378172000000,
+ "lastEpochMicrosec": 1413378172000000,
+ "reportingEntityName": "ibcx0001vm002oam001",
+ "sourceName": "scfx0001vm002cap001",
+ "sequence": 1,
+ "priority": "High"
+ },
+ "stndDefinedFields": {
+ "schemaReference": "http://localhost:8080/external1#components/schemas/NotifyNewAlarm",
+ "data": {
+ "href": 1,
+ "uri": "1",
+ "notificationId": 1,
+ "notificationType": "notifyNewAlarm",
+ "eventTime": "xyz",
+ "systemDN": "xyz",
+ "probableCause": 1,
+ "perceivedSeverity": "INDETERMINATE",
+ "rootCauseIndicator": false,
+ "specificProblem": "xyz",
+ "correlatedNotifications": [],
+ "backedUpStatus": true,
+ "backUpObject": "xyz",
+ "trendIndication": "MORE_SEVERE",
+ "thresholdInfo": {
+ "observedMeasurement": "new",
+ "observedValue": 123
+ },
+ "stateChangeDefinition": {
+ },
+ "monitoredAttributes": {
+ "newAtt": "new"
+ },
+ "proposedRepairActions": "xyz",
+ "additionalText": "xyz",
+ "additionalInformation": {
+ "addInfo": "new"
+ },
+ "alarmId": "1",
+ "alarmType": "COMMUNICATIONS_ALARM"
+ },
+ "stndDefinedFieldsVersion": "1.0"
+ }
+ }
+} \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/resources/externalRepo/validNoHashEvent.json b/services/external-schema-manager/src/main/test/resources/externalRepo/validNoHashEvent.json
new file mode 100644
index 00000000..965ee708
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/externalRepo/validNoHashEvent.json
@@ -0,0 +1,54 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "version": "4",
+ "vesEventListenerVersion": 7,
+ "domain": "fault",
+ "eventId": "stndDefined-gNB_Nokia000001",
+ "eventName": "stndDefined-gNB-Nokia-PowerLost",
+ "stndDefinedNamespace": "3GPP-FaultSupervision",
+ "startEpochMicrosec": 1413378172000000,
+ "lastEpochMicrosec": 1413378172000000,
+ "reportingEntityName": "ibcx0001vm002oam001",
+ "sourceName": "scfx0001vm002cap001",
+ "sequence": 1,
+ "priority": "High"
+ },
+ "stndDefinedFields": {
+ "schemaReference": "http://localhost:8080/externalNoHash",
+ "data": {
+ "href": 1,
+ "uri": "1",
+ "notificationId": 1,
+ "notificationType": "notifyNewAlarm",
+ "eventTime": "xyz",
+ "systemDN": "xyz",
+ "probableCause": 1,
+ "perceivedSeverity": "INDETERMINATE",
+ "rootCauseIndicator": false,
+ "specificProblem": "xyz",
+ "correlatedNotifications": [],
+ "backedUpStatus": true,
+ "backUpObject": "xyz",
+ "trendIndication": "MORE_SEVERE",
+ "thresholdInfo": {
+ "observedMeasurement": "new",
+ "observedValue": 123
+ },
+ "stateChangeDefinition": {
+ },
+ "monitoredAttributes": {
+ "newAtt": "new"
+ },
+ "proposedRepairActions": "xyz",
+ "additionalText": "xyz",
+ "additionalInformation": {
+ "addInfo": "new"
+ },
+ "alarmId": "1",
+ "alarmType": "COMMUNICATIONS_ALARM"
+ },
+ "stndDefinedFieldsVersion": "1.0"
+ }
+ }
+} \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/resources/file_with_one_line.json b/services/external-schema-manager/src/main/test/resources/file_with_one_line.json
new file mode 100644
index 00000000..ad51fa96
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/file_with_one_line.json
@@ -0,0 +1,3 @@
+{
+ "someObject": "dummyValue"
+} \ No newline at end of file
diff --git a/services/external-schema-manager/src/main/test/resources/schema-map-to-tests.json b/services/external-schema-manager/src/main/test/resources/schema-map-to-tests.json
new file mode 100644
index 00000000..d2d19238
--- /dev/null
+++ b/services/external-schema-manager/src/main/test/resources/schema-map-to-tests.json
@@ -0,0 +1,18 @@
+[
+ {
+ "publicURL": "http://someExternalUrl/external",
+ "localURL": "file_with_one_line.json"
+ },
+ {
+ "publicURL": "http://someExternalUrl/emptySchema",
+ "localURL": "externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_EmptyContent.yaml"
+ },
+ {
+ "publicURL": "http://someExternalUrl/invalidYamlFile",
+ "localURL": "externalRepo/rel-16.4/2020-07-10-3GPP_TS28532_IncorrectFormat.yaml"
+ },
+ {
+ "publicURL": "http://someExternalUrl/missingFile",
+ "localURL": "missingFile.yaml"
+ }
+] \ No newline at end of file