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
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.Assert.assertEquals;
27 import static org.junit.Assert.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;
33 import java.io.IOException;
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_Instance1";
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 TOSCA_TEMPLATE_YAML =
72 "src/test/resources/rest/servicetemplates/pmsh_multiple_ac_tosca.yaml";
73 private static final String AUTOMATION_COMPOSITION_NOT_FOUND = "Automation composition not found";
74 private static final String DELETE_BAD_REQUEST = "Automation composition state is still %s";
75 private static final String ORDERED_STATE_INVALID = "ordered state invalid or not specified on command";
76 private static final String AC_ELEMENT_NAME_NOT_FOUND =
77 "\"AutomationCompositions\" INVALID, item has status INVALID\n"
78 + " \"entry org.onap.domain.pmsh.PMSHAutomationCompositionDefinition\" INVALID, item has status INVALID\n"
79 + " \"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not found\n"
80 + " \"entry org.onap.domain.pmsh.PMSHAutomationCompositionDefinition\" INVALID, item has status INVALID\n"
81 + " \"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 + " \"entry org.onap.domain.PMSHAutomationCompositionDefinition\" INVALID, item has status INVALID\n"
86 + " item \"AutomationComposition\" value \"org.onap.domain.PMSHAutomationCompositionDefinition\""
87 + " INVALID, Commissioned automation composition definition not found\n"
88 + " \"entry org.onap.domain.PMSHAutomationCompositionDefinition\" INVALID, item has status INVALID\n"
89 + " 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() throws Exception {
96 serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
100 void testIntanceResponses() 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 instanceOrderState = instantiationProvider.getInstantiationOrderState(ID_NAME, ID_VERSION);
124 assertEquals(AutomationCompositionOrderedState.UNINITIALISED, instanceOrderState.getOrderedState());
125 assertEquals(ID_NAME, instanceOrderState.getAutomationCompositionIdentifierList().get(0).getName());
127 when(acProvider.findAutomationComposition(ID_NAME, ID_VERSION)).thenReturn(Optional.of(automationComposition));
128 when(acProvider.deleteAutomationComposition(ID_NAME, ID_VERSION)).thenReturn(automationComposition);
130 var instanceResponse = instantiationProvider.deleteInstanceProperties(ID_NAME, ID_VERSION);
131 assertEquals(ID_NAME, instanceResponse.getAffectedAutomationCompositions().get(0).getName());
136 void testInstantiationCrud() throws Exception {
137 var participantProvider = Mockito.mock(ParticipantProvider.class);
138 var participants = CommonTestData.createParticipants();
139 when(participantProvider.getParticipants()).thenReturn(participants);
141 var commissioningProvider = mock(CommissioningProvider.class);
142 var toscaNodeTemplate1 = new ToscaNodeTemplate();
143 toscaNodeTemplate1.setName("org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement");
144 toscaNodeTemplate1.setVersion("1.2.3");
145 when(commissioningProvider.getAutomationCompositionDefinitions(anyString(), anyString()))
146 .thenReturn(List.of(toscaNodeTemplate1));
148 var toscaNodeTemplate2 = new ToscaNodeTemplate();
149 toscaNodeTemplate2.setName("org.onap.domain.pmsh.PMSH_OperationalPolicyAutomationCompositionElement");
150 toscaNodeTemplate2.setVersion("1.2.3");
151 var toscaNodeTemplate3 = new ToscaNodeTemplate();
152 toscaNodeTemplate3.setName("org.onap.domain.pmsh.PMSH_CDS_AutomationCompositionElement");
153 toscaNodeTemplate3.setVersion("1.2.3");
154 var toscaNodeTemplate4 = new ToscaNodeTemplate();
155 toscaNodeTemplate4.setName("org.onap.domain.pmsh.PMSH_DCAEMicroservice");
156 toscaNodeTemplate4.setVersion("1.2.3");
158 when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
159 .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3, toscaNodeTemplate4));
161 var supervisionHandler = mock(SupervisionHandler.class);
162 var acProvider = mock(AutomationCompositionProvider.class);
163 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
164 supervisionHandler, participantProvider);
165 AutomationCompositions automationCompositionsCreate =
166 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
167 InstantiationResponse instantiationResponse =
168 instantiationProvider.createAutomationCompositions(automationCompositionsCreate);
169 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionsCreate);
171 verify(acProvider).saveAutomationCompositions(automationCompositionsCreate.getAutomationCompositionList());
173 for (var automationComposition : automationCompositionsCreate.getAutomationCompositionList()) {
174 when(acProvider.getAutomationCompositions(automationComposition.getName(),
175 automationComposition.getVersion())).thenReturn(List.of(automationComposition));
177 AutomationCompositions automationCompositionsGet = instantiationProvider
178 .getAutomationCompositions(automationComposition.getName(), automationComposition.getVersion());
179 assertThat(automationCompositionsGet.getAutomationCompositionList()).hasSize(1);
180 assertThat(automationComposition)
181 .isEqualTo(automationCompositionsGet.getAutomationCompositionList().get(0));
184 AutomationCompositions automationCompositionsUpdate =
185 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
187 instantiationResponse = instantiationProvider.updateAutomationCompositions(automationCompositionsUpdate);
188 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionsUpdate);
190 verify(acProvider).saveAutomationCompositions(automationCompositionsUpdate.getAutomationCompositionList());
192 for (var automationComposition : automationCompositionsUpdate.getAutomationCompositionList()) {
193 when(acProvider.findAutomationComposition(automationComposition.getKey().asIdentifier()))
194 .thenReturn(Optional.of(automationComposition));
195 when(acProvider.findAutomationComposition(automationComposition.getName(),
196 automationComposition.getVersion())).thenReturn(Optional.of(automationComposition));
197 when(acProvider.deleteAutomationComposition(automationComposition.getName(),
198 automationComposition.getVersion())).thenReturn(automationComposition);
201 InstantiationCommand instantiationCommand =
202 InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Crud");
203 instantiationResponse = instantiationProvider.issueAutomationCompositionCommand(instantiationCommand);
204 InstantiationUtils.assertInstantiationResponse(instantiationResponse, instantiationCommand);
206 verify(supervisionHandler)
207 .triggerAutomationCompositionSupervision(instantiationCommand.getAutomationCompositionIdentifierList());
209 // in order to delete a automationComposition the state must be UNINITIALISED
210 automationCompositionsCreate.getAutomationCompositionList()
211 .forEach(ac -> ac.setState(AutomationCompositionState.UNINITIALISED));
212 instantiationProvider.updateAutomationCompositions(automationCompositionsCreate);
214 for (AutomationComposition automationComposition : automationCompositionsCreate
215 .getAutomationCompositionList()) {
216 instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
217 automationComposition.getVersion());
219 verify(acProvider).deleteAutomationComposition(automationComposition.getName(),
220 automationComposition.getVersion());
225 void testInstantiationDelete() throws Exception {
227 AutomationCompositions automationCompositions =
228 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
230 AutomationComposition automationComposition0 = automationCompositions.getAutomationCompositionList().get(0);
231 var participantProvider = Mockito.mock(ParticipantProvider.class);
232 var acProvider = mock(AutomationCompositionProvider.class);
233 var supervisionHandler = mock(SupervisionHandler.class);
234 var commissioningProvider = mock(CommissioningProvider.class);
236 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
237 supervisionHandler, participantProvider);
239 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(automationComposition0.getName(),
240 automationComposition0.getVersion())).hasMessageMatching(AUTOMATION_COMPOSITION_NOT_FOUND);
242 for (AutomationCompositionState state : AutomationCompositionState.values()) {
243 if (!AutomationCompositionState.UNINITIALISED.equals(state)) {
244 assertThatDeleteThrownBy(automationCompositions, state);
247 automationComposition0.setState(AutomationCompositionState.UNINITIALISED);
249 for (AutomationComposition automationComposition : automationCompositions.getAutomationCompositionList()) {
250 when(acProvider.findAutomationComposition(automationComposition.getName(),
251 automationComposition.getVersion())).thenReturn(Optional.of(automationComposition));
252 when(acProvider.deleteAutomationComposition(automationComposition.getName(),
253 automationComposition.getVersion())).thenReturn(automationComposition);
255 instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
256 automationComposition.getVersion());
260 private void assertThatDeleteThrownBy(AutomationCompositions automationCompositions,
261 AutomationCompositionState state) throws Exception {
262 AutomationComposition automationComposition = automationCompositions.getAutomationCompositionList().get(0);
263 automationComposition.setState(state);
264 var participantProvider = Mockito.mock(ParticipantProvider.class);
265 var acProvider = mock(AutomationCompositionProvider.class);
266 var supervisionHandler = mock(SupervisionHandler.class);
267 var commissioningProvider = mock(CommissioningProvider.class);
269 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
270 supervisionHandler, participantProvider);
272 when(acProvider.findAutomationComposition(automationComposition.getName(), automationComposition.getVersion()))
273 .thenReturn(Optional.of(automationComposition));
275 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
276 automationComposition.getVersion())).hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
280 void testCreateAutomationCompositions_NoDuplicates() throws Exception {
281 var commissioningProvider = mock(CommissioningProvider.class);
283 var toscaNodeTemplate1 = new ToscaNodeTemplate();
284 toscaNodeTemplate1.setName("org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement");
285 toscaNodeTemplate1.setVersion("1.2.3");
286 when(commissioningProvider.getAutomationCompositionDefinitions(anyString(), anyString()))
287 .thenReturn(List.of(toscaNodeTemplate1));
289 var toscaNodeTemplate2 = new ToscaNodeTemplate();
290 toscaNodeTemplate2.setName("org.onap.domain.pmsh.PMSH_OperationalPolicyAutomationCompositionElement");
291 toscaNodeTemplate2.setVersion("1.2.3");
292 var toscaNodeTemplate3 = new ToscaNodeTemplate();
293 toscaNodeTemplate3.setName("org.onap.domain.pmsh.PMSH_CDS_AutomationCompositionElement");
294 toscaNodeTemplate3.setVersion("1.2.3");
295 var toscaNodeTemplate4 = new ToscaNodeTemplate();
296 toscaNodeTemplate4.setName("org.onap.domain.pmsh.PMSH_DCAEMicroservice");
297 toscaNodeTemplate4.setVersion("1.2.3");
299 when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
300 .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3, toscaNodeTemplate4));
302 AutomationCompositions automationCompositionsCreate =
303 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
305 var acProvider = mock(AutomationCompositionProvider.class);
306 var participantProvider = Mockito.mock(ParticipantProvider.class);
307 var supervisionHandler = mock(SupervisionHandler.class);
309 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
310 supervisionHandler, participantProvider);
312 InstantiationResponse instantiationResponse =
313 instantiationProvider.createAutomationCompositions(automationCompositionsCreate);
314 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionsCreate);
316 when(acProvider.findAutomationComposition(
317 automationCompositionsCreate.getAutomationCompositionList().get(0).getKey().asIdentifier()))
318 .thenReturn(Optional.of(automationCompositionsCreate.getAutomationCompositionList().get(0)));
320 assertThatThrownBy(() -> instantiationProvider.createAutomationCompositions(automationCompositionsCreate))
322 automationCompositionsCreate.getAutomationCompositionList().get(0).getKey().asIdentifier()
323 + " already defined");
327 void testCreateAutomationCompositions_CommissionedAcElementNotFound() throws Exception {
328 var toscaNodeTemplate1 = new ToscaNodeTemplate();
329 toscaNodeTemplate1.setName("org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement");
330 toscaNodeTemplate1.setVersion("1.2.3");
332 var toscaNodeTemplate2 = new ToscaNodeTemplate();
333 toscaNodeTemplate2.setName("org.onap.domain.pmsh.PMSH_OperationalPolicyAutomationCompositionElement");
334 toscaNodeTemplate2.setVersion("1.2.3");
335 var toscaNodeTemplate3 = new ToscaNodeTemplate();
336 toscaNodeTemplate3.setName("org.onap.domain.pmsh.PMSH_CDS_AutomationCompositionElement");
337 toscaNodeTemplate3.setVersion("1.2.3");
338 var commissioningProvider = mock(CommissioningProvider.class);
339 AutomationCompositions automationCompositions = InstantiationUtils.getAutomationCompositionsFromResource(
340 AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "AcElementNotFound");
342 when(commissioningProvider.getAutomationCompositionDefinitions(
343 automationCompositions.getAutomationCompositionList().get(0).getDefinition().getName(),
344 automationCompositions.getAutomationCompositionList().get(0).getDefinition().getVersion()))
345 .thenReturn(List.of(toscaNodeTemplate1));
347 when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
348 .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3));
350 var acProvider = mock(AutomationCompositionProvider.class);
351 var participantProvider = mock(ParticipantProvider.class);
352 var supervisionHandler = mock(SupervisionHandler.class);
353 var provider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
354 supervisionHandler, participantProvider);
356 assertThatThrownBy(() -> provider.createAutomationCompositions(automationCompositions))
357 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
359 assertThatThrownBy(() -> provider.updateAutomationCompositions(automationCompositions))
360 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
364 void testCreateAutomationCompositions_CommissionedAcNotFound() throws Exception {
365 AutomationCompositions automationCompositions = InstantiationUtils
366 .getAutomationCompositionsFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
368 var participantProvider = Mockito.mock(ParticipantProvider.class);
369 var acProvider = mock(AutomationCompositionProvider.class);
370 var supervisionHandler = mock(SupervisionHandler.class);
371 var commissioningProvider = mock(CommissioningProvider.class);
372 var provider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
373 supervisionHandler, participantProvider);
375 assertThatThrownBy(() -> provider.createAutomationCompositions(automationCompositions))
376 .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
378 assertThatThrownBy(() -> provider.updateAutomationCompositions(automationCompositions))
379 .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
383 void testIssueAutomationCompositionCommand_OrderedStateInvalid()
384 throws AutomationCompositionRuntimeException, IOException {
385 var participantProvider = Mockito.mock(ParticipantProvider.class);
386 var acProvider = mock(AutomationCompositionProvider.class);
387 var supervisionHandler = mock(SupervisionHandler.class);
388 var commissioningProvider = mock(CommissioningProvider.class);
389 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
390 supervisionHandler, participantProvider);
391 assertThatThrownBy(() -> instantiationProvider.issueAutomationCompositionCommand(new InstantiationCommand()))
392 .hasMessageMatching(ORDERED_STATE_INVALID);