Add policy metadataSet handling as node templates
[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 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.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;
50
51 /**
52  * Test of the {@link AuthorativeToscaProvider} class.
53  */
54 public class AuthorativeToscaProviderNodeTemplateTest {
55
56
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;
66     private PfDao pfDao;
67     private StandardCoder standardCoder;
68     private AuthorativeToscaProvider authorativeToscaProvider = new AuthorativeToscaProvider();
69     private YamlJsonTranslator yamlJsonTranslator = new YamlJsonTranslator();
70
71     /**
72      * Read policy metadataSet input json.
73      * @throws Exception Coder exception
74      */
75     @Before
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);
85     }
86
87     /**
88      * Set up DAO towards the database.
89      *
90      * @throws Exception on database errors
91      */
92     @Before
93     public void setupDao() throws Exception {
94         final DaoParameters daoParameters = new DaoParameters();
95         daoParameters.setPluginClass(DefaultPfDao.class.getName());
96
97         daoParameters.setPersistenceUnit("ToscaConceptTest");
98
99         Properties jdbcProperties = new Properties();
100         jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_USER, "policy");
101         jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_PASSWORD, "P01icY");
102
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");
106         } else {
107             jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_DRIVER, "org.h2.Driver");
108             jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_URL,
109                 "jdbc:h2:mem:AuthorativeToscaProviderNodeTemplatesTest");
110         }
111
112         daoParameters.setJdbcProperties(jdbcProperties);
113
114         pfDao = new PfDaoFactory().createPfDao(daoParameters);
115         pfDao.init(daoParameters);
116     }
117
118     @After
119     public void teardown() {
120         pfDao.close();
121     }
122
123     @Test
124     public void testPolicyMetadataSetsGet() throws Exception {
125
126         assertThatThrownBy(() -> {
127             authorativeToscaProvider.getNodeTemplateMetadataSet(null, null, null);
128         }).hasMessageMatching(DAO_IS_NULL);
129
130         assertNotNull(toscaServiceTemplate);
131         authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
132         List<Map<PfConceptKey, ToscaNodeTemplate>> gotPolicyMetadataSets1 = authorativeToscaProvider
133             .getToscaNodeTemplate(pfDao, null, null);
134         assertEquals(3, gotPolicyMetadataSets1.size());
135
136         //Fetch all metadataSet if id is null
137         List<Map<ToscaEntityKey, Map<String, Object>>> gotPolicyMetadataSets = authorativeToscaProvider
138             .getNodeTemplateMetadataSet(pfDao, null, null);
139         assertEquals(3, gotPolicyMetadataSets.size());
140
141         // Get filtered metadataSet
142         List<Map<ToscaEntityKey, Map<String, Object>>> filteredPolicyMetadataSet = authorativeToscaProvider
143             .getNodeTemplateMetadataSet(pfDao, "apexMetadata_adaptive", "2.3.1");
144         assertEquals(1, filteredPolicyMetadataSet.size());
145
146         //Get invalid metadataSet
147         List<Map<ToscaEntityKey, Map<String, Object>>> filteredMetadataSetInvalid = authorativeToscaProvider
148             .getNodeTemplateMetadataSet(pfDao, "invalidname", "1.0.0");
149         assertThat(filteredMetadataSetInvalid).isEmpty();
150     }
151
152     @Test
153     public void testToscaNodeTemplatesGet() throws Exception {
154
155         assertThatThrownBy(() -> {
156             authorativeToscaProvider.getToscaNodeTemplate(null, null, null);
157         }).hasMessageMatching(DAO_IS_NULL);
158
159         assertNotNull(toscaServiceTemplate);
160         authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
161
162         //Fetch all node templates if id is null
163         List<Map<PfConceptKey, ToscaNodeTemplate>> gotToscaNodeTemplates = authorativeToscaProvider
164             .getToscaNodeTemplate(pfDao, null, null);
165         assertEquals(3, gotToscaNodeTemplates.size());
166
167         // Get filtered node templates
168         List<Map<PfConceptKey, ToscaNodeTemplate>> filteredNodeTemplates = authorativeToscaProvider
169             .getToscaNodeTemplate(pfDao, "apexMetadata_adaptive", "2.3.1");
170         assertEquals(1, filteredNodeTemplates.size());
171
172         //Get invalid node template
173         List<Map<PfConceptKey, ToscaNodeTemplate>> filteredNodeTemplatesInvalid = authorativeToscaProvider
174             .getToscaNodeTemplate(pfDao, "invalidname", "1.0.0");
175         assertThat(filteredNodeTemplatesInvalid).isEmpty();
176     }
177
178     @Test
179     public void testToscaNodeTemplatesCreate() throws Exception {
180         assertThatThrownBy(() -> {
181             authorativeToscaProvider.createToscaNodeTemplates(null, null);
182         }).hasMessageMatching(DAO_IS_NULL);
183
184         assertThatThrownBy(() -> {
185             authorativeToscaProvider.createToscaNodeTemplates(null, new ToscaServiceTemplate());
186         }).hasMessageMatching(DAO_IS_NULL);
187
188         assertThatThrownBy(() -> {
189             authorativeToscaProvider.createToscaNodeTemplates(pfDao, null);
190         }).hasMessageMatching("^toscaServiceTemplate is marked .*on.*ull but is null$");
191
192         ToscaServiceTemplate createdNodeTemplates =
193             authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
194         assertThat(createdNodeTemplates.getToscaTopologyTemplate().getNodeTemplates()).hasSize(3);
195         assertThat(createdNodeTemplates.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_grpc")
196             .getMetadata()).containsKey("threshold");
197
198         authorativeToscaProvider.createToscaNodeTemplates(pfDao, createToscaNodeTemplate);
199         assertThat(authorativeToscaProvider.getNodeTemplateMetadataSet(pfDao, null, null)).hasSize(4);
200
201         //Create node template with invalid node type
202         createToscaNodeTemplate.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_adaptive")
203             .setType("invalid.type");
204         assertThatThrownBy(() -> {
205             authorativeToscaProvider.createToscaNodeTemplates(pfDao, createToscaNodeTemplate);
206         }).hasMessageMatching("^NODE_TYPE .* for toscaNodeTemplate .* does not exist$");
207
208     }
209
210     @Test
211     public void testToscaNodeTemplateUpdate() throws Exception {
212         assertThatThrownBy(() -> {
213             authorativeToscaProvider.updateToscaNodeTemplates(null, null);
214         }).hasMessageMatching(DAO_IS_NULL);
215
216         assertThatThrownBy(() -> {
217             authorativeToscaProvider.updateToscaNodeTemplates(null, new ToscaServiceTemplate());
218         }).hasMessageMatching(DAO_IS_NULL);
219
220         assertThatThrownBy(() -> {
221             authorativeToscaProvider.updateToscaNodeTemplates(pfDao, null);
222         }).hasMessageMatching("^serviceTemplate is marked non-null but is null$");
223
224         authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
225         ToscaServiceTemplate updatedTemplate =
226             authorativeToscaProvider.updateToscaNodeTemplates(pfDao, updatedToscaServiceTemplate);
227         assertEquals("Updated Metadata set for GRPC",
228             updatedTemplate.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_grpc")
229                 .getDescription());
230
231         //Update nodeTemplate with invalid node type
232         updatedToscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates().get("apexMetadata_grpc")
233             .setTypeVersion("0.0.0");
234         assertThatThrownBy(() -> {
235             authorativeToscaProvider.updateToscaNodeTemplates(pfDao, updatedToscaServiceTemplate);
236         }).hasMessageMatching("^NODE_TYPE .* for toscaNodeTemplate .* does not exist$");
237     }
238
239     @Test
240     public void testToscaNodeTemplatetDelete() throws Exception {
241         assertThatThrownBy(() -> {
242             authorativeToscaProvider.deleteToscaNodeTemplate(null, null, null);
243         }).hasMessageMatching(DAO_IS_NULL);
244
245         assertThatThrownBy(() -> {
246             authorativeToscaProvider.deleteToscaNodeTemplate(null, null, "0.0.1");
247         }).hasMessageMatching(DAO_IS_NULL);
248
249         assertThatThrownBy(() -> {
250             authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, null, null);
251         }).hasMessageMatching("^name is marked .*on.*ull but is null$");
252
253         assertThatThrownBy(() -> {
254             authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "name", null);
255         }).hasMessageMatching("^version is marked .*on.*ull but is null$");
256
257         authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
258         assertThatThrownBy(() -> {
259             authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "dummyname", "1.0.1");
260         }).hasMessage("node template dummyname:1.0.1 not found");
261
262
263         ToscaServiceTemplate responseTemplate =
264             authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "apexMetadata_decisionMaker",
265                 "1.0.0");
266
267         assertTrue(responseTemplate.getToscaTopologyTemplate().getNodeTemplates()
268             .containsKey("apexMetadata_decisionMaker"));
269         assertThat(responseTemplate.getToscaTopologyTemplate().getNodeTemplates()).hasSize(1);
270
271         assertThat(authorativeToscaProvider.getNodeTemplateMetadataSet(pfDao, null, null)).hasSize(2);
272
273     }
274
275     @Test
276     public void testNodeTemplatesWithExistingPolicy() throws Exception {
277         String policyString = ResourceUtils.getResourceAsString(POLICY_WITH_METADATA_SET_REF);
278         ToscaServiceTemplate policyServiceTemplate =
279             yamlJsonTranslator.fromYaml(policyString, ToscaServiceTemplate.class);
280
281         createPolicyTypes();
282         //Create policy with metadataSet reference in it
283         authorativeToscaProvider.createPolicies(pfDao, policyServiceTemplate);
284         assertThat(authorativeToscaProvider.getPolicyList(pfDao, null, null)).hasSize(1);
285         assertEquals("apexMetadata_decisionMaker", authorativeToscaProvider
286             .getPolicyList(pfDao, null, null).get(0).getMetadata().get("metadataSetName"));
287
288         //Create node templates
289         authorativeToscaProvider.createToscaNodeTemplates(pfDao, toscaServiceTemplate);
290
291         //delete node templates referenced in existing policy
292         assertThatThrownBy(() -> {
293             authorativeToscaProvider
294                 .deleteToscaNodeTemplate(pfDao, "apexMetadata_decisionMaker", "1.0.0");
295         }).hasMessageEndingWith("Node template is in use, it is referenced in Tosca Policy "
296             + "operational.apex.decisionMaker version 1.0.0");
297
298         //delete unreferenced node template
299         authorativeToscaProvider.deleteToscaNodeTemplate(pfDao, "apexMetadata_adaptive", "2.3.1");
300         assertThat(authorativeToscaProvider.getNodeTemplateMetadataSet(pfDao, null, null)).hasSize(2);
301     }
302
303     private void createPolicyTypes() throws CoderException, PfModelException {
304         Object yamlObject =
305             new Yaml().load(ResourceUtils.getResourceAsString(APEX_POLICY_TYPE_YAML));
306         String yamlAsJsonString = new StandardCoder().encode(yamlObject);
307
308         ToscaServiceTemplate toscaServiceTemplatePolicyType =
309             standardCoder.decode(yamlAsJsonString, ToscaServiceTemplate.class);
310
311         assertNotNull(toscaServiceTemplatePolicyType);
312         new AuthorativeToscaProvider().createPolicyTypes(pfDao, toscaServiceTemplatePolicyType);
313     }
314
315 }