448df41993b6bc905c58a755eb948b7fd7a6c2b1
[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.YamlJsonTranslator;
35 import org.onap.policy.common.utils.resources.ResourceUtils;
36 import org.onap.policy.models.provider.PolicyModelsProvider;
37 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
38 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
39 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeType;
40 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
41
42 class CommissioningProviderTest {
43     private static final String TOSCA_SERVICE_TEMPLATE_YAML =
44             "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
45     private static final String TEMPLATE_IS_NULL = ".*serviceTemplate is marked non-null but is null";
46     private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
47
48     private PolicyModelsProvider modelsProvider = null;
49     private ControlLoopProvider clProvider = null;
50
51     @AfterEach
52     void close() throws Exception {
53         if (modelsProvider != null) {
54             modelsProvider.close();
55         }
56         if (clProvider != null) {
57             clProvider.close();
58         }
59     }
60
61     /**
62      * Test the fetching of control loop definitions (ToscaServiceTemplates).
63      *
64      * @throws Exception .
65      */
66     @Test
67     void testGetControlLoopDefinitions() throws Exception {
68         ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
69         modelsProvider =
70                 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
71         clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
72
73         CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider);
74         ToscaServiceTemplate serviceTemplate = yamlTranslator
75                 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
76
77         List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
78         assertThat(listOfTemplates).isEmpty();
79
80         provider.createControlLoopDefinitions(serviceTemplate);
81         listOfTemplates = provider.getControlLoopDefinitions(null, null);
82         assertThat(listOfTemplates).hasSize(2);
83
84         // Test Filtering
85         listOfTemplates = provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
86         assertThat(listOfTemplates).hasSize(1);
87         for (ToscaNodeTemplate template : listOfTemplates) {
88             // Other CL elements contain PMSD instead of PMSH in their name
89             assertThat(template.getName()).doesNotContain("PMSD");
90         }
91
92         // Test Wrong Name
93         listOfTemplates = provider.getControlLoopDefinitions("WrongControlLoopName", "0.0.0");
94         assertThat(listOfTemplates).isEmpty();
95
96     }
97
98     /**
99      * Test the creation of control loop definitions (ToscaServiceTemplates).
100      *
101      * @throws Exception .
102      */
103     @Test
104     void testCreateControlLoopDefinitions() throws Exception {
105         ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("createCLDefinitions");
106         modelsProvider =
107                 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
108         clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
109
110         CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider);
111         // Test Service template is null
112         assertThatThrownBy(() -> provider.createControlLoopDefinitions(null)).hasMessageMatching(TEMPLATE_IS_NULL);
113         List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
114         assertThat(listOfTemplates).isEmpty();
115
116         ToscaServiceTemplate serviceTemplate = yamlTranslator
117                 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
118
119         // Response should return the number of node templates present in the service template
120         List<ToscaConceptIdentifier> affectedDefinitions =
121                 provider.createControlLoopDefinitions(serviceTemplate).getAffectedControlLoopDefinitions();
122         assertThat(affectedDefinitions).hasSize(13);
123         listOfTemplates = provider.getControlLoopDefinitions(null, null);
124         assertThat(listOfTemplates).hasSize(2);
125     }
126
127     /**
128      * Test the deletion of control loop definitions (ToscaServiceTemplate).
129      *
130      * @throws Exception .
131      */
132     @Test
133     void testDeleteControlLoopDefinitions() throws Exception {
134         ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("deleteCLDefinitions");
135         modelsProvider =
136                 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
137         clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
138
139         CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider);
140         ToscaServiceTemplate serviceTemplate = yamlTranslator
141                 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
142
143         List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
144         assertThat(listOfTemplates).isEmpty();
145
146         provider.createControlLoopDefinitions(serviceTemplate);
147         listOfTemplates = provider.getControlLoopDefinitions(null, null);
148         assertThat(listOfTemplates).hasSize(2);
149
150         provider.deleteControlLoopDefinition(serviceTemplate.getName(), serviceTemplate.getVersion());
151         listOfTemplates = provider.getControlLoopDefinitions(null, null);
152         assertThat(listOfTemplates).isEmpty();
153     }
154
155     /**
156      * Test the fetching of control loop element definitions.
157      *
158      * @throws Exception .
159      */
160     @Test
161     void testGetControlLoopElementDefinitions() throws Exception {
162         ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLElDefinitions");
163         modelsProvider =
164                 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
165         clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
166
167         CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider);
168         ToscaServiceTemplate serviceTemplate = yamlTranslator
169                 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
170
171         provider.getControlLoopDefinitions(null, null);
172
173         provider.createControlLoopDefinitions(serviceTemplate);
174         List<ToscaNodeTemplate> controlLoopDefinitionList =
175                 provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
176
177         List<ToscaNodeTemplate> controlLoopElementNodeTemplates =
178                 provider.getControlLoopElementDefinitions(controlLoopDefinitionList.get(0));
179
180         // 4 PMSH control loop elements definitions.
181         assertThat(controlLoopElementNodeTemplates).hasSize(4);
182
183         List<ToscaNodeType> derivedTypes = getDerivedNodeTypes(serviceTemplate);
184         for (ToscaNodeTemplate template : controlLoopElementNodeTemplates) {
185             assertTrue(checkNodeType(template, derivedTypes));
186         }
187     }
188
189     private boolean checkNodeType(ToscaNodeTemplate template, List<ToscaNodeType> derivedNodeTypes) {
190         String controlLoopElementType = "org.onap.policy.clamp.controlloop.ControlLoopElement";
191         for (ToscaNodeType derivedType : derivedNodeTypes) {
192             if (template.getType().equals(derivedType.getName()) || template.getType().equals(controlLoopElementType)) {
193                 return true;
194             }
195         }
196         return false;
197     }
198
199     private List<ToscaNodeType> getDerivedNodeTypes(ToscaServiceTemplate serviceTemplate) {
200         String type = "org.onap.policy.clamp.controlloop.ControlLoopElement";
201         List<ToscaNodeType> nodeTypes = new ArrayList<>();
202         for (ToscaNodeType nodeType : serviceTemplate.getNodeTypes().values()) {
203             if (nodeType.getDerivedFrom().equals(type)) {
204                 nodeTypes.add(nodeType);
205             }
206         }
207         return nodeTypes;
208     }
209 }