From 9b90144c883eb42937f601f9e8ea32c4895fc072 Mon Sep 17 00:00:00 2001 From: Dan Timoney Date: Fri, 21 Aug 2020 15:51:25 -0400 Subject: Implement vnf-topology-operation RPC Implement vnf-topology-operation RPC Change-Id: Ief6520cc7dcba1dc4b536af3ed962d2998317978 Issue-ID: SDNC-1212 Signed-off-by: Dan Timoney --- .../gra/controllers/OperationsApiController.java | 202 ++++++++++++++++++++- 1 file changed, 192 insertions(+), 10 deletions(-) (limited to 'ms/generic-resource-api/src/main/java') diff --git a/ms/generic-resource-api/src/main/java/org/onap/sdnc/apps/ms/gra/controllers/OperationsApiController.java b/ms/generic-resource-api/src/main/java/org/onap/sdnc/apps/ms/gra/controllers/OperationsApiController.java index 8f97dec..ac9a8b1 100644 --- a/ms/generic-resource-api/src/main/java/org/onap/sdnc/apps/ms/gra/controllers/OperationsApiController.java +++ b/ms/generic-resource-api/src/main/java/org/onap/sdnc/apps/ms/gra/controllers/OperationsApiController.java @@ -65,6 +65,13 @@ public class OperationsApiController implements OperationsApi { private static final String CALLED_STR = "{} called."; private static final String MODULE_NAME = "GENERIC-RESOURCE-API"; + private static final String SERVICE_OBJECT_PATH_PARAM = "service-object-path"; + private static final String NETWORK_OBJECT_PATH_PARAM = "network-object-path"; + private static final String VNF_OBJECT_PATH_PARAM = "vnf-object-path"; + private static final String PNF_OBJECT_PATH_PARAM = "pnf-object-path"; + private static final String VF_MODULE_OBJECT_PATH_PARAM = "vf-module-object-path"; + private static final String VF_MODULE_ID_PARAM = "vf-module-id"; + private final ObjectMapper objectMapper; @@ -371,6 +378,13 @@ public class OperationsApiController implements OperationsApi { || input.getServiceInformation().getServiceInstanceId().length() == 0; } + private boolean hasInvalidServiceId(GenericResourceApiVnfOperationInformation input) { + + return input == null || input.getServiceInformation() == null + || input.getServiceInformation().getServiceInstanceId() == null + || input.getServiceInformation().getServiceInstanceId().length() == 0; + } + private GenericResourceApiPreloaddataPreloadData getConfigPreloadData(String preloadId, String preloadType) throws JsonProcessingException { @@ -417,7 +431,8 @@ public class OperationsApiController implements OperationsApi { } - private GenericResourceApiServicedataServiceData getConfigServiceData(String svcInstanceId) throws JsonProcessingException { + private GenericResourceApiServicedataServiceData getConfigServiceData(String svcInstanceId) + throws JsonProcessingException { List configServices = configServicesRepository.findBySvcInstanceId(svcInstanceId); @@ -429,11 +444,9 @@ public class OperationsApiController implements OperationsApi { } } - @Override public ResponseEntity operationsGENERICRESOURCEAPInetworkTopologyOperationPost( - @Valid GenericResourceApiNetworkOperationInformationBodyparam input) - throws RestException { + @Valid GenericResourceApiNetworkOperationInformationBodyparam input) throws RestException { final String svcOperation = "network-topology-operation"; GenericResourceApiNetworkTopologyOperation retval = new GenericResourceApiNetworkTopologyOperation(); GenericResourceApiNetworktopologyoperationOutput resp = new GenericResourceApiNetworktopologyoperationOutput(); @@ -513,9 +526,24 @@ public class OperationsApiController implements OperationsApi { resp.setAckFinalIndicator(respProps.getProperty("ack-final-indicator", "Y")); resp.setResponseCode(respProps.getProperty("error-code", "200")); resp.setResponseMessage(respProps.getProperty("error-message", "SUCCESS")); - configService.setServiceStatusRequestStatus(GenericResourceApiRequestStatusEnumeration.SYNCCOMPLETE.toString()); + + + + configService + .setServiceStatusRequestStatus(GenericResourceApiRequestStatusEnumeration.SYNCCOMPLETE.toString()); if ("200".equals(resp.getResponseCode())) { + + GenericResourceApiInstanceReference serviceReference = new GenericResourceApiInstanceReference(); + serviceReference.setInstanceId(svcInstanceId); + serviceReference.setObjectPath(respProps.getProperty(SERVICE_OBJECT_PATH_PARAM)); + resp.setServiceResponseInformation(serviceReference); + + GenericResourceApiInstanceReference networkReference = new GenericResourceApiInstanceReference(); + networkReference.setInstanceId(respProps.getProperty("networkId")); + networkReference.setObjectPath(respProps.getProperty(NETWORK_OBJECT_PATH_PARAM)); + resp.setNetworkResponseInformation(networkReference); + // If DG returns success, update svcData in config and operational trees // and remember to save operational data. String ctxJson = ctxOut.toJsonString("service-data"); @@ -535,7 +563,7 @@ public class OperationsApiController implements OperationsApi { } // Update status in config services entry - + configService.setServiceStatusFinalIndicator(resp.getAckFinalIndicator()); configService.setServiceStatusResponseCode(resp.getResponseCode()); configService.setServiceStatusResponseMessage(resp.getResponseMessage()); @@ -550,6 +578,7 @@ public class OperationsApiController implements OperationsApi { operationalServicesRepository.save(operService); } retval.setOutput(resp); + return (new ResponseEntity<>(retval, HttpStatus.OK)); } @@ -620,7 +649,6 @@ public class OperationsApiController implements OperationsApi { configService.setServiceStatusRpcAction(input.getInput().getSdncRequestHeader().getSvcAction().toString()); configService.setServiceStatusRpcName(svcOperation); - // Call DG try { // Any of these can throw a nullpointer exception @@ -631,9 +659,16 @@ public class OperationsApiController implements OperationsApi { resp.setAckFinalIndicator(respProps.getProperty("ack-final-indicator", "Y")); resp.setResponseCode(respProps.getProperty("error-code", "200")); resp.setResponseMessage(respProps.getProperty("error-message", "SUCCESS")); - configService.setServiceStatusRequestStatus(GenericResourceApiRequestStatusEnumeration.SYNCCOMPLETE.toString()); - if ("200".equals(resp.getResponseCode())) { + configService + .setServiceStatusRequestStatus(GenericResourceApiRequestStatusEnumeration.SYNCCOMPLETE.toString()); + + if ("200".equals(resp.getResponseCode())) { + GenericResourceApiInstanceReference serviceReference = new GenericResourceApiInstanceReference(); + serviceReference.setInstanceId(svcInstanceId); + serviceReference.setObjectPath(respProps.getProperty(SERVICE_OBJECT_PATH_PARAM)); + resp.setServiceResponseInformation(serviceReference); + // If DG returns success, update svcData in config and operational trees // and remember to save operational data. String ctxJson = ctxOut.toJsonString("service-data"); @@ -653,7 +688,7 @@ public class OperationsApiController implements OperationsApi { } // Update status in config services entry - + configService.setServiceStatusFinalIndicator(resp.getAckFinalIndicator()); configService.setServiceStatusResponseCode(resp.getResponseCode()); configService.setServiceStatusResponseMessage(resp.getResponseMessage()); @@ -672,4 +707,151 @@ public class OperationsApiController implements OperationsApi { } + @Override + public ResponseEntity operationsGENERICRESOURCEAPIvnfTopologyOperationPost( + @Valid GenericResourceApiVnfOperationInformationBodyparam input) + throws RestException { + final String svcOperation = "vnf-topology-operation"; + GenericResourceApiVnfTopologyOperation retval = new GenericResourceApiVnfTopologyOperation(); + GenericResourceApiVnftopologyoperationOutput resp = new GenericResourceApiVnftopologyoperationOutput(); + + log.info(CALLED_STR, svcOperation); + // Verify input contains service instance id + if (hasInvalidServiceId(input.getInput())) { + log.debug("exiting {} because of null or empty service-instance-id", svcOperation); + + resp.setResponseCode("404"); + resp.setResponseMessage("null or empty service-instance-id"); + resp.setAckFinalIndicator("Y"); + + retval.setOutput(resp); + + return new ResponseEntity<>(retval, HttpStatus.OK); + } + + String svcInstanceId = input.getInput().getServiceInformation().getServiceInstanceId(); + String vnfId = null; + + if ((input.getInput() != null) && (input.getInput().getVnfInformation() != null)) { + vnfId = input.getInput().getVnfInformation().getVnfId(); + } + + SvcLogicContext ctxIn = new SvcLogicContext(); + + // Add input to SvcLogicContext + try { + ctxIn.mergeJson(svcOperation + "-input", objectMapper.writeValueAsString(input.getInput())); + } catch (JsonProcessingException e) { + log.error("exiting {} due to parse error on input data", svcOperation); + resp.setResponseCode("500"); + resp.setResponseMessage("internal error"); + resp.setAckFinalIndicator("Y"); + retval.setOutput(resp); + return new ResponseEntity<>(retval, HttpStatus.INTERNAL_SERVER_ERROR); + } + + // Add config tree data to SvcLogicContext + List configServices = configServicesRepository.findBySvcInstanceId(svcInstanceId); + ConfigServices configService = null; + if (configServices != null && !configServices.isEmpty()) { + configService = configServices.get(0); + ctxIn.mergeJson("service-data", configService.getSvcData()); + } else { + log.debug("exiting {} because the service-instance does not have any service data in SDN", svcOperation); + + resp.setResponseCode("404"); + resp.setResponseMessage("invalid input: the service-instance does not have any service data in SDNC"); + resp.setAckFinalIndicator("Y"); + + retval.setOutput(resp); + + return new ResponseEntity<>(retval, HttpStatus.OK); + } + + // Add operational tree data to SvcLogicContext + List operServices = operationalServicesRepository.findBySvcInstanceId(svcInstanceId); + OperationalServices operService = null; + boolean saveOperationalData = false; + + if (operServices != null && !operServices.isEmpty()) { + operService = operServices.get(0); + ctxIn.mergeJson("operational-data", operService.getSvcData()); + } else { + operService = new OperationalServices(svcInstanceId, null, null); + } + + // Update service status info in config entry from input + configService.setServiceStatusAction(input.getInput().getRequestInformation().getRequestAction().toString()); + configService.setServiceStatusRpcAction(input.getInput().getSdncRequestHeader().getSvcAction().toString()); + configService.setServiceStatusRpcName(svcOperation); + + + + // Call DG + try { + // Any of these can throw a nullpointer exception + // execute should only throw a SvcLogicException + SvcLogicContext ctxOut = svc.execute(MODULE_NAME, svcOperation, null, "sync", ctxIn); + Properties respProps = ctxOut.toProperties(); + + resp.setAckFinalIndicator(respProps.getProperty("ack-final-indicator", "Y")); + resp.setResponseCode(respProps.getProperty("error-code", "200")); + resp.setResponseMessage(respProps.getProperty("error-message", "SUCCESS")); + + configService + .setServiceStatusRequestStatus(GenericResourceApiRequestStatusEnumeration.SYNCCOMPLETE.toString()); + + if ("200".equals(resp.getResponseCode())) { + + GenericResourceApiInstanceReference serviceReference = new GenericResourceApiInstanceReference(); + serviceReference.setInstanceId(svcInstanceId); + serviceReference.setObjectPath(respProps.getProperty(SERVICE_OBJECT_PATH_PARAM)); + resp.setServiceResponseInformation(serviceReference); + + if (vnfId == null) { + vnfId = respProps.getProperty("vnfId"); + } + GenericResourceApiInstanceReference vnfReference = new GenericResourceApiInstanceReference(); + vnfReference.setInstanceId(vnfId); + vnfReference.setObjectPath(respProps.getProperty(VNF_OBJECT_PATH_PARAM)); + resp.setVnfResponseInformation(vnfReference); + + // If DG returns success, update svcData in config and operational trees + // and remember to save operational data. + String ctxJson = ctxOut.toJsonString("service-data"); + configService.setSvcData(ctxJson); + operService.setSvcData(ctxJson); + saveOperationalData = true; + } + + } catch (NullPointerException npe) { + resp.setAckFinalIndicator("true"); + resp.setResponseCode("500"); + resp.setResponseMessage("Check that you populated module, rpc and or mode correctly."); + } catch (SvcLogicException e) { + resp.setAckFinalIndicator("true"); + resp.setResponseCode("500"); + resp.setResponseMessage(e.getMessage()); + } + + // Update status in config services entry + + configService.setServiceStatusFinalIndicator(resp.getAckFinalIndicator()); + configService.setServiceStatusResponseCode(resp.getResponseCode()); + configService.setServiceStatusResponseMessage(resp.getResponseMessage()); + configService.setServiceStatusResponseTimestamp(Iso8601Util.now()); + + // Update config tree + configServicesRepository.save(configService); + + // If necessary, sync status to operation service entry and save + if (saveOperationalData) { + operService.setServiceStatus(configService.getServiceStatus()); + operationalServicesRepository.save(operService); + } + retval.setOutput(resp); + return (new ResponseEntity<>(retval, HttpStatus.OK)); + } + + } -- cgit 1.2.3-korg