4403807812c9c2a60abc903a65d504714c61e329
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2021 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.clamp.controlloop.runtime.commissioning;
22
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
25 import static org.junit.jupiter.api.Assertions.assertTrue;
26
27 import java.util.ArrayList;
28 import java.util.List;
29 import org.junit.jupiter.api.AfterEach;
30 import org.junit.jupiter.api.Test;
31 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
32 import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
33 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
34 import org.onap.policy.common.utils.coder.Coder;
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.provider.PolicyModelsProvider;
40 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
41 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
42 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeType;
43 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
44
45 class CommissioningProviderTest {
46     private static final String TOSCA_SERVICE_TEMPLATE_YAML =
47             "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
48     private static final String TEMPLATE_IS_NULL = ".*serviceTemplate is marked non-null but is null";
49     private static final Coder CODER = new StandardCoder();
50     private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
51     private static int dbNum = 0;
52     private static final Object lockit = new Object();
53
54     private PolicyModelsProvider modelsProvider = null;
55     private ControlLoopProvider clProvider = null;
56
57     private static String getParameterGroupAsString() {
58         dbNum++;
59         return ResourceUtils.getResourceAsString("src/test/resources/parameters/TestParameters.json")
60                 .replace("jdbc:h2:mem:testdb", "jdbc:h2:mem:commissioningdb" + dbNum);
61     }
62
63     /**
64      * return a Cl Runtime Parameters.
65      *
66      * @throws CoderException .
67      */
68     public ClRuntimeParameterGroup getClRuntimeParameterGroup() throws CoderException {
69         synchronized (lockit) {
70             return CODER.decode(getParameterGroupAsString(), ClRuntimeParameterGroup.class);
71         }
72     }
73
74     @AfterEach
75     void close() throws Exception {
76         if (modelsProvider != null) {
77             modelsProvider.close();
78         }
79         if (clProvider != null) {
80             clProvider.close();
81         }
82     }
83
84     /**
85      * Test the fetching of control loop definitions (ToscaServiceTemplates).
86      *
87      * @throws Exception .
88      */
89     @Test
90     void testGetControlLoopDefinitions() throws Exception {
91         ClRuntimeParameterGroup clRuntimeParameterGroup = getClRuntimeParameterGroup();
92         modelsProvider =
93                 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
94         clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
95
96         CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider);
97         ToscaServiceTemplate serviceTemplate = yamlTranslator
98                 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
99
100         List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
101         assertThat(listOfTemplates).isEmpty();
102
103         provider.createControlLoopDefinitions(serviceTemplate);
104         listOfTemplates = provider.getControlLoopDefinitions(null, null);
105         assertThat(listOfTemplates).hasSize(2);
106
107         // Test Filtering
108         listOfTemplates = provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
109         assertThat(listOfTemplates).hasSize(1);
110         for (ToscaNodeTemplate template : listOfTemplates) {
111             // Other CL elements contain PMSD instead of PMSH in their name
112             assertThat(template.getName()).doesNotContain("PMSD");
113         }
114
115         // Test Wrong Name
116         listOfTemplates = provider.getControlLoopDefinitions("WrongControlLoopName", "0.0.0");
117         assertThat(listOfTemplates).isEmpty();
118
119     }
120
121     /**
122      * Test the creation of control loop definitions (ToscaServiceTemplates).
123      *
124      * @throws Exception .
125      */
126     @Test
127     void testCreateControlLoopDefinitions() throws Exception {
128         ClRuntimeParameterGroup clRuntimeParameterGroup = getClRuntimeParameterGroup();
129         modelsProvider =
130                 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
131         clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
132
133         CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider);
134         // Test Service template is null
135         assertThatThrownBy(() -> provider.createControlLoopDefinitions(null)).hasMessageMatching(TEMPLATE_IS_NULL);
136         List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
137         assertThat(listOfTemplates).isEmpty();
138
139         ToscaServiceTemplate serviceTemplate = yamlTranslator
140                 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
141
142         // Response should return the number of node templates present in the service template
143         List<ToscaConceptIdentifier> affectedDefinitions =
144                 provider.createControlLoopDefinitions(serviceTemplate).getAffectedControlLoopDefinitions();
145         assertThat(affectedDefinitions).hasSize(13);
146         listOfTemplates = provider.getControlLoopDefinitions(null, null);
147         assertThat(listOfTemplates).hasSize(2);
148     }
149
150     /**
151      * Test the deletion of control loop definitions (ToscaServiceTemplate).
152      *
153      * @throws Exception .
154      */
155     @Test
156     void testDeleteControlLoopDefinitions() throws Exception {
157         ClRuntimeParameterGroup clRuntimeParameterGroup = getClRuntimeParameterGroup();
158         modelsProvider =
159                 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
160         clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
161
162         CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider);
163         ToscaServiceTemplate serviceTemplate = yamlTranslator
164                 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
165
166         List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
167         assertThat(listOfTemplates).isEmpty();
168
169         provider.createControlLoopDefinitions(serviceTemplate);
170         listOfTemplates = provider.getControlLoopDefinitions(null, null);
171         assertThat(listOfTemplates).hasSize(2);
172
173         provider.deleteControlLoopDefinition(serviceTemplate.getName(), serviceTemplate.getVersion());
174         listOfTemplates = provider.getControlLoopDefinitions(null, null);
175         assertThat(listOfTemplates).isEmpty();
176     }
177
178     /**
179      * Test the fetching of control loop element definitions.
180      *
181      * @throws Exception .
182      */
183     @Test
184     void testGetControlLoopElementDefinitions() throws Exception {
185         ClRuntimeParameterGroup clRuntimeParameterGroup = getClRuntimeParameterGroup();
186         modelsProvider =
187                 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
188         clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
189
190         CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider);
191         ToscaServiceTemplate serviceTemplate = yamlTranslator
192                 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
193
194         provider.getControlLoopDefinitions(null, null);
195
196         provider.createControlLoopDefinitions(serviceTemplate);
197         List<ToscaNodeTemplate> controlLoopDefinitionList =
198                 provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
199
200         List<ToscaNodeTemplate> controlLoopElementNodeTemplates =
201                 provider.getControlLoopElementDefinitions(controlLoopDefinitionList.get(0));
202
203         // 4 PMSH control loop elements definitions.
204         assertThat(controlLoopElementNodeTemplates).hasSize(4);
205
206         List<ToscaNodeType> derivedTypes = getDerivedNodeTypes(serviceTemplate);
207         for (ToscaNodeTemplate template : controlLoopElementNodeTemplates) {
208             assertTrue(checkNodeType(template, derivedTypes));
209         }
210     }
211
212     private boolean checkNodeType(ToscaNodeTemplate template, List<ToscaNodeType> derivedNodeTypes) {
213         String controlLoopElementType = "org.onap.policy.clamp.controlloop.ControlLoopElement";
214         for (ToscaNodeType derivedType : derivedNodeTypes) {
215             if (template.getType().equals(derivedType.getName()) || template.getType().equals(controlLoopElementType)) {
216                 return true;
217             }
218         }
219         return false;
220     }
221
222     private List<ToscaNodeType> getDerivedNodeTypes(ToscaServiceTemplate serviceTemplate) {
223         String type = "org.onap.policy.clamp.controlloop.ControlLoopElement";
224         List<ToscaNodeType> nodeTypes = new ArrayList<>();
225         for (ToscaNodeType nodeType : serviceTemplate.getNodeTypes().values()) {
226             if (nodeType.getDerivedFrom().equals(type)) {
227                 nodeTypes.add(nodeType);
228             }
229         }
230         return nodeTypes;
231     }
232 }