8765ac94941c184b6395757fbcbdd754582b2646
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2021-2025 OpenInfra Foundation Europe. All rights reserved.
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.commissioning;
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.assertNotNull;
28 import static org.mockito.ArgumentMatchers.any;
29 import static org.mockito.Mockito.doNothing;
30 import static org.mockito.Mockito.mock;
31 import static org.mockito.Mockito.timeout;
32 import static org.mockito.Mockito.verify;
33 import static org.mockito.Mockito.when;
34 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
35
36 import java.util.List;
37 import java.util.UUID;
38 import java.util.stream.Collectors;
39 import org.junit.jupiter.api.Test;
40 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
41 import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup;
42 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantPrimePublisher;
43 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
44 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
45 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
46 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
47 import org.onap.policy.clamp.models.acm.concepts.NodeTemplateState;
48 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
49 import org.onap.policy.clamp.models.acm.messages.rest.commissioning.AcTypeStateUpdate;
50 import org.onap.policy.clamp.models.acm.messages.rest.commissioning.PrimeOrder;
51 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
52 import org.onap.policy.clamp.models.acm.persistence.provider.AcTypeStateResolver;
53 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
54 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
55 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
56 import org.springframework.data.domain.Pageable;
57
58 class CommissioningProviderTest {
59
60     /**
61      * Test the fetching of automation composition definitions (ToscaServiceTemplates).
62      */
63     @Test
64     void testGetAutomationCompositionDefinitions() {
65         var acProvider = mock(AutomationCompositionProvider.class);
66         var acDefinitionProvider = mock(AcDefinitionProvider.class);
67         var acRuntimeParameterGroup = mock(AcRuntimeParameterGroup.class);
68
69         var provider = new CommissioningProvider(acDefinitionProvider, acProvider, null, null, null,
70             acRuntimeParameterGroup);
71
72         var serviceTemplates = provider.getAutomationCompositionDefinitions(null, null, Pageable.unpaged());
73         assertThat(serviceTemplates.getServiceTemplates()).isEmpty();
74
75         when(acDefinitionProvider.getServiceTemplateList(null, null, Pageable.unpaged()))
76             .thenReturn(List.of(new ToscaServiceTemplate()));
77         serviceTemplates = provider.getAutomationCompositionDefinitions(null, null, Pageable.unpaged());
78         assertThat(serviceTemplates.getServiceTemplates()).hasSize(1);
79
80         assertThatThrownBy(() -> provider.getAutomationCompositionDefinitions(null, null, null))
81                 .hasMessage("pageable is marked non-null but is null");
82     }
83
84     /**
85      * Test the creation of automation composition definitions (ToscaServiceTemplates).
86      */
87     @Test
88     void testCreateAutomationCompositionDefinitions() {
89         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
90         assertNotNull(serviceTemplate);
91         serviceTemplate.setName("Name");
92         serviceTemplate.setVersion("1.0.0");
93         var acmDefinition = new AutomationCompositionDefinition();
94         acmDefinition.setCompositionId(UUID.randomUUID());
95         acmDefinition.setServiceTemplate(serviceTemplate);
96         var acDefinitionProvider = mock(AcDefinitionProvider.class);
97         when(acDefinitionProvider.createAutomationCompositionDefinition(serviceTemplate,
98             CommonTestData.TOSCA_ELEMENT_NAME, CommonTestData.TOSCA_COMP_NAME)).thenReturn(acmDefinition);
99
100         var acProvider = mock(AutomationCompositionProvider.class);
101         var provider = new CommissioningProvider(acDefinitionProvider, acProvider, null, null, null,
102             CommonTestData.getTestParamaterGroup());
103         var affectedDefinitions = provider.createAutomationCompositionDefinition(serviceTemplate)
104             .getAffectedAutomationCompositionDefinitions();
105         verify(acDefinitionProvider).createAutomationCompositionDefinition(serviceTemplate,
106             CommonTestData.TOSCA_ELEMENT_NAME, CommonTestData.TOSCA_COMP_NAME);
107         // Response should return the number of node templates present in the service template
108         assertThat(affectedDefinitions).hasSize(7);
109
110         assertEquals(StateChangeResult.NO_ERROR,
111                 acDefinitionProvider.createAutomationCompositionDefinition(serviceTemplate,
112                         CommonTestData.TOSCA_ELEMENT_NAME, CommonTestData.TOSCA_COMP_NAME).getStateChangeResult());
113     }
114
115     /**
116      * Test the fetching of a full ToscaServiceTemplate object - as opposed to the reduced template that is being
117      * tested in the testGetToscaServiceTemplateReduced() test.
118      */
119     @Test
120     void testGetToscaServiceTemplateList() {
121         var acDefinitionProvider = mock(AcDefinitionProvider.class);
122         var acProvider = mock(AutomationCompositionProvider.class);
123
124         var provider = new CommissioningProvider(acDefinitionProvider, acProvider, null, null, null, null);
125         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
126         assertNotNull(serviceTemplate);
127         when(acDefinitionProvider
128                 .getServiceTemplateList(null, null, Pageable.unpaged())).thenReturn(List.of(serviceTemplate));
129
130         var returnedServiceTemplate = provider.getAutomationCompositionDefinitions(null, null, Pageable.unpaged());
131         assertThat(returnedServiceTemplate).isNotNull();
132         assertThat(returnedServiceTemplate.getServiceTemplates()).isNotEmpty();
133     }
134
135     @Test
136     void testDeleteAcDefinitionDabRequest() {
137         var acDefinitionProvider = mock(AcDefinitionProvider.class);
138         var acProvider = mock(AutomationCompositionProvider.class);
139
140         var compositionId = UUID.randomUUID();
141         when(acProvider.getAcInstancesByCompositionId(compositionId)).thenReturn(List.of(new AutomationComposition()));
142
143         var provider = new CommissioningProvider(acDefinitionProvider, acProvider, null, null, null, null);
144
145         assertThatThrownBy(() -> provider.deleteAutomationCompositionDefinition(compositionId))
146             .hasMessageMatching("Delete instances, to commission automation composition definitions");
147     }
148
149     @Test
150     void testDeleteAutomationCompositionDefinition() {
151         var acDefinitionProvider = mock(AcDefinitionProvider.class);
152         var compositionId = UUID.randomUUID();
153         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
154         assertNotNull(serviceTemplate);
155         when(acDefinitionProvider.deleteAcDefinition(compositionId)).thenReturn(serviceTemplate);
156
157         var acmDefinition = new AutomationCompositionDefinition();
158         acmDefinition.setCompositionId(compositionId);
159         acmDefinition.setServiceTemplate(serviceTemplate);
160         acmDefinition.setState(AcTypeState.COMMISSIONED);
161         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acmDefinition);
162
163         var acProvider = mock(AutomationCompositionProvider.class);
164         var provider = new CommissioningProvider(acDefinitionProvider, acProvider, null, null, null, null);
165
166         provider.deleteAutomationCompositionDefinition(compositionId);
167
168         verify(acDefinitionProvider).deleteAcDefinition(compositionId);
169     }
170
171     @Test
172     void testPriming() {
173         var acDefinitionProvider = mock(AcDefinitionProvider.class);
174         var acmDefinition = CommonTestData.createAcDefinition(
175             InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML), AcTypeState.COMMISSIONED);
176         var compositionId = acmDefinition.getCompositionId();
177         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acmDefinition);
178
179         var participantPrimePublisher = mock(ParticipantPrimePublisher.class);
180         var provider = new CommissioningProvider(acDefinitionProvider, mock(AutomationCompositionProvider.class),
181             mock(ParticipantProvider.class), new AcTypeStateResolver(), participantPrimePublisher,
182             CommonTestData.getTestParamaterGroup());
183
184         var acTypeStateUpdate = new AcTypeStateUpdate();
185         acTypeStateUpdate.setPrimeOrder(PrimeOrder.PRIME);
186         provider.compositionDefinitionPriming(compositionId, acTypeStateUpdate);
187         verify(acDefinitionProvider).updateAcDefinition(acmDefinition, CommonTestData.TOSCA_COMP_NAME);
188         verify(participantPrimePublisher, timeout(1000).times(1)).sendPriming(any(), any(), any());
189     }
190
191     @Test
192     void testDepriming() {
193         var acDefinitionProvider = mock(AcDefinitionProvider.class);
194         var acmDefinition = CommonTestData.createAcDefinition(
195             InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML), AcTypeState.PRIMED);
196         var compositionId = acmDefinition.getCompositionId();
197         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acmDefinition);
198
199         var participantPrimePublisher = mock(ParticipantPrimePublisher.class);
200         var participantProvider = mock(ParticipantProvider.class);
201         var provider = new CommissioningProvider(acDefinitionProvider, mock(AutomationCompositionProvider.class),
202             participantProvider, new AcTypeStateResolver(), participantPrimePublisher,
203             CommonTestData.getTestParamaterGroup());
204
205         var acTypeStateUpdate = new AcTypeStateUpdate();
206         acTypeStateUpdate.setPrimeOrder(PrimeOrder.DEPRIME);
207
208         var participantIds = acmDefinition.getElementStateMap().values().stream()
209                 .map(NodeTemplateState::getParticipantId).collect(Collectors.toSet());
210         doNothing().when(participantProvider).verifyParticipantState(participantIds);
211         provider.compositionDefinitionPriming(compositionId, acTypeStateUpdate);
212         verify(participantPrimePublisher, timeout(1000).times(1))
213                 .sendDepriming(compositionId, participantIds, acmDefinition.getRevisionId());
214     }
215
216     @Test
217     void testBadRequest() {
218         var acProvider = mock(AutomationCompositionProvider.class);
219         var provider = new CommissioningProvider(mock(AcDefinitionProvider.class), acProvider,
220             mock(ParticipantProvider.class), new AcTypeStateResolver(), mock(ParticipantPrimePublisher.class),
221             mock(AcRuntimeParameterGroup.class));
222
223         var compositionId = UUID.randomUUID();
224         when(acProvider.getAcInstancesByCompositionId(compositionId)).thenReturn(List.of(new AutomationComposition()));
225
226         var toscaServiceTemplate = new ToscaServiceTemplate();
227         assertThatThrownBy(() -> provider.updateCompositionDefinition(compositionId, toscaServiceTemplate))
228             .hasMessageMatching("There are ACM instances, Update of ACM Definition not allowed");
229
230         var acTypeStateUpdate = new AcTypeStateUpdate();
231         assertThatThrownBy(() -> provider.compositionDefinitionPriming(compositionId, acTypeStateUpdate))
232             .hasMessageMatching("There are instances, Priming/Depriming not allowed");
233     }
234
235     @Test
236     void testPrimedBadRequest() {
237         var acDefinitionProvider = mock(AcDefinitionProvider.class);
238         var toscaServiceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
239         var acmDefinition = CommonTestData.createAcDefinition(toscaServiceTemplate, AcTypeState.PRIMED);
240         var compositionId = acmDefinition.getCompositionId();
241         when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acmDefinition);
242
243         var provider = new CommissioningProvider(acDefinitionProvider, mock(AutomationCompositionProvider.class),
244             mock(ParticipantProvider.class), new AcTypeStateResolver(), mock(ParticipantPrimePublisher.class),
245             mock(AcRuntimeParameterGroup.class));
246
247         assertThatThrownBy(() -> provider.updateCompositionDefinition(compositionId, toscaServiceTemplate))
248             .hasMessageMatching("ACM not in COMMISSIONED state, Update of ACM Definition not allowed");
249
250         assertThatThrownBy(() -> provider.deleteAutomationCompositionDefinition(compositionId))
251             .hasMessageMatching("ACM not in COMMISSIONED state, Delete of ACM Definition not allowed");
252     }
253 }