caad5a4e9890b669142e60167ed064e2d97b716b
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2021 Nordix Foundation.
4  *  Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
5  * ================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.clamp.controlloop.runtime.instantiation;
23
24 import static org.assertj.core.api.Assertions.assertThat;
25 import static org.assertj.core.api.Assertions.assertThatThrownBy;
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertNotNull;
28 import static org.junit.Assert.assertNull;
29 import static org.mockito.Mockito.mock;
30 import static org.mockito.Mockito.when;
31
32 import java.io.IOException;
33 import java.util.ArrayList;
34 import org.junit.jupiter.api.AfterAll;
35 import org.junit.jupiter.api.AfterEach;
36 import org.junit.jupiter.api.BeforeAll;
37 import org.junit.jupiter.api.BeforeEach;
38 import org.junit.jupiter.api.Test;
39 import org.mockito.Mockito;
40 import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
41 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
42 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
43 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
44 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
45 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ClElementStatisticsProvider;
46 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
47 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider;
48 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantStatisticsProvider;
49 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ServiceTemplateProvider;
50 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationCommand;
51 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationResponse;
52 import org.onap.policy.clamp.controlloop.runtime.commissioning.CommissioningProvider;
53 import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
54 import org.onap.policy.clamp.controlloop.runtime.monitoring.MonitoringProvider;
55 import org.onap.policy.clamp.controlloop.runtime.supervision.SupervisionHandler;
56 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ControlLoopStateChangePublisher;
57 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ControlLoopUpdatePublisher;
58 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantDeregisterAckPublisher;
59 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantRegisterAckPublisher;
60 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantUpdatePublisher;
61 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
62 import org.onap.policy.models.base.PfModelException;
63 import org.onap.policy.models.provider.PolicyModelsProvider;
64 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
65 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
66
67 /**
68  * Class to perform unit test of {@link ControlLoopInstantiationProvider}}.
69  *
70  */
71 class ControlLoopInstantiationProviderTest {
72     private static final String ID_NAME = "PMSH_Instance1";
73     private static final String ID_VERSION = "1.2.3";
74     private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
75     private static final String CL_INSTANTIATION_UPDATE_JSON =
76             "src/test/resources/rest/controlloops/ControlLoopsUpdate.json";
77     private static final String CL_INSTANTIATION_CHANGE_STATE_JSON =
78             "src/test/resources/rest/controlloops/PassiveCommand.json";
79     private static final String CL_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON =
80             "src/test/resources/rest/controlloops/ControlLoopElementsNotFound.json";
81     private static final String CL_INSTANTIATION_CONTROLLOOP_DEFINITION_NOT_FOUND_JSON =
82             "src/test/resources/rest/controlloops/ControlLoopsNotFound.json";
83     private static final String TOSCA_TEMPLATE_YAML =
84             "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
85     private static final String CONTROL_LOOP_NOT_FOUND = "Control Loop not found";
86     private static final String DELETE_BAD_REQUEST = "Control Loop State is still %s";
87     private static final String ORDERED_STATE_INVALID = "ordered state invalid or not specified on command";
88     private static final String CONTROLLOOP_ELEMENT_NAME_NOT_FOUND =
89             "\"ControlLoops\" INVALID, item has status INVALID\n"
90                     + "  \"entry org.onap.domain.pmsh.PMSHControlLoopDefinition\" INVALID, item has status INVALID\n"
91                     + "    \"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not FOUND\n"
92                     + "  \"entry org.onap.domain.pmsh.PMSHControlLoopDefinition\" INVALID, item has status INVALID\n"
93                     + "    \"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not FOUND\n";
94
95     private static final String CONTROLLOOP_DEFINITION_NOT_FOUND = "\"ControlLoops\" INVALID, item has status INVALID\n"
96             + "  \"entry org.onap.domain.PMSHControlLoopDefinition\" INVALID, item has status INVALID\n"
97             + "    item \"ControlLoop\" value \"org.onap.domain.PMSHControlLoopDefinition\" INVALID,"
98             + " Commissioned control loop definition not FOUND\n"
99             + "  \"entry org.onap.domain.PMSHControlLoopDefinition\" INVALID, item has status INVALID\n"
100             + "    item \"ControlLoop\" value \"org.onap.domain.PMSHControlLoopDefinition\" INVALID,"
101             + " Commissioned control loop definition not FOUND\n";
102
103     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
104
105     private static SupervisionHandler supervisionHandler;
106     private static CommissioningProvider commissioningProvider;
107     private static ControlLoopProvider clProvider;
108     private static PolicyModelsProvider modelsProvider;
109
110     @BeforeAll
111     public static void setUpBeforeClass() throws Exception {
112         serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
113     }
114
115     /**
116      * setup Db Provider Parameters.
117      *
118      * @throws PfModelException if an error occurs
119      */
120     @BeforeAll
121     public static void setupDbProviderParameters() throws PfModelException {
122         ClRuntimeParameterGroup controlLoopParameters = CommonTestData.geParameterGroup("instantproviderdb");
123
124         modelsProvider = CommonTestData.getPolicyModelsProvider(controlLoopParameters.getDatabaseProviderParameters());
125         clProvider = new ControlLoopProvider(controlLoopParameters.getDatabaseProviderParameters());
126         var participantProvider = Mockito.mock(ParticipantProvider.class);
127
128         var participantStatisticsProvider = Mockito.mock(ParticipantStatisticsProvider.class);
129         var clElementStatisticsProvider = mock(ClElementStatisticsProvider.class);
130         commissioningProvider = new CommissioningProvider(new ServiceTemplateProvider(modelsProvider), clProvider, null,
131                 participantProvider);
132         var monitoringProvider =
133                 new MonitoringProvider(participantStatisticsProvider, clElementStatisticsProvider, clProvider);
134         var controlLoopUpdatePublisher = Mockito.mock(ControlLoopUpdatePublisher.class);
135         var controlLoopStateChangePublisher = Mockito.mock(ControlLoopStateChangePublisher.class);
136         var participantRegisterAckPublisher = Mockito.mock(ParticipantRegisterAckPublisher.class);
137         var participantDeregisterAckPublisher = Mockito.mock(ParticipantDeregisterAckPublisher.class);
138         var participantUpdatePublisher = Mockito.mock(ParticipantUpdatePublisher.class);
139         var serviceTemplateProvider = Mockito.mock(ServiceTemplateProvider.class);
140
141         supervisionHandler = new SupervisionHandler(clProvider, participantProvider, monitoringProvider,
142                 serviceTemplateProvider, controlLoopUpdatePublisher, controlLoopStateChangePublisher,
143                 participantRegisterAckPublisher, participantDeregisterAckPublisher, participantUpdatePublisher);
144     }
145
146     @BeforeEach
147     public void populateDb() throws Exception {
148         createEntryInDB();
149     }
150
151     @AfterAll
152     public static void closeDbProvider() throws PfModelException {
153         clProvider.close();
154         modelsProvider.close();
155     }
156
157     @AfterEach
158     public void cleanDatabase() throws Exception {
159         deleteEntryInDB(serviceTemplate.getName(), serviceTemplate.getVersion());
160     }
161
162     @Test
163     void testIntanceResponses() throws PfModelException {
164         var participantProvider = Mockito.mock(ParticipantProvider.class);
165         var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
166                 supervisionHandler, participantProvider);
167         var instancePropertyList = instantiationProvider.createInstanceProperties(serviceTemplate);
168         assertNull(instancePropertyList.getErrorDetails());
169         var id = new ToscaConceptIdentifier(ID_NAME, ID_VERSION);
170         assertEquals(id, instancePropertyList.getAffectedInstanceProperties().get(0));
171         var instanceOrderState = instantiationProvider.getInstantiationOrderState(ID_NAME, ID_VERSION);
172         assertEquals(ControlLoopOrderedState.UNINITIALISED, instanceOrderState.getOrderedState());
173         assertEquals(ID_NAME, instanceOrderState.getControlLoopIdentifierList().get(0).getName());
174
175         assertNotNull(clProvider.getControlLoop(id));
176         var instanceResponse = instantiationProvider.deleteInstanceProperties(ID_NAME, ID_VERSION);
177         assertEquals(ID_NAME, instanceResponse.getAffectedControlLoops().get(0).getName());
178         assertNull(clProvider.getControlLoop(id));
179     }
180
181     @Test
182     void testInstantiationCrud() throws Exception {
183         var participantProvider = Mockito.mock(ParticipantProvider.class);
184         var participants = CommonTestData.createParticipants();
185         when(participantProvider.getParticipants()).thenReturn(participants);
186
187         ControlLoops controlLoopsCreate =
188                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Crud");
189         ControlLoops controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
190         assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
191         var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
192                 supervisionHandler, participantProvider);
193         InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
194         InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
195
196         controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
197         assertThat(controlLoopsDb.getControlLoopList()).isNotEmpty();
198         assertThat(controlLoopsCreate).isEqualTo(controlLoopsDb);
199
200         for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
201             ControlLoops controlLoopsGet =
202                     instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
203             assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
204             assertThat(controlLoop).isEqualTo(controlLoopsGet.getControlLoopList().get(0));
205         }
206
207         ControlLoops controlLoopsUpdate =
208                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Crud");
209         assertThat(controlLoopsUpdate).isNotEqualTo(controlLoopsDb);
210
211         instantiationResponse = instantiationProvider.updateControlLoops(controlLoopsUpdate);
212         InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsUpdate);
213
214         controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
215         assertThat(controlLoopsDb.getControlLoopList()).isNotEmpty();
216         assertThat(controlLoopsUpdate).isEqualTo(controlLoopsDb);
217
218         InstantiationCommand instantiationCommand =
219                 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Crud");
220         instantiationResponse = instantiationProvider.issueControlLoopCommand(instantiationCommand);
221         InstantiationUtils.assertInstantiationResponse(instantiationResponse, instantiationCommand);
222
223         for (ToscaConceptIdentifier toscaConceptIdentifier : instantiationCommand.getControlLoopIdentifierList()) {
224             ControlLoops controlLoopsGet = instantiationProvider.getControlLoops(toscaConceptIdentifier.getName(),
225                     toscaConceptIdentifier.getVersion());
226             assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
227             assertThat(instantiationCommand.getOrderedState())
228                     .isEqualTo(controlLoopsGet.getControlLoopList().get(0).getOrderedState());
229         }
230
231         // in order to delete a controlLoop the state must be UNINITIALISED
232         controlLoopsCreate.getControlLoopList().forEach(cl -> cl.setState(ControlLoopState.UNINITIALISED));
233         instantiationProvider.updateControlLoops(controlLoopsCreate);
234
235         for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
236             instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
237         }
238
239         controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
240         assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
241     }
242
243     private ControlLoops getControlLoopsFromDb(ControlLoops controlLoopsSource) throws Exception {
244
245         ControlLoops controlLoopsDb = new ControlLoops();
246         controlLoopsDb.setControlLoopList(new ArrayList<>());
247         var participantProvider = Mockito.mock(ParticipantProvider.class);
248
249         var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
250                 supervisionHandler, participantProvider);
251
252         for (ControlLoop controlLoop : controlLoopsSource.getControlLoopList()) {
253             ControlLoops controlLoopsFromDb =
254                     instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
255             controlLoopsDb.getControlLoopList().addAll(controlLoopsFromDb.getControlLoopList());
256         }
257         return controlLoopsDb;
258     }
259
260     @Test
261     void testInstantiationDelete() throws Exception {
262
263         ControlLoops controlLoops =
264                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
265         assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
266
267         ControlLoop controlLoop0 = controlLoops.getControlLoopList().get(0);
268         var participantProvider = Mockito.mock(ParticipantProvider.class);
269
270         var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
271                 supervisionHandler, participantProvider);
272
273         assertThatThrownBy(
274                 () -> instantiationProvider.deleteControlLoop(controlLoop0.getName(), controlLoop0.getVersion()))
275                         .hasMessageMatching(CONTROL_LOOP_NOT_FOUND);
276
277         InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoops),
278                 controlLoops);
279
280         for (ControlLoopState state : ControlLoopState.values()) {
281             if (!ControlLoopState.UNINITIALISED.equals(state)) {
282                 assertThatDeleteThrownBy(controlLoops, state);
283             }
284         }
285
286         controlLoop0.setState(ControlLoopState.UNINITIALISED);
287         instantiationProvider.updateControlLoops(controlLoops);
288
289         for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
290             instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
291         }
292
293         for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
294             ControlLoops controlLoopsGet =
295                     instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
296             assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
297         }
298     }
299
300     private void assertThatDeleteThrownBy(ControlLoops controlLoops, ControlLoopState state) throws Exception {
301         ControlLoop controlLoop = controlLoops.getControlLoopList().get(0);
302         controlLoop.setState(state);
303         var participantProvider = Mockito.mock(ParticipantProvider.class);
304
305         var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
306                 supervisionHandler, participantProvider);
307
308         instantiationProvider.updateControlLoops(controlLoops);
309         assertThatThrownBy(
310                 () -> instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion()))
311                         .hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
312     }
313
314     @Test
315     void testCreateControlLoops_NoDuplicates() throws Exception {
316
317         ControlLoops controlLoopsCreate =
318                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "NoDuplicates");
319
320         ControlLoops controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
321         assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
322
323         var participantProvider = Mockito.mock(ParticipantProvider.class);
324         var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
325                 supervisionHandler, participantProvider);
326
327         InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
328         InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
329
330         assertThatThrownBy(() -> instantiationProvider.createControlLoops(controlLoopsCreate)).hasMessageMatching(
331                 controlLoopsCreate.getControlLoopList().get(0).getKey().asIdentifier() + " already defined");
332
333         for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
334             instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
335         }
336     }
337
338     @Test
339     void testCreateControlLoops_CommissionedClElementNotFound() throws Exception {
340
341         ControlLoops controlLoops = InstantiationUtils
342                 .getControlLoopsFromResource(CL_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "ClElementNotFound");
343
344         var participantProvider = Mockito.mock(ParticipantProvider.class);
345         var provider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider, supervisionHandler,
346                 participantProvider);
347
348         // to validate control Loop, it needs to define ToscaServiceTemplate
349         // InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, commissioningProvider);
350
351         assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
352
353         assertThatThrownBy(() -> provider.createControlLoops(controlLoops))
354                 .hasMessageMatching(CONTROLLOOP_ELEMENT_NAME_NOT_FOUND);
355     }
356
357     @Test
358     void testCreateControlLoops_CommissionedClNotFound() throws Exception {
359         ControlLoops controlLoops = InstantiationUtils
360                 .getControlLoopsFromResource(CL_INSTANTIATION_CONTROLLOOP_DEFINITION_NOT_FOUND_JSON, "ClNotFound");
361
362         assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
363
364         var participantProvider = Mockito.mock(ParticipantProvider.class);
365         var provider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider, supervisionHandler,
366                 participantProvider);
367         assertThatThrownBy(() -> provider.createControlLoops(controlLoops))
368                 .hasMessageMatching(CONTROLLOOP_DEFINITION_NOT_FOUND);
369     }
370
371     @Test
372     void testIssueControlLoopCommand_OrderedStateInvalid() throws ControlLoopRuntimeException, IOException {
373         var participantProvider = Mockito.mock(ParticipantProvider.class);
374         var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
375                 supervisionHandler, participantProvider);
376         assertThatThrownBy(() -> instantiationProvider.issueControlLoopCommand(new InstantiationCommand()))
377                 .hasMessageMatching(ORDERED_STATE_INVALID);
378     }
379
380     @Test
381     void testInstantiationVersions() throws Exception {
382         // create controlLoops V1
383         ControlLoops controlLoopsV1 =
384                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "V1");
385         assertThat(getControlLoopsFromDb(controlLoopsV1).getControlLoopList()).isEmpty();
386
387         var participantProvider = Mockito.mock(ParticipantProvider.class);
388         var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
389                 supervisionHandler, participantProvider);
390
391         InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoopsV1),
392                 controlLoopsV1);
393
394         // create controlLoops V2
395         ControlLoops controlLoopsV2 =
396                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "V2");
397         assertThat(getControlLoopsFromDb(controlLoopsV2).getControlLoopList()).isEmpty();
398         InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoopsV2),
399                 controlLoopsV2);
400
401         // GET controlLoops V2
402         for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
403             ControlLoops controlLoopsGet =
404                     instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
405             assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
406             assertThat(controlLoop).isEqualTo(controlLoopsGet.getControlLoopList().get(0));
407         }
408
409         // DELETE controlLoops V1
410         for (ControlLoop controlLoop : controlLoopsV1.getControlLoopList()) {
411             instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
412         }
413
414         // GET controlLoops V1 is not available
415         for (ControlLoop controlLoop : controlLoopsV1.getControlLoopList()) {
416             ControlLoops controlLoopsGet =
417                     instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
418             assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
419         }
420
421         // GET controlLoops V2 is still available
422         for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
423             ControlLoops controlLoopsGet =
424                     instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
425             assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
426             assertThat(controlLoop).isEqualTo(controlLoopsGet.getControlLoopList().get(0));
427         }
428
429         // DELETE controlLoops V2
430         for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
431             instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
432         }
433
434         // GET controlLoops V2 is not available
435         for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
436             ControlLoops controlLoopsGet =
437                     instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
438             assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
439         }
440     }
441
442     private synchronized void deleteEntryInDB(String name, String version) throws Exception {
443         if (!modelsProvider.getServiceTemplateList(null, null).isEmpty()) {
444             modelsProvider.deleteServiceTemplate(name, version);
445         }
446     }
447
448     private synchronized void createEntryInDB() throws Exception {
449         try {
450             deleteEntryInDB(serviceTemplate.getName(), serviceTemplate.getVersion());
451             modelsProvider.createServiceTemplate(serviceTemplate);
452         } catch (Exception e) {
453             e.printStackTrace();
454         }
455     }
456 }