248b04595670620c4217360d353fd4da582afefd
[policy/clamp.git] /
1 /*-
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
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.clamp.acm.runtime.instantiation;
23
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;
33
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;
54
55 /**
56  * Class to perform unit test of {@link AutomationCompositionInstantiationProvider}}.
57  *
58  */
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";
82
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";
91
92     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
93
94     @BeforeAll
95     public static void setUpBeforeClass() {
96         serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
97     }
98
99     @Test
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);
105
106         when(commissioningProvider.getAllToscaServiceTemplate()).thenReturn(List.of(serviceTemplate));
107         when(commissioningProvider.getToscaServiceTemplate(ID_NAME, ID_VERSION)).thenReturn(serviceTemplate);
108
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));
115
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));
122
123         var instanceOrderState = instantiationProvider.getInstantiationOrderState(ID_NAME, ID_VERSION);
124         assertEquals(AutomationCompositionOrderedState.UNINITIALISED, instanceOrderState.getOrderedState());
125         assertEquals(ID_NAME, instanceOrderState.getAutomationCompositionIdentifierList().get(0).getName());
126
127         when(acProvider.findAutomationComposition(ID_NAME, ID_VERSION)).thenReturn(Optional.of(automationComposition));
128         when(acProvider.deleteAutomationComposition(ID_NAME, ID_VERSION)).thenReturn(automationComposition);
129
130         var instanceResponse = instantiationProvider.deleteInstanceProperties(ID_NAME, ID_VERSION);
131         assertEquals(ID_NAME, instanceResponse.getAffectedAutomationCompositions().get(0).getName());
132
133     }
134
135     @Test
136     void testInstantiationCrud() throws Exception {
137         var participantProvider = Mockito.mock(ParticipantProvider.class);
138         var participants = CommonTestData.createParticipants();
139         when(participantProvider.getParticipants()).thenReturn(participants);
140
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));
147
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");
157
158         when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
159             .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3, toscaNodeTemplate4));
160
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);
170
171         verify(acProvider).saveAutomationCompositions(automationCompositionsCreate.getAutomationCompositionList());
172
173         for (var automationComposition : automationCompositionsCreate.getAutomationCompositionList()) {
174             when(acProvider.getAutomationCompositions(automationComposition.getName(),
175                 automationComposition.getVersion())).thenReturn(List.of(automationComposition));
176
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));
182         }
183
184         AutomationCompositions automationCompositionsUpdate =
185             InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
186
187         instantiationResponse = instantiationProvider.updateAutomationCompositions(automationCompositionsUpdate);
188         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionsUpdate);
189
190         verify(acProvider).saveAutomationCompositions(automationCompositionsUpdate.getAutomationCompositionList());
191
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);
199         }
200
201         InstantiationCommand instantiationCommand =
202             InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Crud");
203         instantiationResponse = instantiationProvider.issueAutomationCompositionCommand(instantiationCommand);
204         InstantiationUtils.assertInstantiationResponse(instantiationResponse, instantiationCommand);
205
206         verify(supervisionHandler)
207             .triggerAutomationCompositionSupervision(instantiationCommand.getAutomationCompositionIdentifierList());
208
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);
213
214         for (AutomationComposition automationComposition : automationCompositionsCreate
215             .getAutomationCompositionList()) {
216             instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
217                 automationComposition.getVersion());
218
219             verify(acProvider).deleteAutomationComposition(automationComposition.getName(),
220                 automationComposition.getVersion());
221         }
222     }
223
224     @Test
225     void testInstantiationDelete() throws Exception {
226
227         AutomationCompositions automationCompositions =
228             InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
229
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);
235
236         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
237             supervisionHandler, participantProvider);
238
239         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(automationComposition0.getName(),
240             automationComposition0.getVersion())).hasMessageMatching(AUTOMATION_COMPOSITION_NOT_FOUND);
241
242         for (AutomationCompositionState state : AutomationCompositionState.values()) {
243             if (!AutomationCompositionState.UNINITIALISED.equals(state)) {
244                 assertThatDeleteThrownBy(automationCompositions, state);
245             }
246         }
247         automationComposition0.setState(AutomationCompositionState.UNINITIALISED);
248
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);
254
255             instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
256                 automationComposition.getVersion());
257         }
258     }
259
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);
268
269         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
270             supervisionHandler, participantProvider);
271
272         when(acProvider.findAutomationComposition(automationComposition.getName(), automationComposition.getVersion()))
273             .thenReturn(Optional.of(automationComposition));
274
275         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
276             automationComposition.getVersion())).hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
277     }
278
279     @Test
280     void testCreateAutomationCompositions_NoDuplicates() throws Exception {
281         var commissioningProvider = mock(CommissioningProvider.class);
282
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));
288
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");
298
299         when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
300             .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3, toscaNodeTemplate4));
301
302         AutomationCompositions automationCompositionsCreate =
303             InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
304
305         var acProvider = mock(AutomationCompositionProvider.class);
306         var participantProvider = Mockito.mock(ParticipantProvider.class);
307         var supervisionHandler = mock(SupervisionHandler.class);
308
309         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
310             supervisionHandler, participantProvider);
311
312         InstantiationResponse instantiationResponse =
313             instantiationProvider.createAutomationCompositions(automationCompositionsCreate);
314         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionsCreate);
315
316         when(acProvider.findAutomationComposition(
317             automationCompositionsCreate.getAutomationCompositionList().get(0).getKey().asIdentifier()))
318                 .thenReturn(Optional.of(automationCompositionsCreate.getAutomationCompositionList().get(0)));
319
320         assertThatThrownBy(() -> instantiationProvider.createAutomationCompositions(automationCompositionsCreate))
321             .hasMessageMatching(
322                 automationCompositionsCreate.getAutomationCompositionList().get(0).getKey().asIdentifier()
323                     + " already defined");
324     }
325
326     @Test
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");
331
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");
341
342         when(commissioningProvider.getAutomationCompositionDefinitions(
343             automationCompositions.getAutomationCompositionList().get(0).getDefinition().getName(),
344             automationCompositions.getAutomationCompositionList().get(0).getDefinition().getVersion()))
345                 .thenReturn(List.of(toscaNodeTemplate1));
346
347         when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
348             .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3));
349
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);
355
356         assertThatThrownBy(() -> provider.createAutomationCompositions(automationCompositions))
357             .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
358
359         assertThatThrownBy(() -> provider.updateAutomationCompositions(automationCompositions))
360             .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
361     }
362
363     @Test
364     void testCreateAutomationCompositions_CommissionedAcNotFound() throws Exception {
365         AutomationCompositions automationCompositions = InstantiationUtils
366             .getAutomationCompositionsFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
367
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);
374
375         assertThatThrownBy(() -> provider.createAutomationCompositions(automationCompositions))
376             .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
377
378         assertThatThrownBy(() -> provider.updateAutomationCompositions(automationCompositions))
379             .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
380     }
381
382     @Test
383     void testIssueAutomationCompositionCommand_OrderedStateInvalid()
384         throws AutomationCompositionRuntimeException {
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);
393     }
394 }