Pause Upon VF Module Failure
[vid.git] / vid-automation / src / main / java / org / onap / vid / api / CreateServiceWithFailedVnf.java
1 package org.onap.vid.api;
2
3 import com.fasterxml.jackson.core.type.TypeReference;
4 import com.fasterxml.jackson.databind.ObjectMapper;
5 import com.google.common.collect.ImmutableList;
6 import com.google.common.collect.ImmutableMap;
7 import org.hamcrest.Matchers;
8 import org.onap.simulator.presetGenerator.presets.BasePresets.BasePreset;
9 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetCloudOwnersByCloudRegionId;
10 import org.onap.simulator.presetGenerator.presets.mso.*;
11 import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceMetadataGet;
12 import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceToscaModelGet;
13 import org.onap.vid.model.asyncInstantiation.ServiceInfo;
14 import org.springframework.http.HttpStatus;
15 import org.springframework.http.ResponseEntity;
16 import vid.automation.test.infra.Features;
17 import vid.automation.test.infra.ModelInfo;
18 import vid.automation.test.model.JobStatus;
19 import vid.automation.test.model.ServiceAction;
20 import vid.automation.test.services.SimulatorApi;
21
22 import java.io.IOException;
23 import java.util.List;
24 import java.util.Map;
25 import java.util.Optional;
26 import java.util.UUID;
27
28 import static org.hamcrest.CoreMatchers.is;
29 import static org.hamcrest.MatcherAssert.assertThat;
30 import static org.hamcrest.Matchers.*;
31 import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
32 import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOServiceInstanceGen2WithNames.Keys.SERVICE_NAME;
33 import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOServiceInstanceGen2WithNames.Keys.VNF_NAME;
34 import static org.onap.vid.api.TestUtils.hasOrLacksOfEntry;
35 import static org.testng.Assert.assertTrue;
36 import static org.testng.AssertJUnit.assertFalse;
37 import static vid.automation.test.services.SimulatorApi.registerExpectationFromPreset;
38 import static vid.automation.test.services.SimulatorApi.registerExpectationFromPresets;
39
40 //CreateServiceWithFailedVnf is common for API test and UI test,
41 //so if you change it, make sure both test are compatible with your changes
42 public class CreateServiceWithFailedVnf {
43     private AsyncInstantiationBase asyncInstantiationBase;
44     private ImmutableMap<PresetMSOServiceInstanceGen2WithNames.Keys, String> names;
45     private List<PresetMSOBaseCreateInstancePost> createPresets;
46     private List<PresetMSOOrchestrationRequestGet> inProgressPresets;
47     private List<String> uuids;
48     private List<String> retryUuids;
49     private String originalJobId;
50     private String serviceInstanceName = TestUtils.generateRandomAlphaNumeric(10);
51     private ResourceIds firstIds = new ResourceIds();
52     private ResourceIds retryIds = new ResourceIds();
53     private String vnfEditedName = TestUtils.generateRandomAlphaNumeric(10);
54     ObjectMapper objectMapper = new ObjectMapper();
55     public final ModelInfo serviceComplexService = new ModelInfo("e3c34d88-a216-4f1d-a782-9af9f9588705", "0367689e-d41e-483f-b200-eab17e4a7f8d", "service-Complexservice-aLaCarte-csar-2.zip");
56
57     public CreateServiceWithFailedVnf(AsyncInstantiationBase asyncInstantiationALaCarteApiTest) {
58         this.asyncInstantiationBase = asyncInstantiationALaCarteApiTest;
59     }
60
61     public ImmutableMap<PresetMSOServiceInstanceGen2WithNames.Keys, String> getNames() {
62         return names;
63     }
64
65     public ResourceIds getFirstIds() {
66         return firstIds;
67     }
68
69     public static class ResourceIds {
70         public String serviceId =UUID.randomUUID().toString();
71         public String serviceReqId =UUID.randomUUID().toString();
72         public String vnfId =UUID.randomUUID().toString();
73         public String vnfReqId =UUID.randomUUID().toString();
74     }
75
76
77     public CreateServiceWithFailedVnf createServicesWithVnfCompletedWithError() {
78 /*
79 Legit Preset  ||  deploy 1 Service, 1 VNF which will fail
80         -> JobStatus of service is COMPLETED_WITH_ERRORS, audit
81            is adequate; strict simulator comapre
82  */
83
84         names = ImmutableMap.of(SERVICE_NAME, serviceInstanceName, VNF_NAME, serviceInstanceName+"_vnf");
85
86
87
88         final String vnfFailedStatusMessage = "Vnf failed.";
89         createPresets = ImmutableList.of(
90                 new PresetMSOCreateServiceInstanceGen2WithNamesAlacarteService(names, 0, firstIds.serviceReqId, firstIds.serviceId),
91                 new PresetMSOCreateVNFInstanceOnlyRelatedServiceInstance(names.get(VNF_NAME),firstIds.vnfReqId , firstIds.serviceId, firstIds.vnfId, 0)
92         );
93         inProgressPresets = ImmutableList.of(
94                 new PresetMSOOrchestrationRequestGet("COMPLETE", firstIds.serviceReqId),
95                 new PresetMSOOrchestrationRequestGet("FAILED", firstIds.vnfReqId, vnfFailedStatusMessage)
96         );
97         List<BasePreset> presets = asyncInstantiationBase.getPresets(createPresets, inProgressPresets);
98
99         registerExpectationFromPresets(presets, SimulatorApi.RegistrationStrategy.CLEAR_THEN_SET);
100         registerExpectationFromPreset(PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MDT1_TO_ATT_NC, SimulatorApi.RegistrationStrategy.APPEND);
101
102         uuids = asyncInstantiationBase.createBulkOfInstances(false, 1, names, AsyncInstantiationBase.CREATE_BULK_OF_ALACARTE_REQUEST_WITH_VNF);
103         return this;
104     }
105
106     public void firstTimeAssertion() {
107         assertThat(uuids, hasSize(1));
108         originalJobId = uuids.get(0);
109         boolean isPauseOnFailureFlagOn = Features.FLAG_2008_PAUSE_VFMODULE_INSTANTIATION_FAILURE.isActive();
110
111         asyncInstantiationBase.assertServiceInfoSpecific1(originalJobId, isPauseOnFailureFlagOn ?
112                 JobStatus.FAILED_AND_PAUSED : JobStatus.COMPLETED_WITH_ERRORS, names.get(SERVICE_NAME), "us16807000", firstIds.serviceId, ServiceAction.INSTANTIATE);
113         asyncInstantiationBase.assertAuditStatuses(originalJobId, isPauseOnFailureFlagOn ?
114                 asyncInstantiationBase.vidAuditStatusesFailedAndPaused(originalJobId) :
115                 asyncInstantiationBase.vidAuditStatusesCompletedWithErrors(originalJobId),null);
116         assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf(
117                 hasOrLacksOfEntry(createPresets.get(0).getReqPath(), 1L),
118                 hasOrLacksOfEntry(createPresets.get(1).getReqPath(), 1L),
119                 hasOrLacksOfEntry(inProgressPresets.get(0).getReqPath(), 1L),
120                 hasOrLacksOfEntry(inProgressPresets.get(1).getReqPath(), 1L)
121         ));
122     }
123
124     public String getBulkForRetry(){
125         final ResponseEntity<String> responseEntity= asyncInstantiationBase.getRetryBulk(originalJobId);
126         String expected = TestUtils.convertRequest(objectMapper, "asyncInstantiation/ServiceTreeForRetry_serviceInstance.json");
127         expected = expected
128                 .replace("SERVICE_NAME", serviceInstanceName);
129         String originalResponse = responseEntity.getBody();
130         String responseToCompare = originalResponse.replaceFirst( "(instanceId\":\")(.*?)(\")", "$1INSTANCE_ID$3")
131                 .replaceAll( "(trackById\":\")(.*?)(\")", "$1TRACK_BY_ID$3");
132         asyncInstantiationBase.assertJsonEquals(responseToCompare, expected);
133         return originalResponse;
134     }
135
136     public void getBulkForRetryNotFound() {
137         UUID jobId= UUID.randomUUID();
138         final ResponseEntity<String> response = asyncInstantiationBase.getRetryBulk(jobId.toString());
139         assertThat(response.getStatusCode(), is(HttpStatus.NOT_FOUND));
140         assertThat(response.getBody(),containsString("Failed to retrieve class org.onap.vid.dao.JobRequest with JOB_ID "+jobId+" from table. no resource found"));
141     }
142
143     private void secondRegistration(String vnfName) {
144         createPresets = ImmutableList.of(
145                 new PresetMSOCreateVNFInstanceOnlyRelatedServiceInstance(vnfName, retryIds.vnfReqId, firstIds.serviceId, retryIds.vnfId, 0)
146         );
147         inProgressPresets = ImmutableList.of(
148                 new PresetMSOOrchestrationRequestGet("COMPLETE", retryIds.vnfReqId)
149         );
150
151         registerExpectationFromPresets(asyncInstantiationBase.getPresets(createPresets, inProgressPresets), SimulatorApi.RegistrationStrategy.CLEAR_THEN_SET);
152         registerExpectationFromPresets(ImmutableList.of(
153                         PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MDT1_TO_ATT_NC,
154                         new PresetSDCGetServiceMetadataGet(serviceComplexService),
155                         new PresetSDCGetServiceToscaModelGet(serviceComplexService)),
156                 SimulatorApi.RegistrationStrategy.APPEND);
157
158
159     }
160
161     public String deployService1FailedVnf(){
162         createServicesWithVnfCompletedWithError();
163         firstTimeAssertion();
164         return getBulkForRetry();
165     }
166
167     public void assertResourceAuditStatus(String bulkForRetry) {
168         String vnfTrackById = extractVnfTrackById(bulkForRetry);
169
170         Map<String, Object> auditStatus = (Map) asyncInstantiationBase.getResourceAuditInfo(vnfTrackById);
171         assertThat(auditStatus.get("jobStatus"), equalTo("FAILED"));
172         assertThat(auditStatus.get("additionalInfo"), equalTo("Vnf failed."));
173         assertThat(auditStatus.get("requestId"), equalTo(firstIds.vnfReqId));
174     }
175
176     private String extractVnfTrackById(String bulk) {
177         Map<String, Object> serviceInstantiation = null;
178         try {
179             serviceInstantiation = objectMapper.readValue(bulk, new TypeReference<Map<String, Object>>(){});
180             Map<String, Object> vnf = (Map) ((Map) serviceInstantiation.get("vnfs")).get("vSAMP12 1");
181             return vnf.get("trackById").toString();
182         } catch (IOException e) {
183             return null;
184         }
185     }
186
187
188     public void secondRegistration() {
189         secondRegistration(names.get(VNF_NAME));
190     }
191
192     public void retryJob() {
193         //retry the previous job
194         retryUuids = asyncInstantiationBase.retryJob(originalJobId);
195     }
196
197     public void retryJobWithOtherDataAndAssert(String requestBody){
198         retryUuids = asyncInstantiationBase.retryJobWithChangedData(originalJobId, requestBody);
199         retryAssertion();
200         simulatorCallsAssertion();
201     }
202
203     public String changeSomeDataAndRegisterToSimulator(String payload){
204         payload = payload.replace(names.get(VNF_NAME), vnfEditedName);
205         secondRegistration(vnfEditedName);
206         return payload;
207     }
208
209
210     public void retryAssertion() {
211
212         assertThat(retryUuids, Matchers.hasSize(1));
213         String retryJobId = retryUuids.get(0);
214         assertThat(retryJobId, not(equalTo(originalJobId)));
215         asyncInstantiationBase.assertServiceInfoSpecific1(retryJobId, JobStatus.COMPLETED, names.get(SERVICE_NAME), "us16807000", firstIds.serviceId, ServiceAction.UPDATE);
216
217         //make sure original job is retry is disabled.
218         Optional<ServiceInfo> optionalServiceInfo = asyncInstantiationBase.serviceListCall().getBody().stream().filter(si -> originalJobId.equals(si.jobId)).findFirst();
219         assertTrue(optionalServiceInfo.isPresent());
220         assertFalse(optionalServiceInfo.get().isRetryEnabled);
221     }
222
223     public void simulatorCallsAssertion() {
224         assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf(
225                 hasOrLacksOfEntry(createPresets.get(0).getReqPath(), 1L),
226                 hasOrLacksOfEntry(inProgressPresets.get(0).getReqPath(), 1L)
227         ));
228     }
229
230
231 }