0ec8fe3e861fbbdbdb2a170fe871373b91500f2d
[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.instantiation;
22
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
25
26 import java.io.IOException;
27 import java.util.ArrayList;
28 import org.junit.Assert;
29 import org.junit.BeforeClass;
30 import org.junit.Test;
31 import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
32 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
33 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
34 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
35 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationCommand;
36 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationResponse;
37 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
38 import org.onap.policy.models.base.PfModelException;
39 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
40 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
41
42 /**
43  * Class to perform unit test of {@link ControlLoopInstantiationProvider}}.
44  *
45  */
46 public class ControlLoopInstantiationProviderTest {
47
48     private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
49     private static final String CL_INSTANTIATION_UPDATE_JSON =
50             "src/test/resources/rest/controlloops/ControlLoopsUpdate.json";
51     private static final String CL_INSTANTIATION_CHANGE_STATE_JSON =
52             "src/test/resources/rest/controlloops/PassiveCommand.json";
53     private static final String CL_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON =
54             "src/test/resources/rest/controlloops/ControlLoopsElementsNotFound.json";
55     private static final String CL_INSTANTIATION_CONTROLLOOP_DEFINITION_NOT_FOUND_JSON =
56             "src/test/resources/rest/controlloops/ControlLoopsNotFound.json";
57     private static final String TOSCA_TEMPLATE_YAML = "examples/controlloop/PMSubscriptionHandling.yaml";
58
59     private static final String CONTROL_LOOP_NOT_FOUND = "Control Loop not found";
60     private static final String DELETE_BAD_REQUEST = "Control Loop State is still %s";
61     private static final String ORDERED_STATE_INVALID = "ordered state invalid or not specified on command";
62
63     private static final String CONTROLLOOP_ELEMENT_NAME_NOT_FOUND =
64             "\"ControlLoops\" INVALID, item has status INVALID\n"
65                     + "  \"org.onap.domain.pmsh.NotExistFirst\" INVALID, Not FOUND\n"
66                     + "  \"org.onap.domain.pmsh.NotExistSecond\" INVALID, Not FOUND\n";
67
68     private static final String CONTROLLOOP_DEFINITION_NOT_FOUND = "\"ControlLoops\" INVALID, item has status INVALID\n"
69             + "  item \"ControlLoop\" value \"org.onap.domain.PMSHControlLoopDefinition\" INVALID,"
70             + " Commissioned control loop definition not FOUND\n"
71             + "  item \"ControlLoop\" value \"org.onap.domain.PMSHControlLoopDefinition\" INVALID,"
72             + " Commissioned control loop definition not FOUND\n";
73
74     private static PolicyModelsProviderParameters databaseProviderParameters;
75
76     /**
77      * setup Db Provider Parameters.
78      *
79      * @throws PfModelException if an error occurs
80      */
81     @BeforeClass
82     public static void setupDbProviderParameters() throws PfModelException {
83         databaseProviderParameters =
84                 CommonTestData.geParameterGroup(0, "instantproviderdb").getDatabaseProviderParameters();
85     }
86
87     @Test
88     public void testInstantiationCrud() throws Exception {
89         ControlLoops controlLoopsCreate =
90                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Crud");
91
92         ControlLoops controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
93         assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
94
95         try (ControlLoopInstantiationProvider instantiationProvider =
96                 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
97
98             // to validate control Loop, it needs to define ToscaServiceTemplate
99             InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
100
101             InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
102             InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
103
104             controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
105             assertThat(controlLoopsDb.getControlLoopList()).isNotEmpty();
106             Assert.assertEquals(controlLoopsCreate, controlLoopsDb);
107
108             for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
109                 ControlLoops controlLoopsGet =
110                         instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
111                 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
112                 Assert.assertEquals(controlLoop, controlLoopsGet.getControlLoopList().get(0));
113             }
114
115             ControlLoops controlLoopsUpdate =
116                     InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Crud");
117             Assert.assertNotEquals(controlLoopsUpdate, controlLoopsDb);
118
119             instantiationResponse = instantiationProvider.updateControlLoops(controlLoopsUpdate);
120             InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsUpdate);
121
122             controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
123             assertThat(controlLoopsDb.getControlLoopList()).isNotEmpty();
124             Assert.assertEquals(controlLoopsUpdate, controlLoopsDb);
125
126             InstantiationCommand instantiationCommand =
127                     InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Crud");
128             instantiationResponse = instantiationProvider.issueControlLoopCommand(instantiationCommand);
129             InstantiationUtils.assertInstantiationResponse(instantiationResponse, instantiationCommand);
130
131             for (ToscaConceptIdentifier toscaConceptIdentifier : instantiationCommand.getControlLoopIdentifierList()) {
132                 ControlLoops controlLoopsGet = instantiationProvider.getControlLoops(toscaConceptIdentifier.getName(),
133                         toscaConceptIdentifier.getVersion());
134                 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
135                 Assert.assertEquals(instantiationCommand.getOrderedState(),
136                         controlLoopsGet.getControlLoopList().get(0).getOrderedState());
137             }
138
139             // in order to delete a controlLoop the state must be UNINITIALISED
140             controlLoopsCreate.getControlLoopList().forEach(cl -> cl.setState(ControlLoopState.UNINITIALISED));
141             instantiationProvider.updateControlLoops(controlLoopsCreate);
142
143             for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
144                 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
145             }
146
147             controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
148             assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
149         }
150     }
151
152     private ControlLoops getControlLoopsFromDb(ControlLoops controlLoopsSource) throws Exception {
153         ControlLoops controlLoopsDb = new ControlLoops();
154         controlLoopsDb.setControlLoopList(new ArrayList<>());
155
156         try (ControlLoopInstantiationProvider instantiationProvider =
157                 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
158
159             for (ControlLoop controlLoop : controlLoopsSource.getControlLoopList()) {
160                 ControlLoops controlLoopsFromDb =
161                         instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
162                 controlLoopsDb.getControlLoopList().addAll(controlLoopsFromDb.getControlLoopList());
163             }
164             return controlLoopsDb;
165         }
166     }
167
168     @Test
169     public void testInstantiationDelete() throws Exception {
170         ControlLoops controlLoops =
171                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
172         assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
173
174         ControlLoop controlLoop0 = controlLoops.getControlLoopList().get(0);
175
176         try (ControlLoopInstantiationProvider instantiationProvider =
177                 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
178
179             // to validate control Loop, it needs to define ToscaServiceTemplate
180             InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
181
182             assertThatThrownBy(
183                     () -> instantiationProvider.deleteControlLoop(controlLoop0.getName(), controlLoop0.getVersion()))
184                             .hasMessageMatching(CONTROL_LOOP_NOT_FOUND);
185
186             InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoops),
187                     controlLoops);
188
189             for (ControlLoopState state : ControlLoopState.values()) {
190                 if (!ControlLoopState.UNINITIALISED.equals(state)) {
191                     assertThatDeleteThrownBy(controlLoops, state);
192                 }
193             }
194
195             controlLoop0.setState(ControlLoopState.UNINITIALISED);
196             instantiationProvider.updateControlLoops(controlLoops);
197
198             for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
199                 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
200             }
201
202             for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
203                 ControlLoops controlLoopsGet =
204                         instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
205                 assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
206             }
207         }
208     }
209
210     private void assertThatDeleteThrownBy(ControlLoops controlLoops, ControlLoopState state) throws Exception {
211         ControlLoop controlLoop = controlLoops.getControlLoopList().get(0);
212
213         controlLoop.setState(state);
214
215         try (ControlLoopInstantiationProvider instantiationProvider =
216                 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
217
218             instantiationProvider.updateControlLoops(controlLoops);
219             assertThatThrownBy(
220                     () -> instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion()))
221                             .hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
222         }
223     }
224
225     @Test
226     public void testCreateControlLoops_NoDuplicates() throws Exception {
227         ControlLoops controlLoopsCreate =
228                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "NoDuplicates");
229
230         ControlLoops controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
231         assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
232
233         try (ControlLoopInstantiationProvider instantiationProvider =
234                 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
235
236             // to validate control Loop, it needs to define ToscaServiceTemplate
237             InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
238
239             InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
240             InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
241
242             assertThatThrownBy(() -> instantiationProvider.createControlLoops(controlLoopsCreate)).hasMessageMatching(
243                     controlLoopsCreate.getControlLoopList().get(0).getKey().asIdentifier() + " already defined");
244
245             for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
246                 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
247             }
248         }
249     }
250
251     @Test
252     public void testCreateControlLoops_CommissionedClElementNotFound() throws Exception {
253         ControlLoops controlLoops = InstantiationUtils
254                 .getControlLoopsFromResource(CL_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "ClElementNotFound");
255
256         try (ControlLoopInstantiationProvider provider =
257                 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
258
259             // to validate control Loop, it needs to define ToscaServiceTemplate
260             InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
261
262             assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
263
264             assertThatThrownBy(() -> provider.createControlLoops(controlLoops))
265                     .hasMessageMatching(CONTROLLOOP_ELEMENT_NAME_NOT_FOUND);
266         }
267     }
268
269     @Test
270     public void testCreateControlLoops_CommissionedClNotFound() throws Exception {
271         ControlLoops controlLoops = InstantiationUtils
272                 .getControlLoopsFromResource(CL_INSTANTIATION_CONTROLLOOP_DEFINITION_NOT_FOUND_JSON, "ClNotFound");
273
274         assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
275
276         try (ControlLoopInstantiationProvider provider =
277                 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
278             assertThatThrownBy(() -> provider.createControlLoops(controlLoops))
279                     .hasMessageMatching(CONTROLLOOP_DEFINITION_NOT_FOUND);
280         }
281     }
282
283     @Test
284     public void testIssueControlLoopCommand_OrderedStateInvalid() throws ControlLoopRuntimeException, IOException {
285         try (ControlLoopInstantiationProvider instantiationProvider =
286                 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
287             assertThatThrownBy(() -> instantiationProvider.issueControlLoopCommand(new InstantiationCommand()))
288                     .hasMessageMatching(ORDERED_STATE_INVALID);
289         }
290     }
291
292     @Test
293     public void testInstantiationVersions() throws Exception {
294
295         // create controlLoops V1
296         ControlLoops controlLoopsV1 =
297                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "V1");
298         assertThat(getControlLoopsFromDb(controlLoopsV1).getControlLoopList()).isEmpty();
299
300         try (ControlLoopInstantiationProvider instantiationProvider =
301                 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
302
303             // to validate control Loop, it needs to define ToscaServiceTemplate
304             InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
305
306             InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoopsV1),
307                     controlLoopsV1);
308
309             // create controlLoops V2
310             ControlLoops controlLoopsV2 =
311                     InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "V2");
312             assertThat(getControlLoopsFromDb(controlLoopsV2).getControlLoopList()).isEmpty();
313             InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoopsV2),
314                     controlLoopsV2);
315
316             // GET controlLoops V2
317             for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
318                 ControlLoops controlLoopsGet =
319                         instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
320                 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
321                 Assert.assertEquals(controlLoop, controlLoopsGet.getControlLoopList().get(0));
322             }
323
324             // DELETE controlLoops V1
325             for (ControlLoop controlLoop : controlLoopsV1.getControlLoopList()) {
326                 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
327             }
328
329             // GET controlLoops V1 is not available
330             for (ControlLoop controlLoop : controlLoopsV1.getControlLoopList()) {
331                 ControlLoops controlLoopsGet =
332                         instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
333                 assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
334             }
335
336             // GET controlLoops V2 is still available
337             for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
338                 ControlLoops controlLoopsGet =
339                         instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
340                 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
341                 Assert.assertEquals(controlLoop, controlLoopsGet.getControlLoopList().get(0));
342             }
343
344             // DELETE controlLoops V2
345             for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
346                 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
347             }
348
349             // GET controlLoops V2 is not available
350             for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
351                 ControlLoops controlLoopsGet =
352                         instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
353                 assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
354             }
355         }
356     }
357 }