Merge "Allow multiple versions of entities to be returned"
[policy/models.git] / models-tosca / src / test / java / org / onap / policy / models / tosca / authorative / provider / AuthorativeToscaProviderPolicyTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2019 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.assertThatThrownBy;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotNull;
26 import static org.junit.Assert.assertTrue;
27
28 import java.util.ArrayList;
29 import java.util.List;
30 import java.util.Map;
31 import java.util.Properties;
32
33 import org.eclipse.persistence.config.PersistenceUnitProperties;
34 import org.junit.After;
35 import org.junit.Before;
36 import org.junit.Test;
37 import org.onap.policy.common.utils.coder.CoderException;
38 import org.onap.policy.common.utils.coder.StandardCoder;
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.ToscaPolicy;
47 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyFilter;
48 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
49 import org.onap.policy.models.tosca.authorative.concepts.ToscaTopologyTemplate;
50 import org.yaml.snakeyaml.Yaml;
51
52 /**
53  * Test of the {@link AuthorativeToscaProvider} class.
54  *
55  * @author Liam Fallon (liam.fallon@est.tech)
56  */
57 public class AuthorativeToscaProviderPolicyTest {
58     private PfDao pfDao;
59     private StandardCoder standardCoder;
60
61     /**
62      * Set up the DAO towards the database.
63      *
64      * @throws Exception on database errors
65      */
66     @Before
67     public void setupDao() throws Exception {
68         final DaoParameters daoParameters = new DaoParameters();
69         daoParameters.setPluginClass(DefaultPfDao.class.getCanonicalName());
70
71         daoParameters.setPersistenceUnit("ToscaConceptTest");
72
73         Properties jdbcProperties = new Properties();
74         jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_USER, "policy");
75         jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_PASSWORD, "P01icY");
76
77         // H2, use "org.mariadb.jdbc.Driver" and "jdbc:mariadb://localhost:3306/policy" for locally installed MariaDB
78         jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_DRIVER, "org.h2.Driver");
79         jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_URL, "jdbc:h2:mem:testdb");
80
81         daoParameters.setJdbcProperties(jdbcProperties);
82
83         pfDao = new PfDaoFactory().createPfDao(daoParameters);
84         pfDao.init(daoParameters);
85     }
86
87     /**
88      * Set up GSON.
89      */
90     @Before
91     public void setupGson() {
92         standardCoder = new StandardCoder();
93     }
94
95     @After
96     public void teardown() throws Exception {
97         pfDao.close();
98     }
99
100     @Test
101     public void testPoliciesGet() throws Exception {
102         assertThatThrownBy(() -> {
103             new AuthorativeToscaProvider().getPolicies(null, null, null);
104         }).hasMessage("dao is marked @NonNull but is null");
105
106         assertThatThrownBy(() -> {
107             new AuthorativeToscaProvider().getPolicyList(null, null, null);
108         }).hasMessage("dao is marked @NonNull but is null");
109
110         createPolicyTypes();
111
112         ToscaServiceTemplate toscaServiceTemplate = standardCoder.decode(
113                 ResourceUtils.getResourceAsString("policies/vCPE.policy.monitoring.input.tosca.json"),
114                 ToscaServiceTemplate.class);
115
116         assertNotNull(toscaServiceTemplate);
117         ToscaServiceTemplate createdServiceTemplate =
118                 new AuthorativeToscaProvider().createPolicies(pfDao, toscaServiceTemplate);
119
120         PfConceptKey policyKey = new PfConceptKey("onap.restart.tca:1.0.0");
121
122         ToscaPolicy beforePolicy =
123                 toscaServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
124         ToscaPolicy createdPolicy =
125                 createdServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
126         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, createdPolicy));
127         assertTrue(beforePolicy.getType().equals(createdPolicy.getType()));
128
129         ToscaServiceTemplate gotServiceTemplate =
130                 new AuthorativeToscaProvider().getPolicies(pfDao, policyKey.getName(), policyKey.getVersion());
131
132         ToscaPolicy gotPolicy =
133                 gotServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
134         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, gotPolicy));
135         assertTrue(beforePolicy.getType().equals(gotPolicy.getType()));
136
137         List<ToscaPolicy> gotPolicyList =
138                 new AuthorativeToscaProvider().getPolicyList(pfDao, "onap.restart.tca", "1.0.0");
139         assertEquals(1, gotPolicyList.size());
140         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, gotPolicyList.get(0)));
141
142         gotPolicyList = new AuthorativeToscaProvider().getPolicyList(pfDao, "onap.restart.tca", null);
143         assertEquals(1, gotPolicyList.size());
144         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, gotPolicyList.get(0)));
145
146         gotPolicyList = new AuthorativeToscaProvider().getPolicyList(pfDao, null, null);
147         assertEquals(1, gotPolicyList.size());
148         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, gotPolicyList.get(0)));
149
150         gotPolicyList = new AuthorativeToscaProvider().getPolicyList(pfDao, null, "1.0.0");
151         assertEquals(1, gotPolicyList.size());
152         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, gotPolicyList.get(0)));
153
154         gotPolicyList = new AuthorativeToscaProvider().getPolicyList(pfDao, "Nonexistant", "1.0.0");
155         assertEquals(0, gotPolicyList.size());
156     }
157
158     @Test
159     public void testPoliciesGetFiltered() throws Exception {
160         assertThatThrownBy(() -> {
161             new AuthorativeToscaProvider().getFilteredPolicies(null, null);
162         }).hasMessage("dao is marked @NonNull but is null");
163
164         assertThatThrownBy(() -> {
165             new AuthorativeToscaProvider().getFilteredPolicies(null, ToscaPolicyFilter.builder().build());
166         }).hasMessage("dao is marked @NonNull but is null");
167
168         assertThatThrownBy(() -> {
169             new AuthorativeToscaProvider().getFilteredPolicies(pfDao, null);
170         }).hasMessage("filter is marked @NonNull but is null");
171
172         assertThatThrownBy(() -> {
173             new AuthorativeToscaProvider().getFilteredPolicyList(null, null);
174         }).hasMessage("dao is marked @NonNull but is null");
175
176         assertThatThrownBy(() -> {
177             new AuthorativeToscaProvider().getFilteredPolicyList(null, ToscaPolicyFilter.builder().build());
178         }).hasMessage("dao is marked @NonNull but is null");
179
180         assertThatThrownBy(() -> {
181             new AuthorativeToscaProvider().getFilteredPolicyList(pfDao, null);
182         }).hasMessage("filter is marked @NonNull but is null");
183
184         createPolicyTypes();
185
186         ToscaServiceTemplate toscaServiceTemplate = standardCoder.decode(
187                 ResourceUtils.getResourceAsString("policies/vCPE.policy.monitoring.input.tosca.json"),
188                 ToscaServiceTemplate.class);
189
190         assertNotNull(toscaServiceTemplate);
191         ToscaServiceTemplate createdServiceTemplate =
192                 new AuthorativeToscaProvider().createPolicies(pfDao, toscaServiceTemplate);
193
194         PfConceptKey policyKey = new PfConceptKey("onap.restart.tca:1.0.0");
195
196         ToscaPolicy beforePolicy =
197                 toscaServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
198         ToscaPolicy createdPolicy =
199                 createdServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
200         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, createdPolicy));
201         assertTrue(beforePolicy.getType().equals(createdPolicy.getType()));
202
203         ToscaServiceTemplate gotServiceTemplate =
204                 new AuthorativeToscaProvider().getFilteredPolicies(pfDao, ToscaPolicyFilter.builder().build());
205
206         ToscaPolicy gotPolicy =
207                 gotServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
208         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, gotPolicy));
209         assertTrue(beforePolicy.getType().equals(gotPolicy.getType()));
210
211         gotServiceTemplate = new AuthorativeToscaProvider().getFilteredPolicies(pfDao,
212                 ToscaPolicyFilter.builder().name(policyKey.getName()).build());
213
214         gotPolicy = gotServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
215         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, gotPolicy));
216         assertTrue(beforePolicy.getType().equals(gotPolicy.getType()));
217
218         gotServiceTemplate = new AuthorativeToscaProvider().getFilteredPolicies(pfDao,
219                 ToscaPolicyFilter.builder().name(policyKey.getName()).version("1.0.0").build());
220
221         gotPolicy = gotServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
222         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, gotPolicy));
223         assertTrue(beforePolicy.getType().equals(gotPolicy.getType()));
224
225         List<ToscaPolicy> gotPolicyList =
226                 new AuthorativeToscaProvider().getPolicyList(pfDao, "onap.restart.tca", "1.0.0");
227         assertEquals(1, gotPolicyList.size());
228         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, gotPolicyList.get(0)));
229
230         gotPolicyList =
231                 new AuthorativeToscaProvider().getFilteredPolicyList(pfDao, ToscaPolicyFilter.builder().build());
232         assertEquals(1, gotPolicyList.size());
233         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, gotPolicyList.get(0)));
234
235         gotPolicyList = new AuthorativeToscaProvider().getFilteredPolicyList(pfDao,
236                 ToscaPolicyFilter.builder().name(policyKey.getName()).build());
237         assertEquals(1, gotPolicyList.size());
238         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, gotPolicyList.get(0)));
239
240         gotPolicyList = new AuthorativeToscaProvider().getFilteredPolicyList(pfDao,
241                 ToscaPolicyFilter.builder().name(policyKey.getName()).version("1.0.0").build());
242         assertEquals(1, gotPolicyList.size());
243         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, gotPolicyList.get(0)));
244     }
245
246     @Test
247     public void testPolicyCreate() throws Exception {
248         assertThatThrownBy(() -> {
249             new AuthorativeToscaProvider().createPolicies(null, null);
250         }).hasMessage("dao is marked @NonNull but is null");
251
252         assertThatThrownBy(() -> {
253             new AuthorativeToscaProvider().createPolicies(null, new ToscaServiceTemplate());
254         }).hasMessage("dao is marked @NonNull but is null");
255
256         assertThatThrownBy(() -> {
257             new AuthorativeToscaProvider().createPolicies(pfDao, null);
258         }).hasMessage("serviceTemplate is marked @NonNull but is null");
259
260         createPolicyTypes();
261
262         ToscaServiceTemplate toscaServiceTemplate = standardCoder.decode(
263                 ResourceUtils.getResourceAsString("policies/vCPE.policy.monitoring.input.tosca.json"),
264                 ToscaServiceTemplate.class);
265
266         assertNotNull(toscaServiceTemplate);
267         ToscaServiceTemplate createdServiceTemplate =
268                 new AuthorativeToscaProvider().createPolicies(pfDao, toscaServiceTemplate);
269
270         PfConceptKey policyKey = new PfConceptKey("onap.restart.tca:1.0.0");
271
272         ToscaPolicy beforePolicy =
273                 toscaServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
274         ToscaPolicy createdPolicy =
275                 createdServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
276         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, createdPolicy));
277         assertTrue(beforePolicy.getType().equals(createdPolicy.getType()));
278     }
279
280     @Test
281     public void testPolicyUpdate() throws Exception {
282         assertThatThrownBy(() -> {
283             new AuthorativeToscaProvider().createPolicies(null, null);
284         }).hasMessage("dao is marked @NonNull but is null");
285
286         assertThatThrownBy(() -> {
287             new AuthorativeToscaProvider().updatePolicies(null, null);
288         }).hasMessage("dao is marked @NonNull but is null");
289
290         assertThatThrownBy(() -> {
291             new AuthorativeToscaProvider().updatePolicies(null, new ToscaServiceTemplate());
292         }).hasMessage("dao is marked @NonNull but is null");
293
294         assertThatThrownBy(() -> {
295             new AuthorativeToscaProvider().updatePolicies(pfDao, null);
296         }).hasMessage("serviceTemplate is marked @NonNull but is null");
297
298         createPolicyTypes();
299
300         ToscaServiceTemplate toscaServiceTemplate = standardCoder.decode(
301                 ResourceUtils.getResourceAsString("policies/vCPE.policy.monitoring.input.tosca.json"),
302                 ToscaServiceTemplate.class);
303
304         assertNotNull(toscaServiceTemplate);
305         ToscaServiceTemplate createdServiceTemplate =
306                 new AuthorativeToscaProvider().createPolicies(pfDao, toscaServiceTemplate);
307
308         PfConceptKey policyKey = new PfConceptKey("onap.restart.tca:1.0.0");
309
310         ToscaPolicy beforePolicy =
311                 toscaServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
312         ToscaPolicy createdPolicy =
313                 createdServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
314         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, createdPolicy));
315         assertTrue(beforePolicy.getType().equals(createdPolicy.getType()));
316
317         ToscaServiceTemplate updatedServiceTemplate =
318                 new AuthorativeToscaProvider().updatePolicies(pfDao, toscaServiceTemplate);
319
320         ToscaPolicy updatedPolicy =
321                 updatedServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
322         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, updatedPolicy));
323         assertTrue(beforePolicy.getType().equals(updatedPolicy.getType()));
324     }
325
326     @Test
327     public void testPoliciesDelete() throws Exception {
328         assertThatThrownBy(() -> {
329             new AuthorativeToscaProvider().deletePolicy(null, null, null);
330         }).hasMessage("dao is marked @NonNull but is null");
331
332         assertThatThrownBy(() -> {
333             new AuthorativeToscaProvider().deletePolicy(null, null, "version");
334         }).hasMessage("dao is marked @NonNull but is null");
335
336         assertThatThrownBy(() -> {
337             new AuthorativeToscaProvider().deletePolicy(null, "name", null);
338         }).hasMessage("dao is marked @NonNull but is null");
339
340         assertThatThrownBy(() -> {
341             new AuthorativeToscaProvider().deletePolicy(null, "name", "version");
342         }).hasMessage("dao is marked @NonNull but is null");
343
344         assertThatThrownBy(() -> {
345             new AuthorativeToscaProvider().deletePolicy(pfDao, null, null);
346         }).hasMessage("name is marked @NonNull but is null");
347
348         assertThatThrownBy(() -> {
349             new AuthorativeToscaProvider().deletePolicy(pfDao, null, "version");
350         }).hasMessage("name is marked @NonNull but is null");
351
352         assertThatThrownBy(() -> {
353             new AuthorativeToscaProvider().deletePolicy(pfDao, "name", null);
354         }).hasMessage("version is marked @NonNull but is null");
355
356         createPolicyTypes();
357
358         ToscaServiceTemplate toscaServiceTemplate = standardCoder.decode(
359                 ResourceUtils.getResourceAsString("policies/vCPE.policy.monitoring.input.tosca.json"),
360                 ToscaServiceTemplate.class);
361
362         assertNotNull(toscaServiceTemplate);
363         ToscaServiceTemplate createdServiceTemplate =
364                 new AuthorativeToscaProvider().createPolicies(pfDao, toscaServiceTemplate);
365
366         PfConceptKey policyKey = new PfConceptKey("onap.restart.tca:1.0.0");
367
368         ToscaPolicy beforePolicy =
369                 toscaServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
370         ToscaPolicy createdPolicy =
371                 createdServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
372         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, createdPolicy));
373         assertTrue(beforePolicy.getType().equals(createdPolicy.getType()));
374
375         ToscaServiceTemplate deletedServiceTemplate =
376                 new AuthorativeToscaProvider().deletePolicy(pfDao, policyKey.getName(), policyKey.getVersion());
377
378         ToscaPolicy deletedPolicy =
379                 deletedServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
380         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, createdPolicy));
381         assertTrue(beforePolicy.getType().equals(deletedPolicy.getType()));
382
383         ToscaServiceTemplate gotServiceTemplate =
384                 new AuthorativeToscaProvider().getPolicies(pfDao, policyKey.getName(), policyKey.getVersion());
385
386         assertTrue(gotServiceTemplate.getToscaTopologyTemplate().getPolicies().isEmpty());
387     }
388
389     @Test
390     public void testAssertPoliciesExist() throws PfModelException {
391         ToscaServiceTemplate testServiceTemplate = new ToscaServiceTemplate();
392
393         assertThatThrownBy(() -> {
394             new AuthorativeToscaProvider().deletePolicy(pfDao, "name", null);
395         }).hasMessage("version is marked @NonNull but is null");
396
397         assertThatThrownBy(() -> {
398             new AuthorativeToscaProvider().createPolicies(pfDao, testServiceTemplate);
399         }).hasMessage("topology template not specified on service template");
400
401         testServiceTemplate.setToscaTopologyTemplate(new ToscaTopologyTemplate());
402         assertThatThrownBy(() -> {
403             new AuthorativeToscaProvider().createPolicies(pfDao, testServiceTemplate);
404         }).hasMessage("no policies specified on topology template of service template");
405
406         testServiceTemplate.getToscaTopologyTemplate().setPolicies(new ArrayList<>());
407         assertThatThrownBy(() -> {
408             new AuthorativeToscaProvider().createPolicies(pfDao, testServiceTemplate);
409         }).hasMessage("An incoming list of concepts must have at least one entry");
410     }
411
412     @Test
413     public void testEntityMaps() throws CoderException, PfModelException {
414         Object yamlObject = new Yaml().load(
415                 ResourceUtils.getResourceAsString("policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.yaml"));
416         String yamlAsJsonString = new StandardCoder().encode(yamlObject);
417
418         ToscaServiceTemplate toscaServiceTemplatePolicyType =
419                 standardCoder.decode(yamlAsJsonString, ToscaServiceTemplate.class);
420
421         assertNotNull(toscaServiceTemplatePolicyType);
422         new AuthorativeToscaProvider().createPolicyTypes(pfDao, toscaServiceTemplatePolicyType);
423
424         assertEquals(3, toscaServiceTemplatePolicyType.getDataTypesAsMap().size());
425         assertEquals(2, toscaServiceTemplatePolicyType.getPolicyTypesAsMap().size());
426
427         ToscaServiceTemplate toscaServiceTemplate = standardCoder.decode(
428                 ResourceUtils.getResourceAsString("policies/vCPE.policy.monitoring.input.tosca.json"),
429                 ToscaServiceTemplate.class);
430
431         assertNotNull(toscaServiceTemplate);
432         ToscaServiceTemplate createdServiceTemplate =
433                 new AuthorativeToscaProvider().createPolicies(pfDao, toscaServiceTemplate);
434
435         PfConceptKey policyKey = new PfConceptKey("onap.restart.tca:1.0.0");
436
437         ToscaPolicy beforePolicy =
438                 toscaServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
439         ToscaPolicy createdPolicy =
440                 createdServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0).get(policyKey.getName());
441         assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, createdPolicy));
442         assertTrue(beforePolicy.getType().equals(createdPolicy.getType()));
443
444         assertEquals(1, toscaServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().size());
445         assertEquals(1, createdServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap().size());
446
447         Map<String, ToscaPolicy> policyMapItem = createdServiceTemplate.getToscaTopologyTemplate().getPolicies().get(0);
448         createdServiceTemplate.getToscaTopologyTemplate().getPolicies().add(policyMapItem);
449
450         assertThatThrownBy(() -> {
451             createdServiceTemplate.getToscaTopologyTemplate().getPoliciesAsMap();
452         }).hasMessageContaining("list of map of entities contains more than one entity with key");
453     }
454
455     private void createPolicyTypes() throws CoderException, PfModelException {
456         Object yamlObject = new Yaml().load(
457                 ResourceUtils.getResourceAsString("policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.yaml"));
458         String yamlAsJsonString = new StandardCoder().encode(yamlObject);
459
460         ToscaServiceTemplate toscaServiceTemplatePolicyType =
461                 standardCoder.decode(yamlAsJsonString, ToscaServiceTemplate.class);
462
463         assertNotNull(toscaServiceTemplatePolicyType);
464         new AuthorativeToscaProvider().createPolicyTypes(pfDao, toscaServiceTemplatePolicyType);
465     }
466 }