2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021-2022 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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.clamp.acm.runtime.instantiation;
24 import static org.assertj.core.api.Assertions.assertThat;
25 import static org.assertj.core.api.Assertions.assertThatThrownBy;
26 import static org.junit.jupiter.api.Assertions.assertEquals;
27 import static org.junit.jupiter.api.Assertions.assertNull;
28 import static org.mockito.ArgumentMatchers.anyString;
29 import static org.mockito.Mockito.mock;
30 import static org.mockito.Mockito.verify;
31 import static org.mockito.Mockito.when;
32 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
34 import java.util.List;
35 import java.util.Optional;
36 import org.junit.jupiter.api.BeforeAll;
37 import org.junit.jupiter.api.Test;
38 import org.mockito.Mockito;
39 import org.onap.policy.clamp.acm.runtime.commissioning.CommissioningProvider;
40 import org.onap.policy.clamp.acm.runtime.supervision.SupervisionHandler;
41 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
42 import org.onap.policy.clamp.common.acm.exception.AutomationCompositionRuntimeException;
43 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
44 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionOrderedState;
45 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState;
46 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
47 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationCommand;
48 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse;
49 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
50 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
51 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
52 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
53 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
56 * Class to perform unit test of {@link AutomationCompositionInstantiationProvider}}.
59 class AutomationCompositionInstantiationProviderTest {
60 private static final String ID_NAME = "PMSH_Test_Instance";
61 private static final String ID_VERSION = "1.2.3";
62 private static final String AC_INSTANTIATION_CREATE_JSON =
63 "src/test/resources/rest/acm/AutomationCompositions.json";
64 private static final String AC_INSTANTIATION_UPDATE_JSON =
65 "src/test/resources/rest/acm/AutomationCompositionsUpdate.json";
66 private static final String AC_INSTANTIATION_CHANGE_STATE_JSON = "src/test/resources/rest/acm/PassiveCommand.json";
67 private static final String AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON =
68 "src/test/resources/rest/acm/AutomationCompositionElementsNotFound.json";
69 private static final String AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON =
70 "src/test/resources/rest/acm/AutomationCompositionsNotFound.json";
71 private static final String AUTOMATION_COMPOSITION_NOT_FOUND = "Automation composition not found";
72 private static final String DELETE_BAD_REQUEST = "Automation composition state is still %s";
73 private static final String ORDERED_STATE_INVALID = "ordered state invalid or not specified on command";
74 private static final String AC_ELEMENT_NAME_NOT_FOUND =
75 "\"AutomationCompositions\" INVALID, item has status INVALID\n"
76 + " {2}\"entry org.onap.domain.pmsh.PMSHAutomationCompositionDefinition\" "
77 + "INVALID, item has status INVALID\n"
78 + " {4}\"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not found\n"
79 + " {2}\"entry org.onap.domain.pmsh.PMSHAutomationCompositionDefinition\" "
80 + "INVALID, item has status INVALID\n"
81 + " {4}\"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not found\n";
83 private static final String AC_DEFINITION_NOT_FOUND =
84 "\"AutomationCompositions\" INVALID, item has status INVALID\n"
85 + " {2}\"entry org.onap.domain.PMSHAutomationCompositionDefinition\" INVALID, item has status INVALID\n"
86 + " {4}item \"AutomationComposition\" value \"org.onap.domain.PMSHAutomationCompositionDefinition\""
87 + " INVALID, Commissioned automation composition definition not found\n"
88 + " {2}\"entry org.onap.domain.PMSHAutomationCompositionDefinition\" INVALID, item has status INVALID\n"
89 + " {4}item \"AutomationComposition\" value \"org.onap.domain.PMSHAutomationCompositionDefinition\""
90 + " INVALID, Commissioned automation composition definition not found\n";
92 private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
95 public static void setUpBeforeClass() {
96 serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
100 void testInstanceResponse() throws Exception {
101 var participantProvider = Mockito.mock(ParticipantProvider.class);
102 var acProvider = mock(AutomationCompositionProvider.class);
103 var supervisionHandler = mock(SupervisionHandler.class);
104 var commissioningProvider = mock(CommissioningProvider.class);
106 when(commissioningProvider.getAllToscaServiceTemplate()).thenReturn(List.of(serviceTemplate));
107 when(commissioningProvider.getToscaServiceTemplate(ID_NAME, ID_VERSION)).thenReturn(serviceTemplate);
109 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
110 supervisionHandler, participantProvider);
111 var instancePropertyList = instantiationProvider.createInstanceProperties(serviceTemplate);
112 assertNull(instancePropertyList.getErrorDetails());
113 var id = new ToscaConceptIdentifier(ID_NAME, ID_VERSION);
114 assertEquals(id, instancePropertyList.getAffectedInstanceProperties().get(0));
116 AutomationCompositions automationCompositions =
117 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
118 var automationComposition = automationCompositions.getAutomationCompositionList().get(0);
119 automationComposition.setName(ID_NAME);
120 automationComposition.setVersion(ID_VERSION);
121 when(acProvider.getAutomationCompositions(ID_NAME, ID_VERSION)).thenReturn(List.of(automationComposition));
123 var updatedInstancePropertyList = instantiationProvider.createInstanceProperties(serviceTemplate);
124 assertNull(updatedInstancePropertyList.getErrorDetails());
125 var updatedId = new ToscaConceptIdentifier(ID_NAME, ID_VERSION);
126 assertEquals(updatedId, instancePropertyList.getAffectedInstanceProperties().get(0));
128 var instanceOrderState = instantiationProvider.getInstantiationOrderState(ID_NAME, ID_VERSION);
129 assertEquals(AutomationCompositionOrderedState.UNINITIALISED, instanceOrderState.getOrderedState());
130 assertEquals(ID_NAME, instanceOrderState.getAutomationCompositionIdentifierList().get(0).getName());
132 when(acProvider.findAutomationComposition(ID_NAME, ID_VERSION)).thenReturn(Optional.of(automationComposition));
133 when(acProvider.deleteAutomationComposition(ID_NAME, ID_VERSION)).thenReturn(automationComposition);
135 var instanceResponse = instantiationProvider.deleteInstanceProperties(ID_NAME, ID_VERSION);
136 assertEquals(ID_NAME, instanceResponse.getAffectedAutomationCompositions().get(0).getName());
141 void testInstantiationCrud() throws Exception {
142 var participantProvider = Mockito.mock(ParticipantProvider.class);
143 var participants = CommonTestData.createParticipants();
144 when(participantProvider.getParticipants()).thenReturn(participants);
146 var commissioningProvider = mock(CommissioningProvider.class);
147 var toscaNodeTemplate1 = new ToscaNodeTemplate();
148 toscaNodeTemplate1.setName("org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement");
149 toscaNodeTemplate1.setVersion("1.2.3");
150 when(commissioningProvider.getAutomationCompositionDefinitions(anyString(), anyString()))
151 .thenReturn(List.of(toscaNodeTemplate1));
153 var toscaNodeTemplate2 = new ToscaNodeTemplate();
154 toscaNodeTemplate2.setName("org.onap.domain.pmsh.PMSH_OperationalPolicyAutomationCompositionElement");
155 toscaNodeTemplate2.setVersion("1.2.3");
156 var toscaNodeTemplate3 = new ToscaNodeTemplate();
157 toscaNodeTemplate3.setName("org.onap.domain.pmsh.PMSH_CDS_AutomationCompositionElement");
158 toscaNodeTemplate3.setVersion("1.2.3");
159 var toscaNodeTemplate4 = new ToscaNodeTemplate();
160 toscaNodeTemplate4.setName("org.onap.domain.pmsh.PMSH_DCAEMicroservice");
161 toscaNodeTemplate4.setVersion("1.2.3");
163 when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
164 .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3, toscaNodeTemplate4));
166 var supervisionHandler = mock(SupervisionHandler.class);
167 var acProvider = mock(AutomationCompositionProvider.class);
168 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
169 supervisionHandler, participantProvider);
170 AutomationCompositions automationCompositionsCreate =
171 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
172 InstantiationResponse instantiationResponse =
173 instantiationProvider.createAutomationCompositions(automationCompositionsCreate);
174 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionsCreate);
176 verify(acProvider).saveAutomationCompositions(automationCompositionsCreate.getAutomationCompositionList());
178 for (var automationComposition : automationCompositionsCreate.getAutomationCompositionList()) {
179 when(acProvider.getAutomationCompositions(automationComposition.getName(),
180 automationComposition.getVersion())).thenReturn(List.of(automationComposition));
182 AutomationCompositions automationCompositionsGet = instantiationProvider
183 .getAutomationCompositions(automationComposition.getName(), automationComposition.getVersion());
184 assertThat(automationCompositionsGet.getAutomationCompositionList()).hasSize(1);
185 assertThat(automationComposition)
186 .isEqualTo(automationCompositionsGet.getAutomationCompositionList().get(0));
189 AutomationCompositions automationCompositionsUpdate =
190 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
192 instantiationResponse = instantiationProvider.updateAutomationCompositions(automationCompositionsUpdate);
193 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionsUpdate);
195 verify(acProvider).saveAutomationCompositions(automationCompositionsUpdate.getAutomationCompositionList());
197 for (var automationComposition : automationCompositionsUpdate.getAutomationCompositionList()) {
198 when(acProvider.findAutomationComposition(automationComposition.getKey().asIdentifier()))
199 .thenReturn(Optional.of(automationComposition));
200 when(acProvider.findAutomationComposition(automationComposition.getName(),
201 automationComposition.getVersion())).thenReturn(Optional.of(automationComposition));
202 when(acProvider.deleteAutomationComposition(automationComposition.getName(),
203 automationComposition.getVersion())).thenReturn(automationComposition);
206 InstantiationCommand instantiationCommand =
207 InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Crud");
208 instantiationResponse = instantiationProvider.issueAutomationCompositionCommand(instantiationCommand);
209 InstantiationUtils.assertInstantiationResponse(instantiationResponse, instantiationCommand);
211 verify(supervisionHandler)
212 .triggerAutomationCompositionSupervision(instantiationCommand.getAutomationCompositionIdentifierList());
214 // in order to delete a automationComposition the state must be UNINITIALISED
215 automationCompositionsCreate.getAutomationCompositionList()
216 .forEach(ac -> ac.setState(AutomationCompositionState.UNINITIALISED));
217 instantiationProvider.updateAutomationCompositions(automationCompositionsCreate);
219 for (AutomationComposition automationComposition : automationCompositionsCreate
220 .getAutomationCompositionList()) {
221 instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
222 automationComposition.getVersion());
224 verify(acProvider).deleteAutomationComposition(automationComposition.getName(),
225 automationComposition.getVersion());
230 void testInstantiationDelete() throws Exception {
232 AutomationCompositions automationCompositions =
233 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
235 AutomationComposition automationComposition0 = automationCompositions.getAutomationCompositionList().get(0);
236 var participantProvider = Mockito.mock(ParticipantProvider.class);
237 var acProvider = mock(AutomationCompositionProvider.class);
238 var supervisionHandler = mock(SupervisionHandler.class);
239 var commissioningProvider = mock(CommissioningProvider.class);
241 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
242 supervisionHandler, participantProvider);
244 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(automationComposition0.getName(),
245 automationComposition0.getVersion())).hasMessageMatching(AUTOMATION_COMPOSITION_NOT_FOUND);
247 for (AutomationCompositionState state : AutomationCompositionState.values()) {
248 if (!AutomationCompositionState.UNINITIALISED.equals(state)) {
249 assertThatDeleteThrownBy(automationCompositions, state);
252 automationComposition0.setState(AutomationCompositionState.UNINITIALISED);
254 for (AutomationComposition automationComposition : automationCompositions.getAutomationCompositionList()) {
255 when(acProvider.findAutomationComposition(automationComposition.getName(),
256 automationComposition.getVersion())).thenReturn(Optional.of(automationComposition));
257 when(acProvider.deleteAutomationComposition(automationComposition.getName(),
258 automationComposition.getVersion())).thenReturn(automationComposition);
260 instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
261 automationComposition.getVersion());
265 private void assertThatDeleteThrownBy(AutomationCompositions automationCompositions,
266 AutomationCompositionState state) throws Exception {
267 AutomationComposition automationComposition = automationCompositions.getAutomationCompositionList().get(0);
268 automationComposition.setState(state);
269 var participantProvider = Mockito.mock(ParticipantProvider.class);
270 var acProvider = mock(AutomationCompositionProvider.class);
271 var supervisionHandler = mock(SupervisionHandler.class);
272 var commissioningProvider = mock(CommissioningProvider.class);
274 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
275 supervisionHandler, participantProvider);
277 when(acProvider.findAutomationComposition(automationComposition.getName(), automationComposition.getVersion()))
278 .thenReturn(Optional.of(automationComposition));
280 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
281 automationComposition.getVersion())).hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
285 void testCreateAutomationCompositions_NoDuplicates() throws Exception {
286 var commissioningProvider = mock(CommissioningProvider.class);
288 var toscaNodeTemplate1 = new ToscaNodeTemplate();
289 toscaNodeTemplate1.setName("org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement");
290 toscaNodeTemplate1.setVersion("1.2.3");
291 when(commissioningProvider.getAutomationCompositionDefinitions(anyString(), anyString()))
292 .thenReturn(List.of(toscaNodeTemplate1));
294 var toscaNodeTemplate2 = new ToscaNodeTemplate();
295 toscaNodeTemplate2.setName("org.onap.domain.pmsh.PMSH_OperationalPolicyAutomationCompositionElement");
296 toscaNodeTemplate2.setVersion("1.2.3");
297 var toscaNodeTemplate3 = new ToscaNodeTemplate();
298 toscaNodeTemplate3.setName("org.onap.domain.pmsh.PMSH_CDS_AutomationCompositionElement");
299 toscaNodeTemplate3.setVersion("1.2.3");
300 var toscaNodeTemplate4 = new ToscaNodeTemplate();
301 toscaNodeTemplate4.setName("org.onap.domain.pmsh.PMSH_DCAEMicroservice");
302 toscaNodeTemplate4.setVersion("1.2.3");
304 when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
305 .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3, toscaNodeTemplate4));
307 AutomationCompositions automationCompositionsCreate =
308 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
310 var acProvider = mock(AutomationCompositionProvider.class);
311 var participantProvider = Mockito.mock(ParticipantProvider.class);
312 var supervisionHandler = mock(SupervisionHandler.class);
314 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
315 supervisionHandler, participantProvider);
317 InstantiationResponse instantiationResponse =
318 instantiationProvider.createAutomationCompositions(automationCompositionsCreate);
319 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionsCreate);
321 when(acProvider.findAutomationComposition(
322 automationCompositionsCreate.getAutomationCompositionList().get(0).getKey().asIdentifier()))
323 .thenReturn(Optional.of(automationCompositionsCreate.getAutomationCompositionList().get(0)));
325 assertThatThrownBy(() -> instantiationProvider.createAutomationCompositions(automationCompositionsCreate))
327 automationCompositionsCreate.getAutomationCompositionList().get(0).getKey().asIdentifier()
328 + " already defined");
332 void testCreateAutomationCompositions_CommissionedAcElementNotFound() throws Exception {
333 var toscaNodeTemplate1 = new ToscaNodeTemplate();
334 toscaNodeTemplate1.setName("org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement");
335 toscaNodeTemplate1.setVersion("1.2.3");
337 var toscaNodeTemplate2 = new ToscaNodeTemplate();
338 toscaNodeTemplate2.setName("org.onap.domain.pmsh.PMSH_OperationalPolicyAutomationCompositionElement");
339 toscaNodeTemplate2.setVersion("1.2.3");
340 var toscaNodeTemplate3 = new ToscaNodeTemplate();
341 toscaNodeTemplate3.setName("org.onap.domain.pmsh.PMSH_CDS_AutomationCompositionElement");
342 toscaNodeTemplate3.setVersion("1.2.3");
343 var commissioningProvider = mock(CommissioningProvider.class);
344 AutomationCompositions automationCompositions = InstantiationUtils.getAutomationCompositionsFromResource(
345 AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "AcElementNotFound");
347 when(commissioningProvider.getAutomationCompositionDefinitions(
348 automationCompositions.getAutomationCompositionList().get(0).getDefinition().getName(),
349 automationCompositions.getAutomationCompositionList().get(0).getDefinition().getVersion()))
350 .thenReturn(List.of(toscaNodeTemplate1));
352 when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
353 .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3));
355 var acProvider = mock(AutomationCompositionProvider.class);
356 var participantProvider = mock(ParticipantProvider.class);
357 var supervisionHandler = mock(SupervisionHandler.class);
358 var provider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
359 supervisionHandler, participantProvider);
361 assertThatThrownBy(() -> provider.createAutomationCompositions(automationCompositions))
362 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
364 assertThatThrownBy(() -> provider.updateAutomationCompositions(automationCompositions))
365 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
369 void testCreateAutomationCompositions_CommissionedAcNotFound() throws Exception {
370 AutomationCompositions automationCompositions = InstantiationUtils
371 .getAutomationCompositionsFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
373 var participantProvider = Mockito.mock(ParticipantProvider.class);
374 var acProvider = mock(AutomationCompositionProvider.class);
375 var supervisionHandler = mock(SupervisionHandler.class);
376 var commissioningProvider = mock(CommissioningProvider.class);
377 var provider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
378 supervisionHandler, participantProvider);
380 assertThatThrownBy(() -> provider.createAutomationCompositions(automationCompositions))
381 .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
383 assertThatThrownBy(() -> provider.updateAutomationCompositions(automationCompositions))
384 .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
388 void testIssueAutomationCompositionCommand_OrderedStateInvalid()
389 throws AutomationCompositionRuntimeException {
390 var participantProvider = Mockito.mock(ParticipantProvider.class);
391 var acProvider = mock(AutomationCompositionProvider.class);
392 var supervisionHandler = mock(SupervisionHandler.class);
393 var commissioningProvider = mock(CommissioningProvider.class);
394 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
395 supervisionHandler, participantProvider);
396 assertThatThrownBy(() -> instantiationProvider.issueAutomationCompositionCommand(new InstantiationCommand()))
397 .hasMessageMatching(ORDERED_STATE_INVALID);