StndDefined event routing 11/111211/1
authorBogumil Zebek <bogumil.zebek@nokia.com>
Thu, 13 Aug 2020 05:35:53 +0000 (07:35 +0200)
committerZebek Bogumil <bogumil.zebek@nokia.com>
Thu, 13 Aug 2020 05:35:53 +0000 (07:35 +0200)
- Update WS error response
- Update DPO configuration

Change-Id: Id4eb5ea50af6d55c839047c4f39b9f99487e95de
Issue-ID: DCAEGEN2-1771
Signed-off-by: Zebek Bogumil <bogumil.zebek@nokia.com>
Changelog.md
dpo/data-formats/ConsulConfig.json
dpo/data-formats/ves-dmaap-config.json
dpo/spec/vescollector-componentspec.json
src/main/java/org/onap/dcae/restapi/ApiException.java
src/test/java/org/onap/dcae/restapi/VesRestControllerTest.java

index 216e1ce..124e913 100644 (file)
@@ -21,3 +21,5 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
         - [DCAEGEN2-2254](https://jira.onap.org/browse/DCAEGEN2-2254) - Add new data-format for 30.2_ONAP schema version
 ## [1.7.2] - 04/08/2020
         - [DCAEGEN2-1771](https://jira.onap.org/browse/DCAEGEN2-1771) - Add StndDefined event routing to dmaap streams defined in namespace event field - no second stage event validation.
+        - [DCAEGEN2-1771](https://jira.onap.org/browse/DCAEGEN2-1771) - Fix error response model
+        - [DCAEGEN2-1771](https://jira.onap.org/browse/DCAEGEN2-1771) - Update DPO model
index dcfcdf6..1249afe 100644 (file)
@@ -2,7 +2,7 @@
   "collector.dynamic.config.update.frequency": "5",
   "event.transform.flag": "0",
   "collector.schema.checkflag": "1",
-  "collector.dmaap.streamid": "fault=ves-fault|syslog=ves-syslog|heartbeat=ves-heartbeat|measurementsForVfScaling=ves-measurement|mobileFlow=ves-mobileflow|other=ves-other|stateChange=ves-statechange|thresholdCrossingAlert=ves-thresholdCrossingAlert|voiceQuality=ves-voicequality|sipSignaling=ves-sipsignaling|notification=ves-notification|pnfRegistration=ves-pnfRegistration|stndDefined=ves-other",
+  "collector.dmaap.streamid": "fault=ves-fault|syslog=ves-syslog|heartbeat=ves-heartbeat|measurementsForVfScaling=ves-measurement|mobileFlow=ves-mobileflow|other=ves-other|stateChange=ves-statechange|thresholdCrossingAlert=ves-thresholdCrossingAlert|voiceQuality=ves-voicequality|sipSignaling=ves-sipsignaling|notification=ves-notification|pnfRegistration=ves-pnfRegistration|3GPP-FaultSupervision=ves-3gpp-fault-supervision|3GPP-Heartbeat=ves-3gpp-heartbeat|3GPP-Provisioning=ves-3gpp-provisioning|3GPP-PerformanceAssurance=ves-3gpp-performance-assurance",
   "collector.service.port": "8080",
   "collector.schema.file": "{\"v1\":\"./etc/CommonEventFormat_27.2.json\",\"v2\":\"./etc/CommonEventFormat_27.2.json\",\"v3\":\"./etc/CommonEventFormat_27.2.json\",\"v4\":\"./etc/CommonEventFormat_27.2.json\",\"v5\":\"./etc/CommonEventFormat_28.4.1.json\",\"v7\":\"./etc/CommonEventFormat_30.2_ONAP.json\"}",
   "collector.keystore.passwordfile": "/opt/app/VESCollector/etc/passwordfile",
       "dmaap_info": {
         "topic_url": "http://message-router:3904/events/unauthenticated.VES_NOTIFICATION_OUTPUT/"
       }
+    },
+    "ves-3gpp-fault-supervision": {
+      "type": "message_router",
+      "dmaap_info": {
+        "topic_url": "http://message-router:3904/events/unauthenticated.SEC_3GPP_FAULTSUPERVISION_OUTPUT/"
+      }
+    },
+    "ves-3gpp-provisioning": {
+      "type": "message_router",
+      "dmaap_info": {
+        "topic_url": "http://message-router:3904/events/unauthenticated.SEC_3GPP_PROVISIONING_OUTPUT/"
+      }
+    },
+    "ves-3gpp-heartbeat": {
+      "type": "message_router",
+      "dmaap_info": {
+        "topic_url": "http://message-router:3904/events/unauthenticated.SEC_3GPP_HEARTBEAT_OUTPUT/"
+      }
+    },
+    "ves-3gpp-performance-assurance": {
+      "type": "message_router",
+      "dmaap_info": {
+        "topic_url": "http://message-router:3904/events/unauthenticated.SEC_3GPP_PERFORMANCEASSURANCE_OUTPUT/"
+      }
     }
   },
   "collector.service.secure.port": "8443",
index 53e8def..c3b4b80 100644 (file)
       "topic_url": "http://dmaap-mr-hostname:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
     }
   },
+  "ves_3gpp_fault_supervision": {
+    "type": "message_router",
+    "dmaap_info": {
+      "location": "mtl5",
+      "topic_url": "http://dmaap-mr-hostname:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+    }
+  },
+  "ves_3gpp_provisioning": {
+    "type": "message_router",
+    "dmaap_info": {
+      "location": "mtl5",
+      "topic_url": "http://dmaap-mr-hostname:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+    }
+  },
+  "ves_3gpp_heartbeat": {
+    "type": "message_router",
+    "dmaap_info": {
+      "location": "mtl5",
+      "topic_url": "http://dmaap-mr-hostname:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+    }
+  },
+  "ves_3gpp_performance_assurance": {
+    "type": "message_router",
+    "dmaap_info": {
+      "location": "mtl5",
+      "topic_url": "http://dmaap-mr-hostname:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+    }
+  },
   "ves_syslog_secondary": {
     "type": "message_router",
     "dmaap_info": {
       "location": "mtl5",
       "topic_url": "http://dmaap-mr-hostname:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
     }
+  },
+  "ves_3gpp_fault_supervision_secondary": {
+    "type": "message_router",
+    "dmaap_info": {
+      "location": "mtl5",
+      "topic_url": "http://dmaap-mr-hostname:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+    }
+  },
+  "ves_3gpp_provisioning_secondary": {
+    "type": "message_router",
+    "dmaap_info": {
+      "location": "mtl5",
+      "topic_url": "http://dmaap-mr-hostname:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+    }
+  },
+  "ves_3gpp_heartbeat_secondary": {
+    "type": "message_router",
+    "dmaap_info": {
+      "location": "mtl5",
+      "topic_url": "http://dmaap-mr-hostname:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+    }
+  },
+  "ves_3gpp_performance_assurance_secondary": {
+    "type": "message_router",
+    "dmaap_info": {
+      "location": "mtl5",
+      "topic_url": "http://dmaap-mr-hostname:3904/events/DCAE-SE-COLLECTOR-EVENTS-DEV"
+    }
   }
 }
index 3a21d2d..65972c6 100644 (file)
         "version": "7.30.2",
         "type": "message router",
         "config_key": "ves-perf3gpp"
+      },
+      {
+        "format": "VES_specification",
+        "version": "7.30.2",
+        "type": "message router",
+        "config_key": "ves-3gpp-fault-supervision"
+      },
+      {
+        "format": "VES_specification",
+        "version": "7.30.2",
+        "type": "message router",
+        "config_key": "ves-3gpp-provisioning"
+      },
+      {
+        "format": "VES_specification",
+        "version": "7.30.2",
+        "type": "message router",
+        "config_key": "ves-3gpp-heartbeat"
+      },
+      {
+        "format": "VES_specification",
+        "version": "7.30.2",
+        "type": "message router",
+        "config_key": "ves-3gpp-performance-assurance"
       }
     ]
   },
index 255999a..9ea0207 100644 (file)
@@ -22,6 +22,9 @@ package org.onap.dcae.restapi;
 import com.google.common.base.CaseFormat;
 import org.json.JSONObject;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * @author Pawel Szalapski (pawel.szalapski@nokia.com)
  */
@@ -32,19 +35,25 @@ public enum ApiException {
     INVALID_CONTENT_TYPE(ExceptionType.SERVICE_EXCEPTION, "SVC0002", "Bad Parameter (Incorrect request Content-Type)", 400),
     UNAUTHORIZED_USER(ExceptionType.POLICY_EXCEPTION, "POL2000", "Unauthorized user", 401),
     INVALID_CUSTOM_HEADER(ExceptionType.SERVICE_EXCEPTION, "SVC0002", "Bad Parameter (Incorrect request api version)", 400),
-    MISSING_NAMESPACE_PARAMETER(ExceptionType.SERVICE_EXCEPTION, "SVC2006", "Mandatory input attribute event.commonEventHeader.stndDefinedNamespace is missing from request", 400),
-    EMPTY_NAMESPACE_PARAMETER(ExceptionType.SERVICE_EXCEPTION, "SVC2006", "Mandatory input attribute event.commonEventHeader.stndDefinedNamespace is empty in request", 400),
+    MISSING_NAMESPACE_PARAMETER(ExceptionType.SERVICE_EXCEPTION, "SVC2006", "Mandatory input %1 %2 is missing from request", List.of("attribute", "event.commonEventHeader.stndDefinedNamespace"), 400),
+    EMPTY_NAMESPACE_PARAMETER(ExceptionType.SERVICE_EXCEPTION, "SVC2006", "Mandatory input %1 %2 is empty in request", List.of("attribute", "event.commonEventHeader.stndDefinedNamespace"), 400),
     NO_SERVER_RESOURCES(ExceptionType.SERVICE_EXCEPTION, "SVC1000", "No server resources (internal processing queue full)", 503);
 
     public final int httpStatusCode;
     private final ExceptionType type;
     private final String code;
     private final String details;
+    private final List<String> variables;
 
     ApiException(ExceptionType type, String code, String details, int httpStatusCode) {
+        this(type, code, details, new ArrayList<>(), httpStatusCode);
+    }
+
+    ApiException(ExceptionType type, String code, String details, List<String> variables, int httpStatusCode) {
         this.type = type;
         this.code = code;
         this.details = details;
+        this.variables = variables;
         this.httpStatusCode = httpStatusCode;
     }
 
@@ -52,6 +61,9 @@ public enum ApiException {
         JSONObject exceptionTypeNode = new JSONObject();
         exceptionTypeNode.put("messageId", code);
         exceptionTypeNode.put("text", details);
+        if(!variables.isEmpty()) {
+            exceptionTypeNode.put("variables", variables);
+        }
 
         JSONObject requestErrorNode = new JSONObject();
         requestErrorNode.put(type.toString(), exceptionTypeNode);
index e5e7239..1042305 100644 (file)
@@ -191,7 +191,8 @@ public class VesRestControllerTest {
         verifyErrorResponse(
                 response,
                 "SVC2006",
-                "Mandatory input attribute event.commonEventHeader.stndDefinedNamespace is missing from request"
+                "Mandatory input %1 %2 is missing from request",
+                List.of("attribute", "event.commonEventHeader.stndDefinedNamespace")
         );
         verifyThatEventWasNotSend();
     }
@@ -215,7 +216,8 @@ public class VesRestControllerTest {
         verifyErrorResponse(
                 response,
                 "SVC2006",
-                "Mandatory input attribute event.commonEventHeader.stndDefinedNamespace is empty in request"
+                "Mandatory input %1 %2 is empty in request",
+                List.of("attribute", "event.commonEventHeader.stndDefinedNamespace")
         );
         verifyThatEventWasNotSend();
     }
@@ -251,13 +253,14 @@ public class VesRestControllerTest {
         when(applicationSettings.jsonSchema(eq(VERSION_V7))).thenReturn(loadedJsonSchemas.get(VERSION_V7).get());
     }
 
-    private void verifyErrorResponse(ResponseEntity<String> response, String messageId, String messageText) throws com.fasterxml.jackson.core.JsonProcessingException {
-        final Map<String, String> errorDetails = fetchErrorDetails(response);
-        assertThat(errorDetails).containsEntry("messageId", messageId);
-        assertThat(errorDetails).containsEntry("text", messageText);
+    private void verifyErrorResponse(ResponseEntity<String> response, String messageId, String messageText, List<String> variables) throws com.fasterxml.jackson.core.JsonProcessingException {
+        final Map<String, ?> errorDetails = fetchErrorDetails(response);
+        assertThat((Map<String, String>)errorDetails).containsEntry("messageId", messageId);
+        assertThat((Map<String, String>)errorDetails).containsEntry("text", messageText);
+        assertThat((Map<String, List<String>>)errorDetails).containsEntry("variables",  variables);
     }
 
-    private Map<String, String> fetchErrorDetails(ResponseEntity<String> response) throws com.fasterxml.jackson.core.JsonProcessingException {
+    private Map<String, ?> fetchErrorDetails(ResponseEntity<String> response) throws com.fasterxml.jackson.core.JsonProcessingException {
         final String body = response.getBody();
         ObjectMapper mapper = new ObjectMapper();
         Map<String, Map<String, Map<String,String>>> map = mapper.readValue(body, Map.class);