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.mockito.ArgumentMatchers.anyString;
27 import static org.mockito.Mockito.mock;
28 import static org.mockito.Mockito.verify;
29 import static org.mockito.Mockito.when;
31 import java.util.List;
32 import java.util.Optional;
33 import org.junit.jupiter.api.Test;
34 import org.mockito.Mockito;
35 import org.onap.policy.clamp.acm.runtime.commissioning.CommissioningProvider;
36 import org.onap.policy.clamp.acm.runtime.supervision.SupervisionHandler;
37 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
38 import org.onap.policy.clamp.common.acm.exception.AutomationCompositionRuntimeException;
39 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
40 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState;
41 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
42 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationCommand;
43 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse;
44 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
45 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
46 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
49 * Class to perform unit test of {@link AutomationCompositionInstantiationProvider}}.
52 class AutomationCompositionInstantiationProviderTest {
53 private static final String AC_INSTANTIATION_CREATE_JSON =
54 "src/test/resources/rest/acm/AutomationCompositions.json";
55 private static final String AC_INSTANTIATION_UPDATE_JSON =
56 "src/test/resources/rest/acm/AutomationCompositionsUpdate.json";
57 private static final String AC_INSTANTIATION_CHANGE_STATE_JSON = "src/test/resources/rest/acm/PassiveCommand.json";
58 private static final String AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON =
59 "src/test/resources/rest/acm/AutomationCompositionElementsNotFound.json";
60 private static final String AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON =
61 "src/test/resources/rest/acm/AutomationCompositionsNotFound.json";
62 private static final String AUTOMATION_COMPOSITION_NOT_FOUND = "Automation composition not found";
63 private static final String DELETE_BAD_REQUEST = "Automation composition state is still %s";
64 private static final String ORDERED_STATE_INVALID = "ordered state invalid or not specified on command";
65 private static final String AC_ELEMENT_NAME_NOT_FOUND =
66 "\"AutomationCompositions\" INVALID, item has status INVALID\n"
67 + " {2}\"entry org.onap.domain.pmsh.PMSHAutomationCompositionDefinition\" "
68 + "INVALID, item has status INVALID\n"
69 + " {4}\"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not found\n"
70 + " {2}\"entry org.onap.domain.pmsh.PMSHAutomationCompositionDefinition\" "
71 + "INVALID, item has status INVALID\n"
72 + " {4}\"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not found\n";
74 private static final String AC_DEFINITION_NOT_FOUND =
75 "\"AutomationCompositions\" INVALID, item has status INVALID\n"
76 + " {2}\"entry org.onap.domain.PMSHAutomationCompositionDefinition\" INVALID, item has status INVALID\n"
77 + " {4}item \"AutomationComposition\" value \"org.onap.domain.PMSHAutomationCompositionDefinition\""
78 + " INVALID, Commissioned automation composition definition not found\n"
79 + " {2}\"entry org.onap.domain.PMSHAutomationCompositionDefinition\" INVALID, item has status INVALID\n"
80 + " {4}item \"AutomationComposition\" value \"org.onap.domain.PMSHAutomationCompositionDefinition\""
81 + " INVALID, Commissioned automation composition definition not found\n";
84 void testInstantiationCrud() throws Exception {
85 var participantProvider = Mockito.mock(ParticipantProvider.class);
86 var participants = CommonTestData.createParticipants();
87 when(participantProvider.getParticipants()).thenReturn(participants);
89 var commissioningProvider = mock(CommissioningProvider.class);
90 var toscaNodeTemplate1 = new ToscaNodeTemplate();
91 toscaNodeTemplate1.setName("org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement");
92 toscaNodeTemplate1.setVersion("1.2.3");
93 when(commissioningProvider.getAutomationCompositionDefinitions(anyString(), anyString()))
94 .thenReturn(List.of(toscaNodeTemplate1));
96 var toscaNodeTemplate2 = new ToscaNodeTemplate();
97 toscaNodeTemplate2.setName("org.onap.domain.pmsh.PMSH_OperationalPolicyAutomationCompositionElement");
98 toscaNodeTemplate2.setVersion("1.2.3");
99 var toscaNodeTemplate3 = new ToscaNodeTemplate();
100 toscaNodeTemplate3.setName("org.onap.domain.pmsh.PMSH_CDS_AutomationCompositionElement");
101 toscaNodeTemplate3.setVersion("1.2.3");
102 var toscaNodeTemplate4 = new ToscaNodeTemplate();
103 toscaNodeTemplate4.setName("org.onap.domain.pmsh.PMSH_DCAEMicroservice");
104 toscaNodeTemplate4.setVersion("1.2.3");
106 when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
107 .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3, toscaNodeTemplate4));
109 var supervisionHandler = mock(SupervisionHandler.class);
110 var acProvider = mock(AutomationCompositionProvider.class);
111 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
112 supervisionHandler, participantProvider);
113 AutomationCompositions automationCompositionsCreate =
114 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
115 InstantiationResponse instantiationResponse =
116 instantiationProvider.createAutomationCompositions(automationCompositionsCreate);
117 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionsCreate);
119 verify(acProvider).saveAutomationCompositions(automationCompositionsCreate.getAutomationCompositionList());
121 for (var automationComposition : automationCompositionsCreate.getAutomationCompositionList()) {
122 when(acProvider.getAutomationCompositions(automationComposition.getName(),
123 automationComposition.getVersion())).thenReturn(List.of(automationComposition));
125 AutomationCompositions automationCompositionsGet = instantiationProvider
126 .getAutomationCompositions(automationComposition.getName(), automationComposition.getVersion());
127 assertThat(automationCompositionsGet.getAutomationCompositionList()).hasSize(1);
128 assertThat(automationComposition)
129 .isEqualTo(automationCompositionsGet.getAutomationCompositionList().get(0));
132 AutomationCompositions automationCompositionsUpdate =
133 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
135 instantiationResponse = instantiationProvider.updateAutomationCompositions(automationCompositionsUpdate);
136 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionsUpdate);
138 verify(acProvider).saveAutomationCompositions(automationCompositionsUpdate.getAutomationCompositionList());
140 for (var automationComposition : automationCompositionsUpdate.getAutomationCompositionList()) {
141 when(acProvider.findAutomationComposition(automationComposition.getKey().asIdentifier()))
142 .thenReturn(Optional.of(automationComposition));
143 when(acProvider.findAutomationComposition(automationComposition.getName(),
144 automationComposition.getVersion())).thenReturn(Optional.of(automationComposition));
145 when(acProvider.deleteAutomationComposition(automationComposition.getName(),
146 automationComposition.getVersion())).thenReturn(automationComposition);
149 InstantiationCommand instantiationCommand =
150 InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Crud");
151 instantiationResponse = instantiationProvider.issueAutomationCompositionCommand(instantiationCommand);
152 InstantiationUtils.assertInstantiationResponse(instantiationResponse, instantiationCommand);
154 verify(supervisionHandler)
155 .triggerAutomationCompositionSupervision(instantiationCommand.getAutomationCompositionIdentifierList());
157 // in order to delete a automationComposition the state must be UNINITIALISED
158 automationCompositionsCreate.getAutomationCompositionList()
159 .forEach(ac -> ac.setState(AutomationCompositionState.UNINITIALISED));
160 instantiationProvider.updateAutomationCompositions(automationCompositionsCreate);
162 for (AutomationComposition automationComposition : automationCompositionsCreate
163 .getAutomationCompositionList()) {
164 instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
165 automationComposition.getVersion());
167 verify(acProvider).deleteAutomationComposition(automationComposition.getName(),
168 automationComposition.getVersion());
173 void testInstantiationDelete() throws Exception {
175 AutomationCompositions automationCompositions =
176 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
178 AutomationComposition automationComposition0 = automationCompositions.getAutomationCompositionList().get(0);
179 var participantProvider = Mockito.mock(ParticipantProvider.class);
180 var acProvider = mock(AutomationCompositionProvider.class);
181 var supervisionHandler = mock(SupervisionHandler.class);
182 var commissioningProvider = mock(CommissioningProvider.class);
184 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
185 supervisionHandler, participantProvider);
187 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(automationComposition0.getName(),
188 automationComposition0.getVersion())).hasMessageMatching(AUTOMATION_COMPOSITION_NOT_FOUND);
190 for (AutomationCompositionState state : AutomationCompositionState.values()) {
191 if (!AutomationCompositionState.UNINITIALISED.equals(state)) {
192 assertThatDeleteThrownBy(automationCompositions, state);
195 automationComposition0.setState(AutomationCompositionState.UNINITIALISED);
197 for (AutomationComposition automationComposition : automationCompositions.getAutomationCompositionList()) {
198 when(acProvider.findAutomationComposition(automationComposition.getName(),
199 automationComposition.getVersion())).thenReturn(Optional.of(automationComposition));
200 when(acProvider.deleteAutomationComposition(automationComposition.getName(),
201 automationComposition.getVersion())).thenReturn(automationComposition);
203 instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
204 automationComposition.getVersion());
208 private void assertThatDeleteThrownBy(AutomationCompositions automationCompositions,
209 AutomationCompositionState state) throws Exception {
210 AutomationComposition automationComposition = automationCompositions.getAutomationCompositionList().get(0);
211 automationComposition.setState(state);
212 var participantProvider = Mockito.mock(ParticipantProvider.class);
213 var acProvider = mock(AutomationCompositionProvider.class);
214 var supervisionHandler = mock(SupervisionHandler.class);
215 var commissioningProvider = mock(CommissioningProvider.class);
217 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
218 supervisionHandler, participantProvider);
220 when(acProvider.findAutomationComposition(automationComposition.getName(), automationComposition.getVersion()))
221 .thenReturn(Optional.of(automationComposition));
223 assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
224 automationComposition.getVersion())).hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
228 void testCreateAutomationCompositions_NoDuplicates() throws Exception {
229 var commissioningProvider = mock(CommissioningProvider.class);
231 var toscaNodeTemplate1 = new ToscaNodeTemplate();
232 toscaNodeTemplate1.setName("org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement");
233 toscaNodeTemplate1.setVersion("1.2.3");
234 when(commissioningProvider.getAutomationCompositionDefinitions(anyString(), anyString()))
235 .thenReturn(List.of(toscaNodeTemplate1));
237 var toscaNodeTemplate2 = new ToscaNodeTemplate();
238 toscaNodeTemplate2.setName("org.onap.domain.pmsh.PMSH_OperationalPolicyAutomationCompositionElement");
239 toscaNodeTemplate2.setVersion("1.2.3");
240 var toscaNodeTemplate3 = new ToscaNodeTemplate();
241 toscaNodeTemplate3.setName("org.onap.domain.pmsh.PMSH_CDS_AutomationCompositionElement");
242 toscaNodeTemplate3.setVersion("1.2.3");
243 var toscaNodeTemplate4 = new ToscaNodeTemplate();
244 toscaNodeTemplate4.setName("org.onap.domain.pmsh.PMSH_DCAEMicroservice");
245 toscaNodeTemplate4.setVersion("1.2.3");
247 when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
248 .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3, toscaNodeTemplate4));
250 AutomationCompositions automationCompositionsCreate =
251 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
253 var acProvider = mock(AutomationCompositionProvider.class);
254 var participantProvider = Mockito.mock(ParticipantProvider.class);
255 var supervisionHandler = mock(SupervisionHandler.class);
257 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
258 supervisionHandler, participantProvider);
260 InstantiationResponse instantiationResponse =
261 instantiationProvider.createAutomationCompositions(automationCompositionsCreate);
262 InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionsCreate);
264 when(acProvider.findAutomationComposition(
265 automationCompositionsCreate.getAutomationCompositionList().get(0).getKey().asIdentifier()))
266 .thenReturn(Optional.of(automationCompositionsCreate.getAutomationCompositionList().get(0)));
268 assertThatThrownBy(() -> instantiationProvider.createAutomationCompositions(automationCompositionsCreate))
270 automationCompositionsCreate.getAutomationCompositionList().get(0).getKey().asIdentifier()
271 + " already defined");
275 void testCreateAutomationCompositions_CommissionedAcElementNotFound() throws Exception {
276 var toscaNodeTemplate1 = new ToscaNodeTemplate();
277 toscaNodeTemplate1.setName("org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement");
278 toscaNodeTemplate1.setVersion("1.2.3");
280 var toscaNodeTemplate2 = new ToscaNodeTemplate();
281 toscaNodeTemplate2.setName("org.onap.domain.pmsh.PMSH_OperationalPolicyAutomationCompositionElement");
282 toscaNodeTemplate2.setVersion("1.2.3");
283 var toscaNodeTemplate3 = new ToscaNodeTemplate();
284 toscaNodeTemplate3.setName("org.onap.domain.pmsh.PMSH_CDS_AutomationCompositionElement");
285 toscaNodeTemplate3.setVersion("1.2.3");
286 var commissioningProvider = mock(CommissioningProvider.class);
287 AutomationCompositions automationCompositions = InstantiationUtils.getAutomationCompositionsFromResource(
288 AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "AcElementNotFound");
290 when(commissioningProvider.getAutomationCompositionDefinitions(
291 automationCompositions.getAutomationCompositionList().get(0).getDefinition().getName(),
292 automationCompositions.getAutomationCompositionList().get(0).getDefinition().getVersion()))
293 .thenReturn(List.of(toscaNodeTemplate1));
295 when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
296 .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3));
298 var acProvider = mock(AutomationCompositionProvider.class);
299 var participantProvider = mock(ParticipantProvider.class);
300 var supervisionHandler = mock(SupervisionHandler.class);
301 var provider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
302 supervisionHandler, participantProvider);
304 assertThatThrownBy(() -> provider.createAutomationCompositions(automationCompositions))
305 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
307 assertThatThrownBy(() -> provider.updateAutomationCompositions(automationCompositions))
308 .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
312 void testCreateAutomationCompositions_CommissionedAcNotFound() throws Exception {
313 AutomationCompositions automationCompositions = InstantiationUtils
314 .getAutomationCompositionsFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
316 var participantProvider = Mockito.mock(ParticipantProvider.class);
317 var acProvider = mock(AutomationCompositionProvider.class);
318 var supervisionHandler = mock(SupervisionHandler.class);
319 var commissioningProvider = mock(CommissioningProvider.class);
320 var provider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
321 supervisionHandler, participantProvider);
323 assertThatThrownBy(() -> provider.createAutomationCompositions(automationCompositions))
324 .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
326 assertThatThrownBy(() -> provider.updateAutomationCompositions(automationCompositions))
327 .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
331 void testIssueAutomationCompositionCommand_OrderedStateInvalid()
332 throws AutomationCompositionRuntimeException {
333 var participantProvider = Mockito.mock(ParticipantProvider.class);
334 var acProvider = mock(AutomationCompositionProvider.class);
335 var supervisionHandler = mock(SupervisionHandler.class);
336 var commissioningProvider = mock(CommissioningProvider.class);
337 var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
338 supervisionHandler, participantProvider);
339 assertThatThrownBy(() -> instantiationProvider.issueAutomationCompositionCommand(new InstantiationCommand()))
340 .hasMessageMatching(ORDERED_STATE_INVALID);