Merge "Fix file access issue in DummyProviderImpl"
authorLiam Fallon <liam.fallon@est.tech>
Wed, 27 Mar 2019 09:20:17 +0000 (09:20 +0000)
committerGerrit Code Review <gerrit@onap.org>
Wed, 27 Mar 2019 09:20:18 +0000 (09:20 +0000)
20 files changed:
models-base/pom.xml
models-base/src/main/java/org/onap/policy/models/base/PfModelException.java
models-base/src/main/java/org/onap/policy/models/base/PfModelRuntimeException.java
models-base/src/test/java/org/onap/policy/models/base/ExceptionsTest.java
models-base/src/test/java/org/onap/policy/models/base/PfModelExceptionInfoTest.java
models-errors/pom.xml
models-errors/src/main/java/org/onap/policy/models/errors/concepts/ErrorResponse.java
models-errors/src/main/java/org/onap/policy/models/errors/concepts/ErrorResponseInfo.java [moved from models-base/src/main/java/org/onap/policy/models/base/PfModelExceptionInfo.java with 52% similarity]
models-errors/src/main/java/org/onap/policy/models/errors/concepts/ErrorResponseUtils.java [new file with mode: 0644]
models-errors/src/test/java/org/onap/policy/models/errors/concepts/ErrorResponseUtilsTest.java [new file with mode: 0644]
models-examples/src/main/resources/policies/vDNS.policy.monitoring.input.tosca.json
models-examples/src/main/resources/policies/vFirewall.policy.monitoring.input.tosca.json
models-provider/src/test/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderTest.java
models-provider/src/test/java/org/onap/policy/models/provider/impl/MonitoringPolicyPersistenceTest.java [deleted file]
models-provider/src/test/java/org/onap/policy/models/provider/impl/PolicyPersistenceTest.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaProperty.java
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaServiceTemplateJsonAdapter.java
models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/concepts/TestPojos.java
models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/mapping/PlainToscaServiceTemplateMapperTest.java
models-tosca/src/test/java/org/onap/policy/models/tosca/simple/serialization/MonitoringPolicySerializationTest.java

index 712bc91..0523c33 100644 (file)
@@ -17,8 +17,7 @@
   SPDX-License-Identifier: Apache-2.0
   ============LICENSE_END=========================================================
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
     <artifactId>policy-models-base</artifactId>
     <name>${project.artifactId}</name>
     <description>[${project.parent.artifactId}] module provides basic model handling for the ONAP Policy Framework</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.policy.models</groupId>
+            <artifactId>policy-models-errors</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
 </project>
index ce44e51..46c5bd3 100644 (file)
@@ -25,18 +25,20 @@ import javax.ws.rs.core.Response;
 import lombok.Getter;
 import lombok.ToString;
 
-import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.onap.policy.models.errors.concepts.ErrorResponse;
+import org.onap.policy.models.errors.concepts.ErrorResponseInfo;
+import org.onap.policy.models.errors.concepts.ErrorResponseUtils;
 
 /**
  * This class is a base exception from which all model exceptions are sub classes.
  */
 @Getter
 @ToString
-public class PfModelException extends Exception implements PfModelExceptionInfo {
+public class PfModelException extends Exception implements ErrorResponseInfo {
     private static final long serialVersionUID = -8507246953751956974L;
 
-    // The status code on the exception
-    private final Response.Status statusCode;
+    // The error response of the exception
+    private final ErrorResponse errorResponse = new ErrorResponse();
 
     // The object on which the exception was thrown
     private final transient Object object;
@@ -60,7 +62,8 @@ public class PfModelException extends Exception implements PfModelExceptionInfo
      */
     public PfModelException(final Response.Status statusCode, final String message, final Object object) {
         super(message);
-        this.statusCode = statusCode;
+        errorResponse.setResponseCode(statusCode);
+        ErrorResponseUtils.getExceptionMessages(errorResponse, this);
         this.object = object;
     }
 
@@ -86,45 +89,8 @@ public class PfModelException extends Exception implements PfModelExceptionInfo
     public PfModelException(final Response.Status statusCode, final String message, final Exception exception,
             final Object object) {
         super(message, exception);
-        this.statusCode = statusCode;
+        errorResponse.setResponseCode(statusCode);
+        ErrorResponseUtils.getExceptionMessages(errorResponse, this);
         this.object = object;
     }
-
-    /**
-     * Get the message from this exception and its causes.
-     *
-     * @return the cascaded messages from this exception and the exceptions that caused it
-     */
-    @Override
-    public String getCascadedMessage() {
-        return buildCascadedMessage(this);
-    }
-
-    /**
-     * Build a cascaded message from an exception and all its nested exceptions.
-     *
-     * @param throwable the top level exception
-     * @return cascaded message string
-     */
-    public static String buildCascadedMessage(Throwable throwable) {
-        final StringBuilder builder = new StringBuilder();
-        builder.append(throwable.getMessage());
-
-        for (Throwable t = throwable; t != null; t = t.getCause()) {
-            builder.append("\ncaused by: ");
-            builder.append(t.getMessage());
-        }
-
-        return builder.toString();
-    }
-
-    /**
-     * Get the stack trace of the exception as a string.
-     *
-     * @return the stack trace of this message as a string
-     */
-    @Override
-    public String getStackTraceAsString() {
-        return ExceptionUtils.getStackTrace(this);
-    }
 }
index 32855c2..4724128 100644 (file)
@@ -25,18 +25,20 @@ import javax.ws.rs.core.Response;
 import lombok.Getter;
 import lombok.ToString;
 
-import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.onap.policy.models.errors.concepts.ErrorResponse;
+import org.onap.policy.models.errors.concepts.ErrorResponseInfo;
+import org.onap.policy.models.errors.concepts.ErrorResponseUtils;
 
 /**
  * This class is a base model run time exception from which all model run time exceptions are sub classes.
  */
 @Getter
 @ToString
-public class PfModelRuntimeException extends RuntimeException implements PfModelExceptionInfo {
+public class PfModelRuntimeException extends RuntimeException implements ErrorResponseInfo {
     private static final long serialVersionUID = -8507246953751956974L;
 
-    // The return code on the exception
-    private final Response.Status statusCode;
+    // The error response of the exception
+    private final ErrorResponse errorResponse = new ErrorResponse();
 
     // The object on which the exception was thrown
     private final transient Object object;
@@ -61,7 +63,8 @@ public class PfModelRuntimeException extends RuntimeException implements PfModel
     public PfModelRuntimeException(final Response.Status statusCode, final String message, final Object object) {
         super(message);
         this.object = object;
-        this.statusCode = statusCode;
+        errorResponse.setResponseCode(statusCode);
+        ErrorResponseUtils.getExceptionMessages(errorResponse, this);
     }
 
     /**
@@ -87,26 +90,7 @@ public class PfModelRuntimeException extends RuntimeException implements PfModel
             final Object object) {
         super(message, exception);
         this.object = object;
-        this.statusCode = statusCode;
-    }
-
-    /**
-     * Get the message from this exception and its causes.
-     *
-     * @return the message of this exception and all the exceptions that caused this exception
-     */
-    @Override
-    public String getCascadedMessage() {
-        return PfModelException.buildCascadedMessage(this);
-    }
-
-    /**
-     * Get the stack trace of the exception as a string.
-     *
-     * @return the stack trace of this message as a string
-     */
-    @Override
-    public String getStackTraceAsString() {
-        return ExceptionUtils.getStackTrace(this);
+        errorResponse.setResponseCode(statusCode);
+        ErrorResponseUtils.getExceptionMessages(errorResponse, this);
     }
 }
index 0a5b6a0..664e3dd 100644 (file)
@@ -28,6 +28,7 @@ import java.io.IOException;
 import javax.ws.rs.core.Response;
 
 import org.junit.Test;
+import org.onap.policy.models.errors.concepts.ErrorResponse;
 
 public class ExceptionsTest {
 
@@ -41,7 +42,8 @@ public class ExceptionsTest {
         String key = "A String";
         PfModelException ae =
                 new PfModelException(Response.Status.OK, "Message", new IOException("IO exception message"), key);
-        assertEquals("Message\ncaused by: Message\ncaused by: IO exception message", ae.getCascadedMessage());
+        ErrorResponse errorResponse = ae.getErrorResponse();
+        assertEquals("Message\nIO exception message", String.join("\n", errorResponse.getErrorDetails()));
         assertEquals(key, ae.getObject());
 
         assertNotNull(new PfModelRuntimeException(Response.Status.OK, "Message"));
@@ -52,8 +54,9 @@ public class ExceptionsTest {
         String rkey = "A String";
         PfModelRuntimeException re = new PfModelRuntimeException(Response.Status.OK, "Runtime Message",
                 new IOException("IO runtime exception message"), rkey);
-        assertEquals("Runtime Message\ncaused by: Runtime Message\ncaused by: IO runtime exception message",
-                re.getCascadedMessage());
+        errorResponse = re.getErrorResponse();
+        assertEquals("Runtime Message\nIO runtime exception message",
+                String.join("\n", errorResponse.getErrorDetails()));
         assertEquals(key, re.getObject());
     }
 }
index 1257975..183b44c 100644 (file)
@@ -25,6 +25,7 @@ import static org.junit.Assert.assertEquals;
 import javax.ws.rs.core.Response;
 
 import org.junit.Test;
+import org.onap.policy.models.errors.concepts.ErrorResponseInfo;
 
 /**
  * Test PfModelExceptionInfo interface.
@@ -49,15 +50,15 @@ public class PfModelExceptionInfoTest {
         }
     }
 
-    private String getErrorMessage(final PfModelExceptionInfo pfme) {
+    private String getErrorMessage(final ErrorResponseInfo eri) {
         StringBuilder stringBuilder = new StringBuilder();
 
         stringBuilder.append("Server returned: ");
-        stringBuilder.append(pfme.getStatusCode().toString());
+        stringBuilder.append(eri.getErrorResponse().getResponseCode().toString());
+        stringBuilder.append("Error Message:\n");
+        stringBuilder.append(eri.getErrorResponse().getErrorMessage());
         stringBuilder.append("\nDetailed Message:\n");
-        stringBuilder.append(pfme.getCascadedMessage());
-        stringBuilder.append("\nStack Trace:\n");
-        stringBuilder.append(pfme.getStackTraceAsString());
+        stringBuilder.append(String.join("\n", eri.getErrorResponse().getErrorDetails()));
 
         return stringBuilder.toString();
     }
index ab99853..4e29786 100644 (file)
@@ -27,7 +27,7 @@
         <version>2.0.0-SNAPSHOT</version>
     </parent>
 
-    <artifactId>models-errors</artifactId>
+    <artifactId>policy-models-errors</artifactId>
 
     <name>${project.artifactId}</name>
     <description>The models for Policy API's to return Error/warning message details.</description>
index b072ba1..88960f8 100644 (file)
@@ -22,6 +22,7 @@ package org.onap.policy.models.errors.concepts;
 
 import com.google.gson.annotations.SerializedName;
 
+import java.io.Serializable;
 import java.util.List;
 
 import javax.ws.rs.core.Response;
@@ -36,7 +37,8 @@ import lombok.Data;
  *
  */
 @Data
-public class ErrorResponse {
+public class ErrorResponse implements Serializable {
+    private static final long serialVersionUID = 6760066094588944729L;
 
     @SerializedName("code")
     private Response.Status  responseCode;
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.policy.models.base;
-
-import javax.ws.rs.core.Response;
+package org.onap.policy.models.errors.concepts;
 
 /**
- * Interface implemented bu Policy framework model exceptions to allow uniform reading of status codes and cascaded
- * messages.
+ * Interface implemented by Policy framework model exceptions to allow uniform reading of error responses.
  *
  * @author Liam Fallon (liam.fallon@est.tech)
  */
-public interface PfModelExceptionInfo {
-
-    /**
-     * Get the status code associated with an exception.
-     * @return the status code
-     */
-    public Response.Status getStatusCode();
-
-    /**
-     * Get the messages for all the cascaded exceptions in an exception.
-     *
-     * @return the cascaded message
-     */
-    public String getCascadedMessage();
-
-    /**
-     * Get the object associated with an exception.
-     *
-     * @return the object associated with an exception
-     */
-    public Object getObject();
+public interface ErrorResponseInfo {
 
     /**
-     * Get the stack trace of the exception as a string.
+     * Get the error response.
      *
-     * @return the stack trace of this message as a string
+     * @return the error response
      */
-    public String getStackTraceAsString();
+    public ErrorResponse getErrorResponse();
 }
diff --git a/models-errors/src/main/java/org/onap/policy/models/errors/concepts/ErrorResponseUtils.java b/models-errors/src/main/java/org/onap/policy/models/errors/concepts/ErrorResponseUtils.java
new file mode 100644 (file)
index 0000000..6346f9a
--- /dev/null
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.errors.concepts;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Utility class for managing {@link ErrorResponse objects}
+ *
+ * @author Liam Fallon (liam.fallon@est.tech)
+ */
+public final class ErrorResponseUtils {
+    /**
+     * Private constructor used to prevent sub class instantiation.
+     */
+    private ErrorResponseUtils() {}
+
+    /**
+     * Store the cascaded messages from an exception and all its nested exceptions in an ErrorResponse object.
+     *
+     * @param throwable the top level exception
+     */
+    public static void getExceptionMessages(final ErrorResponse errorResponse, final Throwable throwable) {
+        errorResponse.setErrorMessage(throwable.getMessage());
+
+        List<String> cascascadedErrorMessages = new ArrayList<>();
+
+        for (Throwable t = throwable; t != null; t = t.getCause()) {
+            cascascadedErrorMessages.add(t.getMessage());
+        }
+
+        if (!cascascadedErrorMessages.isEmpty()) {
+            errorResponse.setErrorDetails(cascascadedErrorMessages);
+        }
+    }
+}
+
diff --git a/models-errors/src/test/java/org/onap/policy/models/errors/concepts/ErrorResponseUtilsTest.java b/models-errors/src/test/java/org/onap/policy/models/errors/concepts/ErrorResponseUtilsTest.java
new file mode 100644 (file)
index 0000000..4f4ef39
--- /dev/null
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.errors.concepts;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+/**
+ * Test the {@link ErrorResponseUtils} class.
+ *
+ * @author Liam Fallon (liam.fallon@est.tech)
+ */
+public class ErrorResponseUtilsTest {
+    @Test
+    public void testErrorResponseUtils() {
+        try {
+            try {
+                throw new NumberFormatException("Exception 0");
+            }
+            catch (Exception nfe) {
+                throw new IOException("Exception 1", nfe);
+            }
+        } catch (Exception ioe) {
+            ErrorResponse errorResponse = new ErrorResponse();
+            ErrorResponseUtils.getExceptionMessages(errorResponse, ioe);
+
+            assertEquals("Exception 1", errorResponse.getErrorMessage());
+            assertEquals("Exception 1", errorResponse.getErrorDetails().get(0));
+            assertEquals("Exception 0", errorResponse.getErrorDetails().get(1));
+        }
+    }
+}
index bd4bdc4..56c49d0 100644 (file)
@@ -1,50 +1,50 @@
 {
-  "tosca_definitions_version": "tosca_simple_yaml_1_0_0",
-  "topology_template": {
-    "policies": [
-      {
-        "onap.scaleout.tca": {
-          "type": "onap.policies.monitoring.cdap.tca.hi.lo.app",
-          "version": "1.0.0",
-          "metadata": {
-            "policy-id": "onap.scaleout.tca"
-          },
-          "properties": {
-            "tca_policy": {
-              "domain": "measurementsForVfScaling",
-              "metricsPerEventName": [
-                {
-                  "eventName": "vLoadBalancer",
-                  "controlLoopSchemaType": "VNF",
-                  "policyScope": "type=configuration",
-                  "policyName": "onap.scaleout.tca",
-                  "policyVersion": "v0.0.1",
-                  "thresholds": [
-                    {
-                      "closedLoopControlName": "ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3",
-                      "closedLoopEventStatus": "ONSET",
-                      "version": "1.0.2",
-                      "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
-                      "thresholdValue": 500,
-                      "direction": "LESS_OR_EQUAL",
-                      "severity": "MAJOR"
-                    },
-                    {
-                      "closedLoopControlName": "ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3",
-                      "closedLoopEventStatus": "ONSET",
-                      "version": "1.0.2",
-                      "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
-                      "thresholdValue": 5000,
-                      "direction": "GREATER_OR_EQUAL",
-                      "severity": "CRITICAL"
-                    }
-                  ]
-                }
-              ]
-            }
-          }
-        }
-      }
-    ]
-  }
-}
\ No newline at end of file
+       "tosca_definitions_version": "tosca_simple_yaml_1_0_0",
+       "topology_template": {
+               "policies": [
+                       {
+                               "onap.scaleout.tca": {
+                                       "type": "onap.policies.monitoring.cdap.tca.hi.lo.app",
+                                       "version": "1.0.0",
+                                       "metadata": {
+                                               "policy-id": "onap.scaleout.tca"
+                                       },
+                                       "properties": {
+                                               "tca_policy": {
+                                                       "domain": "measurementsForVfScaling",
+                                                       "metricsPerEventName": [
+                                                               {
+                                                                       "eventName": "vLoadBalancer",
+                                                                       "controlLoopSchemaType": "VNF",
+                                                                       "policyScope": "type=configuration",
+                                                                       "policyName": "onap.scaleout.tca",
+                                                                       "policyVersion": "v0.0.1",
+                                                                       "thresholds": [
+                                                                               {
+                                                                                       "closedLoopControlName": "ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3",
+                                                                                       "closedLoopEventStatus": "ONSET",
+                                                                                       "version": "1.0.2",
+                                                                                       "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
+                                                                                       "thresholdValue": 500,
+                                                                                       "direction": "LESS_OR_EQUAL",
+                                                                                       "severity": "MAJOR"
+                                                                               },
+                                                                               {
+                                                                                       "closedLoopControlName": "ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3",
+                                                                                       "closedLoopEventStatus": "ONSET",
+                                                                                       "version": "1.0.2",
+                                                                                       "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
+                                                                                       "thresholdValue": 5000,
+                                                                                       "direction": "GREATER_OR_EQUAL",
+                                                                                       "severity": "CRITICAL"
+                                                                               }
+                                                                       ]
+                                                               }
+                                                       ]
+                                               }
+                                       }
+                               }
+                       }
+               ]
+       }
+}
index dc3131d..29c29b8 100644 (file)
@@ -1,50 +1,50 @@
 {
-  "tosca_definitions_version": "tosca_simple_yaml_1_0_0",
-  "topology_template": {
-    "policies": [
-      {
-        "onap.vfirewall.tca": {
-          "type": "onap.policy.monitoring.cdap.tca.hi.lo.app",
-          "version": "1.0.0",
-          "metadata": {
-            "policy-id": "onap.vfirewall.tca"
-          },
-          "properties": {
-            "tca_policy": {
-              "domain": "measurementsForVfScaling",
-              "metricsPerEventName": [
-                {
-                  "eventName": "vLoadBalancer",
-                  "controlLoopSchemaType": "VNF",
-                  "policyScope": "resource=vLoadBalancer;type=configuration",
-                  "policyName": "onap.vfirewall.tca",
-                  "policyVersion": "v0.0.1",
-                  "thresholds": [
-                    {
-                      "closedLoopControlName": "ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a",
-                      "closedLoopEventStatus": "ONSET",
-                      "version": "1.0.2",
-                      "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
-                      "thresholdValue": 500,
-                      "direction": "LESS_OR_EQUAL",
-                      "severity": "MAJOR"
+       "tosca_definitions_version": "tosca_simple_yaml_1_0_0",
+       "topology_template": {
+               "policies": [
+                       {
+                               "onap.vfirewall.tca": {
+                                       "type": "onap.policy.monitoring.cdap.tca.hi.lo.app",
+                                       "version": "1.0.0",
+                    "metadata": {
+                        "policy-id": "onap.vfirewall.tca"
                     },
-                    {
-                      "closedLoopControlName": "ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a",
-                      "closedLoopEventStatus": "ONSET",
-                      "version": "1.0.2",
-                      "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
-                      "thresholdValue": 5000,
-                      "direction": "GREATER_OR_EQUAL",
-                      "severity": "CRITICAL"
-                    }
-                  ]
-                }
-              ]
-            }
-          }
-        }
-      }
-    ]
-  }
-}
\ No newline at end of file
+                                       "properties": {
+                                               "tca_policy": {
+                                                       "domain": "measurementsForVfScaling",
+                                                       "metricsPerEventName": [
+                                                               {
+                                                                       "eventName": "vLoadBalancer",
+                                                                       "controlLoopSchemaType": "VNF",
+                                                                       "policyScope": "resource=vLoadBalancer;type=configuration",
+                                                                       "policyName": "onap.vfirewall.tca",
+                                                                       "policyVersion": "v0.0.1",
+                                                                       "thresholds": [
+                                                                               {
+                                                                                       "closedLoopControlName": "ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a",
+                                                                                       "closedLoopEventStatus": "ONSET",
+                                                                                       "version": "1.0.2",
+                                                                                       "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
+                                                                                       "thresholdValue": 500,
+                                                                                       "direction": "LESS_OR_EQUAL",
+                                                                                       "severity": "MAJOR"
+                                                                               },
+                                                                               {
+                                                                                       "closedLoopControlName": "ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a",
+                                                                                       "closedLoopEventStatus": "ONSET",
+                                                                                       "version": "1.0.2",
+                                                                                       "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
+                                                                                       "thresholdValue": 5000,
+                                                                                       "direction": "GREATER_OR_EQUAL",
+                                                                                       "severity": "CRITICAL"
+                                                                               }
+                                                                       ]
+                                                               }
+                                                       ]
+                                               }
+                                       }
+                               }
+                       }
+               ]
+       }
+}
index 498000a..c5dd8f0 100644 (file)
@@ -37,7 +37,6 @@ import org.onap.policy.models.provider.PolicyModelsProviderParameters;
 import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicy;
 import org.onap.policy.models.tosca.legacy.concepts.LegacyOperationalPolicy;
 import org.onap.policy.models.tosca.simple.concepts.ToscaServiceTemplate;
-import org.onap.policy.models.tosca.simple.provider.SimpleToscaProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,7 +46,7 @@ import org.slf4j.LoggerFactory;
  * @author Liam Fallon (liam.fallon@est.tech)
  */
 public class DatabasePolicyModelsProviderTest {
-    private static final Logger LOGGER = LoggerFactory.getLogger(SimpleToscaProvider.class);
+    private static final Logger LOGGER = LoggerFactory.getLogger(DatabasePolicyModelsProviderTest.class);
 
     PolicyModelsProviderParameters parameters;
 
diff --git a/models-provider/src/test/java/org/onap/policy/models/provider/impl/MonitoringPolicyPersistenceTest.java b/models-provider/src/test/java/org/onap/policy/models/provider/impl/MonitoringPolicyPersistenceTest.java
deleted file mode 100644 (file)
index b26e762..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- *  Copyright (C) 2019 Nordix Foundation.
- * ================================================================================
- * 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.
- *
- * SPDX-License-Identifier: Apache-2.0
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.models.provider.impl;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import com.google.gson.Gson;
-import com.google.gson.JsonSyntaxException;
-
-import java.io.IOException;
-import java.sql.Connection;
-import java.sql.DriverManager;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.onap.policy.common.utils.resources.ResourceUtils;
-import org.onap.policy.models.base.PfConceptKey;
-import org.onap.policy.models.base.PfValidationResult;
-import org.onap.policy.models.dao.DaoParameters;
-import org.onap.policy.models.dao.PfDao;
-import org.onap.policy.models.dao.PfDaoFactory;
-import org.onap.policy.models.dao.impl.DefaultPfDao;
-import org.onap.policy.models.tosca.simple.concepts.ToscaPolicy;
-import org.onap.policy.models.tosca.simple.concepts.ToscaServiceTemplate;
-import org.onap.policy.models.tosca.simple.serialization.ToscaServiceTemplateMessageBodyHandler;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Test persistence of monitoring policies to and from the database.
- *
- * @author Liam Fallon (liam.fallon@est.tech)
- */
-public class MonitoringPolicyPersistenceTest {
-    // Logger for this class
-    private static final Logger LOGGER = LoggerFactory.getLogger(MonitoringPolicyPersistenceTest.class);
-
-    private Gson gson;
-
-    private Connection connection;
-    private PfDao pfDao;
-
-    /**
-     * Set up the DAO towards the database.
-     *
-     * @throws Exception on database errors
-     */
-    @Before
-    public void setupDao() throws Exception {
-        // Use the JDBC UI "jdbc:h2:mem:testdb" to test towards the h2 database
-        // Use the JDBC UI "jdbc:mariadb://localhost:3306/policy" to test towards a locally installed mariadb instance
-        connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "policy", "P01icY");
-
-        final DaoParameters daoParameters = new DaoParameters();
-        daoParameters.setPluginClass(DefaultPfDao.class.getCanonicalName());
-
-        // Use the persistence unit ToscaConceptTest to test towards the h2 database
-        // Use the persistence unit ToscaConceptMariaDBTest to test towards a locally installed mariadb instance
-        daoParameters.setPersistenceUnit("ToscaConceptTest");
-
-        pfDao = new PfDaoFactory().createPfDao(daoParameters);
-        pfDao.init(daoParameters);
-    }
-
-    /**
-     * Set up GSON.
-     */
-    @Before
-    public void setupGson() {
-        gson = new ToscaServiceTemplateMessageBodyHandler().getGson();
-    }
-
-    @After
-    public void teardown() throws Exception {
-        pfDao.close();
-        connection.close();
-    }
-
-    @Test
-    public void testJsonDeserialization() throws JsonSyntaxException, IOException {
-        ToscaServiceTemplate serviceTemplate =
-                gson.fromJson(ResourceUtils.getResourceAsString("policies/vCPE.policy.monitoring.input.tosca.json"),
-                        ToscaServiceTemplate.class);
-
-        assertNotNull(serviceTemplate);
-        LOGGER.info(serviceTemplate.validate(new PfValidationResult()).toString());
-        assertTrue(serviceTemplate.validate(new PfValidationResult()).isValid());
-
-        ToscaPolicy policyBeforeDb = serviceTemplate.getTopologyTemplate().getPolicies().get("onap.restart.tca");
-
-        pfDao.create(policyBeforeDb);
-
-        ToscaPolicy policyAfterDb = pfDao.get(ToscaPolicy.class, new PfConceptKey("onap.restart.tca:1.0.0"));
-
-        assertEquals(policyBeforeDb, policyAfterDb);
-    }
-}
diff --git a/models-provider/src/test/java/org/onap/policy/models/provider/impl/PolicyPersistenceTest.java b/models-provider/src/test/java/org/onap/policy/models/provider/impl/PolicyPersistenceTest.java
new file mode 100644 (file)
index 0000000..de29977
--- /dev/null
@@ -0,0 +1,159 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.provider.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+import java.util.Base64;
+
+import lombok.NonNull;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfValidationResult;
+import org.onap.policy.models.provider.PolicyModelsProvider;
+import org.onap.policy.models.provider.PolicyModelsProviderFactory;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.tosca.simple.concepts.ToscaPolicy;
+import org.onap.policy.models.tosca.simple.concepts.ToscaServiceTemplate;
+import org.onap.policy.models.tosca.simple.serialization.ToscaServiceTemplateMessageBodyHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.yaml.snakeyaml.Yaml;
+
+/**
+ * Test persistence of monitoring policies to and from the database.
+ *
+ * @author Liam Fallon (liam.fallon@est.tech)
+ */
+public class PolicyPersistenceTest {
+    // Logger for this class
+    private static final Logger LOGGER = LoggerFactory.getLogger(PolicyPersistenceTest.class);
+
+    private Gson gson;
+
+    private PolicyModelsProvider databaseProvider;
+
+    // @formatter:off
+    private String[] policyResourceNames = {
+        "policies/vCPE.policy.monitoring.input.tosca.json",
+        "policies/vCPE.policy.monitoring.input.tosca.yaml",
+        "policies/vCPE.policy.operational.input.tosca.yaml",
+        "policies/vDNS.policy.guard.frequency.input.tosca.json",
+        "policies/vDNS.policy.guard.frequency.input.tosca.yaml",
+        "policies/vDNS.policy.monitoring.input.tosca.json",
+        "policies/vDNS.policy.monitoring.input.tosca.yaml",
+        "policies/vDNS.policy.operational.input.tosca.yaml",
+        "policies/vFirewall.policy.monitoring.input.tosca.json",
+        "policies/vFirewall.policy.monitoring.input.tosca.yaml",
+        "policies/vFirewall.policy.operational.input.tosca.json",
+        "policies/vFirewall.policy.operational.input.tosca.yaml"
+    };
+    // @formatter:on
+
+    /**
+     * Initialize provider.
+     *
+     * @throws PfModelException on exceptions in the tests
+     */
+    @Before
+    public void setupParameters() throws PfModelException {
+        PolicyModelsProviderParameters parameters = new PolicyModelsProviderParameters();
+        parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
+        parameters.setDatabaseUser("policy");
+        parameters.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
+        parameters.setPersistenceUnit("ToscaConceptTest");
+
+        databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
+        databaseProvider.init();
+    }
+
+    /**
+     * Set up GSON.
+     */
+    @Before
+    public void setupGson() {
+        gson = new ToscaServiceTemplateMessageBodyHandler().getGson();
+    }
+
+    @After
+    public void teardown() throws Exception {
+        databaseProvider.close();
+    }
+
+    @Test
+    public void testPolicyPersistence() {
+        try {
+            for (String policyResourceName : policyResourceNames) {
+                String policyString = ResourceUtils.getResourceAsString(policyResourceName);
+
+                if (policyResourceName.endsWith("yaml")) {
+                    testYamlStringPolicyPersistence(policyString);
+                } else {
+                    testJsonStringPolicyPersistence(policyString);
+                }
+            }
+        } catch (Exception exc) {
+            LOGGER.warn("error processing policies", exc);
+            fail("test should not throw an exception");
+        }
+    }
+
+    private void testYamlStringPolicyPersistence(final String policyString) throws Exception {
+        Object yamlObject = new Yaml().load(policyString);
+        String yamlAsJsonString = new GsonBuilder().setPrettyPrinting().create().toJson(yamlObject);
+
+        testJsonStringPolicyPersistence(yamlAsJsonString);
+    }
+
+    /**
+     * Check persistence of a policy.
+     *
+     * @param policyString the policy as a string
+     * @throws Exception any exception thrown
+     */
+    public void testJsonStringPolicyPersistence(@NonNull final String policyString) throws Exception {
+        ToscaServiceTemplate serviceTemplate = gson.fromJson(policyString, ToscaServiceTemplate.class);
+
+        assertNotNull(serviceTemplate);
+        LOGGER.info(serviceTemplate.validate(new PfValidationResult()).toString());
+        assertTrue(serviceTemplate.validate(new PfValidationResult()).isValid());
+
+        databaseProvider.createPolicies(serviceTemplate);
+
+        for (PfConceptKey policyKey : serviceTemplate.getTopologyTemplate().getPolicies().getConceptMap().keySet()) {
+            ToscaPolicy incomingPolicy = serviceTemplate.getTopologyTemplate().getPolicies().get(policyKey);
+            ToscaPolicy databasePolicy =
+                    databaseProvider.getPolicies(policyKey).getTopologyTemplate().getPolicies().get(policyKey);
+            assertEquals(incomingPolicy, databasePolicy);
+        }
+    }
+}
index e25adfd..78f3153 100644 (file)
@@ -32,13 +32,10 @@ import java.lang.reflect.Type;
 
 import lombok.NonNull;
 
-import org.onap.policy.models.base.PfConceptKey;
 import org.onap.policy.models.tosca.simple.concepts.ToscaDataTypes;
 import org.onap.policy.models.tosca.simple.concepts.ToscaPolicyTypes;
 import org.onap.policy.models.tosca.simple.concepts.ToscaServiceTemplate;
 import org.onap.policy.models.tosca.simple.concepts.ToscaTopologyTemplate;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * GSON type adapter for TOSCA policies.
@@ -49,8 +46,6 @@ import org.slf4j.LoggerFactory;
 public class ToscaServiceTemplateJsonAdapter
         implements JsonSerializer<ToscaServiceTemplate>, JsonDeserializer<ToscaServiceTemplate> {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(ToscaServiceTemplateJsonAdapter.class);
-
     private static final String TOPOLOGY_TEMPLATE = "topology_template";
     private static final String TOSCA_DEFINITIONS_VERSION = "tosca_definitions_version";
     private static final String POLICY_TYPES = "policy_types";
@@ -64,10 +59,7 @@ public class ToscaServiceTemplateJsonAdapter
         final JsonObject serviceTemplateJsonObject = serviceTemplateElement.getAsJsonObject();
 
         // The outgoing object
-        final PfConceptKey serviceTemplateKey = new PfConceptKey("IncomingServiceTemplate", "0.0.1");
-        final ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate(serviceTemplateKey);
-
-        // Set tosca_definitions_version
+        final ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
         serviceTemplate
                 .setToscaDefinitionsVersion(serviceTemplateJsonObject.get(TOSCA_DEFINITIONS_VERSION).getAsString());
 
@@ -75,19 +67,18 @@ public class ToscaServiceTemplateJsonAdapter
         if (serviceTemplateJsonObject.has(TOPOLOGY_TEMPLATE)) {
             serviceTemplate.setTopologyTemplate(new ToscaTopologyTemplateJsonAdapter().deserialize(
                     serviceTemplateJsonObject.get(TOPOLOGY_TEMPLATE), ToscaTopologyTemplate.class, context));
-            serviceTemplate.getTopologyTemplate().getKey().setParentConceptKey(serviceTemplateKey);
         }
 
         // Set policy_types
         if (serviceTemplateJsonObject.has(POLICY_TYPES)) {
-            serviceTemplate.setPolicyTypes(new ToscaPolicyTypesJsonAdapter().deserialize(
-                    serviceTemplateJsonObject.get(POLICY_TYPES), ToscaPolicyTypes.class, context));
+            serviceTemplate.setPolicyTypes(new ToscaPolicyTypesJsonAdapter()
+                    .deserialize(serviceTemplateJsonObject.get(POLICY_TYPES), ToscaPolicyTypes.class, context));
         }
 
         // Set data_types
         if (serviceTemplateJsonObject.has(DATA_TYPES)) {
-            serviceTemplate.setDataTypes(new ToscaDataTypesJsonAdapter().deserialize(
-                    serviceTemplateJsonObject.get(DATA_TYPES), ToscaDataTypes.class, context));
+            serviceTemplate.setDataTypes(new ToscaDataTypesJsonAdapter()
+                    .deserialize(serviceTemplateJsonObject.get(DATA_TYPES), ToscaDataTypes.class, context));
         }
 
         return serviceTemplate;
@@ -101,8 +92,8 @@ public class ToscaServiceTemplateJsonAdapter
 
         // Serialize tosca_definitions_version
         if (serviceTemplate.getToscaDefinitionsVersion() != null) {
-            serviceTemplateJsonObject.addProperty(
-                    TOSCA_DEFINITIONS_VERSION, serviceTemplate.getToscaDefinitionsVersion());
+            serviceTemplateJsonObject.addProperty(TOSCA_DEFINITIONS_VERSION,
+                    serviceTemplate.getToscaDefinitionsVersion());
         }
 
         // Serialize topoligy_template
@@ -114,15 +105,15 @@ public class ToscaServiceTemplateJsonAdapter
 
         // Serialize policy_types
         if (serviceTemplate.getPolicyTypes() != null) {
-            JsonElement policyTypesJsonElement = new ToscaPolicyTypesJsonAdapter()
-                    .serialize(serviceTemplate.getPolicyTypes(), type, context);
+            JsonElement policyTypesJsonElement =
+                    new ToscaPolicyTypesJsonAdapter().serialize(serviceTemplate.getPolicyTypes(), type, context);
             serviceTemplateJsonObject.add(POLICY_TYPES, policyTypesJsonElement);
         }
 
         // Serialize data_types
         if (serviceTemplate.getDataTypes() != null) {
-            JsonElement dataTypesJsonElement = new ToscaDataTypesJsonAdapter()
-                    .serialize(serviceTemplate.getDataTypes(), type, context);
+            JsonElement dataTypesJsonElement =
+                    new ToscaDataTypesJsonAdapter().serialize(serviceTemplate.getDataTypes(), type, context);
             serviceTemplateJsonObject.add(DATA_TYPES, dataTypesJsonElement);
         }
 
index 4dd55d5..7c813a6 100644 (file)
@@ -33,7 +33,7 @@ import org.junit.Test;
 import org.onap.policy.common.utils.validation.ToStringTester;
 
 /**
- * Class to perform unit tests of all pojos
+ * Class to perform unit tests of all pojos.
  *
  * @author Chenfei Gao (cgao@research.att.com)
  *
index bd6b26b..e9223b3 100644 (file)
@@ -37,7 +37,7 @@ import org.onap.policy.models.tosca.simple.concepts.ToscaServiceTemplate;
 import org.yaml.snakeyaml.Yaml;
 
 /**
- * This class performs unit test of {@link PlainToscaServiceTemplateMapper}}
+ * This class performs unit test of {@link PlainToscaServiceTemplateMapper}}.
  *
  * @author Chenfei Gao (cgao@research.att.com)
  */
index e491563..505e90e 100644 (file)
@@ -115,6 +115,7 @@ public class MonitoringPolicySerializationTest {
             verifyVfwMonitoringOutputserialization(serializedServiceTemplate);
 
         } catch (Exception e) {
+            LOGGER.warn("No exception should be thrown", e);
             fail("No exception should be thrown");
         }
     }