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
10 * http://www.apache.org/licenses/LICENSE-2.0
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========================================================================
20 package com.oransc.rappmanager.service;
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;
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;
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;
47 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
49 class RappServiceTest {
52 RappService rappService;
55 AcmDeployer acmDeployer;
58 SmeDeployer smeDeployer;
61 DmeDeployer dmeDeployer;
64 SmeLifecycleManager smeLifecycleManager;
67 RappInstanceStateMachine rappInstanceStateMachine;
69 String validCsarFileLocation = "src/test/resources/";
71 private final String validRappFile = "valid-rapp-package.csar";
73 private final String STATE_TRANSITION_NOT_PERMITTED = "State transition from %s to %s is not permitted.";
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());
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());
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());
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());
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());
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());
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());
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());
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());
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());
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());
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());
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());
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());
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());
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());
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());
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());
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());
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());