a0940ef979ddf1694342d50bc1886155389599b2
[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.ControlLoopException;
32 import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
33 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
34 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
35 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
36 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationCommand;
37 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationResponse;
38 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
39 import org.onap.policy.models.base.PfModelException;
40 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
41 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
42
43 /**
44  * Class to perform unit test of {@link ControlLoopInstantiationProvider}}.
45  *
46  */
47 public class ControlLoopInstantiationProviderTest {
48
49     private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
50     private static final String CL_INSTANTIATION_UPDATE_JSON =
51             "src/test/resources/rest/controlloops/ControlLoopsUpdate.json";
52     private static final String CL_INSTANTIATION_CHANGE_STATE_JSON =
53             "src/test/resources/rest/controlloops/PassiveCommand.json";
54
55     private static final String CONTROL_LOOP_NOT_FOUND = "Control Loop not found";
56     private static final String DELETE_BAD_REQUEST = "Control Loop State is still %s";
57     private static final String ORDERED_STATE_INVALID = "ordered state invalid or not specified on command";
58
59     private static PolicyModelsProviderParameters databaseProviderParameters;
60
61     @BeforeClass
62     public static void setupDbProviderParameters() throws ControlLoopException, PfModelException {
63         databaseProviderParameters =
64                 CommonTestData.geParameterGroup(0, "instantproviderdb").getDatabaseProviderParameters();
65     }
66
67     @Test
68     public void testInstantiationCrud() throws Exception {
69         ControlLoops controlLoopsCreate =
70                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Crud");
71
72         ControlLoops controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
73         assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
74
75         try (ControlLoopInstantiationProvider instantiationProvider =
76                 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
77             InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
78             InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
79
80             controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
81             assertThat(controlLoopsDb.getControlLoopList()).isNotEmpty();
82             Assert.assertEquals(controlLoopsCreate, controlLoopsDb);
83
84             for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
85                 ControlLoops controlLoopsGet =
86                         instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
87                 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
88                 Assert.assertEquals(controlLoop, controlLoopsGet.getControlLoopList().get(0));
89             }
90
91             ControlLoops controlLoopsUpdate =
92                     InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Crud");
93             Assert.assertNotEquals(controlLoopsUpdate, controlLoopsDb);
94
95             instantiationResponse = instantiationProvider.updateControlLoops(controlLoopsUpdate);
96             InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsUpdate);
97
98             controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
99             assertThat(controlLoopsDb.getControlLoopList()).isNotEmpty();
100             Assert.assertEquals(controlLoopsUpdate, controlLoopsDb);
101
102             InstantiationCommand instantiationCommand =
103                     InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Crud");
104             instantiationResponse = instantiationProvider.issueControlLoopCommand(instantiationCommand);
105             InstantiationUtils.assertInstantiationResponse(instantiationResponse, instantiationCommand);
106
107             for (ToscaConceptIdentifier toscaConceptIdentifier : instantiationCommand.getControlLoopIdentifierList()) {
108                 ControlLoops controlLoopsGet = instantiationProvider.getControlLoops(toscaConceptIdentifier.getName(),
109                         toscaConceptIdentifier.getVersion());
110                 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
111                 Assert.assertEquals(instantiationCommand.getOrderedState(),
112                         controlLoopsGet.getControlLoopList().get(0).getOrderedState());
113             }
114
115             // in order to delete a controlLoop the state must be UNINITIALISED
116             controlLoopsCreate.getControlLoopList().forEach(cl -> cl.setState(ControlLoopState.UNINITIALISED));
117             instantiationProvider.updateControlLoops(controlLoopsCreate);
118
119             for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
120                 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
121             }
122
123             controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
124             assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
125         }
126     }
127
128     private ControlLoops getControlLoopsFromDb(ControlLoops controlLoopsSource) throws Exception {
129         ControlLoops controlLoopsDb = new ControlLoops();
130         controlLoopsDb.setControlLoopList(new ArrayList<>());
131
132         try (ControlLoopInstantiationProvider instantiationProvider =
133                 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
134
135             for (ControlLoop controlLoop : controlLoopsSource.getControlLoopList()) {
136                 ControlLoops controlLoopsFromDb =
137                         instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
138                 controlLoopsDb.getControlLoopList().addAll(controlLoopsFromDb.getControlLoopList());
139             }
140             return controlLoopsDb;
141         }
142     }
143
144     @Test
145     public void testInstantiationDelete() throws Exception {
146         ControlLoops controlLoops =
147                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
148         assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
149
150         ControlLoop controlLoop0 = controlLoops.getControlLoopList().get(0);
151
152         try (ControlLoopInstantiationProvider instantiationProvider =
153                 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
154
155             assertThatThrownBy(() -> {
156                 instantiationProvider.deleteControlLoop(controlLoop0.getName(), controlLoop0.getVersion());
157             }).hasMessageMatching(CONTROL_LOOP_NOT_FOUND);
158
159             InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoops),
160                     controlLoops);
161
162             for (ControlLoopState state : ControlLoopState.values()) {
163                 if (!ControlLoopState.UNINITIALISED.equals(state)) {
164                     assertThatDeleteThrownBy(controlLoops, state);
165                 }
166             }
167
168             controlLoop0.setState(ControlLoopState.UNINITIALISED);
169             instantiationProvider.updateControlLoops(controlLoops);
170
171             for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
172                 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
173             }
174
175             for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
176                 ControlLoops controlLoopsGet =
177                         instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
178                 assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
179             }
180         }
181     }
182
183     private void assertThatDeleteThrownBy(ControlLoops controlLoops, ControlLoopState state) throws Exception {
184         ControlLoop controlLoop = controlLoops.getControlLoopList().get(0);
185
186         controlLoop.setState(state);
187
188         try (ControlLoopInstantiationProvider instantiationProvider =
189                 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
190
191             instantiationProvider.updateControlLoops(controlLoops);
192             assertThatThrownBy(() -> {
193                 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
194             }).hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
195         }
196     }
197
198     @Test
199     public void testCreateControlLoops_NoDuplicates() throws Exception {
200
201         ControlLoops controlLoopsCreate =
202                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "NoDuplicates");
203
204         ControlLoops controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
205         assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
206
207         try (ControlLoopInstantiationProvider instantiationProvider =
208                 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
209             InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
210             InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
211
212             assertThatThrownBy(() -> {
213                 instantiationProvider.createControlLoops(controlLoopsCreate);
214             }).hasMessageMatching(
215                     controlLoopsCreate.getControlLoopList().get(0).getKey().asIdentifier() + " already defined");
216
217             for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
218                 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
219             }
220         }
221     }
222
223     @Test
224     public void testIssueControlLoopCommand_OrderedStateInvalid() throws ControlLoopRuntimeException, IOException {
225         try (ControlLoopInstantiationProvider instantiationProvider =
226                 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
227             assertThatThrownBy(() -> {
228                 instantiationProvider.issueControlLoopCommand(new InstantiationCommand());
229             }).hasMessageMatching(ORDERED_STATE_INVALID);
230         }
231     }
232
233     @Test
234     public void testInstantiationVersions() throws Exception {
235
236         // create controlLoops V1
237         ControlLoops controlLoopsV1 =
238                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "V1");
239         assertThat(getControlLoopsFromDb(controlLoopsV1).getControlLoopList()).isEmpty();
240
241         try (ControlLoopInstantiationProvider instantiationProvider =
242                 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
243             InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoopsV1),
244                     controlLoopsV1);
245
246             // create controlLoops V2
247             ControlLoops controlLoopsV2 =
248                     InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "V2");
249             assertThat(getControlLoopsFromDb(controlLoopsV2).getControlLoopList()).isEmpty();
250             InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoopsV2),
251                     controlLoopsV2);
252
253             // GET controlLoops V2
254             for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
255                 ControlLoops controlLoopsGet =
256                         instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
257                 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
258                 Assert.assertEquals(controlLoop, controlLoopsGet.getControlLoopList().get(0));
259             }
260
261             // DELETE controlLoops V1
262             for (ControlLoop controlLoop : controlLoopsV1.getControlLoopList()) {
263                 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
264             }
265
266             // GET controlLoops V1 is not available
267             for (ControlLoop controlLoop : controlLoopsV1.getControlLoopList()) {
268                 ControlLoops controlLoopsGet =
269                         instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
270                 assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
271             }
272
273             // GET controlLoops V2 is still available
274             for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
275                 ControlLoops controlLoopsGet =
276                         instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
277                 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
278                 Assert.assertEquals(controlLoop, controlLoopsGet.getControlLoopList().get(0));
279             }
280
281             // DELETE controlLoops V2
282             for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
283                 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
284             }
285
286             // GET controlLoops V2 is not available
287             for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
288                 ControlLoops controlLoopsGet =
289                         instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
290                 assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
291             }
292         }
293     }
294 }