1 package com.oransc.rappmanager.service;
3 import static org.junit.jupiter.api.Assertions.assertEquals;
4 import static org.junit.jupiter.api.Assertions.assertThrows;
5 import static org.mockito.ArgumentMatchers.any;
6 import static org.mockito.Mockito.when;
8 import com.oransc.rappmanager.acm.service.AcmDeployer;
9 import com.oransc.rappmanager.dme.service.DmeDeployer;
10 import com.oransc.rappmanager.models.exception.RappHandlerException;
11 import com.oransc.rappmanager.models.rapp.Rapp;
12 import com.oransc.rappmanager.models.rapp.RappState;
13 import com.oransc.rappmanager.models.rappinstance.RappInstance;
14 import com.oransc.rappmanager.models.rappinstance.RappInstanceState;
15 import com.oransc.rappmanager.models.statemachine.RappInstanceStateMachine;
16 import com.oransc.rappmanager.sme.service.SmeDeployer;
17 import com.oransc.rappmanager.sme.service.SmeLifecycleManager;
18 import java.util.HashMap;
20 import java.util.UUID;
21 import org.junit.jupiter.api.Test;
22 import org.springframework.beans.factory.annotation.Autowired;
23 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
24 import org.springframework.boot.test.context.SpringBootTest;
25 import org.springframework.boot.test.mock.mockito.MockBean;
26 import org.springframework.http.HttpStatus;
28 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
30 class RappServiceTest {
33 RappService rappService;
36 AcmDeployer acmDeployer;
39 SmeDeployer smeDeployer;
42 DmeDeployer dmeDeployer;
45 SmeLifecycleManager smeLifecycleManager;
48 RappInstanceStateMachine rappInstanceStateMachine;
50 String validCsarFileLocation = "src/test/resources/";
52 private final String validRappFile = "valid-rapp-package.csar";
54 private final String STATE_TRANSITION_NOT_PERMITTED = "State transition from %s to %s is not permitted.";
58 void testPrimeRapp() {
59 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
60 .packageLocation(validCsarFileLocation).state(RappState.COMMISSIONED).build();
61 when(acmDeployer.primeRapp(any())).thenReturn(true);
62 when(dmeDeployer.primeRapp(any())).thenReturn(true);
63 assertEquals(HttpStatus.OK, rappService.primeRapp(rapp).getStatusCode());
64 assertEquals(RappState.PRIMED, rapp.getState());
68 void testPrimeRappInvalidState() {
69 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
70 .packageLocation(validCsarFileLocation).state(RappState.PRIMING).build();
71 RappHandlerException rappHandlerException =
72 assertThrows(RappHandlerException.class, () -> rappService.primeRapp(rapp));
73 assertEquals(HttpStatus.BAD_REQUEST, rappHandlerException.getStatusCode());
74 assertEquals(String.format(STATE_TRANSITION_NOT_PERMITTED, RappState.PRIMING, RappState.PRIMED),
75 rappHandlerException.getMessage());
76 assertEquals(RappState.PRIMING, rapp.getState());
80 void testPrimeRappAcmFailure() {
81 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
82 .packageLocation(validCsarFileLocation).state(RappState.COMMISSIONED).build();
83 when(acmDeployer.primeRapp(any())).thenReturn(false);
84 when(dmeDeployer.primeRapp(any())).thenReturn(true);
85 assertEquals(HttpStatus.BAD_GATEWAY, rappService.primeRapp(rapp).getStatusCode());
86 assertEquals(RappState.COMMISSIONED, rapp.getState());
90 void testPrimeRappDmeFailure() {
91 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
92 .packageLocation(validCsarFileLocation).state(RappState.COMMISSIONED).build();
93 when(acmDeployer.primeRapp(any())).thenReturn(true);
94 when(dmeDeployer.primeRapp(any())).thenReturn(false);
95 assertEquals(HttpStatus.BAD_GATEWAY, rappService.primeRapp(rapp).getStatusCode());
96 assertEquals(RappState.COMMISSIONED, rapp.getState());
101 void testDeprimeRapp() {
102 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
103 .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
104 when(acmDeployer.deprimeRapp(any())).thenReturn(true);
105 when(dmeDeployer.deprimeRapp(any())).thenReturn(true);
106 assertEquals(HttpStatus.OK, rappService.deprimeRapp(rapp).getStatusCode());
107 assertEquals(RappState.COMMISSIONED, rapp.getState());
111 void testDeprimeRappAcmFailure() {
112 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
113 .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
114 when(acmDeployer.deprimeRapp(any())).thenReturn(false);
115 when(dmeDeployer.deprimeRapp(any())).thenReturn(true);
116 assertEquals(HttpStatus.BAD_GATEWAY, rappService.deprimeRapp(rapp).getStatusCode());
117 assertEquals(RappState.PRIMED, rapp.getState());
121 void testDeprimeRappDmeFailure() {
122 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
123 .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
124 when(acmDeployer.deprimeRapp(any())).thenReturn(true);
125 when(dmeDeployer.deprimeRapp(any())).thenReturn(false);
126 assertEquals(HttpStatus.BAD_GATEWAY, rappService.deprimeRapp(rapp).getStatusCode());
127 assertEquals(RappState.PRIMED, rapp.getState());
131 void testDeprimeRappInvalidState() {
132 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
133 .packageLocation(validCsarFileLocation).state(RappState.COMMISSIONED).build();
134 RappHandlerException rappHandlerException =
135 assertThrows(RappHandlerException.class, () -> rappService.deprimeRapp(rapp));
136 assertEquals(HttpStatus.BAD_REQUEST, rappHandlerException.getStatusCode());
137 assertEquals(String.format(STATE_TRANSITION_NOT_PERMITTED, RappState.COMMISSIONED, RappState.COMMISSIONED),
138 rappHandlerException.getMessage());
139 assertEquals(RappState.COMMISSIONED, rapp.getState());
143 void testDeprimeRappActiveInstances() {
144 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
145 .packageLocation(validCsarFileLocation).state(RappState.PRIMED)
146 .rappInstances(Map.of(UUID.randomUUID(), new RappInstance())).build();
147 RappHandlerException rappHandlerException =
148 assertThrows(RappHandlerException.class, () -> rappService.deprimeRapp(rapp));
149 assertEquals(HttpStatus.BAD_REQUEST, rappHandlerException.getStatusCode());
150 assertEquals(RappState.PRIMED, rapp.getState());
154 void testDeployRappInstance() {
155 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
156 .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
157 RappInstance rappInstance = new RappInstance();
158 rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
159 when(acmDeployer.deployRappInstance(any(), any())).thenReturn(true);
160 when(smeDeployer.deployRappInstance(any(), any())).thenReturn(true);
161 when(dmeDeployer.deployRappInstance(any(), any())).thenReturn(true);
162 assertEquals(HttpStatus.ACCEPTED, rappService.deployRappInstance(rapp, rappInstance).getStatusCode());
166 void testDeployRappInstanceFailure() {
167 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
168 .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
169 RappInstance rappInstance = new RappInstance();
170 rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
171 when(acmDeployer.deployRappInstance(any(), any())).thenReturn(true);
172 when(smeDeployer.deployRappInstance(any(), any())).thenReturn(false);
173 when(dmeDeployer.deployRappInstance(any(), any())).thenReturn(true);
174 assertEquals(HttpStatus.BAD_GATEWAY, rappService.deployRappInstance(rapp, rappInstance).getStatusCode());
178 void testDeployRappInstanceDmeFailure() {
179 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
180 .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
181 RappInstance rappInstance = new RappInstance();
182 rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
183 when(acmDeployer.deployRappInstance(any(), any())).thenReturn(true);
184 when(smeDeployer.deployRappInstance(any(), any())).thenReturn(true);
185 when(dmeDeployer.deployRappInstance(any(), any())).thenReturn(false);
186 assertEquals(HttpStatus.BAD_GATEWAY, rappService.deployRappInstance(rapp, rappInstance).getStatusCode());
190 void testDeployRappInstanceFailureWithState() {
191 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
192 .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
193 RappInstance rappInstance = new RappInstance();
194 rappInstance.setState(RappInstanceState.DEPLOYED);
195 rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
196 RappHandlerException rappHandlerException =
197 assertThrows(RappHandlerException.class, () -> rappService.deployRappInstance(rapp, rappInstance));
198 assertEquals(HttpStatus.BAD_REQUEST, rappHandlerException.getStatusCode());
199 assertEquals(String.format("Unable to deploy rApp instance %s as it is not in UNDEPLOYED state",
200 rappInstance.getRappInstanceId()), rappHandlerException.getMessage());
201 assertEquals(RappState.PRIMED, rapp.getState());
206 void testUndeployRappInstance() {
207 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
208 .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
209 RappInstance rappInstance = new RappInstance();
210 rappInstance.setState(RappInstanceState.DEPLOYED);
211 rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
212 when(acmDeployer.undeployRappInstance(any(), any())).thenReturn(true);
213 when(smeDeployer.undeployRappInstance(any(), any())).thenReturn(true);
214 when(dmeDeployer.undeployRappInstance(any(), any())).thenReturn(true);
215 assertEquals(HttpStatus.ACCEPTED, rappService.undeployRappInstance(rapp, rappInstance).getStatusCode());
219 void testUndeployRappInstanceFailure() {
220 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
221 .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
222 RappInstance rappInstance = new RappInstance();
223 rappInstance.setState(RappInstanceState.DEPLOYED);
224 rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
225 when(acmDeployer.undeployRappInstance(any(), any())).thenReturn(true);
226 when(smeDeployer.undeployRappInstance(any(), any())).thenReturn(false);
227 when(dmeDeployer.undeployRappInstance(any(), any())).thenReturn(true);
228 assertEquals(HttpStatus.BAD_GATEWAY, rappService.undeployRappInstance(rapp, rappInstance).getStatusCode());
232 void testUndeployRappInstanceDmeFailure() {
233 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
234 .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
235 RappInstance rappInstance = new RappInstance();
236 rappInstance.setState(RappInstanceState.DEPLOYED);
237 rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
238 when(acmDeployer.undeployRappInstance(any(), any())).thenReturn(true);
239 when(smeDeployer.undeployRappInstance(any(), any())).thenReturn(true);
240 when(dmeDeployer.undeployRappInstance(any(), any())).thenReturn(false);
241 assertEquals(HttpStatus.BAD_GATEWAY, rappService.undeployRappInstance(rapp, rappInstance).getStatusCode());
245 void testUndeployRappInstanceInvalidStateFailure() {
246 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
247 .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
248 RappInstance rappInstance = new RappInstance();
249 rappInstance.setState(RappInstanceState.DEPLOYING);
250 rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
251 when(acmDeployer.undeployRappInstance(any(), any())).thenReturn(true);
252 when(smeDeployer.undeployRappInstance(any(), any())).thenReturn(false);
253 when(dmeDeployer.undeployRappInstance(any(), any())).thenReturn(true);
254 RappHandlerException rappHandlerException =
255 assertThrows(RappHandlerException.class, () -> rappService.undeployRappInstance(rapp, rappInstance));
256 assertEquals(HttpStatus.BAD_REQUEST, rappHandlerException.getStatusCode());
260 void testDeleteRappInstance() {
261 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
262 .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
263 RappInstance rappInstance = new RappInstance();
264 rappInstance.setState(RappInstanceState.UNDEPLOYED);
265 HashMap<UUID, RappInstance> rAppInstanceMap = new HashMap<>();
266 rAppInstanceMap.put(rappInstance.getRappInstanceId(), rappInstance);
267 rapp.setRappInstances(rAppInstanceMap);
268 rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
269 assertEquals(HttpStatus.NO_CONTENT,
270 rappService.deleteRappInstance(rapp, rappInstance.getRappInstanceId()).getStatusCode());
274 void testDeleteRappInstanceFailure() {
275 Rapp rapp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
276 .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
277 RappInstance rappInstance = new RappInstance();
278 rappInstance.setState(RappInstanceState.DEPLOYED);
279 UUID rappInstanceId = rappInstance.getRappInstanceId();
280 HashMap<UUID, RappInstance> rAppInstanceMap = new HashMap<>();
281 rAppInstanceMap.put(rappInstanceId, rappInstance);
282 rapp.setRappInstances(rAppInstanceMap);
283 rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
284 RappHandlerException rappHandlerException =
285 assertThrows(RappHandlerException.class, () -> rappService.deleteRappInstance(rapp, rappInstanceId));
286 assertEquals(HttpStatus.BAD_REQUEST, rappHandlerException.getStatusCode());
287 assertEquals(String.format("Unable to delete rApp instance %s as it is not in UNDEPLOYED state",
288 rappInstance.getRappInstanceId()), rappHandlerException.getMessage());
289 assertEquals(RappState.PRIMED, rapp.getState());
293 void testDeleteRappSuccess() {
294 Rapp rApp = Rapp.builder().rappId(UUID.randomUUID()).name("").packageName(validRappFile)
295 .packageLocation(validCsarFileLocation).state(RappState.COMMISSIONED).build();
296 assertEquals(HttpStatus.OK, rappService.deleteRapp(rApp).getStatusCode());
300 void testDeleteRappFailureWithState() {
301 String rAppName = "rAppInPrimed";
302 Rapp rApp = Rapp.builder().rappId(UUID.randomUUID()).name(rAppName).packageName(validRappFile)
303 .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
304 RappHandlerException rappHandlerException =
305 assertThrows(RappHandlerException.class, () -> rappService.deleteRapp(rApp));
306 assertEquals(HttpStatus.BAD_REQUEST, rappHandlerException.getStatusCode());
307 assertEquals(String.format("Unable to delete %s as the rApp is not in COMMISSIONED state.", rAppName),
308 rappHandlerException.getMessage());
309 assertEquals(RappState.PRIMED, rApp.getState());
313 void testDeleteRappFailureWithInstances() {
314 String rAppName = "rAppWithInstances";
315 Rapp rApp = Rapp.builder().rappId(UUID.randomUUID()).name(rAppName).packageName(validRappFile)
316 .packageLocation(validCsarFileLocation).state(RappState.PRIMED).build();
317 RappInstance rappInstance = new RappInstance();
318 rappInstance.setState(RappInstanceState.DEPLOYED);
319 rappInstanceStateMachine.onboardRappInstance(rappInstance.getRappInstanceId());
320 rApp.setRappInstances(Map.of(rappInstance.getRappInstanceId(), rappInstance));
321 RappHandlerException rappHandlerException =
322 assertThrows(RappHandlerException.class, () -> rappService.deleteRapp(rApp));
323 assertEquals(HttpStatus.BAD_REQUEST, rappHandlerException.getStatusCode());
324 assertEquals(String.format("Unable to delete %s as there are active rApp instances.", rAppName),
325 rappHandlerException.getMessage());
326 assertEquals(RappState.PRIMED, rApp.getState());