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