Fixing service delete in sdnc simulator
[integration/csit.git] / plans / so / integration-etsi-testing / so-simulators / sdnc-simulator / src / main / java / org / onap / so / sdncsimulator / providers / ServiceOperationsCacheServiceProviderimpl.java
index 2281d0a..dae8b7f 100644 (file)
@@ -78,6 +78,7 @@ import org.springframework.stereotype.Service;
 public class ServiceOperationsCacheServiceProviderimpl extends AbstractCacheServiceProvider
         implements ServiceOperationsCacheServiceProvider {
 
+    private static final String EMPTY_STRING = "";
     private static final Logger LOGGER = LoggerFactory.getLogger(ServiceOperationsCacheServiceProviderimpl.class);
 
     @Autowired
@@ -89,32 +90,69 @@ public class ServiceOperationsCacheServiceProviderimpl extends AbstractCacheServ
     public Output putServiceOperationInformation(final GenericResourceApiServiceOperationInformation input) {
 
         final GenericResourceApiSdncrequestheaderSdncRequestHeader requestHeader = input.getSdncRequestHeader();
-        final String svcRequestId = requestHeader != null ? requestHeader.getSvcRequestId() : null;
+        final String svcRequestId = getSvcRequestId(requestHeader);
 
         final GenericResourceApiServiceinformationServiceInformation serviceInformation = input.getServiceInformation();
         if (serviceInformation != null && isValid(serviceInformation.getServiceInstanceId())) {
-            final Cache cache = getCache(SERVICE_TOPOLOGY_OPERATION_CACHE);
             final String serviceInstanceId = serviceInformation.getServiceInstanceId();
-            LOGGER.info("Adding GenericResourceApiServiceOperationInformation to cache with key: {}",
-                    serviceInstanceId);
 
-            final GenericResourceApiServicemodelinfrastructureService service =
-                    getServiceItem(input, serviceInstanceId);
-            cache.put(serviceInstanceId, service);
+            if (isServiceOperationInformationNotExists(serviceInstanceId, input)) {
+                final Cache cache = getCache(SERVICE_TOPOLOGY_OPERATION_CACHE);
+                LOGGER.info("Adding GenericResourceApiServiceOperationInformation to cache with key: {}",
+                        serviceInstanceId);
 
-            final GenericResourceApiServicestatusServiceStatus serviceStatus = service.getServiceStatus();
+                final GenericResourceApiServicemodelinfrastructureService service =
+                        getServiceItem(input, serviceInstanceId);
+                cache.put(serviceInstanceId, service);
 
-            return new Output().ackFinalIndicator(serviceStatus.getFinalIndicator())
-                    .responseCode(serviceStatus.getResponseCode()).responseMessage(serviceStatus.getResponseMessage())
-                    .svcRequestId(svcRequestId).serviceResponseInformation(new GenericResourceApiInstanceReference()
-                            .instanceId(serviceInstanceId).objectPath(getObjectPath(serviceInstanceId)));
+                final GenericResourceApiServicestatusServiceStatus serviceStatus = service.getServiceStatus();
 
+                return new Output().ackFinalIndicator(serviceStatus.getFinalIndicator())
+                        .responseCode(serviceStatus.getResponseCode())
+                        .responseMessage(serviceStatus.getResponseMessage()).svcRequestId(svcRequestId)
+                        .serviceResponseInformation(new GenericResourceApiInstanceReference()
+                                .instanceId(serviceInstanceId).objectPath(getObjectPath(serviceInstanceId)));
+            }
+            LOGGER.error("serviceInstanceId: {} already exists", serviceInstanceId);
+            return new Output().ackFinalIndicator(YES).responseCode(HttpStatus.BAD_REQUEST.toString())
+                    .responseMessage("serviceInstanceId: " + serviceInstanceId + " already exists")
+                    .svcRequestId(svcRequestId);
         }
+
         LOGGER.error(
                 "Unable to add GenericResourceApiServiceOperationInformation in cache due to invalid input: {}... ",
                 input);
         return new Output().ackFinalIndicator(YES).responseCode(HttpStatus.BAD_REQUEST.toString())
                 .responseMessage("Service instance not found").svcRequestId(svcRequestId);
+
+    }
+
+    @Override
+    public Output deleteServiceOperationInformation(final GenericResourceApiServiceOperationInformation input) {
+        final GenericResourceApiServiceinformationServiceInformation serviceInformation = input.getServiceInformation();
+        final String svcRequestId = getSvcRequestId(input.getSdncRequestHeader());
+
+        if (serviceInformation != null && isValid(serviceInformation.getServiceInstanceId())) {
+            final String serviceInstanceId = serviceInformation.getServiceInstanceId();
+            final Optional<GenericResourceApiServicemodelinfrastructureService> optional =
+                    getGenericResourceApiServicemodelinfrastructureService(serviceInstanceId);
+            if (optional.isPresent()) {
+                final Cache cache = getCache(SERVICE_TOPOLOGY_OPERATION_CACHE);
+                LOGGER.info("Deleting GenericResourceApiServiceOperationInformation from cache using key: {}",
+                        serviceInstanceId);
+                cache.evict(serviceInstanceId);
+                return new Output().ackFinalIndicator(YES).responseCode(HttpStatus.OK.toString())
+                        .responseMessage(EMPTY_STRING).svcRequestId(svcRequestId).serviceResponseInformation(
+                                new GenericResourceApiInstanceReference().instanceId(serviceInstanceId));
+            }
+            LOGGER.error(
+                    "Unable to find existing GenericResourceApiServiceModelInfrastructure in cache using service instance id: {}",
+                    serviceInstanceId);
+
+        }
+        LOGGER.error("Unable to remove service instance from cache due to invalid input: {}... ", input);
+        return new Output().ackFinalIndicator(YES).responseCode(HttpStatus.BAD_REQUEST.toString())
+                .responseMessage("Unable to remove service").svcRequestId(svcRequestId);
     }
 
     @Override
@@ -140,7 +178,7 @@ public class ServiceOperationsCacheServiceProviderimpl extends AbstractCacheServ
         final GenericResourceApiVnfinformationVnfInformation vnfInformation = input.getVnfInformation();
 
         final GenericResourceApiSdncrequestheaderSdncRequestHeader requestHeader = input.getSdncRequestHeader();
-        final String svcRequestId = requestHeader != null ? requestHeader.getSvcRequestId() : null;
+        final String svcRequestId = getSvcRequestId(requestHeader);
 
         if (serviceInformation != null && isValid(serviceInformation.getServiceInstanceId()) && vnfInformation != null
                 && isValid(vnfInformation.getVnfId())) {
@@ -153,8 +191,10 @@ public class ServiceOperationsCacheServiceProviderimpl extends AbstractCacheServ
                 final GenericResourceApiServicedataServiceData serviceData = service.getServiceData();
                 if (serviceData != null) {
                     final List<GenericResourceApiServicedataServicedataVnfsVnf> vnfsList = getVnfs(serviceData);
-                    if (ifVnfNotExists(vnfId, vnfsList)) {
+                    final GenericResourceApiLastRpcActionEnumeration svcAction =
+                            GenericResourceApiLastRpcActionEnumeration.fromValue(getSvcAction(requestHeader));
 
+                    if (ifVnfNotExists(vnfId, svcAction, vnfsList)) {
                         vnfsList.add(getGenericResourceApiServicedataVnf(serviceInstanceId, vnfId, input));
 
                         final GenericResourceApiServicestatusServiceStatus serviceStatus = service.getServiceStatus();
@@ -167,7 +207,7 @@ public class ServiceOperationsCacheServiceProviderimpl extends AbstractCacheServ
                                 .vnfResponseInformation(new GenericResourceApiInstanceReference().instanceId(vnfId)
                                         .objectPath(getObjectPath(serviceInstanceId, vnfId)));
                     }
-                    LOGGER.error("vnfId: {} already exists", vnfId);
+                    LOGGER.error("vnfId: {} already exists with SVC Action: {}", vnfId, svcAction);
                     return new Output().ackFinalIndicator(YES).responseCode(HttpStatus.BAD_REQUEST.toString())
                             .responseMessage("vnfId: " + vnfId + " already exists").svcRequestId(svcRequestId);
                 }
@@ -184,6 +224,62 @@ public class ServiceOperationsCacheServiceProviderimpl extends AbstractCacheServ
                 .responseMessage("Unable to add vnf").svcRequestId(svcRequestId);
     }
 
+    @Override
+    public Output deleteVnfOperationInformation(final GenericResourceApiVnfOperationInformation input) {
+        final GenericResourceApiServiceinformationServiceInformation serviceInformation = input.getServiceInformation();
+        final GenericResourceApiVnfinformationVnfInformation vnfInformation = input.getVnfInformation();
+
+        final GenericResourceApiSdncrequestheaderSdncRequestHeader requestHeader = input.getSdncRequestHeader();
+        final String svcRequestId = getSvcRequestId(requestHeader);
+
+        if (serviceInformation != null && isValid(serviceInformation.getServiceInstanceId()) && vnfInformation != null
+                && isValid(vnfInformation.getVnfId())) {
+            final String serviceInstanceId = serviceInformation.getServiceInstanceId();
+            final String vnfId = vnfInformation.getVnfId();
+            final Optional<GenericResourceApiServicemodelinfrastructureService> optional =
+                    getGenericResourceApiServicemodelinfrastructureService(serviceInstanceId);
+            if (optional.isPresent()) {
+                final GenericResourceApiServicemodelinfrastructureService service = optional.get();
+                final GenericResourceApiServicedataServiceData serviceData = service.getServiceData();
+                if (serviceData != null) {
+                    final List<GenericResourceApiServicedataServicedataVnfsVnf> vnfsList = getVnfs(serviceData);
+                    final Optional<GenericResourceApiServicedataServicedataVnfsVnf> vnfInstanceOptional =
+                            getExistingVnf(vnfId, vnfsList);
+
+                    if (vnfInstanceOptional.isPresent()) {
+                        vnfsList.removeIf(vnf -> {
+                            final String existingVnfId = vnf.getVnfId();
+                            if (existingVnfId != null && existingVnfId.equals(vnfId)) {
+                                LOGGER.info("Remove vnf with id: {} ... ", existingVnfId);
+                                return true;
+                            }
+                            return false;
+                        });
+
+                        return new Output().ackFinalIndicator(YES).responseCode(HttpStatus.OK.toString())
+                                .responseMessage(EMPTY_STRING).svcRequestId(svcRequestId)
+                                .serviceResponseInformation(
+                                        new GenericResourceApiInstanceReference().instanceId(serviceInstanceId))
+                                .vnfResponseInformation(new GenericResourceApiInstanceReference().instanceId(vnfId));
+                    }
+
+                }
+            }
+            LOGGER.error(
+                    "Unable to find existing GenericResourceApiServiceModelInfrastructure in cache using service instance id: {}",
+                    serviceInstanceId);
+
+        }
+        LOGGER.error("Unable to remove vnf instance from cache due to invalid input: {}... ", input);
+        return new Output().ackFinalIndicator(YES).responseCode(HttpStatus.BAD_REQUEST.toString())
+                .responseMessage("Unable to remove vnf").svcRequestId(svcRequestId);
+
+    }
+
+    private String getSvcRequestId(final GenericResourceApiSdncrequestheaderSdncRequestHeader requestHeader) {
+        return requestHeader != null ? requestHeader.getSvcRequestId() : null;
+    }
+
     @Override
     public void clearAll() {
         clearCache(SERVICE_TOPOLOGY_OPERATION_CACHE);
@@ -198,11 +294,35 @@ public class ServiceOperationsCacheServiceProviderimpl extends AbstractCacheServ
     }
 
 
-    private boolean ifVnfNotExists(final String vnfId,
+    private boolean ifVnfNotExists(final String vnfId, final GenericResourceApiLastRpcActionEnumeration svcAction,
             final List<GenericResourceApiServicedataServicedataVnfsVnf> vnfsList) {
-        final Optional<GenericResourceApiServicedataServicedataVnfsVnf> optional =
-                vnfsList.stream().filter(vnf -> vnf.getVnfId() != null && vnf.getVnfId().equals(vnfId)).findFirst();
-        return !optional.isPresent();
+        final Optional<GenericResourceApiServicedataServicedataVnfsVnf> optional = getExistingVnf(vnfId, vnfsList);
+        if (optional.isPresent()) {
+            final GenericResourceApiServicedataServicedataVnfsVnf existingVnf = optional.get();
+            final GenericResourceApiServicedataServicedataVnfsVnfVnfData vnfData = existingVnf.getVnfData();
+
+            if (vnfData != null && vnfData.getVnfLevelOperStatus() != null
+                    && vnfData.getVnfLevelOperStatus().getLastRpcAction() != null) {
+                final GenericResourceApiLastRpcActionEnumeration existingVnflastRpcAction =
+                        vnfData.getVnfLevelOperStatus().getLastRpcAction();
+                if (existingVnflastRpcAction.equals(svcAction)) {
+                    LOGGER.error("Found vnf with id: {} and LastRpcAction: {} same as SvcAction:  {}", vnfId,
+                            existingVnflastRpcAction, svcAction);
+                    return false;
+                }
+                LOGGER.warn("Will remove and replace existing vnf with id: {} as SvcAction is changed from {} to {}",
+                        vnfId, existingVnflastRpcAction, svcAction);
+                vnfsList.removeIf(vnf -> vnf.getVnfId() != null && vnf.getVnfId().equals(vnfId));
+
+            }
+        }
+
+        return true;
+    }
+
+    private Optional<GenericResourceApiServicedataServicedataVnfsVnf> getExistingVnf(final String vnfId,
+            final List<GenericResourceApiServicedataServicedataVnfsVnf> vnfsList) {
+        return vnfsList.stream().filter(vnf -> vnf.getVnfId() != null && vnf.getVnfId().equals(vnfId)).findFirst();
     }
 
     private List<GenericResourceApiServicedataServicedataVnfsVnf> getVnfs(
@@ -285,17 +405,13 @@ public class ServiceOperationsCacheServiceProviderimpl extends AbstractCacheServ
         apiServicedataServiceData.serviceLevelOperStatus(getServiceLevelOperStatus(input));
 
         final GenericResourceApiServicestatusServiceStatus serviceStatus =
-                getServiceStatus(getSvcAction(input.getSdncRequestHeader()), getAction(input.getRequestInformation()),
-                        HttpStatus.OK.toString());
+                getServiceStatus(getSvcAction(input.getSdncRequestHeader()),
+                        getRequestAction(input.getRequestInformation()), HttpStatus.OK.toString());
 
         return new GenericResourceApiServicemodelinfrastructureService().serviceData(apiServicedataServiceData)
                 .serviceStatus(serviceStatus).serviceInstanceId(serviceInstanceId);
     }
 
-    private String getAction(final GenericResourceApiRequestinformationRequestInformation input) {
-        return getString(input.getRequestAction(), "");
-    }
-
     private String getSvcAction(final GenericResourceApiSdncrequestheaderSdncRequestHeader input) {
         return input != null ? getStringOrNull(input.getSvcAction()) : null;
     }
@@ -305,7 +421,7 @@ public class ServiceOperationsCacheServiceProviderimpl extends AbstractCacheServ
         return new GenericResourceApiServicestatusServiceStatus().finalIndicator(YES)
                 .rpcAction(GenericResourceApiRpcActionEnumeration.fromValue(rpcAction))
                 .rpcName(SERVICE_TOPOLOGY_OPERATION).responseTimestamp(LocalDateTime.now().toString())
-                .responseCode(responseCode).requestStatus(SYNCCOMPLETE).responseMessage("").action(action);
+                .responseCode(responseCode).requestStatus(SYNCCOMPLETE).responseMessage(EMPTY_STRING).action(action);
     }
 
     private GenericResourceApiOperStatusData getServiceLevelOperStatus(
@@ -323,7 +439,12 @@ public class ServiceOperationsCacheServiceProviderimpl extends AbstractCacheServ
     }
 
     private String getRequestAction(final GenericResourceApiRequestinformationRequestInformation input) {
-        return input != null ? getStringOrNull(input.getRequestAction()) : null;
+        return getRequestAction(input, EMPTY_STRING);
+    }
+
+    private String getRequestAction(final GenericResourceApiRequestinformationRequestInformation input,
+            final String defaultValue) {
+        return input != null ? getString(input.getRequestAction(), defaultValue) : defaultValue;
     }
 
     private GenericResourceApiServicetopologyServiceTopology getServiceTopology(
@@ -355,4 +476,33 @@ public class ServiceOperationsCacheServiceProviderimpl extends AbstractCacheServ
 
     }
 
+    private boolean isServiceOperationInformationNotExists(final String serviceInstanceId,
+            final GenericResourceApiServiceOperationInformation input) {
+        final GenericResourceApiSdncrequestheaderSdncRequestHeader requestHeader = input.getSdncRequestHeader();
+        final Optional<GenericResourceApiServicemodelinfrastructureService> optional =
+                getGenericResourceApiServicemodelinfrastructureService(serviceInstanceId);
+
+        if (optional.isPresent()) {
+            final GenericResourceApiServicemodelinfrastructureService existingService = optional.get();
+            final GenericResourceApiServicestatusServiceStatus serviceStatus = existingService.getServiceStatus();
+            if (serviceStatus != null) {
+                final GenericResourceApiRpcActionEnumeration rpcAction = serviceStatus.getRpcAction();
+                final String svcAction = getSvcAction(requestHeader);
+                if (rpcAction != null && rpcAction.toString().equals(svcAction)) {
+                    LOGGER.error("Found Service with id: {} and RpcAction: {} same as SvcAction:  {}",
+                            serviceInstanceId, rpcAction, svcAction);
+                    return false;
+                }
+
+                final Cache cache = getCache(SERVICE_TOPOLOGY_OPERATION_CACHE);
+                LOGGER.info(
+                        "Deleting existing GenericResourceApiServiceOperationInformation from cache using key: {} as SvcAction is changed from {} to {}",
+                        serviceInstanceId, rpcAction, svcAction);
+                cache.evict(serviceInstanceId);
+            }
+        }
+        return true;
+
+    }
+
 }