b826eebbcf326b7ad060adfe00174ad53a96e348
[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 updatedInstancePropertyList = instantiationProvider.createInstanceProperties(serviceTemplate);
124         assertNull(updatedInstancePropertyList.getErrorDetails());
125         var updatedId = new ToscaConceptIdentifier(ID_NAME, ID_VERSION);
126         assertEquals(updatedId, instancePropertyList.getAffectedInstanceProperties().get(0));
127
128         var instanceOrderState = instantiationProvider.getInstantiationOrderState(ID_NAME, ID_VERSION);
129         assertEquals(AutomationCompositionOrderedState.UNINITIALISED, instanceOrderState.getOrderedState());
130         assertEquals(ID_NAME, instanceOrderState.getAutomationCompositionIdentifierList().get(0).getName());
131
132         when(acProvider.findAutomationComposition(ID_NAME, ID_VERSION)).thenReturn(Optional.of(automationComposition));
133         when(acProvider.deleteAutomationComposition(ID_NAME, ID_VERSION)).thenReturn(automationComposition);
134
135         var instanceResponse = instantiationProvider.deleteInstanceProperties(ID_NAME, ID_VERSION);
136         assertEquals(ID_NAME, instanceResponse.getAffectedAutomationCompositions().get(0).getName());
137
138     }
139
140     @Test
141     void testInstantiationCrud() throws Exception {
142         var participantProvider = Mockito.mock(ParticipantProvider.class);
143         var participants = CommonTestData.createParticipants();
144         when(participantProvider.getParticipants()).thenReturn(participants);
145
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));
152
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");
162
163         when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
164             .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3, toscaNodeTemplate4));
165
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);
175
176         verify(acProvider).saveAutomationCompositions(automationCompositionsCreate.getAutomationCompositionList());
177
178         for (var automationComposition : automationCompositionsCreate.getAutomationCompositionList()) {
179             when(acProvider.getAutomationCompositions(automationComposition.getName(),
180                 automationComposition.getVersion())).thenReturn(List.of(automationComposition));
181
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));
187         }
188
189         AutomationCompositions automationCompositionsUpdate =
190             InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
191
192         instantiationResponse = instantiationProvider.updateAutomationCompositions(automationCompositionsUpdate);
193         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionsUpdate);
194
195         verify(acProvider).saveAutomationCompositions(automationCompositionsUpdate.getAutomationCompositionList());
196
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);
204         }
205
206         InstantiationCommand instantiationCommand =
207             InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Crud");
208         instantiationResponse = instantiationProvider.issueAutomationCompositionCommand(instantiationCommand);
209         InstantiationUtils.assertInstantiationResponse(instantiationResponse, instantiationCommand);
210
211         verify(supervisionHandler)
212             .triggerAutomationCompositionSupervision(instantiationCommand.getAutomationCompositionIdentifierList());
213
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);
218
219         for (AutomationComposition automationComposition : automationCompositionsCreate
220             .getAutomationCompositionList()) {
221             instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
222                 automationComposition.getVersion());
223
224             verify(acProvider).deleteAutomationComposition(automationComposition.getName(),
225                 automationComposition.getVersion());
226         }
227     }
228
229     @Test
230     void testInstantiationDelete() throws Exception {
231
232         AutomationCompositions automationCompositions =
233             InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
234
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);
240
241         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
242             supervisionHandler, participantProvider);
243
244         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(automationComposition0.getName(),
245             automationComposition0.getVersion())).hasMessageMatching(AUTOMATION_COMPOSITION_NOT_FOUND);
246
247         for (AutomationCompositionState state : AutomationCompositionState.values()) {
248             if (!AutomationCompositionState.UNINITIALISED.equals(state)) {
249                 assertThatDeleteThrownBy(automationCompositions, state);
250             }
251         }
252         automationComposition0.setState(AutomationCompositionState.UNINITIALISED);
253
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);
259
260             instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
261                 automationComposition.getVersion());
262         }
263     }
264
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);
273
274         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
275             supervisionHandler, participantProvider);
276
277         when(acProvider.findAutomationComposition(automationComposition.getName(), automationComposition.getVersion()))
278             .thenReturn(Optional.of(automationComposition));
279
280         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
281             automationComposition.getVersion())).hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
282     }
283
284     @Test
285     void testCreateAutomationCompositions_NoDuplicates() throws Exception {
286         var commissioningProvider = mock(CommissioningProvider.class);
287
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));
293
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");
303
304         when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
305             .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3, toscaNodeTemplate4));
306
307         AutomationCompositions automationCompositionsCreate =
308             InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
309
310         var acProvider = mock(AutomationCompositionProvider.class);
311         var participantProvider = Mockito.mock(ParticipantProvider.class);
312         var supervisionHandler = mock(SupervisionHandler.class);
313
314         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
315             supervisionHandler, participantProvider);
316
317         InstantiationResponse instantiationResponse =
318             instantiationProvider.createAutomationCompositions(automationCompositionsCreate);
319         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionsCreate);
320
321         when(acProvider.findAutomationComposition(
322             automationCompositionsCreate.getAutomationCompositionList().get(0).getKey().asIdentifier()))
323                 .thenReturn(Optional.of(automationCompositionsCreate.getAutomationCompositionList().get(0)));
324
325         assertThatThrownBy(() -> instantiationProvider.createAutomationCompositions(automationCompositionsCreate))
326             .hasMessageMatching(
327                 automationCompositionsCreate.getAutomationCompositionList().get(0).getKey().asIdentifier()
328                     + " already defined");
329     }
330
331     @Test
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");
336
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");
346
347         when(commissioningProvider.getAutomationCompositionDefinitions(
348             automationCompositions.getAutomationCompositionList().get(0).getDefinition().getName(),
349             automationCompositions.getAutomationCompositionList().get(0).getDefinition().getVersion()))
350                 .thenReturn(List.of(toscaNodeTemplate1));
351
352         when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
353             .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3));
354
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);
360
361         assertThatThrownBy(() -> provider.createAutomationCompositions(automationCompositions))
362             .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
363
364         assertThatThrownBy(() -> provider.updateAutomationCompositions(automationCompositions))
365             .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
366     }
367
368     @Test
369     void testCreateAutomationCompositions_CommissionedAcNotFound() throws Exception {
370         AutomationCompositions automationCompositions = InstantiationUtils
371             .getAutomationCompositionsFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
372
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);
379
380         assertThatThrownBy(() -> provider.createAutomationCompositions(automationCompositions))
381             .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
382
383         assertThatThrownBy(() -> provider.updateAutomationCompositions(automationCompositions))
384             .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
385     }
386
387     @Test
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);
398     }
399 }