Implement validation and hierarchical get
[policy/models.git] / models-tosca / src / test / java / org / onap / policy / models / tosca / simple / provider / SimpleToscaProviderTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2019-2020 Nordix Foundation.
4  *  Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
5  * ================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.models.tosca.simple.provider;
23
24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertNotNull;
27
28 import java.util.Properties;
29
30 import org.eclipse.persistence.config.PersistenceUnitProperties;
31 import org.junit.After;
32 import org.junit.Before;
33 import org.junit.Test;
34 import org.onap.policy.common.utils.coder.CoderException;
35 import org.onap.policy.common.utils.coder.StandardCoder;
36 import org.onap.policy.common.utils.resources.ResourceUtils;
37 import org.onap.policy.models.base.PfConceptKey;
38 import org.onap.policy.models.base.PfModelException;
39 import org.onap.policy.models.dao.DaoParameters;
40 import org.onap.policy.models.dao.PfDao;
41 import org.onap.policy.models.dao.PfDaoFactory;
42 import org.onap.policy.models.dao.impl.DefaultPfDao;
43 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
44 import org.onap.policy.models.tosca.authorative.provider.AuthorativeToscaProvider;
45 import org.onap.policy.models.tosca.simple.concepts.JpaToscaDataType;
46 import org.onap.policy.models.tosca.simple.concepts.JpaToscaDataTypes;
47 import org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies;
48 import org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType;
49 import org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyTypes;
50 import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
51 import org.onap.policy.models.tosca.simple.concepts.JpaToscaTopologyTemplate;
52 import org.yaml.snakeyaml.Yaml;
53
54 /**
55  * Test the {@link SimpleToscaProvider} class.
56  *
57  * @author Liam Fallon (liam.fallon@est.tech)
58  */
59 public class SimpleToscaProviderTest {
60     private static final String TEMPLATE_IS_NULL = "^serviceTemplate is marked .*on.*ull but is null$";
61     private static final String INCOMING_TEMPLATE_IS_NULL = "^incomingServiceTemplate is marked .*on.*ull but is null$";
62     private static final String VCPE_INPUT_JSON = "policies/vCPE.policy.monitoring.input.tosca.json";
63     private static final String DAO_IS_NULL = "^dao is marked .*on.*ull but is null$";
64
65     private PfDao pfDao;
66     private StandardCoder standardCoder;
67
68     /**
69      * Set up the DAO towards the database.
70      *
71      * @throws Exception on database errors
72      */
73     @Before
74     public void setupDao() throws Exception {
75         final DaoParameters daoParameters = new DaoParameters();
76         daoParameters.setPluginClass(DefaultPfDao.class.getName());
77
78         daoParameters.setPersistenceUnit("ToscaConceptTest");
79
80         Properties jdbcProperties = new Properties();
81         jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_USER, "policy");
82         jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_PASSWORD, "P01icY");
83
84         // H2, use "org.mariadb.jdbc.Driver" and "jdbc:mariadb://localhost:3306/policy" for locally installed MariaDB
85         jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_DRIVER, "org.h2.Driver");
86         jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_URL, "jdbc:h2:mem:testdb");
87
88         daoParameters.setJdbcProperties(jdbcProperties);
89
90         pfDao = new PfDaoFactory().createPfDao(daoParameters);
91         pfDao.init(daoParameters);
92     }
93
94     /**
95      * Set up GSON.
96      */
97     @Before
98     public void setupGson() {
99         standardCoder = new StandardCoder();
100     }
101
102     @After
103     public void teardown() {
104         pfDao.close();
105     }
106
107     @Test
108     public void testCreateUpdateGetDeleteDataType() throws PfModelException {
109         JpaToscaServiceTemplate serviceTemplate = new JpaToscaServiceTemplate();
110
111         PfConceptKey dataType0Key = new PfConceptKey("DataType0", "0.0.1");
112         JpaToscaDataType dataType0 = new JpaToscaDataType();
113         dataType0.setKey(dataType0Key);
114         serviceTemplate.setDataTypes(new JpaToscaDataTypes());
115         serviceTemplate.getDataTypes().getConceptMap().put(dataType0Key, dataType0);
116
117         JpaToscaServiceTemplate createdServiceTemplate =
118                 new SimpleToscaProvider().createDataTypes(pfDao, serviceTemplate);
119
120         assertEquals(1, createdServiceTemplate.getDataTypes().getConceptMap().size());
121         assertEquals(dataType0, createdServiceTemplate.getDataTypes().get(dataType0Key));
122         assertEquals(null, createdServiceTemplate.getDataTypes().get(dataType0Key).getDescription());
123
124         dataType0.setDescription("Updated Description");
125
126         JpaToscaServiceTemplate updatedServiceTemplate =
127                 new SimpleToscaProvider().updateDataTypes(pfDao, serviceTemplate);
128
129         assertEquals(dataType0, updatedServiceTemplate.getDataTypes().get(dataType0Key));
130         assertEquals("Updated Description", updatedServiceTemplate.getDataTypes().get(dataType0Key).getDescription());
131
132         JpaToscaServiceTemplate gotServiceTemplate =
133                 new SimpleToscaProvider().getDataTypes(pfDao, dataType0Key.getName(), dataType0Key.getVersion());
134
135         assertEquals(dataType0, gotServiceTemplate.getDataTypes().get(dataType0Key));
136         assertEquals("Updated Description", gotServiceTemplate.getDataTypes().get(dataType0Key).getDescription());
137
138         JpaToscaServiceTemplate deletedServiceTemplate = new SimpleToscaProvider().deleteDataType(pfDao, dataType0Key);
139
140         assertEquals(dataType0, deletedServiceTemplate.getDataTypes().get(dataType0Key));
141         assertEquals("Updated Description", deletedServiceTemplate.getDataTypes().get(dataType0Key).getDescription());
142
143         assertThatThrownBy(() -> new SimpleToscaProvider().deleteDataType(pfDao, dataType0Key))
144                 .hasMessage("data types for DataType0:0.0.1 do not exist");
145     }
146
147     @Test
148     public void testCreateUpdateGetDeletePolicyType() throws PfModelException {
149         JpaToscaServiceTemplate serviceTemplate = new JpaToscaServiceTemplate();
150
151         PfConceptKey dataType0Key = new PfConceptKey("DataType0", "0.0.1");
152         JpaToscaDataType dataType0 = new JpaToscaDataType();
153         dataType0.setKey(dataType0Key);
154         serviceTemplate.setDataTypes(new JpaToscaDataTypes());
155         serviceTemplate.getDataTypes().getConceptMap().put(dataType0Key, dataType0);
156
157         PfConceptKey policyType0Key = new PfConceptKey("PolicyType0", "0.0.1");
158         JpaToscaPolicyType policyType0 = new JpaToscaPolicyType();
159         policyType0.setKey(policyType0Key);
160         serviceTemplate.setPolicyTypes(new JpaToscaPolicyTypes());
161         serviceTemplate.getPolicyTypes().getConceptMap().put(policyType0Key, policyType0);
162
163         JpaToscaServiceTemplate createdServiceTemplate =
164                 new SimpleToscaProvider().createPolicyTypes(pfDao, serviceTemplate);
165
166         assertEquals(1, createdServiceTemplate.getPolicyTypes().getConceptMap().size());
167         assertEquals(policyType0, createdServiceTemplate.getPolicyTypes().get(policyType0Key));
168         assertEquals(null, createdServiceTemplate.getPolicyTypes().get(policyType0Key).getDescription());
169
170         policyType0.setDescription("Updated Description");
171
172         JpaToscaServiceTemplate updatedServiceTemplate =
173                 new SimpleToscaProvider().updatePolicyTypes(pfDao, serviceTemplate);
174
175         assertEquals(policyType0, updatedServiceTemplate.getPolicyTypes().get(policyType0Key));
176         assertEquals("Updated Description",
177                 updatedServiceTemplate.getPolicyTypes().get(policyType0Key).getDescription());
178
179         JpaToscaServiceTemplate gotServiceTemplate =
180                 new SimpleToscaProvider().getPolicyTypes(pfDao, policyType0Key.getName(), policyType0Key.getVersion());
181
182         assertEquals(policyType0, gotServiceTemplate.getPolicyTypes().get(policyType0Key));
183         assertEquals("Updated Description", gotServiceTemplate.getPolicyTypes().get(policyType0Key).getDescription());
184
185         JpaToscaServiceTemplate deletedServiceTemplate =
186                 new SimpleToscaProvider().deletePolicyType(pfDao, policyType0Key);
187
188         assertEquals(policyType0, deletedServiceTemplate.getPolicyTypes().get(policyType0Key));
189         assertEquals("Updated Description",
190                 deletedServiceTemplate.getPolicyTypes().get(policyType0Key).getDescription());
191
192         assertThatThrownBy(() -> new SimpleToscaProvider().deletePolicyType(pfDao, policyType0Key))
193                 .hasMessage("policy types for PolicyType0:0.0.1 do not exist");
194     }
195
196     @Test
197     public void testCreateUpdateGetDeletePolicyTypeWithDataType() throws PfModelException {
198         JpaToscaServiceTemplate serviceTemplate = new JpaToscaServiceTemplate();
199
200         PfConceptKey policyType0Key = new PfConceptKey("PolicyType0", "0.0.1");
201         JpaToscaPolicyType policyType0 = new JpaToscaPolicyType();
202         policyType0.setKey(policyType0Key);
203         serviceTemplate.setPolicyTypes(new JpaToscaPolicyTypes());
204         serviceTemplate.getPolicyTypes().getConceptMap().put(policyType0Key, policyType0);
205
206         JpaToscaServiceTemplate createdServiceTemplate =
207                 new SimpleToscaProvider().createPolicyTypes(pfDao, serviceTemplate);
208
209         assertEquals(policyType0, createdServiceTemplate.getPolicyTypes().get(policyType0Key));
210         assertEquals(null, createdServiceTemplate.getPolicyTypes().get(policyType0Key).getDescription());
211
212         policyType0.setDescription("Updated Description");
213
214         JpaToscaServiceTemplate updatedServiceTemplate =
215                 new SimpleToscaProvider().updatePolicyTypes(pfDao, serviceTemplate);
216
217         assertEquals(policyType0, updatedServiceTemplate.getPolicyTypes().get(policyType0Key));
218         assertEquals("Updated Description",
219                 updatedServiceTemplate.getPolicyTypes().get(policyType0Key).getDescription());
220
221         JpaToscaServiceTemplate gotServiceTemplate =
222                 new SimpleToscaProvider().getPolicyTypes(pfDao, policyType0Key.getName(), policyType0Key.getVersion());
223
224         assertEquals(policyType0, gotServiceTemplate.getPolicyTypes().get(policyType0Key));
225         assertEquals("Updated Description", gotServiceTemplate.getPolicyTypes().get(policyType0Key).getDescription());
226
227         JpaToscaServiceTemplate deletedServiceTemplate =
228                 new SimpleToscaProvider().deletePolicyType(pfDao, policyType0Key);
229
230         assertEquals(policyType0, deletedServiceTemplate.getPolicyTypes().get(policyType0Key));
231         assertEquals("Updated Description",
232                 deletedServiceTemplate.getPolicyTypes().get(policyType0Key).getDescription());
233
234         assertThatThrownBy(() -> new SimpleToscaProvider().deletePolicyType(pfDao, policyType0Key))
235                 .hasMessage("policy types for PolicyType0:0.0.1 do not exist");
236     }
237
238     @Test
239     public void testPoliciesGet() throws Exception {
240         ToscaServiceTemplate toscaServiceTemplate =
241                 standardCoder.decode(ResourceUtils.getResourceAsString(VCPE_INPUT_JSON), ToscaServiceTemplate.class);
242
243         createPolicyTypes();
244
245         JpaToscaServiceTemplate originalServiceTemplate = new JpaToscaServiceTemplate();
246         originalServiceTemplate.fromAuthorative(toscaServiceTemplate);
247
248         assertNotNull(originalServiceTemplate);
249         JpaToscaServiceTemplate createdServiceTemplate =
250                 new SimpleToscaProvider().createPolicies(pfDao, originalServiceTemplate);
251
252         assertEquals(originalServiceTemplate.getTopologyTemplate().getPolicies(),
253                 createdServiceTemplate.getTopologyTemplate().getPolicies());
254
255         PfConceptKey policyKey = new PfConceptKey("onap.restart.tca:1.0.0");
256
257         JpaToscaServiceTemplate gotServiceTemplate =
258                 new SimpleToscaProvider().getPolicies(pfDao, policyKey.getName(), policyKey.getVersion());
259
260         assertEquals(originalServiceTemplate.getTopologyTemplate().getPolicies().get(policyKey),
261                 gotServiceTemplate.getTopologyTemplate().getPolicies().get(policyKey));
262     }
263
264     @Test
265     public void testPolicyCreate() throws Exception {
266         ToscaServiceTemplate toscaServiceTemplate =
267                 standardCoder.decode(ResourceUtils.getResourceAsString(VCPE_INPUT_JSON), ToscaServiceTemplate.class);
268
269         createPolicyTypes();
270
271         JpaToscaServiceTemplate originalServiceTemplate = new JpaToscaServiceTemplate();
272         originalServiceTemplate.fromAuthorative(toscaServiceTemplate);
273
274         assertNotNull(originalServiceTemplate);
275         JpaToscaServiceTemplate createdServiceTemplate =
276                 new SimpleToscaProvider().createPolicies(pfDao, originalServiceTemplate);
277
278         assertEquals(originalServiceTemplate.getTopologyTemplate().getPolicies(),
279                 createdServiceTemplate.getTopologyTemplate().getPolicies());
280     }
281
282     @Test
283     public void testPolicyUpdate() throws Exception {
284         ToscaServiceTemplate toscaServiceTemplate =
285                 standardCoder.decode(ResourceUtils.getResourceAsString(VCPE_INPUT_JSON), ToscaServiceTemplate.class);
286
287         createPolicyTypes();
288
289         JpaToscaServiceTemplate originalServiceTemplate = new JpaToscaServiceTemplate();
290         originalServiceTemplate.fromAuthorative(toscaServiceTemplate);
291
292         assertNotNull(originalServiceTemplate);
293         JpaToscaServiceTemplate updatedServiceTemplate =
294                 new SimpleToscaProvider().updatePolicies(pfDao, originalServiceTemplate);
295
296         assertEquals(originalServiceTemplate, updatedServiceTemplate);
297     }
298
299     @Test
300     public void testPoliciesDelete() throws Exception {
301         ToscaServiceTemplate toscaServiceTemplate =
302                 standardCoder.decode(ResourceUtils.getResourceAsString(VCPE_INPUT_JSON), ToscaServiceTemplate.class);
303
304         createPolicyTypes();
305
306         JpaToscaServiceTemplate originalServiceTemplate = new JpaToscaServiceTemplate();
307         originalServiceTemplate.fromAuthorative(toscaServiceTemplate);
308
309         assertNotNull(originalServiceTemplate);
310         JpaToscaServiceTemplate createdServiceTemplate =
311                 new SimpleToscaProvider().createPolicies(pfDao, originalServiceTemplate);
312
313         assertEquals(originalServiceTemplate.getTopologyTemplate(), createdServiceTemplate.getTopologyTemplate());
314
315         PfConceptKey policyKey = new PfConceptKey("onap.restart.tca:1.0.0");
316
317         JpaToscaServiceTemplate deletedServiceTemplate =
318                 new SimpleToscaProvider().deletePolicy(pfDao, new PfConceptKey(policyKey));
319
320         assertEquals(originalServiceTemplate.getTopologyTemplate().getPolicies().get(policyKey),
321                 deletedServiceTemplate.getTopologyTemplate().getPolicies().get(policyKey));
322
323         // @formatter:off
324         assertThatThrownBy(
325             () -> new SimpleToscaProvider().getPolicies(pfDao, policyKey.getName(), policyKey.getVersion()))
326                     .hasMessage("policies for onap.restart.tca:1.0.0 do not exist");
327         // @formatter:on
328     }
329
330     @Test
331     public void testAssertPoliciesExist() {
332         JpaToscaServiceTemplate testServiceTemplate = new JpaToscaServiceTemplate();
333
334         assertThatThrownBy(() -> new SimpleToscaProvider().createPolicies(pfDao, testServiceTemplate))
335                 .hasMessage("topology template not specified on service template");
336
337         testServiceTemplate.setTopologyTemplate(new JpaToscaTopologyTemplate());
338         assertThatThrownBy(() -> new SimpleToscaProvider().createPolicies(pfDao, testServiceTemplate))
339                 .hasMessage("no policies specified on topology template of service template");
340
341         testServiceTemplate.getTopologyTemplate().setPolicies(new JpaToscaPolicies());
342         assertThatThrownBy(() -> new SimpleToscaProvider().createPolicies(pfDao, testServiceTemplate))
343                 .hasMessage("list of policies specified on topology template of service template is empty");
344     }
345
346     @Test
347     public void testNonNulls() {
348         assertThatThrownBy(() -> {
349             new SimpleToscaProvider().getDataTypes(null, null, null);
350         }).hasMessageMatching(DAO_IS_NULL);
351
352         assertThatThrownBy(() -> {
353             new SimpleToscaProvider().createDataTypes(null, null);
354         }).hasMessageMatching(DAO_IS_NULL);
355
356         assertThatThrownBy(() -> {
357             new SimpleToscaProvider().createDataTypes(null, new JpaToscaServiceTemplate());
358         }).hasMessageMatching(DAO_IS_NULL);
359
360         assertThatThrownBy(() -> {
361             new SimpleToscaProvider().createDataTypes(pfDao, null);
362         }).hasMessageMatching(INCOMING_TEMPLATE_IS_NULL);
363
364         assertThatThrownBy(() -> {
365             new SimpleToscaProvider().updateDataTypes(null, null);
366         }).hasMessageMatching(DAO_IS_NULL);
367
368         assertThatThrownBy(() -> {
369             new SimpleToscaProvider().updateDataTypes(null, new JpaToscaServiceTemplate());
370         }).hasMessageMatching(DAO_IS_NULL);
371
372         assertThatThrownBy(() -> {
373             new SimpleToscaProvider().updateDataTypes(pfDao, null);
374         }).hasMessageMatching(TEMPLATE_IS_NULL);
375
376         assertThatThrownBy(() -> {
377             new SimpleToscaProvider().deleteDataType(null, null);
378         }).hasMessageMatching(DAO_IS_NULL);
379
380         assertThatThrownBy(() -> {
381             new SimpleToscaProvider().deleteDataType(null, new PfConceptKey());
382         }).hasMessageMatching(DAO_IS_NULL);
383
384         assertThatThrownBy(() -> {
385             new SimpleToscaProvider().deleteDataType(pfDao, null);
386         }).hasMessageMatching("^dataTypeKey is marked .*on.*ull but is null$");
387
388         assertThatThrownBy(() -> {
389             new SimpleToscaProvider().getPolicyTypes(null, null, null);
390         }).hasMessageMatching(DAO_IS_NULL);
391
392         assertThatThrownBy(() -> {
393             new SimpleToscaProvider().createPolicyTypes(null, null);
394         }).hasMessageMatching(DAO_IS_NULL);
395
396         assertThatThrownBy(() -> {
397             new SimpleToscaProvider().createPolicyTypes(null, new JpaToscaServiceTemplate());
398         }).hasMessageMatching(DAO_IS_NULL);
399
400         assertThatThrownBy(() -> {
401             new SimpleToscaProvider().createPolicyTypes(pfDao, null);
402         }).hasMessageMatching(INCOMING_TEMPLATE_IS_NULL);
403
404         assertThatThrownBy(() -> {
405             new SimpleToscaProvider().updatePolicyTypes(null, null);
406         }).hasMessageMatching(DAO_IS_NULL);
407
408         assertThatThrownBy(() -> {
409             new SimpleToscaProvider().updatePolicyTypes(null, new JpaToscaServiceTemplate());
410         }).hasMessageMatching(DAO_IS_NULL);
411
412         assertThatThrownBy(() -> {
413             new SimpleToscaProvider().updatePolicyTypes(pfDao, null);
414         }).hasMessageMatching(TEMPLATE_IS_NULL);
415
416         assertThatThrownBy(() -> {
417             new SimpleToscaProvider().deletePolicyType(null, null);
418         }).hasMessageMatching(DAO_IS_NULL);
419
420         assertThatThrownBy(() -> {
421             new SimpleToscaProvider().deletePolicyType(null, new PfConceptKey());
422         }).hasMessageMatching(DAO_IS_NULL);
423
424         assertThatThrownBy(() -> {
425             new SimpleToscaProvider().deletePolicyType(pfDao, null);
426         }).hasMessageMatching("^policyTypeKey is marked .*on.*ull but is null$");
427
428         assertThatThrownBy(() -> {
429             new SimpleToscaProvider().getPolicies(null, null, null);
430         }).hasMessageMatching(DAO_IS_NULL);
431
432         assertThatThrownBy(() -> {
433             new SimpleToscaProvider().createPolicies(null, null);
434         }).hasMessageMatching(DAO_IS_NULL);
435
436         assertThatThrownBy(() -> {
437             new SimpleToscaProvider().createPolicies(null, new JpaToscaServiceTemplate());
438         }).hasMessageMatching(DAO_IS_NULL);
439
440         assertThatThrownBy(() -> {
441             new SimpleToscaProvider().createPolicies(pfDao, null);
442         }).hasMessageMatching(INCOMING_TEMPLATE_IS_NULL);
443
444         assertThatThrownBy(() -> {
445             new SimpleToscaProvider().updatePolicies(null, null);
446         }).hasMessageMatching(DAO_IS_NULL);
447
448         assertThatThrownBy(() -> {
449             new SimpleToscaProvider().updatePolicies(null, new JpaToscaServiceTemplate());
450         }).hasMessageMatching(DAO_IS_NULL);
451
452         assertThatThrownBy(() -> {
453             new SimpleToscaProvider().updatePolicies(pfDao, null);
454         }).hasMessageMatching(TEMPLATE_IS_NULL);
455
456         assertThatThrownBy(() -> {
457             new SimpleToscaProvider().deletePolicy(null, null);
458         }).hasMessageMatching(DAO_IS_NULL);
459
460         assertThatThrownBy(() -> {
461             new SimpleToscaProvider().deletePolicy(null, new PfConceptKey());
462         }).hasMessageMatching(DAO_IS_NULL);
463
464         assertThatThrownBy(() -> {
465             new SimpleToscaProvider().deletePolicy(pfDao, null);
466         }).hasMessageMatching("^policyKey is marked .*on.*ull but is null$");
467     }
468
469     private void createPolicyTypes() throws CoderException, PfModelException {
470         Object yamlObject = new Yaml().load(
471                 ResourceUtils.getResourceAsString("policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.yaml"));
472         String yamlAsJsonString = new StandardCoder().encode(yamlObject);
473
474         ToscaServiceTemplate toscaServiceTemplatePolicyType =
475                 standardCoder.decode(yamlAsJsonString, ToscaServiceTemplate.class);
476
477         assertNotNull(toscaServiceTemplatePolicyType);
478         new AuthorativeToscaProvider().createPolicyTypes(pfDao, toscaServiceTemplatePolicyType);
479     }
480 }