016ec6c5e7a060f0007d5db45f013c498d45456c
[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.mockito.ArgumentMatchers.anyString;
27 import static org.mockito.Mockito.mock;
28 import static org.mockito.Mockito.verify;
29 import static org.mockito.Mockito.when;
30
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;
47
48 /**
49  * Class to perform unit test of {@link AutomationCompositionInstantiationProvider}}.
50  *
51  */
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";
73
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";
82
83     @Test
84     void testInstantiationCrud() throws Exception {
85         var participantProvider = Mockito.mock(ParticipantProvider.class);
86         var participants = CommonTestData.createParticipants();
87         when(participantProvider.getParticipants()).thenReturn(participants);
88
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));
95
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");
105
106         when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
107             .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3, toscaNodeTemplate4));
108
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);
118
119         verify(acProvider).saveAutomationCompositions(automationCompositionsCreate.getAutomationCompositionList());
120
121         for (var automationComposition : automationCompositionsCreate.getAutomationCompositionList()) {
122             when(acProvider.getAutomationCompositions(automationComposition.getName(),
123                 automationComposition.getVersion())).thenReturn(List.of(automationComposition));
124
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));
130         }
131
132         AutomationCompositions automationCompositionsUpdate =
133             InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
134
135         instantiationResponse = instantiationProvider.updateAutomationCompositions(automationCompositionsUpdate);
136         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionsUpdate);
137
138         verify(acProvider).saveAutomationCompositions(automationCompositionsUpdate.getAutomationCompositionList());
139
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);
147         }
148
149         InstantiationCommand instantiationCommand =
150             InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Crud");
151         instantiationResponse = instantiationProvider.issueAutomationCompositionCommand(instantiationCommand);
152         InstantiationUtils.assertInstantiationResponse(instantiationResponse, instantiationCommand);
153
154         verify(supervisionHandler)
155             .triggerAutomationCompositionSupervision(instantiationCommand.getAutomationCompositionIdentifierList());
156
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);
161
162         for (AutomationComposition automationComposition : automationCompositionsCreate
163             .getAutomationCompositionList()) {
164             instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
165                 automationComposition.getVersion());
166
167             verify(acProvider).deleteAutomationComposition(automationComposition.getName(),
168                 automationComposition.getVersion());
169         }
170     }
171
172     @Test
173     void testInstantiationDelete() throws Exception {
174
175         AutomationCompositions automationCompositions =
176             InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
177
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);
183
184         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
185             supervisionHandler, participantProvider);
186
187         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(automationComposition0.getName(),
188             automationComposition0.getVersion())).hasMessageMatching(AUTOMATION_COMPOSITION_NOT_FOUND);
189
190         for (AutomationCompositionState state : AutomationCompositionState.values()) {
191             if (!AutomationCompositionState.UNINITIALISED.equals(state)) {
192                 assertThatDeleteThrownBy(automationCompositions, state);
193             }
194         }
195         automationComposition0.setState(AutomationCompositionState.UNINITIALISED);
196
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);
202
203             instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
204                 automationComposition.getVersion());
205         }
206     }
207
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);
216
217         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
218             supervisionHandler, participantProvider);
219
220         when(acProvider.findAutomationComposition(automationComposition.getName(), automationComposition.getVersion()))
221             .thenReturn(Optional.of(automationComposition));
222
223         assertThatThrownBy(() -> instantiationProvider.deleteAutomationComposition(automationComposition.getName(),
224             automationComposition.getVersion())).hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
225     }
226
227     @Test
228     void testCreateAutomationCompositions_NoDuplicates() throws Exception {
229         var commissioningProvider = mock(CommissioningProvider.class);
230
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));
236
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");
246
247         when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
248             .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3, toscaNodeTemplate4));
249
250         AutomationCompositions automationCompositionsCreate =
251             InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates");
252
253         var acProvider = mock(AutomationCompositionProvider.class);
254         var participantProvider = Mockito.mock(ParticipantProvider.class);
255         var supervisionHandler = mock(SupervisionHandler.class);
256
257         var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, commissioningProvider,
258             supervisionHandler, participantProvider);
259
260         InstantiationResponse instantiationResponse =
261             instantiationProvider.createAutomationCompositions(automationCompositionsCreate);
262         InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionsCreate);
263
264         when(acProvider.findAutomationComposition(
265             automationCompositionsCreate.getAutomationCompositionList().get(0).getKey().asIdentifier()))
266                 .thenReturn(Optional.of(automationCompositionsCreate.getAutomationCompositionList().get(0)));
267
268         assertThatThrownBy(() -> instantiationProvider.createAutomationCompositions(automationCompositionsCreate))
269             .hasMessageMatching(
270                 automationCompositionsCreate.getAutomationCompositionList().get(0).getKey().asIdentifier()
271                     + " already defined");
272     }
273
274     @Test
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");
279
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");
289
290         when(commissioningProvider.getAutomationCompositionDefinitions(
291             automationCompositions.getAutomationCompositionList().get(0).getDefinition().getName(),
292             automationCompositions.getAutomationCompositionList().get(0).getDefinition().getVersion()))
293                 .thenReturn(List.of(toscaNodeTemplate1));
294
295         when(commissioningProvider.getAutomationCompositionElementDefinitions(toscaNodeTemplate1))
296             .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3));
297
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);
303
304         assertThatThrownBy(() -> provider.createAutomationCompositions(automationCompositions))
305             .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
306
307         assertThatThrownBy(() -> provider.updateAutomationCompositions(automationCompositions))
308             .hasMessageMatching(AC_ELEMENT_NAME_NOT_FOUND);
309     }
310
311     @Test
312     void testCreateAutomationCompositions_CommissionedAcNotFound() throws Exception {
313         AutomationCompositions automationCompositions = InstantiationUtils
314             .getAutomationCompositionsFromResource(AC_INSTANTIATION_AC_DEFINITION_NOT_FOUND_JSON, "AcNotFound");
315
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);
322
323         assertThatThrownBy(() -> provider.createAutomationCompositions(automationCompositions))
324             .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
325
326         assertThatThrownBy(() -> provider.updateAutomationCompositions(automationCompositions))
327             .hasMessageMatching(AC_DEFINITION_NOT_FOUND);
328     }
329
330     @Test
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);
341     }
342 }