Add provider for Tosca Policies

Provider working from JAVA API call through to database and
back for TOSCA policies with full unit test.

Issue-ID: POLICY-1195
Change-Id: I82cf3b513b4921dcb2e6726856aa4fbeb7d0d816
Signed-off-by: liamfallon <liam.fallon@est.tech>
diff --git a/models-provider/src/test/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderTest.java b/models-provider/src/test/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderTest.java
index 3b30f98..498000a 100644
--- a/models-provider/src/test/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderTest.java
+++ b/models-provider/src/test/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderTest.java
@@ -37,6 +37,9 @@
 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;
 
 /**
  * Test the database models provider implementation.
@@ -44,6 +47,8 @@
  * @author Liam Fallon (liam.fallon@est.tech)
  */
 public class DatabasePolicyModelsProviderTest {
+    private static final Logger LOGGER = LoggerFactory.getLogger(SimpleToscaProvider.class);
+
     PolicyModelsProviderParameters parameters;
 
     /**
@@ -266,15 +271,51 @@
                 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters)) {
             databaseProvider.init();
 
-            assertNull(databaseProvider.getPolicyTypes(new PfConceptKey()));
-            assertNull(databaseProvider.createPolicyTypes(new ToscaServiceTemplate()));
-            assertNull(databaseProvider.updatePolicyTypes(new ToscaServiceTemplate()));
-            assertNull(databaseProvider.deletePolicyTypes(new PfConceptKey()));
+            try {
+                databaseProvider.getPolicyTypes(new PfConceptKey());
+                fail("test should throw an exception");
+            } catch (Exception npe) {
+                assertEquals("policy type not found: NULL:0.0.0", npe.getMessage());
+            }
+            try {
+                databaseProvider.createPolicyTypes(new ToscaServiceTemplate());
+            } catch (Exception npe) {
+                assertEquals("no policy types specified on service template", npe.getMessage());
+            }
+            try {
+                databaseProvider.updatePolicyTypes(new ToscaServiceTemplate());
+            } catch (Exception npe) {
+                assertEquals("no policy types specified on service template", npe.getMessage());
+            }
+            try {
+                databaseProvider.deletePolicyTypes(new PfConceptKey());
+                fail("test should throw an exception");
+            } catch (Exception npe) {
+                assertEquals("policy type not found: NULL:0.0.0", npe.getMessage());
+            }
 
-            assertNull(databaseProvider.getPolicies(new PfConceptKey()));
-            assertNull(databaseProvider.createPolicies(new ToscaServiceTemplate()));
-            assertNull(databaseProvider.updatePolicies(new ToscaServiceTemplate()));
-            assertNull(databaseProvider.deletePolicies(new PfConceptKey()));
+            try {
+                databaseProvider.getPolicies(new PfConceptKey());
+                fail("test should throw an exception");
+            } catch (Exception npe) {
+                assertEquals("policy not found: NULL:0.0.0", npe.getMessage());
+            }
+            try {
+                databaseProvider.createPolicies(new ToscaServiceTemplate());
+            } catch (Exception npe) {
+                assertEquals("topology template not specified on service template", npe.getMessage());
+            }
+            try {
+                databaseProvider.updatePolicies(new ToscaServiceTemplate());
+            } catch (Exception npe) {
+                assertEquals("topology template not specified on service template", npe.getMessage());
+            }
+            try {
+                databaseProvider.deletePolicies(new PfConceptKey());
+                fail("test should throw an exception");
+            } catch (Exception npe) {
+                assertEquals("policy not found: NULL:0.0.0", npe.getMessage());
+            }
 
             assertNull(databaseProvider.getOperationalPolicy("policy_id"));
             assertNull(databaseProvider.createOperationalPolicy(new LegacyOperationalPolicy()));
@@ -292,6 +333,7 @@
             assertNotNull(databaseProvider.deletePdpGroups("filter"));
 
         } catch (Exception exc) {
+            LOGGER.warn("test should not throw an exception", exc);
             fail("test should not throw an exception");
         }
     }
diff --git a/models-provider/src/test/resources/META-INF/persistence.xml b/models-provider/src/test/resources/META-INF/persistence.xml
index 4915053..6834090 100644
--- a/models-provider/src/test/resources/META-INF/persistence.xml
+++ b/models-provider/src/test/resources/META-INF/persistence.xml
@@ -26,6 +26,7 @@
         <class>org.onap.policy.models.dao.converters.CDataConditioner</class>
         <class>org.onap.policy.models.dao.converters.Uuid2String</class>
         <class>org.onap.policy.models.base.PfConceptKey</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.ToscaPolicyType</class>
         <class>org.onap.policy.models.tosca.simple.concepts.ToscaPolicy</class>
 
         <properties>
diff --git a/models-tosca/pom.xml b/models-tosca/pom.xml
index 5658a1c..c8fa252 100644
--- a/models-tosca/pom.xml
+++ b/models-tosca/pom.xml
@@ -56,5 +56,18 @@
             <artifactId>gson</artifactId>
             <version>${policy.common.version}</version>
         </dependency>
+
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mariadb.jdbc</groupId>
+            <artifactId>mariadb-java-client</artifactId>
+            <scope>test</scope>
+        </dependency>
+
     </dependencies>
 </project>
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaDataTypes.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaDataTypes.java
index cbf0e38..eae98a1 100644
--- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaDataTypes.java
+++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaDataTypes.java
@@ -47,12 +47,15 @@
 public class ToscaDataTypes extends PfConceptContainer<ToscaDataType> {
     private static final long serialVersionUID = 2941102271022190348L;
 
+    public static final String DEFAULT_NAME = "ToscaDataTypesSimple";
+    public static final String DEFAULT_VERSION = "1.0.0";
+
     /**
      * The Default Constructor creates a {@link ToscaDataTypes} object with a null artifact key
      * and creates an empty concept map.
      */
     public ToscaDataTypes() {
-        super(new PfConceptKey());
+        super(new PfConceptKey(DEFAULT_NAME, DEFAULT_VERSION));
     }
 
     /**
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaPolicies.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaPolicies.java
index 9dd12ec..ee9c2ea 100644
--- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaPolicies.java
+++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaPolicies.java
@@ -47,12 +47,15 @@
 public class ToscaPolicies extends PfConceptContainer<ToscaPolicy> {
     private static final long serialVersionUID = -7526648702327776101L;
 
+    public static final String DEFAULT_NAME = "ToscaPoliciessSimple";
+    public static final String DEFAULT_VERSION = "1.0.0";
+
     /**
      * The Default Constructor creates a {@link ToscaPolicies} object with a null artifact key and
      * creates an empty concept map.
      */
     public ToscaPolicies() {
-        super(new PfConceptKey());
+        super(new PfConceptKey(DEFAULT_NAME, DEFAULT_VERSION));
     }
 
     /**
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaPolicyTypes.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaPolicyTypes.java
index 23159cc..2772913 100644
--- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaPolicyTypes.java
+++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaPolicyTypes.java
@@ -47,12 +47,15 @@
 public class ToscaPolicyTypes extends PfConceptContainer<ToscaPolicyType> {
     private static final long serialVersionUID = -4157979965271220098L;
 
+    public static final String DEFAULT_NAME = "ToscaPolicyTypesSimple";
+    public static final String DEFAULT_VERSION = "1.0.0";
+
     /**
      * The Default Constructor creates a {@link ToscaPolicyTypes} object with a null artifact key
      * and creates an empty concept map.
      */
     public ToscaPolicyTypes() {
-        super(new PfConceptKey());
+        super(new PfConceptKey(DEFAULT_NAME, DEFAULT_VERSION));
     }
 
     /**
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaServiceTemplate.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaServiceTemplate.java
index fd8b134..c3bb916 100644
--- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaServiceTemplate.java
+++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaServiceTemplate.java
@@ -60,6 +60,9 @@
 public class ToscaServiceTemplate extends ToscaEntityType {
     private static final long serialVersionUID = 8084846046148349401L;
 
+    public static final String DEFAULT_NAME = "ToscaServiceTemplateSimple";
+    public static final String DEFAULT_VERSION = "1.0.0";
+
     @Column
     @SerializedName("tosca_definitions_version")
     private String toscaDefinitionsVersion;
@@ -80,7 +83,7 @@
      * The Default Constructor creates a {@link ToscaServiceTemplate} object with a null key.
      */
     public ToscaServiceTemplate() {
-        this(new PfConceptKey());
+        this(new PfConceptKey(DEFAULT_NAME, DEFAULT_VERSION));
     }
 
     /**
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaTopologyTemplate.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaTopologyTemplate.java
index 9d156c3..35381ec 100644
--- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaTopologyTemplate.java
+++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaTopologyTemplate.java
@@ -45,8 +45,8 @@
 import org.onap.policy.models.base.PfValidationResult.ValidationResult;
 
 /**
- * This class holds a TOSCA topology template. Note: Only the policy specific parts of the TOSCA
- * topology template are implemented.
+ * This class holds a TOSCA topology template. Note: Only the policy specific parts of the TOSCA topology template are
+ * implemented.
  *
  * @author Liam Fallon (liam.fallon@est.tech)
  */
@@ -58,6 +58,8 @@
 public class ToscaTopologyTemplate extends PfConcept {
     private static final long serialVersionUID = 8969698734673232603L;
 
+    public static final String DEFAULT_LOCAL_NAME = "ToscaTopologyTemplateSimple";
+
     @EmbeddedId
     private PfReferenceKey key;
 
@@ -71,12 +73,12 @@
      * The Default Constructor creates a {@link ToscaTopologyTemplate} object with a null key.
      */
     public ToscaTopologyTemplate() {
-        this(new PfReferenceKey());
+        this(new PfReferenceKey(ToscaServiceTemplate.DEFAULT_NAME, ToscaServiceTemplate.DEFAULT_VERSION,
+                DEFAULT_LOCAL_NAME));
     }
 
     /**
-     * The Key Constructor creates a {@link ToscaTopologyTemplate} object with the given concept
-     * key.
+     * The Key Constructor creates a {@link ToscaTopologyTemplate} object with the given concept key.
      *
      * @param key the key
      */
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProvider.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProvider.java
index 3d563a1..2240ef0 100644
--- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProvider.java
+++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProvider.java
@@ -20,12 +20,22 @@
 
 package org.onap.policy.models.tosca.simple.provider;
 
+import javax.ws.rs.core.Response;
+
 import lombok.NonNull;
 
 import org.onap.policy.models.base.PfConceptKey;
 import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.dao.PfDao;
+import org.onap.policy.models.tosca.simple.concepts.ToscaPolicies;
+import org.onap.policy.models.tosca.simple.concepts.ToscaPolicy;
+import org.onap.policy.models.tosca.simple.concepts.ToscaPolicyType;
+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;
 
 /**
  * This class provides the provision of information on TOSCA concepts in the database to callers.
@@ -33,6 +43,8 @@
  * @author Liam Fallon (liam.fallon@est.tech)
  */
 public class SimpleToscaProvider {
+    private static final Logger LOGGER = LoggerFactory.getLogger(SimpleToscaProvider.class);
+
     /**
      * Get policy types.
      *
@@ -44,7 +56,21 @@
      */
     public ToscaServiceTemplate getPolicyTypes(@NonNull final PfDao dao, @NonNull final PfConceptKey policyTypeKey)
             throws PfModelException {
-        return null;
+
+        // Create the structure of the TOSCA service template to contain the policy type
+        ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
+        serviceTemplate.setPolicyTypes(new ToscaPolicyTypes());
+
+        // Add the policy type to the TOSCA service template
+        ToscaPolicyType policyType = dao.get(ToscaPolicyType.class, policyTypeKey);
+        if (policyType != null) {
+            serviceTemplate.getPolicyTypes().getConceptMap().put(policyTypeKey, policyType);
+            return serviceTemplate;
+        } else {
+            String errorMessage = "policy type not found: " + policyTypeKey.getId();
+            LOGGER.warn(errorMessage);
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+        }
     }
 
     /**
@@ -57,7 +83,24 @@
      */
     public ToscaServiceTemplate createPolicyTypes(@NonNull final PfDao dao,
             @NonNull final ToscaServiceTemplate serviceTemplate) throws PfModelException {
-        return null;
+
+        assertPolicyTypesExist(serviceTemplate);
+
+        for (ToscaPolicyType policyType : serviceTemplate.getPolicyTypes().getAll(null)) {
+            dao.create(policyType);
+        }
+
+        // Return the created policy types
+        ToscaPolicyTypes returnPolicyTypes = new ToscaPolicyTypes();
+
+        for (PfConceptKey policyTypeKey : serviceTemplate.getPolicyTypes().getConceptMap().keySet()) {
+            returnPolicyTypes.getConceptMap().put(policyTypeKey, dao.get(ToscaPolicyType.class, policyTypeKey));
+        }
+
+        ToscaServiceTemplate returnServiceTemplate = new ToscaServiceTemplate();
+        returnServiceTemplate.setPolicyTypes(returnPolicyTypes);
+
+        return returnServiceTemplate;
     }
 
     /**
@@ -70,7 +113,24 @@
      */
     public ToscaServiceTemplate updatePolicyTypes(@NonNull final PfDao dao,
             @NonNull final ToscaServiceTemplate serviceTemplate) throws PfModelException {
-        return null;
+
+        assertPolicyTypesExist(serviceTemplate);
+
+        for (ToscaPolicyType policyType : serviceTemplate.getPolicyTypes().getAll(null)) {
+            dao.update(policyType);
+        }
+
+        // Return the created policy types
+        ToscaPolicyTypes returnPolicyTypes = new ToscaPolicyTypes();
+
+        for (PfConceptKey policyTypeKey : serviceTemplate.getPolicyTypes().getConceptMap().keySet()) {
+            returnPolicyTypes.getConceptMap().put(policyTypeKey, dao.get(ToscaPolicyType.class, policyTypeKey));
+        }
+
+        ToscaServiceTemplate returnServiceTemplate = new ToscaServiceTemplate();
+        returnServiceTemplate.setPolicyTypes(returnPolicyTypes);
+
+        return returnServiceTemplate;
     }
 
     /**
@@ -84,7 +144,12 @@
      */
     public ToscaServiceTemplate deletePolicyTypes(@NonNull final PfDao dao, @NonNull final PfConceptKey policyTypeKey)
             throws PfModelException {
-        return null;
+
+        ToscaServiceTemplate serviceTemplate = getPolicyTypes(dao, policyTypeKey);
+
+        dao.delete(ToscaPolicyType.class, policyTypeKey);
+
+        return serviceTemplate;
     }
 
     /**
@@ -98,7 +163,22 @@
      */
     public ToscaServiceTemplate getPolicies(@NonNull final PfDao dao, @NonNull final PfConceptKey policyKey)
             throws PfModelException {
-        return null;
+
+        // Create the structure of the TOSCA service template to contain the policy type
+        ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
+        serviceTemplate.setTopologyTemplate(new ToscaTopologyTemplate());
+        serviceTemplate.getTopologyTemplate().setPolicies(new ToscaPolicies());
+
+        // Add the policy to the TOSCA service template
+        ToscaPolicy policy = dao.get(ToscaPolicy.class, policyKey);
+        if (policy != null) {
+            serviceTemplate.getTopologyTemplate().getPolicies().getConceptMap().put(policyKey, policy);
+            return serviceTemplate;
+        } else {
+            String errorMessage = "policy not found: " + policyKey.getId();
+            LOGGER.warn(errorMessage);
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+        }
     }
 
     /**
@@ -111,7 +191,24 @@
      */
     public ToscaServiceTemplate createPolicies(@NonNull final PfDao dao,
             @NonNull final ToscaServiceTemplate serviceTemplate) throws PfModelException {
-        return null;
+
+        assertPoliciesExist(serviceTemplate);
+
+        for (ToscaPolicy policy : serviceTemplate.getTopologyTemplate().getPolicies().getAll(null)) {
+            dao.create(policy);
+        }
+
+        // Return the created policy types
+        ToscaPolicies returnPolicies = new ToscaPolicies();
+        returnPolicies.setKey(serviceTemplate.getTopologyTemplate().getPolicies().getKey());
+
+        for (PfConceptKey policyKey : serviceTemplate.getTopologyTemplate().getPolicies().getConceptMap().keySet()) {
+            returnPolicies.getConceptMap().put(policyKey, dao.get(ToscaPolicy.class, policyKey));
+        }
+
+        serviceTemplate.getTopologyTemplate().setPolicies(returnPolicies);
+
+        return serviceTemplate;
     }
 
     /**
@@ -124,7 +221,24 @@
      */
     public ToscaServiceTemplate updatePolicies(@NonNull final PfDao dao,
             @NonNull final ToscaServiceTemplate serviceTemplate) throws PfModelException {
-        return null;
+
+        assertPoliciesExist(serviceTemplate);
+
+        for (ToscaPolicy policy : serviceTemplate.getTopologyTemplate().getPolicies().getAll(null)) {
+            dao.update(policy);
+        }
+
+        // Return the created policy types
+        ToscaPolicies returnPolicies = new ToscaPolicies();
+        returnPolicies.setKey(serviceTemplate.getTopologyTemplate().getPolicies().getKey());
+
+        for (PfConceptKey policyKey : serviceTemplate.getTopologyTemplate().getPolicies().getConceptMap().keySet()) {
+            returnPolicies.getConceptMap().put(policyKey, dao.get(ToscaPolicy.class, policyKey));
+        }
+
+        serviceTemplate.getTopologyTemplate().setPolicies(returnPolicies);
+
+        return serviceTemplate;
     }
 
     /**
@@ -132,11 +246,56 @@
      *
      * @param dao the DAO to use to access the database
      * @param policyKey the policy key
-     * @return the TOSCA service template containing the policy types that were deleted
+     * @return the TOSCA service template containing the policies that were deleted
      * @throws PfModelException on errors deleting policies
      */
     public ToscaServiceTemplate deletePolicies(@NonNull final PfDao dao, @NonNull final PfConceptKey policyKey)
             throws PfModelException {
-        return null;
+
+        ToscaServiceTemplate serviceTemplate = getPolicies(dao, policyKey);
+
+        dao.delete(ToscaPolicy.class, policyKey);
+
+        return serviceTemplate;
+    }
+
+    /**
+     * Check if policy types have been specified is initialized.
+     */
+    private void assertPolicyTypesExist(final ToscaServiceTemplate serviceTemplate) {
+        if (serviceTemplate.getPolicyTypes() == null) {
+            String errorMessage = "no policy types specified on service template";
+            LOGGER.warn(errorMessage);
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+        }
+
+        if (serviceTemplate.getPolicyTypes().getConceptMap().isEmpty()) {
+            String errorMessage = "list of policy types specified on service template is empty";
+            LOGGER.warn(errorMessage);
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+        }
+    }
+
+    /**
+     * Check if policy types have been specified is initialized.
+     */
+    private void assertPoliciesExist(final ToscaServiceTemplate serviceTemplate) {
+        if (serviceTemplate.getTopologyTemplate() == null) {
+            String errorMessage = "topology template not specified on service template";
+            LOGGER.warn(errorMessage);
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+        }
+
+        if (serviceTemplate.getTopologyTemplate().getPolicies() == null) {
+            String errorMessage = "no policies specified on topology template of service template";
+            LOGGER.warn(errorMessage);
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+        }
+
+        if (serviceTemplate.getTopologyTemplate().getPolicies().getConceptMap().isEmpty()) {
+            String errorMessage = "list of policies specified on topology template of service template is empty";
+            LOGGER.warn(errorMessage);
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+        }
     }
 }
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaServiceTemplateJsonAdapter.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaServiceTemplateJsonAdapter.java
index 613b0e2..40fe63c 100644
--- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaServiceTemplateJsonAdapter.java
+++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaServiceTemplateJsonAdapter.java
@@ -32,7 +32,6 @@
 
 import lombok.NonNull;
 
-import org.onap.policy.models.base.PfConceptKey;
 import org.onap.policy.models.tosca.simple.concepts.ToscaServiceTemplate;
 import org.onap.policy.models.tosca.simple.concepts.ToscaTopologyTemplate;
 
@@ -56,8 +55,7 @@
         final JsonObject serviceTemplateJsonObject = serviceTemplateElement.getAsJsonObject();
 
         // The outgoing object
-        final PfConceptKey serviceTemplateKey = new PfConceptKey("IncomingServiceTemplate", "0.0.1");
-        final ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate(serviceTemplateKey);
+        final ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
         serviceTemplate
                 .setToscaDefinitionsVersion(serviceTemplateJsonObject.get(TOSCA_DEFINITIONS_VERSION).getAsString());
 
@@ -67,7 +65,7 @@
         }
 
         // Set the parent key of the topology template to be this service template
-        serviceTemplate.getTopologyTemplate().getKey().setParentConceptKey(serviceTemplateKey);
+        serviceTemplate.getTopologyTemplate().getKey().setParentConceptKey(serviceTemplate.getKey());
 
         return serviceTemplate;
     }
diff --git a/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/concepts/ToscaTopologyTemplateTest.java b/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/concepts/ToscaTopologyTemplateTest.java
index 3ea225d..d35c3d6 100644
--- a/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/concepts/ToscaTopologyTemplateTest.java
+++ b/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/concepts/ToscaTopologyTemplateTest.java
@@ -118,7 +118,7 @@
         ttt.clean();
         assertEquals(tttClone0, ttt);
 
-        assertFalse(new ToscaTopologyTemplate().validate(new PfValidationResult()).isValid());
+        assertTrue(new ToscaTopologyTemplate().validate(new PfValidationResult()).isValid());
         assertTrue(ttt.validate(new PfValidationResult()).isValid());
 
         ttt.setDescription(null);
diff --git a/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProviderTest.java b/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProviderTest.java
new file mode 100644
index 0000000..ed25a7a
--- /dev/null
+++ b/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProviderTest.java
@@ -0,0 +1,283 @@
+/*-
+ * ============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.tosca.simple.provider;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import com.google.gson.Gson;
+
+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.PfModelException;
+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.ToscaPolicies;
+import org.onap.policy.models.tosca.simple.concepts.ToscaServiceTemplate;
+import org.onap.policy.models.tosca.simple.concepts.ToscaTopologyTemplate;
+import org.onap.policy.models.tosca.simple.serialization.ToscaServiceTemplateMessageBodyHandler;
+
+/**
+ * Test the {@link SimpleToscaProvider} class.
+ *
+ * @author Liam Fallon (liam.fallon@est.tech)
+ */
+public class SimpleToscaProviderTest {
+    private Connection connection;
+    private PfDao pfDao;
+    private Gson gson;
+
+
+    /**
+     * 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 testPoliciesGet() throws PfModelException {
+        try {
+            new SimpleToscaProvider().getPolicies(null, null);
+            fail("test should throw an exception here");
+        } catch (Exception exc) {
+            assertEquals("dao is marked @NonNull but is null", exc.getMessage());
+        }
+
+        try {
+            new SimpleToscaProvider().getPolicies(null, new PfConceptKey());
+            fail("test should throw an exception here");
+        } catch (Exception exc) {
+            assertEquals("dao is marked @NonNull but is null", exc.getMessage());
+        }
+
+        try {
+            new SimpleToscaProvider().getPolicies(pfDao, null);
+            fail("test should throw an exception here");
+        } catch (Exception exc) {
+            assertEquals("policyKey is marked @NonNull but is null", exc.getMessage());
+        }
+
+        ToscaServiceTemplate originalServiceTemplate =
+                gson.fromJson(ResourceUtils.getResourceAsString("policies/vCPE.policy.monitoring.input.tosca.json"),
+                        ToscaServiceTemplate.class);
+
+        assertNotNull(originalServiceTemplate);
+        ToscaServiceTemplate createdServiceTemplate =
+                new SimpleToscaProvider().createPolicies(pfDao, originalServiceTemplate);
+
+        assertEquals(originalServiceTemplate, createdServiceTemplate);
+
+        PfConceptKey policyKey = new PfConceptKey("onap.restart.tca:1.0.0");
+
+        ToscaServiceTemplate gotServiceTemplate =
+                new SimpleToscaProvider().getPolicies(pfDao, new PfConceptKey(policyKey));
+
+        assertEquals(originalServiceTemplate.getTopologyTemplate().getPolicies().get(policyKey),
+                gotServiceTemplate.getTopologyTemplate().getPolicies().get(policyKey));
+
+    }
+
+    @Test
+    public void testPolicyCreate() throws PfModelException {
+        try {
+            new SimpleToscaProvider().createPolicies(null, null);
+            fail("test should throw an exception here");
+        } catch (Exception exc) {
+            assertEquals("dao is marked @NonNull but is null", exc.getMessage());
+        }
+
+        try {
+            new SimpleToscaProvider().createPolicies(null, new ToscaServiceTemplate());
+            fail("test should throw an exception here");
+        } catch (Exception exc) {
+            assertEquals("dao is marked @NonNull but is null", exc.getMessage());
+        }
+
+        try {
+            new SimpleToscaProvider().createPolicies(pfDao, null);
+            fail("test should throw an exception here");
+        } catch (Exception exc) {
+            assertEquals("serviceTemplate is marked @NonNull but is null", exc.getMessage());
+        }
+
+        ToscaServiceTemplate originalServiceTemplate =
+                gson.fromJson(ResourceUtils.getResourceAsString("policies/vCPE.policy.monitoring.input.tosca.json"),
+                        ToscaServiceTemplate.class);
+
+        assertNotNull(originalServiceTemplate);
+        ToscaServiceTemplate createdServiceTemplate =
+                new SimpleToscaProvider().createPolicies(pfDao, originalServiceTemplate);
+
+        assertEquals(originalServiceTemplate, createdServiceTemplate);
+    }
+
+    @Test
+    public void testPolicyUpdate() throws PfModelException {
+        try {
+            new SimpleToscaProvider().updatePolicies(null, null);
+            fail("test should throw an exception here");
+        } catch (Exception exc) {
+            assertEquals("dao is marked @NonNull but is null", exc.getMessage());
+        }
+
+        try {
+            new SimpleToscaProvider().updatePolicies(null, new ToscaServiceTemplate());
+            fail("test should throw an exception here");
+        } catch (Exception exc) {
+            assertEquals("dao is marked @NonNull but is null", exc.getMessage());
+        }
+
+        try {
+            new SimpleToscaProvider().updatePolicies(pfDao, null);
+            fail("test should throw an exception here");
+        } catch (Exception exc) {
+            assertEquals("serviceTemplate is marked @NonNull but is null", exc.getMessage());
+        }
+
+        ToscaServiceTemplate originalServiceTemplate =
+                gson.fromJson(ResourceUtils.getResourceAsString("policies/vCPE.policy.monitoring.input.tosca.json"),
+                        ToscaServiceTemplate.class);
+
+        assertNotNull(originalServiceTemplate);
+        ToscaServiceTemplate updatedServiceTemplate =
+                new SimpleToscaProvider().updatePolicies(pfDao, originalServiceTemplate);
+
+        assertEquals(originalServiceTemplate, updatedServiceTemplate);
+    }
+
+    @Test
+    public void testPoliciesDelete() throws PfModelException {
+        try {
+            new SimpleToscaProvider().deletePolicies(null, null);
+            fail("test should throw an exception here");
+        } catch (Exception exc) {
+            assertEquals("dao is marked @NonNull but is null", exc.getMessage());
+        }
+
+        try {
+            new SimpleToscaProvider().deletePolicies(null, new PfConceptKey());
+            fail("test should throw an exception here");
+        } catch (Exception exc) {
+            assertEquals("dao is marked @NonNull but is null", exc.getMessage());
+        }
+
+        try {
+            new SimpleToscaProvider().deletePolicies(pfDao, null);
+            fail("test should throw an exception here");
+        } catch (Exception exc) {
+            assertEquals("policyKey is marked @NonNull but is null", exc.getMessage());
+        }
+
+        ToscaServiceTemplate originalServiceTemplate =
+                gson.fromJson(ResourceUtils.getResourceAsString("policies/vCPE.policy.monitoring.input.tosca.json"),
+                        ToscaServiceTemplate.class);
+
+        assertNotNull(originalServiceTemplate);
+        ToscaServiceTemplate createdServiceTemplate =
+                new SimpleToscaProvider().createPolicies(pfDao, originalServiceTemplate);
+
+        assertEquals(originalServiceTemplate, createdServiceTemplate);
+
+        PfConceptKey policyKey = new PfConceptKey("onap.restart.tca:1.0.0");
+
+        ToscaServiceTemplate deletedServiceTemplate =
+                new SimpleToscaProvider().deletePolicies(pfDao, new PfConceptKey(policyKey));
+
+        assertEquals(originalServiceTemplate.getTopologyTemplate().getPolicies().get(policyKey),
+                deletedServiceTemplate.getTopologyTemplate().getPolicies().get(policyKey));
+
+        try {
+            new SimpleToscaProvider().getPolicies(pfDao, new PfConceptKey(policyKey));
+            fail("test should throw an exception here");
+        } catch (Exception exc) {
+            assertEquals("policy not found: onap.restart.tca:1.0.0", exc.getMessage());
+        }
+    }
+
+    @Test
+    public void testAssertPoliciesExist() throws PfModelException {
+        ToscaServiceTemplate testServiceTemplate = new ToscaServiceTemplate();
+
+        try {
+            new SimpleToscaProvider().createPolicies(pfDao, testServiceTemplate);
+            fail("test should throw an exception here");
+        } catch (Exception exc) {
+            assertEquals("topology template not specified on service template", exc.getMessage());
+        }
+
+        testServiceTemplate.setTopologyTemplate(new ToscaTopologyTemplate());
+        try {
+            new SimpleToscaProvider().createPolicies(pfDao, testServiceTemplate);
+            fail("test should throw an exception here");
+        } catch (Exception exc) {
+            assertEquals("no policies specified on topology template of service template", exc.getMessage());
+        }
+
+        testServiceTemplate.getTopologyTemplate().setPolicies(new ToscaPolicies());
+        try {
+            new SimpleToscaProvider().createPolicies(pfDao, testServiceTemplate);
+            fail("test should throw an exception here");
+        } catch (Exception exc) {
+            assertEquals("list of policies specified on topology template of service template is empty",
+                    exc.getMessage());
+        }
+
+    }
+}
diff --git a/models-tosca/src/test/resources/META-INF/persistence.xml b/models-tosca/src/test/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..6834090
--- /dev/null
+++ b/models-tosca/src/test/resources/META-INF/persistence.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============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=========================================================
+-->
+
+<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
+    <persistence-unit name="ToscaConceptTest" transaction-type="RESOURCE_LOCAL">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+
+        <class>org.onap.policy.models.dao.converters.CDataConditioner</class>
+        <class>org.onap.policy.models.dao.converters.Uuid2String</class>
+        <class>org.onap.policy.models.base.PfConceptKey</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.ToscaPolicyType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.ToscaPolicy</class>
+
+        <properties>
+            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
+            <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:testdb" />
+            <property name="javax.persistence.jdbc.user" value="policy" />
+            <property name="javax.persistence.jdbc.password" value="P01icY" />
+            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
+            <property name="eclipselink.ddl-generation.output-mode" value="database" />
+            <property name="eclipselink.logging.level" value="INFO" />
+        </properties>
+    </persistence-unit>
+
+    <persistence-unit name="ToscaConceptMariaDBTest" transaction-type="RESOURCE_LOCAL">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+
+        <class>org.onap.policy.models.dao.converters.CDataConditioner</class>
+        <class>org.onap.policy.models.dao.converters.Uuid2String</class>
+        <class>org.onap.policy.models.base.PfConceptKey</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.ToscaPolicy</class>
+
+        <properties>
+            <property name="javax.persistence.jdbc.driver" value="org.mariadb.jdbc.Driver" />
+            <property name="javax.persistence.jdbc.url" value="jdbc:mariadb://localhost:3306/policy" />
+            <property name="javax.persistence.jdbc.user" value="policy" />
+            <property name="javax.persistence.jdbc.password" value="P01icY" />
+            <property name="javax.persistence.schema-generation.database.action" value="create" />
+
+            <!-- property name="eclipselink.logging.level" value="ALL" />
+            <property name="eclipselink.logging.level.jpa" value="ALL" />
+            <property name="eclipselink.logging.level.ddl" value="ALL" />
+            <property name="eclipselink.logging.level.connection" value="ALL" />
+            <property name="eclipselink.logging.level.sql" value="ALL" />
+            <property name="eclipselink.logging.level.transaction" value="ALL" />
+            <property name="eclipselink.logging.level.sequencing" value="ALL" />
+            <property name="eclipselink.logging.level.server" value="ALL" />
+            <property name="eclipselink.logging.level.query" value="ALL" />
+            <property name="eclipselink.logging.level.properties" value="ALL" /-->
+
+            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
+            <property name="eclipselink.ddl-generation.output-mode" value="database" />
+            <property name="eclipselink.logging.level" value="INFO" />
+        </properties>
+    </persistence-unit>
+</persistence>