Merge the POMBA code to ONAP AAI data router
[aai/data-router.git] / src / main / java / org / onap / aai / datarouter / policy / ServiceIntegrityValidationPolicy.java
diff --git a/src/main/java/org/onap/aai/datarouter/policy/ServiceIntegrityValidationPolicy.java b/src/main/java/org/onap/aai/datarouter/policy/ServiceIntegrityValidationPolicy.java
new file mode 100644 (file)
index 0000000..31aa898
--- /dev/null
@@ -0,0 +1,213 @@
+/**\r
+ * ============LICENSE_START=======================================================\r
+ * org.onap.aai\r
+ * ================================================================================\r
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.\r
+ * Copyright © 2017-2018 Amdocs\r
+ * ================================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *       http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ============LICENSE_END=========================================================\r
+ */\r
+package org.onap.aai.datarouter.policy;\r
+\r
+import com.google.gson.JsonArray;\r
+import com.google.gson.JsonElement;\r
+import com.google.gson.JsonObject;\r
+import com.google.gson.JsonParser;\r
+import java.util.Arrays;\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Map;\r
+import org.apache.camel.Exchange;\r
+import org.onap.aai.cl.api.Logger;\r
+import org.onap.aai.cl.eelf.LoggerFactory;\r
+import org.onap.aai.cl.mdc.MdcContext;\r
+import org.onap.aai.restclient.client.Headers;\r
+import org.onap.aai.datarouter.logging.ServiceIntegrityValidationsMsgs;\r
+import org.onap.aai.datarouter.util.SearchServiceAgent;\r
+import org.slf4j.MDC;\r
+\r
+/**\r
+ *  This class handles the logic which transformers the POA-AUDIT-RESULT event message to the ElasticSearch validation/violation message\r
+ *  in order to prepare two Json structures, one for validation index and one for violation index and then submit POST request to\r
+ *  Search-Data-Service to insert the document into ES.\r
+ *\r
+ */\r
+public class ServiceIntegrityValidationPolicy {\r
+\r
+    private static final String SERVICE_VALIDATION_SCHEMA_FILE = "auditservice_validation_schema.json";\r
+    private static final String SERVICE_VIOLATION_SCHEMA_FILE = "auditservice_violation_schema.json";\r
+\r
+    private static Logger logger = LoggerFactory.getInstance()\r
+            .getLogger(ServiceIntegrityValidationPolicy.class.getSimpleName());\r
+\r
+    private static JsonParser jsonParser = new JsonParser();\r
+\r
+    private String validationIndexName = null;\r
+    private String violationIndexName = null;\r
+\r
+    private SearchServiceAgent searchAgent = null;\r
+\r
+    public ServiceIntegrityValidationPolicy(String searchCertPath,\r
+            String searchCertTruststore,\r
+            String searchCertPassword,\r
+            String searchBaseURL,\r
+            String endpoint,\r
+            String validationIndexName,\r
+            String violationIndexName) {\r
+        searchAgent = new SearchServiceAgent(searchCertPath,\r
+                searchCertTruststore,\r
+                searchCertPassword,\r
+                concatSubURI(searchBaseURL, endpoint),\r
+                "documents",\r
+                logger);\r
+\r
+        this.validationIndexName = validationIndexName;\r
+        this.violationIndexName = violationIndexName;\r
+    }\r
+\r
+    public void startup(){\r
+\r
+        searchAgent.createSearchIndex(validationIndexName, SERVICE_VALIDATION_SCHEMA_FILE);\r
+        searchAgent.createSearchIndex(violationIndexName, SERVICE_VIOLATION_SCHEMA_FILE);\r
+\r
+        logger.info(ServiceIntegrityValidationsMsgs.SI_POLICY_REGISTRATION);\r
+    }\r
+\r
+    public void process(Exchange exchange) throws Exception {\r
+\r
+        logger.debug("Invoking ServiceIntegrityViolationPolicy with payload" + exchange.getIn().getBody());\r
+\r
+        String payload = (String)exchange.getIn().getBody();\r
+\r
+        JsonObject serviceValidation = jsonParser.parse(payload).getAsJsonObject();\r
+        JsonElement serviceViolationsElement = serviceValidation.get("violations");\r
+        // Calculate the document id to use for this entity.\r
+        JsonElement id = serviceValidation.get("validationId");\r
+\r
+        if(serviceViolationsElement == null || serviceViolationsElement.getAsJsonArray().size() == 0) {\r
+            serviceValidation.addProperty("result", "Pass");\r
+            logger.debug("Service integrity validation event processing for event with ID " + id + " as a Pass due to no violations.");\r
+        }else {\r
+            serviceValidation.addProperty("result", "Fail");\r
+            logger.debug("Service integrity validation event processing for event with ID " + id + " as a Fail due to one or more violations.");\r
+        }\r
+\r
+        if(serviceViolationsElement != null) {\r
+            JsonArray violationsArray = serviceViolationsElement.getAsJsonArray();\r
+            Iterator<JsonElement> vit = violationsArray.iterator();\r
+            while(vit.hasNext()) {\r
+                JsonObject currentViolation = vit.next().getAsJsonObject();\r
+                JsonObject oldViolationDetails =  currentViolation.getAsJsonObject("violationDetails");\r
+                JsonObject newViolationDetails = new JsonObject();\r
+                for (Map.Entry<String, JsonElement> e : oldViolationDetails.entrySet()) {\r
+                    String oldKey  = e.getKey();\r
+                    String newKey = oldKey.replace(".","-");\r
+                    newViolationDetails.add(newKey,e.getValue());\r
+                }\r
+                currentViolation.remove("violationDetails");\r
+                currentViolation.remove("modelName");\r
+                currentViolation.add("violationDetails",newViolationDetails);\r
+                logger.debug("new violation:" + currentViolation.toString());\r
+                JsonObject formattedViolation = buildViolation(serviceValidation, currentViolation);\r
+\r
+                handleSearchDataServiceOperation(violationIndexName, null, formattedViolation.toString(), "POST");\r
+\r
+            }\r
+        }\r
+        logger.debug("validation: " + serviceValidation.toString());\r
+\r
+        JsonObject formattedValidation = buildValidation(serviceValidation);\r
+        // Persist the entity that we received from the event to the Search Service.\r
+        handleSearchDataServiceOperation(validationIndexName, id.getAsString(), formattedValidation.toString(), "PUT");\r
+\r
+    }\r
+\r
+\r
+    private JsonObject buildViolation(JsonObject validation, JsonObject violation) {\r
+        JsonObject formattedViolation = new JsonObject();\r
+\r
+        formattedViolation.addProperty("validationId", validation.get("validationId").getAsString());\r
+        formattedViolation.addProperty("validationTimestamp", validation.get("validationTimestamp").getAsString());\r
+        formattedViolation.addProperty("modelVersionId", validation.get("entity").getAsJsonObject().get("poa-event").getAsJsonObject().get("modelVersionId").getAsString());\r
+        formattedViolation.addProperty("modelInvariantId", validation.get("entity").getAsJsonObject().get("poa-event").getAsJsonObject().get("modelInvariantId").getAsString());\r
+        formattedViolation.addProperty("serviceInstanceId",validation.get("entity").getAsJsonObject().get("poa-event").getAsJsonObject().get("serviceInstanceId").getAsString());\r
+\r
+        formattedViolation.addProperty("violationId", violation.get("violationId").getAsString());\r
+        formattedViolation.addProperty("violationTimestamp", validation.get("validationTimestamp").getAsString());\r
+        formattedViolation.addProperty("category", violation.get("category").getAsString());\r
+        formattedViolation.addProperty("severity", violation.get("severity").getAsString());\r
+        formattedViolation.addProperty("violationType", violation.get("violationType").getAsString());\r
+        formattedViolation.addProperty("validationRule", violation.get("validationRule").getAsString());\r
+        formattedViolation.addProperty("message", violation.get("errorMessage").getAsString());\r
+\r
+        //formattedViolation.add("violationDetails",violation.get("violationDetails"));\r
+        return formattedViolation;\r
+    }\r
+\r
+    private JsonObject buildValidation(JsonObject validation) {\r
+        JsonObject formattedValidation = new JsonObject();\r
+\r
+        formattedValidation.add("violations", validation.get("violations"));\r
+        formattedValidation.addProperty("validationId", validation.get("validationId").getAsString());\r
+        formattedValidation.addProperty("validationTimestamp", validation.get("validationTimestamp").getAsString());\r
+        formattedValidation.addProperty("modelVersionId", validation.get("entity").getAsJsonObject().get("poa-event").getAsJsonObject().get("modelVersionId").getAsString());\r
+        formattedValidation.addProperty("modelInvariantId", validation.get("entity").getAsJsonObject().get("poa-event").getAsJsonObject().get("modelInvariantId").getAsString());\r
+        formattedValidation.addProperty("serviceInstanceId",validation.get("entity").getAsJsonObject().get("poa-event").getAsJsonObject().get("serviceInstanceId").getAsString());\r
+\r
+        try {\r
+            formattedValidation.addProperty("modelName", validation.get("entity").getAsJsonObject().get("context-list").getAsJsonObject().get("sdc").getAsJsonObject().get("service").getAsJsonObject().get("name").getAsString());\r
+            logger.debug("model name: " +  validation.get("entity").getAsJsonObject().get("context-list").getAsJsonObject().get("sdc").getAsJsonObject().get("service").getAsJsonObject().get("name").getAsString());\r
+        }catch (NullPointerException ex){\r
+            ex.printStackTrace();\r
+            formattedValidation.addProperty("modelName","");\r
+        }\r
+\r
+        return formattedValidation;\r
+    }\r
+\r
+\r
+    private static String concatSubURI(String... suburis) {\r
+        String finalURI = "";\r
+\r
+        for (String suburi : suburis) {\r
+\r
+            if (suburi != null) {\r
+                // Remove any leading / since we only want to append /\r
+                suburi = suburi.replaceFirst("^/*", "");\r
+\r
+                // Add a trailing / if one isn't already there\r
+                finalURI += suburi.endsWith("/") ? suburi : suburi + "/";\r
+            }\r
+        }\r
+\r
+        return finalURI;\r
+    }\r
+\r
+\r
+    public void handleSearchDataServiceOperation(String index, String id, String payload, String action) {\r
+\r
+        Map<String, List<String>> headers = new HashMap<>();\r
+        headers.put(Headers.FROM_APP_ID, Arrays.asList("DataRouter"));\r
+        headers.put(Headers.TRANSACTION_ID, Arrays.asList(MDC.get(MdcContext.MDC_REQUEST_ID)));\r
+\r
+        if (action.equalsIgnoreCase("PUT")) {\r
+            searchAgent.putDocument(index, id, payload, headers);\r
+\r
+        }else if (action.equalsIgnoreCase("POST")) {\r
+            searchAgent.postDocument(index,  payload, headers);\r
+        }\r
+\r
+    }\r
+}\r