Replace Eclipselink with Hibernate
[policy/models.git] / models-tosca / src / test / java / org / onap / policy / models / tosca / authorative / provider / AuthorativeToscaProviderNodeTemplateTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2022-2023 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
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.models.tosca.authorative.provider;
22
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;
28
29 import java.util.List;
30 import java.util.Map;
31 import java.util.Properties;
32 import org.junit.After;
33 import org.junit.Before;
34 import org.junit.Test;
35 import org.onap.policy.common.utils.coder.CoderException;
36 import org.onap.policy.common.utils.coder.StandardCoder;
37 import org.onap.policy.common.utils.coder.YamlJsonTranslator;
38 import org.onap.policy.common.utils.resources.ResourceUtils;
39 import org.onap.policy.models.base.PfModelException;
40 import org.onap.policy.models.dao.DaoParameters;
41 import org.onap.policy.models.dao.PfDao;
42 import org.onap.policy.models.dao.PfDaoFactory;
43 import org.onap.policy.models.dao.impl.DefaultPfDao;
44 import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityKey;
45 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
46 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
47 import org.yaml.snakeyaml.Yaml;
48
49 /**
50  * Test of the {@link AuthorativeToscaProvider} class.
51  */
52 public class AuthorativeToscaProviderNodeTemplateTest {
53
54
55     private static final String NODE_TEMPLATES_JSON = "nodetemplates/nodetemplates.metadatasets.input.tosca.json";
56     private static final String UPDATED_METADATA_SET_JSON = "nodetemplates/TestUpdateMetadataSet.json";
57     private static final String CREATE_METADATA_SET_JSON = "nodetemplates/TestCreateMetadataSet.json";
58     private static final String POLICY_WITH_METADATA_SET_REF = "policies/apex.policy.decisionmaker.input.tosca.yaml";
59     private static final String APEX_POLICY_TYPE_YAML = "policytypes/onap.policies.native.Apex.yaml";
60     private static final String DAO_IS_NULL = "^dao is marked .*on.*ull but is null$";
61     private static ToscaServiceTemplate toscaServiceTemplate;
62     private static ToscaServiceTemplate updatedToscaServiceTemplate;
63     private static ToscaServiceTemplate createToscaNodeTemplate;
64     private PfDao pfDao;
65     private StandardCoder standardCoder;
66     private AuthorativeToscaProvider authorativeToscaProvider = new AuthorativeToscaProvider();
67     private YamlJsonTranslator yamlJsonTranslator = new YamlJsonTranslator();
68
69     /**
70      * Read policy metadataSet input json.
71      * @throws Exception Coder exception
72      */
73     @Before
74     public void fetchToscaNodeTemplatesJson() throws Exception {
75         standardCoder = new StandardCoder();
76         toscaServiceTemplate =
77             standardCoder.decode(ResourceUtils.getResourceAsString(NODE_TEMPLATES_JSON), ToscaServiceTemplate.class);
78         updatedToscaServiceTemplate =
79             standardCoder.decode(ResourceUtils.getResourceAsString(UPDATED_METADATA_SET_JSON),
80                 ToscaServiceTemplate.class);
81         createToscaNodeTemplate = standardCoder.decode(ResourceUtils.getResourceAsString(
82             CREATE_METADATA_SET_JSON), ToscaServiceTemplate.class);
83     }
84
85     /**
86      * Set up DAO towards the database.
87      *
88      * @throws Exception on database errors
89      */
90     @Before
91     public void setupDao() throws Exception {
92         final DaoParameters daoParameters = new DaoParameters();
93         daoParameters.setPluginClass(DefaultPfDao.class.getName());
94
95         daoParameters.setPersistenceUnit("ToscaConceptTest");
96
97         Properties jdbcProperties = new Properties();
98         jdbcProperties.setProperty("javax.persistence.jdbc.user", "policy");
99         jdbcProperties.setProperty("javax.persistence.jdbc.password", "P01icY");
100         if (System.getProperty("USE-MARIADB") != null) {
101             jdbcProperties.setProperty("javax.persistence.jdbc.driver", "org.mariadb.jdbc.Driver");
102             jdbcProperties.setProperty("javax.persistence.jdbc.url", "jdbc:mariadb://localhost:3306/policy");
103         } else {
104             jdbcProperties.setProperty("javax.persistence.jdbc.driver", "org.h2.Driver");
105             jdbcProperties.setProperty("javax.persistence.jdbc.url",
106                 "jdbc:h2:mem:AuthorativeToscaProviderNodeTemplatesTest");
107         }
108         daoParameters.setJdbcProperties(jdbcProperties);
109
110         pfDao = new PfDaoFactory().createPfDao(daoParameters);
111         pfDao.init(daoParameters);
112     }
113
114     @After
115     public void teardown() {
116         pfDao.close();
117     }
118
119     @Test
120     public void testPolicyMetadataSetsGet() throws Exception {
121
122         assertThatThrownBy(() -> {
123             authorativeToscaProvider.getNodeTemplateMetadataSet(null, null, null);
124         }).hasMessageMatching(DAO_IS_NULL);
125
126         assertNotNull(toscaServiceTemplate);
127         authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
128
129         //Fetch all metadataSet if id is null
130         List<Map<ToscaEntityKey, Map<String, Object>>> gotPolicyMetadataSets = authorativeToscaProvider
131             .getNodeTemplateMetadataSet(pfDao, null, null);
132         assertEquals(3, gotPolicyMetadataSets.size());
133
134         // Get filtered metadataSet
135         List<Map<ToscaEntityKey, Map<String, Object>>> filteredPolicyMetadataSet = authorativeToscaProvider
136             .getNodeTemplateMetadataSet(pfDao, "apexMetadata_adaptive", "2.3.1");
137         assertEquals(1, filteredPolicyMetadataSet.size());
138
139         //Get invalid metadataSet
140         List<Map<ToscaEntityKey, Map<String, Object>>> filteredMetadataSetInvalid = authorativeToscaProvider
141             .getNodeTemplateMetadataSet(pfDao, "invalidname", "1.0.0");
142         assertThat(filteredMetadataSetInvalid).isEmpty();
143     }
144
145     @Test
146     public void testToscaNodeTemplatesGet() throws Exception {
147
148         assertThatThrownBy(() -> {
149             authorativeToscaProvider.getToscaNodeTemplate(null, null, null);
150         }).hasMessageMatching(DAO_IS_NULL);
151
152         assertNotNull(toscaServiceTemplate);
153         authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
154
155         //Fetch all node templates if id is null
156         List<ToscaNodeTemplate> gotToscaNodeTemplates = authorativeToscaProvider
157             .getToscaNodeTemplate(pfDao, null, null);
158         assertEquals(3, gotToscaNodeTemplates.size());
159
160         // Get filtered node templates
161         List<ToscaNodeTemplate> filteredNodeTemplates = authorativeToscaProvider
162             .getToscaNodeTemplate(pfDao, "apexMetadata_adaptive", "2.3.1");
163         assertEquals(1, filteredNodeTemplates.size());
164
165         //Get invalid node template
166         List<ToscaNodeTemplate> filteredNodeTemplatesInvalid = authorativeToscaProvider
167             .getToscaNodeTemplate(pfDao, "invalidname", "1.0.0");
168         assertThat(filteredNodeTemplatesInvalid).isEmpty();
169     }
170
171     @Test
172     public void testToscaNodeTemplatesCreate() throws Exception {
173         assertThatThrownBy(() -> {
174             authorativeToscaProvider.createToscaNodeTemplates(null, null);
175         }).hasMessageMatching(DAO_IS_NULL);
176
177         assertThatThrownBy(() -> {
178             authorativeToscaProvider.createToscaNodeTemplates(null, new ToscaServiceTemplate());
179         }).hasMessageMatching(DAO_IS_NULL);
180
181         assertThatThrownBy(() -> {
182             authorativeToscaProvider.createToscaNodeTemplates(pfDao, null);
183         }).hasMessageMatching("^toscaServiceTemplate is marked .*on.*ull but is null$");
184
185         ToscaServiceTemplate createdNodeTemplates =
186             authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
187         assertThat(createdNodeTemplates.getToscaTopologyTemplate().getNodeTemplates()).hasSize(3);
188         assertThat(createdNodeTemplates.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_grpc")
189             .getMetadata()).containsKey("threshold");
190
191         authorativeToscaProvider.createToscaNodeTemplates(pfDao, createToscaNodeTemplate);
192         assertThat(authorativeToscaProvider.getNodeTemplateMetadataSet(pfDao, null, null)).hasSize(4);
193
194         //Create node template with invalid node type
195         createToscaNodeTemplate.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_adaptive")
196             .setType("invalid.type");
197         assertThatThrownBy(() -> {
198             authorativeToscaProvider.createToscaNodeTemplates(pfDao, createToscaNodeTemplate);
199         }).hasMessageMatching("^NODE_TYPE .* for toscaNodeTemplate .* does not exist$");
200
201     }
202
203     @Test
204     public void testToscaNodeTemplateUpdate() throws Exception {
205         assertThatThrownBy(() -> {
206             authorativeToscaProvider.updateToscaNodeTemplates(null, null);
207         }).hasMessageMatching(DAO_IS_NULL);
208
209         assertThatThrownBy(() -> {
210             authorativeToscaProvider.updateToscaNodeTemplates(null, new ToscaServiceTemplate());
211         }).hasMessageMatching(DAO_IS_NULL);
212
213         assertThatThrownBy(() -> {
214             authorativeToscaProvider.updateToscaNodeTemplates(pfDao, null);
215         }).hasMessageMatching("^serviceTemplate is marked non-null but is null$");
216
217         authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
218         ToscaServiceTemplate updatedTemplate =
219             authorativeToscaProvider.updateToscaNodeTemplates(pfDao, updatedToscaServiceTemplate);
220         assertEquals("Updated Metadata set for GRPC",
221             updatedTemplate.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_grpc")
222                 .getDescription());
223
224         //Update nodeTemplate with invalid node type
225         updatedToscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_grpc")
226             .setTypeVersion("0.0.0");
227         assertThatThrownBy(() -> {
228             authorativeToscaProvider.updateToscaNodeTemplates(pfDao, updatedToscaServiceTemplate);
229         }).hasMessageMatching("^NODE_TYPE .* for toscaNodeTemplate .* does not exist$");
230     }
231
232     @Test
233     public void testToscaNodeTemplatetDelete() throws Exception {
234         assertThatThrownBy(() -> {
235             authorativeToscaProvider.deleteToscaNodeTemplate(null, null, null);
236         }).hasMessageMatching(DAO_IS_NULL);
237
238         assertThatThrownBy(() -> {
239             authorativeToscaProvider.deleteToscaNodeTemplate(null, null, "0.0.1");
240         }).hasMessageMatching(DAO_IS_NULL);
241
242         assertThatThrownBy(() -> {
243             authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, null, null);
244         }).hasMessageMatching("^name is marked .*on.*ull but is null$");
245
246         assertThatThrownBy(() -> {
247             authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "name", null);
248         }).hasMessageMatching("^version is marked .*on.*ull but is null$");
249
250         authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
251         assertThatThrownBy(() -> {
252             authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "dummyname", "1.0.1");
253         }).hasMessage("node template dummyname:1.0.1 not found");
254
255
256         ToscaServiceTemplate responseTemplate =
257             authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "apexMetadata_decisionMaker",
258                 "1.0.0");
259
260         assertTrue(responseTemplate.getToscaTopologyTemplate().getNodeTemplates()
261             .containsKey("apexMetadata_decisionMaker"));
262         assertThat(responseTemplate.getToscaTopologyTemplate().getNodeTemplates()).hasSize(1);
263
264         assertThat(authorativeToscaProvider.getNodeTemplateMetadataSet(pfDao, null, null)).hasSize(2);
265
266     }
267
268     @Test
269     public void testNodeTemplatesWithExistingPolicy() throws Exception {
270         String policyString = ResourceUtils.getResourceAsString(POLICY_WITH_METADATA_SET_REF);
271         ToscaServiceTemplate policyServiceTemplate =
272             yamlJsonTranslator.fromYaml(policyString, ToscaServiceTemplate.class);
273
274         createPolicyTypes();
275         //Create policy with metadataSet reference in it
276         authorativeToscaProvider.createPolicies(pfDao, policyServiceTemplate);
277         assertThat(authorativeToscaProvider.getPolicyList(pfDao, null, null)).hasSize(1);
278         assertEquals("apexMetadata_decisionMaker", authorativeToscaProvider
279             .getPolicyList(pfDao, null, null).get(0).getMetadata().get("metadataSetName"));
280
281         //Create node templates
282         authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
283
284         //delete node templates referenced in existing policy
285         assertThatThrownBy(() -> {
286             authorativeToscaProvider
287                 .deleteToscaNodeTemplate(pfDao, "apexMetadata_decisionMaker", "1.0.0");
288         }).hasMessageEndingWith("Node template is in use, it is referenced in Tosca Policy "
289             + "operational.apex.decisionMaker version 1.0.0");
290
291         //delete unreferenced node template
292         authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "apexMetadata_adaptive", "2.3.1");
293         assertThat(authorativeToscaProvider.getNodeTemplateMetadataSet(pfDao, null, null)).hasSize(2);
294     }
295
296     private void createPolicyTypes() throws CoderException, PfModelException {
297         Object yamlObject =
298             new Yaml().load(ResourceUtils.getResourceAsString(APEX_POLICY_TYPE_YAML));
299         String yamlAsJsonString = new StandardCoder().encode(yamlObject);
300
301         ToscaServiceTemplate toscaServiceTemplatePolicyType =
302             standardCoder.decode(yamlAsJsonString, ToscaServiceTemplate.class);
303
304         assertNotNull(toscaServiceTemplatePolicyType);
305         new AuthorativeToscaProvider().createPolicyTypes(pfDao, toscaServiceTemplatePolicyType);
306     }
307
308 }