2  * ============LICENSE_START=======================================================
 
   3  *  Copyright (C) 2022 Nordix Foundation.
 
   4  * ================================================================================
 
   5  * Licensed under the Apache License, Version 2.0 (the "License");
 
   6  * you may not use this file except in compliance with the License.
 
   7  * You may obtain a copy of the License at
 
   9  *      http://www.apache.org/licenses/LICENSE-2.0
 
  11  * Unless required by applicable law or agreed to in writing, software
 
  12  * distributed under the License is distributed on an "AS IS" BASIS,
 
  13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  14  * See the License for the specific language governing permissions and
 
  15  * limitations under the License.
 
  17  * SPDX-License-Identifier: Apache-2.0
 
  18  * ============LICENSE_END=========================================================
 
  21 package org.onap.policy.models.tosca.authorative.provider;
 
  23 import static org.assertj.core.api.Assertions.assertThat;
 
  24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
  25 import static org.junit.Assert.assertEquals;
 
  26 import static org.junit.Assert.assertNotNull;
 
  27 import static org.junit.Assert.assertTrue;
 
  29 import java.util.List;
 
  31 import java.util.Properties;
 
  32 import org.eclipse.persistence.config.PersistenceUnitProperties;
 
  33 import org.junit.After;
 
  34 import org.junit.Before;
 
  35 import org.junit.Test;
 
  36 import org.onap.policy.common.utils.coder.CoderException;
 
  37 import org.onap.policy.common.utils.coder.StandardCoder;
 
  38 import org.onap.policy.common.utils.coder.YamlJsonTranslator;
 
  39 import org.onap.policy.common.utils.resources.ResourceUtils;
 
  40 import org.onap.policy.models.base.PfConceptKey;
 
  41 import org.onap.policy.models.base.PfModelException;
 
  42 import org.onap.policy.models.dao.DaoParameters;
 
  43 import org.onap.policy.models.dao.PfDao;
 
  44 import org.onap.policy.models.dao.PfDaoFactory;
 
  45 import org.onap.policy.models.dao.impl.DefaultPfDao;
 
  46 import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityKey;
 
  47 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
 
  48 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 
  49 import org.yaml.snakeyaml.Yaml;
 
  52  * Test of the {@link AuthorativeToscaProvider} class.
 
  54 public class AuthorativeToscaProviderNodeTemplateTest {
 
  57     private static final String NODE_TEMPLATES_JSON = "nodetemplates/nodetemplates.metadatasets.input.tosca.json";
 
  58     private static final String UPDATED_METADATA_SET_JSON = "nodetemplates/TestUpdateMetadataSet.json";
 
  59     private static final String CREATE_METADATA_SET_JSON = "nodetemplates/TestCreateMetadataSet.json";
 
  60     private static final String POLICY_WITH_METADATA_SET_REF = "policies/apex.policy.decisionmaker.input.tosca.yaml";
 
  61     private static final String APEX_POLICY_TYPE_YAML = "policytypes/onap.policies.native.Apex.yaml";
 
  62     private static final String DAO_IS_NULL = "^dao is marked .*on.*ull but is null$";
 
  63     private static ToscaServiceTemplate toscaServiceTemplate;
 
  64     private static ToscaServiceTemplate updatedToscaServiceTemplate;
 
  65     private static ToscaServiceTemplate createToscaNodeTemplate;
 
  67     private StandardCoder standardCoder;
 
  68     private AuthorativeToscaProvider authorativeToscaProvider = new AuthorativeToscaProvider();
 
  69     private YamlJsonTranslator yamlJsonTranslator = new YamlJsonTranslator();
 
  72      * Read policy metadataSet input json.
 
  73      * @throws Exception Coder exception
 
  76     public void fetchToscaNodeTemplatesJson() throws Exception {
 
  77         standardCoder = new StandardCoder();
 
  78         toscaServiceTemplate =
 
  79             standardCoder.decode(ResourceUtils.getResourceAsString(NODE_TEMPLATES_JSON), ToscaServiceTemplate.class);
 
  80         updatedToscaServiceTemplate =
 
  81             standardCoder.decode(ResourceUtils.getResourceAsString(UPDATED_METADATA_SET_JSON),
 
  82                 ToscaServiceTemplate.class);
 
  83         createToscaNodeTemplate = standardCoder.decode(ResourceUtils.getResourceAsString(
 
  84             CREATE_METADATA_SET_JSON), ToscaServiceTemplate.class);
 
  88      * Set up DAO towards the database.
 
  90      * @throws Exception on database errors
 
  93     public void setupDao() throws Exception {
 
  94         final DaoParameters daoParameters = new DaoParameters();
 
  95         daoParameters.setPluginClass(DefaultPfDao.class.getName());
 
  97         daoParameters.setPersistenceUnit("ToscaConceptTest");
 
  99         Properties jdbcProperties = new Properties();
 
 100         jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_USER, "policy");
 
 101         jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_PASSWORD, "P01icY");
 
 103         if (System.getProperty("USE-MARIADB") != null) {
 
 104             jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_DRIVER, "org.mariadb.jdbc.Driver");
 
 105             jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_URL, "jdbc:mariadb://localhost:3306/policy");
 
 107             jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_DRIVER, "org.h2.Driver");
 
 108             jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_URL,
 
 109                 "jdbc:h2:mem:AuthorativeToscaProviderNodeTemplatesTest");
 
 112         daoParameters.setJdbcProperties(jdbcProperties);
 
 114         pfDao = new PfDaoFactory().createPfDao(daoParameters);
 
 115         pfDao.init(daoParameters);
 
 119     public void teardown() {
 
 124     public void testPolicyMetadataSetsGet() throws Exception {
 
 126         assertThatThrownBy(() -> {
 
 127             authorativeToscaProvider.getNodeTemplateMetadataSet(null, null, null);
 
 128         }).hasMessageMatching(DAO_IS_NULL);
 
 130         assertNotNull(toscaServiceTemplate);
 
 131         authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
 
 133         //Fetch all metadataSet if id is null
 
 134         List<Map<ToscaEntityKey, Map<String, Object>>> gotPolicyMetadataSets = authorativeToscaProvider
 
 135             .getNodeTemplateMetadataSet(pfDao, null, null);
 
 136         assertEquals(3, gotPolicyMetadataSets.size());
 
 138         // Get filtered metadataSet
 
 139         List<Map<ToscaEntityKey, Map<String, Object>>> filteredPolicyMetadataSet = authorativeToscaProvider
 
 140             .getNodeTemplateMetadataSet(pfDao, "apexMetadata_adaptive", "2.3.1");
 
 141         assertEquals(1, filteredPolicyMetadataSet.size());
 
 143         //Get invalid metadataSet
 
 144         List<Map<ToscaEntityKey, Map<String, Object>>> filteredMetadataSetInvalid = authorativeToscaProvider
 
 145             .getNodeTemplateMetadataSet(pfDao, "invalidname", "1.0.0");
 
 146         assertThat(filteredMetadataSetInvalid).isEmpty();
 
 150     public void testToscaNodeTemplatesGet() throws Exception {
 
 152         assertThatThrownBy(() -> {
 
 153             authorativeToscaProvider.getToscaNodeTemplate(null, null, null);
 
 154         }).hasMessageMatching(DAO_IS_NULL);
 
 156         assertNotNull(toscaServiceTemplate);
 
 157         authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
 
 159         //Fetch all node templates if id is null
 
 160         List<ToscaNodeTemplate> gotToscaNodeTemplates = authorativeToscaProvider
 
 161             .getToscaNodeTemplate(pfDao, null, null);
 
 162         assertEquals(3, gotToscaNodeTemplates.size());
 
 164         // Get filtered node templates
 
 165         List<ToscaNodeTemplate> filteredNodeTemplates = authorativeToscaProvider
 
 166             .getToscaNodeTemplate(pfDao, "apexMetadata_adaptive", "2.3.1");
 
 167         assertEquals(1, filteredNodeTemplates.size());
 
 169         //Get invalid node template
 
 170         List<ToscaNodeTemplate> filteredNodeTemplatesInvalid = authorativeToscaProvider
 
 171             .getToscaNodeTemplate(pfDao, "invalidname", "1.0.0");
 
 172         assertThat(filteredNodeTemplatesInvalid).isEmpty();
 
 176     public void testToscaNodeTemplatesCreate() throws Exception {
 
 177         assertThatThrownBy(() -> {
 
 178             authorativeToscaProvider.createToscaNodeTemplates(null, null);
 
 179         }).hasMessageMatching(DAO_IS_NULL);
 
 181         assertThatThrownBy(() -> {
 
 182             authorativeToscaProvider.createToscaNodeTemplates(null, new ToscaServiceTemplate());
 
 183         }).hasMessageMatching(DAO_IS_NULL);
 
 185         assertThatThrownBy(() -> {
 
 186             authorativeToscaProvider.createToscaNodeTemplates(pfDao, null);
 
 187         }).hasMessageMatching("^toscaServiceTemplate is marked .*on.*ull but is null$");
 
 189         ToscaServiceTemplate createdNodeTemplates =
 
 190             authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
 
 191         assertThat(createdNodeTemplates.getToscaTopologyTemplate().getNodeTemplates()).hasSize(3);
 
 192         assertThat(createdNodeTemplates.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_grpc")
 
 193             .getMetadata()).containsKey("threshold");
 
 195         authorativeToscaProvider.createToscaNodeTemplates(pfDao, createToscaNodeTemplate);
 
 196         assertThat(authorativeToscaProvider.getNodeTemplateMetadataSet(pfDao, null, null)).hasSize(4);
 
 198         //Create node template with invalid node type
 
 199         createToscaNodeTemplate.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_adaptive")
 
 200             .setType("invalid.type");
 
 201         assertThatThrownBy(() -> {
 
 202             authorativeToscaProvider.createToscaNodeTemplates(pfDao, createToscaNodeTemplate);
 
 203         }).hasMessageMatching("^NODE_TYPE .* for toscaNodeTemplate .* does not exist$");
 
 208     public void testToscaNodeTemplateUpdate() throws Exception {
 
 209         assertThatThrownBy(() -> {
 
 210             authorativeToscaProvider.updateToscaNodeTemplates(null, null);
 
 211         }).hasMessageMatching(DAO_IS_NULL);
 
 213         assertThatThrownBy(() -> {
 
 214             authorativeToscaProvider.updateToscaNodeTemplates(null, new ToscaServiceTemplate());
 
 215         }).hasMessageMatching(DAO_IS_NULL);
 
 217         assertThatThrownBy(() -> {
 
 218             authorativeToscaProvider.updateToscaNodeTemplates(pfDao, null);
 
 219         }).hasMessageMatching("^serviceTemplate is marked non-null but is null$");
 
 221         authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
 
 222         ToscaServiceTemplate updatedTemplate =
 
 223             authorativeToscaProvider.updateToscaNodeTemplates(pfDao, updatedToscaServiceTemplate);
 
 224         assertEquals("Updated Metadata set for GRPC",
 
 225             updatedTemplate.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_grpc")
 
 228         //Update nodeTemplate with invalid node type
 
 229         updatedToscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_grpc")
 
 230             .setTypeVersion("0.0.0");
 
 231         assertThatThrownBy(() -> {
 
 232             authorativeToscaProvider.updateToscaNodeTemplates(pfDao, updatedToscaServiceTemplate);
 
 233         }).hasMessageMatching("^NODE_TYPE .* for toscaNodeTemplate .* does not exist$");
 
 237     public void testToscaNodeTemplatetDelete() throws Exception {
 
 238         assertThatThrownBy(() -> {
 
 239             authorativeToscaProvider.deleteToscaNodeTemplate(null, null, null);
 
 240         }).hasMessageMatching(DAO_IS_NULL);
 
 242         assertThatThrownBy(() -> {
 
 243             authorativeToscaProvider.deleteToscaNodeTemplate(null, null, "0.0.1");
 
 244         }).hasMessageMatching(DAO_IS_NULL);
 
 246         assertThatThrownBy(() -> {
 
 247             authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, null, null);
 
 248         }).hasMessageMatching("^name is marked .*on.*ull but is null$");
 
 250         assertThatThrownBy(() -> {
 
 251             authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "name", null);
 
 252         }).hasMessageMatching("^version is marked .*on.*ull but is null$");
 
 254         authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
 
 255         assertThatThrownBy(() -> {
 
 256             authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "dummyname", "1.0.1");
 
 257         }).hasMessage("node template dummyname:1.0.1 not found");
 
 260         ToscaServiceTemplate responseTemplate =
 
 261             authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "apexMetadata_decisionMaker",
 
 264         assertTrue(responseTemplate.getToscaTopologyTemplate().getNodeTemplates()
 
 265             .containsKey("apexMetadata_decisionMaker"));
 
 266         assertThat(responseTemplate.getToscaTopologyTemplate().getNodeTemplates()).hasSize(1);
 
 268         assertThat(authorativeToscaProvider.getNodeTemplateMetadataSet(pfDao, null, null)).hasSize(2);
 
 273     public void testNodeTemplatesWithExistingPolicy() throws Exception {
 
 274         String policyString = ResourceUtils.getResourceAsString(POLICY_WITH_METADATA_SET_REF);
 
 275         ToscaServiceTemplate policyServiceTemplate =
 
 276             yamlJsonTranslator.fromYaml(policyString, ToscaServiceTemplate.class);
 
 279         //Create policy with metadataSet reference in it
 
 280         authorativeToscaProvider.createPolicies(pfDao, policyServiceTemplate);
 
 281         assertThat(authorativeToscaProvider.getPolicyList(pfDao, null, null)).hasSize(1);
 
 282         assertEquals("apexMetadata_decisionMaker", authorativeToscaProvider
 
 283             .getPolicyList(pfDao, null, null).get(0).getMetadata().get("metadataSetName"));
 
 285         //Create node templates
 
 286         authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
 
 288         //delete node templates referenced in existing policy
 
 289         assertThatThrownBy(() -> {
 
 290             authorativeToscaProvider
 
 291                 .deleteToscaNodeTemplate(pfDao, "apexMetadata_decisionMaker", "1.0.0");
 
 292         }).hasMessageEndingWith("Node template is in use, it is referenced in Tosca Policy "
 
 293             + "operational.apex.decisionMaker version 1.0.0");
 
 295         //delete unreferenced node template
 
 296         authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "apexMetadata_adaptive", "2.3.1");
 
 297         assertThat(authorativeToscaProvider.getNodeTemplateMetadataSet(pfDao, null, null)).hasSize(2);
 
 300     private void createPolicyTypes() throws CoderException, PfModelException {
 
 302             new Yaml().load(ResourceUtils.getResourceAsString(APEX_POLICY_TYPE_YAML));
 
 303         String yamlAsJsonString = new StandardCoder().encode(yamlObject);
 
 305         ToscaServiceTemplate toscaServiceTemplatePolicyType =
 
 306             standardCoder.decode(yamlAsJsonString, ToscaServiceTemplate.class);
 
 308         assertNotNull(toscaServiceTemplatePolicyType);
 
 309         new AuthorativeToscaProvider().createPolicyTypes(pfDao, toscaServiceTemplatePolicyType);