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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.clamp.controlloop.runtime.instantiation;
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
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;
43 * Class to perform unit test of {@link ControlLoopInstantiationProvider}}.
46 public class ControlLoopInstantiationProviderTest {
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";
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";
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";
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";
74 private static PolicyModelsProviderParameters databaseProviderParameters;
77 * setup Db Provider Parameters.
79 * @throws PfModelException if an error occurs
82 public static void setupDbProviderParameters() throws PfModelException {
83 databaseProviderParameters =
84 CommonTestData.geParameterGroup(0, "instantproviderdb").getDatabaseProviderParameters();
88 public void testInstantiationCrud() throws Exception {
89 ControlLoops controlLoopsCreate =
90 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Crud");
92 ControlLoops controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
93 assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
95 try (ControlLoopInstantiationProvider instantiationProvider =
96 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
98 // to validate control Loop, it needs to define ToscaServiceTemplate
99 InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
101 InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
102 InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
104 controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
105 assertThat(controlLoopsDb.getControlLoopList()).isNotEmpty();
106 Assert.assertEquals(controlLoopsCreate, controlLoopsDb);
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));
115 ControlLoops controlLoopsUpdate =
116 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Crud");
117 Assert.assertNotEquals(controlLoopsUpdate, controlLoopsDb);
119 instantiationResponse = instantiationProvider.updateControlLoops(controlLoopsUpdate);
120 InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsUpdate);
122 controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
123 assertThat(controlLoopsDb.getControlLoopList()).isNotEmpty();
124 Assert.assertEquals(controlLoopsUpdate, controlLoopsDb);
126 InstantiationCommand instantiationCommand =
127 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Crud");
128 instantiationResponse = instantiationProvider.issueControlLoopCommand(instantiationCommand);
129 InstantiationUtils.assertInstantiationResponse(instantiationResponse, instantiationCommand);
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());
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);
143 for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
144 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
147 controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
148 assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
152 private ControlLoops getControlLoopsFromDb(ControlLoops controlLoopsSource) throws Exception {
153 ControlLoops controlLoopsDb = new ControlLoops();
154 controlLoopsDb.setControlLoopList(new ArrayList<>());
156 try (ControlLoopInstantiationProvider instantiationProvider =
157 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
159 for (ControlLoop controlLoop : controlLoopsSource.getControlLoopList()) {
160 ControlLoops controlLoopsFromDb =
161 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
162 controlLoopsDb.getControlLoopList().addAll(controlLoopsFromDb.getControlLoopList());
164 return controlLoopsDb;
169 public void testInstantiationDelete() throws Exception {
170 ControlLoops controlLoops =
171 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
172 assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
174 ControlLoop controlLoop0 = controlLoops.getControlLoopList().get(0);
176 try (ControlLoopInstantiationProvider instantiationProvider =
177 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
179 // to validate control Loop, it needs to define ToscaServiceTemplate
180 InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
183 () -> instantiationProvider.deleteControlLoop(controlLoop0.getName(), controlLoop0.getVersion()))
184 .hasMessageMatching(CONTROL_LOOP_NOT_FOUND);
186 InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoops),
189 for (ControlLoopState state : ControlLoopState.values()) {
190 if (!ControlLoopState.UNINITIALISED.equals(state)) {
191 assertThatDeleteThrownBy(controlLoops, state);
195 controlLoop0.setState(ControlLoopState.UNINITIALISED);
196 instantiationProvider.updateControlLoops(controlLoops);
198 for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
199 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
202 for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
203 ControlLoops controlLoopsGet =
204 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
205 assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
210 private void assertThatDeleteThrownBy(ControlLoops controlLoops, ControlLoopState state) throws Exception {
211 ControlLoop controlLoop = controlLoops.getControlLoopList().get(0);
213 controlLoop.setState(state);
215 try (ControlLoopInstantiationProvider instantiationProvider =
216 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
218 instantiationProvider.updateControlLoops(controlLoops);
220 () -> instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion()))
221 .hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
226 public void testCreateControlLoops_NoDuplicates() throws Exception {
227 ControlLoops controlLoopsCreate =
228 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "NoDuplicates");
230 ControlLoops controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
231 assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
233 try (ControlLoopInstantiationProvider instantiationProvider =
234 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
236 // to validate control Loop, it needs to define ToscaServiceTemplate
237 InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
239 InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
240 InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
242 assertThatThrownBy(() -> instantiationProvider.createControlLoops(controlLoopsCreate)).hasMessageMatching(
243 controlLoopsCreate.getControlLoopList().get(0).getKey().asIdentifier() + " already defined");
245 for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
246 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
252 public void testCreateControlLoops_CommissionedClElementNotFound() throws Exception {
253 ControlLoops controlLoops = InstantiationUtils
254 .getControlLoopsFromResource(CL_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "ClElementNotFound");
256 try (ControlLoopInstantiationProvider provider =
257 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
259 // to validate control Loop, it needs to define ToscaServiceTemplate
260 InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
262 assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
264 assertThatThrownBy(() -> provider.createControlLoops(controlLoops))
265 .hasMessageMatching(CONTROLLOOP_ELEMENT_NAME_NOT_FOUND);
270 public void testCreateControlLoops_CommissionedClNotFound() throws Exception {
271 ControlLoops controlLoops = InstantiationUtils
272 .getControlLoopsFromResource(CL_INSTANTIATION_CONTROLLOOP_DEFINITION_NOT_FOUND_JSON, "ClNotFound");
274 assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
276 try (ControlLoopInstantiationProvider provider =
277 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
278 assertThatThrownBy(() -> provider.createControlLoops(controlLoops))
279 .hasMessageMatching(CONTROLLOOP_DEFINITION_NOT_FOUND);
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);
293 public void testInstantiationVersions() throws Exception {
295 // create controlLoops V1
296 ControlLoops controlLoopsV1 =
297 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "V1");
298 assertThat(getControlLoopsFromDb(controlLoopsV1).getControlLoopList()).isEmpty();
300 try (ControlLoopInstantiationProvider instantiationProvider =
301 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
303 // to validate control Loop, it needs to define ToscaServiceTemplate
304 InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, databaseProviderParameters);
306 InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoopsV1),
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),
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));
324 // DELETE controlLoops V1
325 for (ControlLoop controlLoop : controlLoopsV1.getControlLoopList()) {
326 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
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();
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));
344 // DELETE controlLoops V2
345 for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
346 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
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();