d9be9b7dd196db82e538cd520a04fdb6d061abe0
[nonrtric/plt/rappmanager.git] / rapp-manager-application / src / test / java / com / oransc / rappmanager / service / RappServiceTest.java
1 package com.oransc.rappmanager.service;
2
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;
7
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;
19 import java.util.Map;
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;
27
28 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
29 @AutoConfigureMockMvc
30 class RappServiceTest {
31
32     @Autowired
33     RappService rappService;
34
35     @MockBean
36     AcmDeployer acmDeployer;
37
38     @MockBean
39     SmeDeployer smeDeployer;
40
41     @MockBean
42     DmeDeployer dmeDeployer;
43
44     @MockBean
45     SmeLifecycleManager smeLifecycleManager;
46
47     @Autowired
48     RappInstanceStateMachine rappInstanceStateMachine;
49
50     String validCsarFileLocation = "src/test/resources/";
51
52     private final String validRappFile = "valid-rapp-package.csar";
53
54     private final String STATE_TRANSITION_NOT_PERMITTED = "State transition from %s to %s is not permitted.";
55
56
57     @Test
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());
65     }
66
67     @Test
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());
77     }
78
79     @Test
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());
87     }
88
89     @Test
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());
97     }
98
99
100     @Test
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());
108     }
109
110     @Test
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());
118     }
119
120     @Test
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());
128     }
129
130     @Test
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());
140     }
141
142     @Test
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());
151     }
152
153     @Test
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());
163     }
164
165     @Test
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());
175     }
176
177     @Test
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());
187     }
188
189     @Test
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());
202
203     }
204
205     @Test
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());
216     }
217
218     @Test
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());
229     }
230
231     @Test
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());
242     }
243
244     @Test
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());
257     }
258
259     @Test
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());
271     }
272
273     @Test
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());
290     }
291
292     @Test
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());
297     }
298
299     @Test
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());
310     }
311
312     @Test
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());
327     }
328 }