Add ACM interceptor for DME
[nonrtric/plt/rappmanager.git] / rapp-manager-application / src / test / java / com / oransc / rappmanager / service / RappServiceTest.java
1 /*-
2  * ============LICENSE_START======================================================================
3  * Copyright (C) 2023 Nordix Foundation. All rights reserved.
4  * Copyright (C) 2023 OpenInfra Foundation Europe. 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  * ============LICENSE_END========================================================================
18  */
19
20 package com.oransc.rappmanager.service;
21
22 import static org.junit.jupiter.api.Assertions.assertEquals;
23 import static org.junit.jupiter.api.Assertions.assertThrows;
24 import static org.mockito.ArgumentMatchers.any;
25 import static org.mockito.Mockito.when;
26
27 import com.oransc.rappmanager.acm.service.AcmDeployer;
28 import com.oransc.rappmanager.dme.service.DmeDeployer;
29 import com.oransc.rappmanager.models.exception.RappHandlerException;
30 import com.oransc.rappmanager.models.rapp.Rapp;
31 import com.oransc.rappmanager.models.rapp.RappState;
32 import com.oransc.rappmanager.models.rappinstance.RappInstance;
33 import com.oransc.rappmanager.models.rappinstance.RappInstanceState;
34 import com.oransc.rappmanager.models.statemachine.RappInstanceStateMachine;
35 import com.oransc.rappmanager.sme.service.SmeDeployer;
36 import com.oransc.rappmanager.sme.service.SmeLifecycleManager;
37 import java.util.HashMap;
38 import java.util.Map;
39 import java.util.UUID;
40 import org.junit.jupiter.api.Test;
41 import org.springframework.beans.factory.annotation.Autowired;
42 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
43 import org.springframework.boot.test.context.SpringBootTest;
44 import org.springframework.boot.test.mock.mockito.MockBean;
45 import org.springframework.http.HttpStatus;
46
47 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
48 @AutoConfigureMockMvc
49 class RappServiceTest {
50
51     @Autowired
52     RappService rappService;
53
54     @MockBean
55     AcmDeployer acmDeployer;
56
57     @MockBean
58     SmeDeployer smeDeployer;
59
60     @MockBean
61     DmeDeployer dmeDeployer;
62
63     @MockBean
64     SmeLifecycleManager smeLifecycleManager;
65
66     @Autowired
67     RappInstanceStateMachine rappInstanceStateMachine;
68
69     String validCsarFileLocation = "src/test/resources/";
70
71     private final String validRappFile = "valid-rapp-package.csar";
72
73     private final String STATE_TRANSITION_NOT_PERMITTED = "State transition from %s to %s is not permitted.";
74
75
76     @Test
77     void testPrimeRapp() {
78         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
79                             .packageLocation(validCsarFileLocation).state(RappState.COMMISSIONED).build();
80         when(acmDeployer.primeRapp(any())).thenReturn(true);
81         when(dmeDeployer.primeRapp(any())).thenReturn(true);
82         assertEquals(HttpStatus.OK, rappService.primeRapp(rapp).getStatusCode());
83         assertEquals(RappState.PRIMED, rapp.getState());
84     }
85
86     @Test
87     void testPrimeRappInvalidState() {
88         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
89                             .packageLocation(validCsarFileLocation).state(RappState.PRIMING).build();
90         RappHandlerException rappHandlerException =
91                 assertThrows(RappHandlerException.class, () -> rappService.primeRapp(rapp));
92         assertEquals(HttpStatus.BAD_REQUEST, rappHandlerException.getStatusCode());
93         assertEquals(String.format(STATE_TRANSITION_NOT_PERMITTED, RappState.PRIMING, RappState.PRIMED),
94                 rappHandlerException.getMessage());
95         assertEquals(RappState.PRIMING, rapp.getState());
96     }
97
98     @Test
99     void testPrimeRappAcmFailure() {
100         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
101                             .packageLocation(validCsarFileLocation).state(RappState.COMMISSIONED).build();
102         when(acmDeployer.primeRapp(any())).thenReturn(false);
103         when(dmeDeployer.primeRapp(any())).thenReturn(true);
104         assertEquals(HttpStatus.BAD_GATEWAY, rappService.primeRapp(rapp).getStatusCode());
105         assertEquals(RappState.COMMISSIONED, rapp.getState());
106     }
107
108     @Test
109     void testPrimeRappDmeFailure() {
110         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
111                             .packageLocation(validCsarFileLocation).state(RappState.COMMISSIONED).build();
112         when(acmDeployer.primeRapp(any())).thenReturn(true);
113         when(dmeDeployer.primeRapp(any())).thenReturn(false);
114         assertEquals(HttpStatus.BAD_GATEWAY, rappService.primeRapp(rapp).getStatusCode());
115         assertEquals(RappState.COMMISSIONED, rapp.getState());
116     }
117
118
119     @Test
120     void testDeprimeRapp() {
121         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
122                             .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
123         when(acmDeployer.deprimeRapp(any())).thenReturn(true);
124         when(dmeDeployer.deprimeRapp(any())).thenReturn(true);
125         assertEquals(HttpStatus.OK, rappService.deprimeRapp(rapp).getStatusCode());
126         assertEquals(RappState.COMMISSIONED, rapp.getState());
127     }
128
129     @Test
130     void testDeprimeRappAcmFailure() {
131         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
132                             .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
133         when(acmDeployer.deprimeRapp(any())).thenReturn(false);
134         when(dmeDeployer.deprimeRapp(any())).thenReturn(true);
135         assertEquals(HttpStatus.BAD_GATEWAY, rappService.deprimeRapp(rapp).getStatusCode());
136         assertEquals(RappState.PRIMED, rapp.getState());
137     }
138
139     @Test
140     void testDeprimeRappDmeFailure() {
141         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
142                             .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
143         when(acmDeployer.deprimeRapp(any())).thenReturn(true);
144         when(dmeDeployer.deprimeRapp(any())).thenReturn(false);
145         assertEquals(HttpStatus.BAD_GATEWAY, rappService.deprimeRapp(rapp).getStatusCode());
146         assertEquals(RappState.PRIMED, rapp.getState());
147     }
148
149     @Test
150     void testDeprimeRappInvalidState() {
151         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
152                             .packageLocation(validCsarFileLocation).state(RappState.COMMISSIONED).build();
153         RappHandlerException rappHandlerException =
154                 assertThrows(RappHandlerException.class, () -> rappService.deprimeRapp(rapp));
155         assertEquals(HttpStatus.BAD_REQUEST, rappHandlerException.getStatusCode());
156         assertEquals(String.format(STATE_TRANSITION_NOT_PERMITTED, RappState.COMMISSIONED, RappState.COMMISSIONED),
157                 rappHandlerException.getMessage());
158         assertEquals(RappState.COMMISSIONED, rapp.getState());
159     }
160
161     @Test
162     void testDeprimeRappActiveInstances() {
163         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
164                             .packageLocation(validCsarFileLocation).state(RappState.PRIMED)
165                             .rappInstances(Map.of(UUID.randomUUID(), new RappInstance())).build();
166         RappHandlerException rappHandlerException =
167                 assertThrows(RappHandlerException.class, () -> rappService.deprimeRapp(rapp));
168         assertEquals(HttpStatus.BAD_REQUEST, rappHandlerException.getStatusCode());
169         assertEquals(RappState.PRIMED, rapp.getState());
170     }
171
172     @Test
173     void testDeployRappInstance() {
174         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
175                             .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
176         RappInstance rappInstance = new RappInstance();
177         rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
178         when(acmDeployer.deployRappInstance(any(), any())).thenReturn(true);
179         when(smeDeployer.deployRappInstance(any(), any())).thenReturn(true);
180         when(dmeDeployer.deployRappInstance(any(), any())).thenReturn(true);
181         assertEquals(HttpStatus.ACCEPTED, rappService.deployRappInstance(rapp, rappInstance).getStatusCode());
182     }
183
184     @Test
185     void testDeployRappInstanceFailure() {
186         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
187                             .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
188         RappInstance rappInstance = new RappInstance();
189         rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
190         when(acmDeployer.deployRappInstance(any(), any())).thenReturn(true);
191         when(smeDeployer.deployRappInstance(any(), any())).thenReturn(false);
192         when(dmeDeployer.deployRappInstance(any(), any())).thenReturn(true);
193         assertEquals(HttpStatus.BAD_GATEWAY, rappService.deployRappInstance(rapp, rappInstance).getStatusCode());
194     }
195
196     @Test
197     void testDeployRappInstanceFailureWithState() {
198         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
199                             .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
200         RappInstance rappInstance = new RappInstance();
201         rappInstance.setState(RappInstanceState.DEPLOYED);
202         rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
203         RappHandlerException rappHandlerException =
204                 assertThrows(RappHandlerException.class, () -> rappService.deployRappInstance(rapp, rappInstance));
205         assertEquals(HttpStatus.BAD_REQUEST, rappHandlerException.getStatusCode());
206         assertEquals(String.format("Unable to deploy rApp instance %s as it is not in UNDEPLOYED state",
207                 rappInstance.getRappInstanceId()), rappHandlerException.getMessage());
208         assertEquals(RappState.PRIMED, rapp.getState());
209
210     }
211
212     @Test
213     void testUndeployRappInstance() {
214         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
215                             .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
216         RappInstance rappInstance = new RappInstance();
217         rappInstance.setState(RappInstanceState.DEPLOYED);
218         rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
219         when(acmDeployer.undeployRappInstance(any(), any())).thenReturn(true);
220         when(smeDeployer.undeployRappInstance(any(), any())).thenReturn(true);
221         when(dmeDeployer.undeployRappInstance(any(), any())).thenReturn(true);
222         assertEquals(HttpStatus.ACCEPTED, rappService.undeployRappInstance(rapp, rappInstance).getStatusCode());
223     }
224
225     @Test
226     void testUndeployRappInstanceFailure() {
227         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
228                             .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
229         RappInstance rappInstance = new RappInstance();
230         rappInstance.setState(RappInstanceState.DEPLOYED);
231         rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
232         when(acmDeployer.undeployRappInstance(any(), any())).thenReturn(true);
233         when(smeDeployer.undeployRappInstance(any(), any())).thenReturn(false);
234         when(dmeDeployer.undeployRappInstance(any(), any())).thenReturn(true);
235         assertEquals(HttpStatus.BAD_GATEWAY, rappService.undeployRappInstance(rapp, rappInstance).getStatusCode());
236     }
237
238     @Test
239     void testUndeployRappInstanceInvalidStateFailure() {
240         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
241                             .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
242         RappInstance rappInstance = new RappInstance();
243         rappInstance.setState(RappInstanceState.DEPLOYING);
244         rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
245         when(acmDeployer.undeployRappInstance(any(), any())).thenReturn(true);
246         when(smeDeployer.undeployRappInstance(any(), any())).thenReturn(false);
247         when(dmeDeployer.undeployRappInstance(any(), any())).thenReturn(true);
248         RappHandlerException rappHandlerException =
249                 assertThrows(RappHandlerException.class, () -> rappService.undeployRappInstance(rapp, rappInstance));
250         assertEquals(HttpStatus.BAD_REQUEST, rappHandlerException.getStatusCode());
251     }
252
253     @Test
254     void testDeleteRappInstance() {
255         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
256                             .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
257         RappInstance rappInstance = new RappInstance();
258         rappInstance.setState(RappInstanceState.UNDEPLOYED);
259         HashMap<UUID, RappInstance> rAppInstanceMap = new HashMap<>();
260         rAppInstanceMap.put(rappInstance.getRappInstanceId(), rappInstance);
261         rapp.setRappInstances(rAppInstanceMap);
262         rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
263         assertEquals(HttpStatus.NO_CONTENT,
264                 rappService.deleteRappInstance(rapp, rappInstance.getRappInstanceId()).getStatusCode());
265     }
266
267     @Test
268     void testDeleteRappInstanceFailure() {
269         Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
270                             .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
271         RappInstance rappInstance = new RappInstance();
272         rappInstance.setState(RappInstanceState.DEPLOYED);
273         UUID rappInstanceId = rappInstance.getRappInstanceId();
274         HashMap<UUID, RappInstance> rAppInstanceMap = new HashMap<>();
275         rAppInstanceMap.put(rappInstanceId, rappInstance);
276         rapp.setRappInstances(rAppInstanceMap);
277         rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
278         RappHandlerException rappHandlerException =
279                 assertThrows(RappHandlerException.class, () -> rappService.deleteRappInstance(rapp, rappInstanceId));
280         assertEquals(HttpStatus.BAD_REQUEST, rappHandlerException.getStatusCode());
281         assertEquals(String.format("Unable to delete rApp instance %s as it is not in UNDEPLOYED state",
282                 rappInstance.getRappInstanceId()), rappHandlerException.getMessage());
283         assertEquals(RappState.PRIMED, rapp.getState());
284     }
285
286     @Test
287     void testDeleteRappSuccess() {
288         Rapp rApp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
289                             .packageLocation(validCsarFileLocation).state(RappState.COMMISSIONED).build();
290         assertEquals(HttpStatus.OK, rappService.deleteRapp(rApp).getStatusCode());
291     }
292
293     @Test
294     void testDeleteRappFailureWithState() {
295         String rAppName = "rAppInPrimed";
296         Rapp rApp = Rapp.builder().rappId(UUID.randomUUID()).name(rAppName).packageName(validRappFile)
297                             .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
298         RappHandlerException rappHandlerException =
299                 assertThrows(RappHandlerException.class, () -> rappService.deleteRapp(rApp));
300         assertEquals(HttpStatus.BAD_REQUEST, rappHandlerException.getStatusCode());
301         assertEquals(String.format("Unable to delete %s as the rApp is not in COMMISSIONED state.", rAppName),
302                 rappHandlerException.getMessage());
303         assertEquals(RappState.PRIMED, rApp.getState());
304     }
305
306     @Test
307     void testDeleteRappFailureWithInstances() {
308         String rAppName = "rAppWithInstances";
309         Rapp rApp = Rapp.builder().rappId(UUID.randomUUID()).name(rAppName).packageName(validRappFile)
310                             .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
311         RappInstance rappInstance = new RappInstance();
312         rappInstance.setState(RappInstanceState.DEPLOYED);
313         rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
314         rApp.setRappInstances(Map.of(rappInstance.getRappInstanceId(), rappInstance));
315         RappHandlerException rappHandlerException =
316                 assertThrows(RappHandlerException.class, () -> rappService.deleteRapp(rApp));
317         assertEquals(HttpStatus.BAD_REQUEST, rappHandlerException.getStatusCode());
318         assertEquals(String.format("Unable to delete %s as there are active rApp instances.", rAppName),
319                 rappHandlerException.getMessage());
320         assertEquals(RappState.PRIMED, rApp.getState());
321     }
322 }