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