TOSCA Compliant Guard Policies
[policy/models.git] / models-tosca / src / test / java / org / onap / policy / models / tosca / simple / serialization / MonitoringPolicySerializationTest.java
index 95f0ac9..318eaee 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2019 Nordix Foundation.
+ *  Copyright (C) 2019-2020 Nordix Foundation.
+ *  Copyright (C) 2019 AT&T Intellectual Property. 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.
@@ -23,19 +24,25 @@ package org.onap.policy.models.tosca.simple.serialization;
 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 com.google.gson.JsonSyntaxException;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
 
-import java.io.IOException;
+import java.util.Map;
 
-import org.junit.Before;
 import org.junit.Test;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.coder.YamlJsonTranslator;
 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.tosca.simple.concepts.ToscaServiceTemplate;
-import org.onap.policy.models.tosca.simple.serialization.ToscaServiceTemplateMessageBodyHandler;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
+import org.onap.policy.models.tosca.utils.ToscaServiceTemplateUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.yaml.snakeyaml.Yaml;
@@ -44,61 +51,279 @@ import org.yaml.snakeyaml.Yaml;
  * Test serialization of monitoring policies.
  *
  * @author Liam Fallon (liam.fallon@est.tech)
+ * @author Chenfei Gao (cgao@research.att.com)
  */
 public class MonitoringPolicySerializationTest {
-    // Logger for this class
+
+    private static final String VERSION = "version";
+
+    private static final String YAML_VERSION = "tosca_simple_yaml_1_1_0";
+
+    private static final String DEFINITION_VERSION = "tosca_definitions_version";
+
+    private static final String TOPOLOGY_TEMPLATE = "topology_template";
+
+    private static final String TCA_POLICY = "tca_policy";
+
+    private static final String PROPERTIES2 = "properties";
+
+    private static final String POLICY_ID = "policy-id";
+
+    private static final String POLICIES = "policies";
+
+    private static final String POLICY3 = "onap.vfirewall.tca";
+
+    private static final String POLICY2 = "onap.scaleout.tca";
+
+    private static final String POLICY1 = "onap.restart.tca";
+
+    private static final String TYPE1 = "onap.policies.monitoring.cdap.tca.hi.lo.app";
+
+    private static final String METADATA = "metadata";
+
+    private static final String VERSION_100 = "1.0.0";
+
     private static final Logger LOGGER = LoggerFactory.getLogger(MonitoringPolicySerializationTest.class);
 
-    private Gson gson;
+    private static final String VCPE_MON_INPUT_JSON = "policies/vCPE.policy.monitoring.input.tosca.json";
+    private static final String VCPE_MON_INPUT_YAML = "policies/vCPE.policy.monitoring.input.tosca.yaml";
+    private static final String VDNS_MON_INPUT_JSON = "policies/vDNS.policy.monitoring.input.tosca.json";
+    private static final String VDNS_MON_INPUT_YAML = "policies/vDNS.policy.monitoring.input.tosca.yaml";
+    private static final String VFW_MON_INPUT_JSON = "policies/vFirewall.policy.monitoring.input.tosca.json";
+    private static final String VFW_MON_INPUT_YAML = "policies/vFirewall.policy.monitoring.input.tosca.yaml";
+
+    private StandardCoder standardCoder = new StandardCoder();
+    private YamlJsonTranslator yamlJsonTranslator = new YamlJsonTranslator();
 
-    @Before
-    public void setUp() {
-        gson = new ToscaServiceTemplateMessageBodyHandler().getGson();
+    @Test
+    public void testDeserialization() throws Exception {
+        String policyTypeInputJson =
+                ResourceUtils.getResourceAsString("policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.yaml");
+        ToscaServiceTemplate plainPolicyTypes =
+                yamlJsonTranslator.fromYaml(policyTypeInputJson, ToscaServiceTemplate.class);
+
+        JpaToscaServiceTemplate policyTypeServiceTemplate = new JpaToscaServiceTemplate();
+        policyTypeServiceTemplate.fromAuthorative(plainPolicyTypes);
+
+        // vCPE
+        JpaToscaServiceTemplate serviceTemplateFromJson = deserializeMonitoringInputJson(VCPE_MON_INPUT_JSON);
+        JpaToscaServiceTemplate mergedServiceTemplate =
+                ToscaServiceTemplateUtils.addFragment(policyTypeServiceTemplate, serviceTemplateFromJson);
+        verifyVcpeMonitoringInputDeserialization(mergedServiceTemplate);
+        JpaToscaServiceTemplate serviceTemplateFromYaml = deserializeMonitoringInputYaml(VCPE_MON_INPUT_YAML);
+        assertTrue(serviceTemplateFromJson.compareTo(serviceTemplateFromYaml) == 0);
+
+        // vDNS
+        serviceTemplateFromJson = deserializeMonitoringInputJson(VDNS_MON_INPUT_JSON);
+        mergedServiceTemplate =
+                ToscaServiceTemplateUtils.addFragment(policyTypeServiceTemplate, serviceTemplateFromJson);
+        verifyVdnsMonitoringInputDeserialization(mergedServiceTemplate);
+        serviceTemplateFromYaml = deserializeMonitoringInputYaml(VDNS_MON_INPUT_YAML);
+        assertTrue(serviceTemplateFromJson.compareTo(serviceTemplateFromYaml) == 0);
+
+        // vFirewall
+        serviceTemplateFromJson = deserializeMonitoringInputJson(VFW_MON_INPUT_JSON);
+        mergedServiceTemplate =
+                ToscaServiceTemplateUtils.addFragment(policyTypeServiceTemplate, serviceTemplateFromJson);
+        verifyVfwMonitoringInputDeserialization(mergedServiceTemplate);
+        serviceTemplateFromYaml = deserializeMonitoringInputYaml(VFW_MON_INPUT_YAML);
+        assertTrue(serviceTemplateFromJson.compareTo(serviceTemplateFromYaml) == 0);
     }
 
     @Test
-    public void testJsonDeserialization() throws JsonSyntaxException, IOException {
-        String vcpePolicyJson = ResourceUtils.getResourceAsString("policies/vCPE.policy.monitoring.input.tosca.json");
+    public void testSerialization() {
+        try {
+            // vCPE
+            JpaToscaServiceTemplate serviceTemplate = deserializeMonitoringInputJson(VCPE_MON_INPUT_JSON);
+            String serializedServiceTemplate = serializeMonitoringServiceTemplate(serviceTemplate);
+            verifyVcpeMonitoringOutputserialization(serializedServiceTemplate);
+
+            // vDNS
+            serviceTemplate = deserializeMonitoringInputJson(VDNS_MON_INPUT_JSON);
+            serializedServiceTemplate = serializeMonitoringServiceTemplate(serviceTemplate);
+            verifyVdnsMonitoringOutputserialization(serializedServiceTemplate);
+
+            // vFirewall
+            serviceTemplate = deserializeMonitoringInputJson(VFW_MON_INPUT_JSON);
+            serializedServiceTemplate = serializeMonitoringServiceTemplate(serviceTemplate);
+            verifyVfwMonitoringOutputserialization(serializedServiceTemplate);
+
+        } catch (Exception e) {
+            LOGGER.warn("No exception should be thrown", e);
+            fail("No exception should be thrown");
+        }
+    }
+
+    private JpaToscaServiceTemplate deserializeMonitoringInputJson(String resourcePath) throws Exception {
+
+        String policyJson = ResourceUtils.getResourceAsString(resourcePath);
+        ToscaServiceTemplate serviceTemplate = standardCoder.decode(policyJson, ToscaServiceTemplate.class);
+        JpaToscaServiceTemplate jpaToscaServiceTemplate = new JpaToscaServiceTemplate();
+        jpaToscaServiceTemplate.fromAuthorative(serviceTemplate);
+        return jpaToscaServiceTemplate;
+    }
 
-        ToscaServiceTemplate serviceTemplate = gson.fromJson(vcpePolicyJson, ToscaServiceTemplate.class);
+    private JpaToscaServiceTemplate deserializeMonitoringInputYaml(String resourcePath) throws Exception {
+
+        Yaml yaml = new Yaml();
+        String policyYaml = ResourceUtils.getResourceAsString(resourcePath);
+        Object yamlObject = yaml.load(policyYaml);
+        String yamlAsJsonString = new StandardCoder().encode(yamlObject);
+        ToscaServiceTemplate serviceTemplate = standardCoder.decode(yamlAsJsonString, ToscaServiceTemplate.class);
+
+        JpaToscaServiceTemplate jpaToscaServiceTemplate = new JpaToscaServiceTemplate();
+        jpaToscaServiceTemplate.fromAuthorative(serviceTemplate);
+        return jpaToscaServiceTemplate;
+    }
+
+    private String serializeMonitoringServiceTemplate(JpaToscaServiceTemplate serviceTemplate) throws CoderException {
+        return standardCoder.encode(serviceTemplate.toAuthorative());
+    }
+
+    private void verifyVcpeMonitoringInputDeserialization(JpaToscaServiceTemplate serviceTemplate) {
+
+        // Sanity check the entire structure
         assertNotNull(serviceTemplate);
         LOGGER.info(serviceTemplate.validate(new PfValidationResult()).toString());
         assertTrue(serviceTemplate.validate(new PfValidationResult()).isValid());
 
+        // Check tosca_definitions_version
+        assertEquals(YAML_VERSION, serviceTemplate.getToscaDefinitionsVersion());
+
+        Map<PfConceptKey, JpaToscaPolicy> policiesConceptMap =
+                serviceTemplate.getTopologyTemplate().getPolicies().getConceptMap();
+
+        // Check policies
+        assertTrue(policiesConceptMap.size() == 1);
+        assertEquals(POLICY1, policiesConceptMap.keySet().iterator().next().getName());
         assertEquals("onap.restart.tca:1.0.0",
-                serviceTemplate.getTopologyTemplate().getPolicies().get("onap.restart.tca").getId());
+                serviceTemplate.getTopologyTemplate().getPolicies().get(POLICY1).getId());
 
-        String reserializedString = gson.toJson(serviceTemplate, ToscaServiceTemplate.class);
-        assertEquals(vcpePolicyJson.replaceAll("\\s+", ""), reserializedString.replaceAll("\\s+", ""));
+        JpaToscaPolicy policyVal = policiesConceptMap.values().iterator().next();
 
-        ToscaServiceTemplate serviceTemplate2 = gson.fromJson(reserializedString, ToscaServiceTemplate.class);
-        assertNotNull(serviceTemplate2);
-        assertEquals(serviceTemplate, serviceTemplate2);
+        // Check metadata
+        assertTrue(policyVal.getMetadata().size() == 2);
+        assertEquals(POLICY_ID, policyVal.getMetadata().entrySet().iterator().next().getKey());
+        assertEquals(POLICY1, policyVal.getMetadata().entrySet().iterator().next().getValue());
+
+        // Check properties
+        assertTrue(policiesConceptMap.values().iterator().next().getProperties().size() == 1);
+        assertEquals(TCA_POLICY, policyVal.getProperties().keySet().iterator().next());
+        assertNotNull(policyVal.getProperties().values().iterator().next());
     }
 
-    @Test
-    public void testYamlDeserialization() throws JsonSyntaxException, IOException {
-        Yaml yaml = new Yaml();
+    private void verifyVdnsMonitoringInputDeserialization(JpaToscaServiceTemplate serviceTemplate) {
+
+        // Sanity check the entire structure
+        assertNotNull(serviceTemplate);
+        LOGGER.info(serviceTemplate.validate(new PfValidationResult()).toString());
+        assertTrue(serviceTemplate.validate(new PfValidationResult()).isValid());
+
+        // Check tosca_definitions_version
+        assertEquals(YAML_VERSION, serviceTemplate.getToscaDefinitionsVersion());
 
-        String vcpePolicyYaml = ResourceUtils.getResourceAsString("policies/vCPE.policy.monitoring.input.tosca.yaml");
-        Object yamlObject = yaml.load(vcpePolicyYaml);
+        Map<PfConceptKey, JpaToscaPolicy> policiesConceptMap =
+                serviceTemplate.getTopologyTemplate().getPolicies().getConceptMap();
 
-        String yamlAsJsonString = new GsonBuilder().setPrettyPrinting().create().toJson(yamlObject);
+        // Check policies
+        assertTrue(policiesConceptMap.size() == 1);
+        assertEquals(POLICY2, policiesConceptMap.keySet().iterator().next().getName());
+        assertEquals("onap.scaleout.tca:1.0.0",
+                serviceTemplate.getTopologyTemplate().getPolicies().get(POLICY2).getId());
 
-        ToscaServiceTemplate serviceTemplate = gson.fromJson(yamlAsJsonString, ToscaServiceTemplate.class);
+        JpaToscaPolicy policyVal = policiesConceptMap.values().iterator().next();
 
+        // Check metadata
+        assertTrue(policyVal.getMetadata().size() == 2);
+        assertEquals(POLICY_ID, policyVal.getMetadata().entrySet().iterator().next().getKey());
+        assertEquals(POLICY2, policyVal.getMetadata().entrySet().iterator().next().getValue());
+
+        // Check properties
+        assertTrue(policiesConceptMap.values().iterator().next().getProperties().size() == 1);
+        assertEquals(TCA_POLICY, policyVal.getProperties().keySet().iterator().next());
+        assertNotNull(policyVal.getProperties().values().iterator().next());
+    }
+
+    private void verifyVfwMonitoringInputDeserialization(JpaToscaServiceTemplate serviceTemplate) {
+
+        // Sanity check the entire structure
         assertNotNull(serviceTemplate);
         LOGGER.info(serviceTemplate.validate(new PfValidationResult()).toString());
         assertTrue(serviceTemplate.validate(new PfValidationResult()).isValid());
 
-        assertEquals("onap.restart.tca:1.0.0",
-                serviceTemplate.getTopologyTemplate().getPolicies().get("onap.restart.tca").getId());
+        // Check tosca_definitions_version
+        assertEquals(YAML_VERSION, serviceTemplate.getToscaDefinitionsVersion());
+
+        Map<PfConceptKey, JpaToscaPolicy> policiesConceptMap =
+                serviceTemplate.getTopologyTemplate().getPolicies().getConceptMap();
+
+        // Check policies
+        assertTrue(policiesConceptMap.size() == 1);
+        assertEquals(POLICY3, policiesConceptMap.keySet().iterator().next().getName());
+        assertEquals("onap.vfirewall.tca:1.0.0",
+                serviceTemplate.getTopologyTemplate().getPolicies().get(POLICY3).getId());
+
+        JpaToscaPolicy policyVal = policiesConceptMap.values().iterator().next();
+
+        // Check metadata
+        assertTrue(policyVal.getMetadata().size() == 2);
+        assertEquals(POLICY_ID, policyVal.getMetadata().entrySet().iterator().next().getKey());
+        assertEquals(POLICY3, policyVal.getMetadata().entrySet().iterator().next().getValue());
+
+        // Check properties
+        assertTrue(policiesConceptMap.values().iterator().next().getProperties().size() == 1);
+        assertEquals(TCA_POLICY, policyVal.getProperties().keySet().iterator().next());
+        assertNotNull(policyVal.getProperties().values().iterator().next());
+    }
+
+    private void verifyVcpeMonitoringOutputserialization(String serializedServiceTemplate) {
+
+        JsonObject serviceTemplateJsonObject = JsonParser.parseString(serializedServiceTemplate).getAsJsonObject();
+        assertEquals(YAML_VERSION, serviceTemplateJsonObject.get(DEFINITION_VERSION).getAsString());
+        JsonObject topologyTemplateJsonObject = serviceTemplateJsonObject.get(TOPOLOGY_TEMPLATE).getAsJsonObject();
+        JsonArray policiesJsonArray = topologyTemplateJsonObject.get(POLICIES).getAsJsonArray();
+        assertTrue(policiesJsonArray.size() == 1);
+        JsonObject policy = policiesJsonArray.iterator().next().getAsJsonObject();
+        assertNotNull(policy.get(POLICY1));
+        JsonObject policyVal = policy.get(POLICY1).getAsJsonObject();
+        assertEquals(TYPE1, policyVal.get("type").getAsString());
+        assertEquals(VERSION_100, policyVal.get(VERSION).getAsString());
+        assertEquals(POLICY1, policyVal.get(METADATA).getAsJsonObject().get(POLICY_ID).getAsString());
+        JsonObject properties = policyVal.get(PROPERTIES2).getAsJsonObject();
+        assertNotNull(properties.get(TCA_POLICY));
+    }
+
+    private void verifyVdnsMonitoringOutputserialization(String serializedServiceTemplate) {
+
+        JsonObject serviceTemplateJsonObject = JsonParser.parseString(serializedServiceTemplate).getAsJsonObject();
+        assertEquals(YAML_VERSION, serviceTemplateJsonObject.get(DEFINITION_VERSION).getAsString());
+        JsonObject topologyTemplateJsonObject = serviceTemplateJsonObject.get(TOPOLOGY_TEMPLATE).getAsJsonObject();
+        JsonArray policiesJsonArray = topologyTemplateJsonObject.get(POLICIES).getAsJsonArray();
+        assertTrue(policiesJsonArray.size() == 1);
+        JsonObject policy = policiesJsonArray.iterator().next().getAsJsonObject();
+        assertNotNull(policy.get(POLICY2));
+        JsonObject policyVal = policy.get(POLICY2).getAsJsonObject();
+        assertEquals(TYPE1, policyVal.get("type").getAsString());
+        assertEquals(VERSION_100, policyVal.get(VERSION).getAsString());
+        assertEquals(POLICY2, policyVal.get(METADATA).getAsJsonObject().get(POLICY_ID).getAsString());
+        JsonObject properties = policyVal.get(PROPERTIES2).getAsJsonObject();
+        assertNotNull(properties.get(TCA_POLICY));
+    }
 
-        String reserializedString = gson.toJson(serviceTemplate, ToscaServiceTemplate.class);
-        assertEquals(yamlAsJsonString.replaceAll("\\s+", ""), reserializedString.replaceAll("\\s+", ""));
+    private void verifyVfwMonitoringOutputserialization(String serializedServiceTemplate) {
 
-        ToscaServiceTemplate serviceTemplate2 = gson.fromJson(reserializedString, ToscaServiceTemplate.class);
-        assertNotNull(serviceTemplate2);
-        assertEquals(serviceTemplate, serviceTemplate2);
+        JsonObject serviceTemplateJsonObject = JsonParser.parseString(serializedServiceTemplate).getAsJsonObject();
+        assertEquals(YAML_VERSION, serviceTemplateJsonObject.get(DEFINITION_VERSION).getAsString());
+        JsonObject topologyTemplateJsonObject = serviceTemplateJsonObject.get(TOPOLOGY_TEMPLATE).getAsJsonObject();
+        JsonArray policiesJsonArray = topologyTemplateJsonObject.get(POLICIES).getAsJsonArray();
+        assertTrue(policiesJsonArray.size() == 1);
+        JsonObject policy = policiesJsonArray.iterator().next().getAsJsonObject();
+        assertNotNull(policy.get(POLICY3));
+        JsonObject policyVal = policy.get(POLICY3).getAsJsonObject();
+        assertEquals(TYPE1, policyVal.get("type").getAsString());
+        assertEquals(VERSION_100, policyVal.get(VERSION).getAsString());
+        assertEquals(POLICY3, policyVal.get(METADATA).getAsJsonObject().get(POLICY_ID).getAsString());
+        JsonObject properties = policyVal.get(PROPERTIES2).getAsJsonObject();
+        assertNotNull(properties.get(TCA_POLICY));
     }
 }