diff options
Diffstat (limited to 'src/main/java/org/onap/nbi/apis/serviceorder/workflow/SOTaskProcessor.java')
-rw-r--r-- | src/main/java/org/onap/nbi/apis/serviceorder/workflow/SOTaskProcessor.java | 177 |
1 files changed, 172 insertions, 5 deletions
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/workflow/SOTaskProcessor.java b/src/main/java/org/onap/nbi/apis/serviceorder/workflow/SOTaskProcessor.java index a11863c..3f9b556 100644 --- a/src/main/java/org/onap/nbi/apis/serviceorder/workflow/SOTaskProcessor.java +++ b/src/main/java/org/onap/nbi/apis/serviceorder/workflow/SOTaskProcessor.java @@ -22,6 +22,7 @@ import org.onap.nbi.apis.serviceorder.model.orchestrator.ExecutionTask; import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfo; import org.onap.nbi.apis.serviceorder.repositories.ExecutionTaskRepository; import org.onap.nbi.apis.serviceorder.service.ServiceOrderService; +import org.onap.nbi.apis.serviceorder.utils.E2EServiceUtils; import org.onap.nbi.apis.serviceorder.utils.JsonEntityConverter; import org.onap.nbi.exceptions.TechnicalException; import org.slf4j.Logger; @@ -81,18 +82,29 @@ public class SOTaskProcessor { ServiceOrder serviceOrder = serviceOrderService.findServiceOrderById(serviceOrderInfo.getServiceOrderId()); ServiceOrderItem serviceOrderItem = getServiceOrderItem(executionTask, serviceOrder); - + boolean e2eService = E2EServiceUtils.isE2EService(serviceOrderInfo.getServiceOrderItemInfos().get(serviceOrderItem.getId())); + if (StateType.ACKNOWLEDGED == serviceOrderItem.getState()) { + if (e2eService) { + ResponseEntity<CreateE2EServiceInstanceResponse> response = postE2EServiceOrderItem(serviceOrderInfo, + serviceOrderItem, serviceOrder); + updateE2EServiceOrderItem(response, serviceOrderItem, serviceOrder); + } else { - ResponseEntity<CreateServiceInstanceResponse> response = postServiceOrderItem(serviceOrderInfo,serviceOrder, - serviceOrderItem); - updateServiceOrderItem(response, serviceOrderItem,serviceOrder); + ResponseEntity<CreateServiceInstanceResponse> response = postServiceOrderItem(serviceOrderInfo,serviceOrder, + serviceOrderItem); + updateServiceOrderItem(response, serviceOrderItem,serviceOrder); + } } if (executionTask.getNbRetries() > 0 && StateType.FAILED != serviceOrderItem.getState() ) { // TODO lancer en asynchrone - pollSoRequestStatus(serviceOrder,serviceOrderItem); + if (e2eService) + pollE2ESoRequestStatus(serviceOrder, serviceOrderItem); + else + pollSoRequestStatus(serviceOrder, serviceOrderItem); + if (serviceOrderItem.getState().equals(StateType.COMPLETED)) { updateSuccessTask(executionTask); } else { @@ -120,6 +132,18 @@ public class SOTaskProcessor { return response; } + private ResponseEntity<CreateE2EServiceInstanceResponse> postE2EServiceOrderItem(ServiceOrderInfo serviceOrderInfo, + ServiceOrderItem serviceOrderItem, ServiceOrder serviceOrder) { + ResponseEntity<CreateE2EServiceInstanceResponse> response; + try { + response = postE2ESORequest(serviceOrderItem, serviceOrderInfo, serviceOrder); + } catch (NullPointerException e) { + LOGGER.error("Unable to create service instance for serviceOrderItem.id=" + serviceOrderItem.getId(), e); + response = null; + } + return response; + } + private ServiceOrderItem getServiceOrderItem(ExecutionTask executionTask, ServiceOrder serviceOrder) { for (ServiceOrderItem item : serviceOrder.getOrderItem()) { if (item.getId().equals(executionTask.getOrderItemId())) { @@ -169,6 +193,27 @@ public class SOTaskProcessor { return response; } + private ResponseEntity<CreateE2EServiceInstanceResponse> postE2ESORequest(ServiceOrderItem serviceOrderItem, + ServiceOrderInfo serviceOrderInfo, ServiceOrder serviceOrder) { + ServiceModel service = buildE2ESoRequest(serviceOrderItem, serviceOrderInfo.getServiceOrderItemInfos().get(serviceOrderItem.getId()).getCatalogResponse(), serviceOrderInfo.getSubscriberInfo(), serviceOrder); + MSOE2EPayload msoE2EPayload = new MSOE2EPayload(service); + ResponseEntity<CreateE2EServiceInstanceResponse> response = null; + switch (serviceOrderItem.getAction()) { + case ADD: + response = soClient.callE2ECreateServiceInstance(msoE2EPayload); + break; + case DELETE: + response = soClient.callE2EDeleteServiceInstance(service.getGlobalSubscriberId(), service.getServiceType(),serviceOrderItem.getService().getId()); + break; + default: + break; + } + if(response!=null && response.getStatusCode()== HttpStatus.INTERNAL_SERVER_ERROR) { + serviceOrderService.addOrderMessage(serviceOrder, "502"); + } + return response; + } + private void updateServiceOrder(ServiceOrder serviceOrder) { boolean atLeastOneCompleted = false; boolean atLeastOneNotFinished = false; @@ -250,6 +295,47 @@ public class SOTaskProcessor { } } + private void pollE2ESoRequestStatus(ServiceOrder serviceOrder, ServiceOrderItem orderItem) throws InterruptedException { + boolean stopPolling = false; + String operationId = orderItem.getRequestId(); + String serviceId = orderItem.getService().getId(); + int nbRetries = 0; + GetE2ERequestStatusResponse response = null; + final String ERROR = "error"; + final String FINISHED = "finished"; + final String PROCESSING = "processing"; + String result = null; + while (!stopPolling) { + response = soClient.callE2EGetRequestStatus(operationId, serviceId); + if (response != null) { + result = response.getOperation().getResult(); + if (PROCESSING.equals(result)) { + nbRetries++; + serviceOrderService.updateOrderItemState(serviceOrder,orderItem,StateType.INPROGRESS); + Thread.sleep(1000); + LOGGER.debug("orderitem id {} still in progress from so",orderItem.getId()); + } else if (ERROR.equals(result)) { + serviceOrderService.updateOrderItemState(serviceOrder,orderItem,StateType.FAILED); + stopPolling = true; + LOGGER.debug("orderitem id {} failed, response from request status {}",orderItem.getId(),response.getOperation().getResult()); + } else if (FINISHED.equals(result)) { + serviceOrderService.updateOrderItemState(serviceOrder,orderItem,StateType.COMPLETED); + stopPolling = true; + LOGGER.debug("orderitem id {} completed"); + } + } else { + serviceOrderService.updateOrderItemState(serviceOrder,orderItem,StateType.INPROGRESS); + stopPolling = true; + LOGGER.debug("orderitem id {} still in progress from so",orderItem.getId()); + } + if (nbRetries == 3) { + stopPolling = true; + LOGGER.debug("orderitem id {} stop polling from getrequeststatus, 3 retries done",orderItem.getId()); + + } + } + } + /** * Build SO CREATE request from the ServiceOrder and catalog informations from SDC * @@ -302,6 +388,57 @@ public class SOTaskProcessor { return requestDetails; } + + /** + * Build E2E SO CREATE request from the ServiceOrder and catalog informations from SDC + * + * @param serviceOrderItem + * @param serviceOrder + * @param sdcInfos + * @return + */ + //ServiceOrderItem serviceOrderItem --> orderItem? + private ServiceModel buildE2ESoRequest(ServiceOrderItem serviceOrderItem, Map<String, Object> sdcInfos, + SubscriberInfo subscriberInfo, ServiceOrder serviceOrder) { + + subscriberInfo.getGlobalSubscriberId(); + ServiceModel service = new ServiceModel(); + service.setName(serviceOrderItem.getService().getName()); + service.setDescription(serviceOrder.getDescription()); + service.setServiceUuid(serviceOrderItem.getService().getServiceSpecification().getId()); + service.setServiceInvariantUuid((String) sdcInfos.get("invariantUUID")); + service.setGlobalSubscriberId(subscriberInfo.getGlobalSubscriberId()); + service.setServiceType((String) sdcInfos.get("name")); + + ParametersModel parameters = new ParametersModel(); + ArrayList<ResourceModel> resources = new ArrayList(); + + ArrayList<Object> resourceObjects = (ArrayList<Object>)sdcInfos.get("resourceSpecification"); + + for(int i = 0; i < resourceObjects.size(); i++) { + + ResourceModel resourceModel = new ResourceModel((Map<String, Object>)resourceObjects.get(i)); + ParametersModel resourceParameters = new ParametersModel(); + resourceModel.setParameters(resourceParameters); + resources.add(resourceModel); + + } + parameters.setResources(resources); + List<UserParams> userParams = retrieveUserParamsFromServiceCharacteristics(serviceOrderItem.getService().getServiceCharacteristic()); + + // If there are ServiceCharacteristics add them to requestInputs + if (!userParams.isEmpty()){ + Map<String, String> requestInputs = new HashMap<String, String>(); + for (int i = 0; i < userParams.size(); i++) { + requestInputs.put(userParams.get(i).getName(), userParams.get(i).getValue()); + } + + parameters.setRequestInputs(requestInputs); + } + service.setParameters(parameters); + + return service; + } /** * Build a list of UserParams for the SO request by browsing a list of ServiceCharacteristics from SDC @@ -352,6 +489,36 @@ public class SOTaskProcessor { } /** + * Update E2EServiceOrderItem with SO response by using serviceOrderRepository with the serviceOrderId + * @param response + * @param orderItem + * @param serviceOrder + */ + private void updateE2EServiceOrderItem(ResponseEntity<CreateE2EServiceInstanceResponse> response, + ServiceOrderItem orderItem, ServiceOrder serviceOrder) { + + if (response==null || !response.getStatusCode().is2xxSuccessful()) { + LOGGER.warn("response ko for serviceOrderItem.id=" + orderItem.getId()); + serviceOrderService.updateOrderItemState(serviceOrder,orderItem,StateType.FAILED); + } + else { + CreateE2EServiceInstanceResponse createE2EServiceInstanceResponse = response.getBody(); + if (createE2EServiceInstanceResponse != null && !orderItem.getState().equals(StateType.FAILED)) { + orderItem.getService().setId(createE2EServiceInstanceResponse.getService().getServiceId()); + orderItem.setRequestId(createE2EServiceInstanceResponse.getService().getOperationId()); + } + + if (!response.getStatusCode().is2xxSuccessful() || response.getBody() == null + || response.getBody().getService().getOperationId() == null || response.getBody().getService().getServiceId() == null) { + serviceOrderService.updateOrderItemState(serviceOrder,orderItem,StateType.FAILED); + LOGGER.warn("order item {} failed , status {} , response {}",orderItem.getId(),response.getStatusCode(),response.getBody()); + } else { + serviceOrderService.updateOrderItemState(serviceOrder,orderItem,StateType.INPROGRESS); + } + } + } + + /** * Update an executionTask in database when it's process with a success * * @param executionTask |