diff --git a/src/main/java/org/etsi/osl/osom/lcm/ChatClient.java b/src/main/java/org/etsi/osl/osom/lcm/ChatClient.java new file mode 100644 index 0000000000000000000000000000000000000000..dd1b6ab4f1264497634c5e54924199e42bff46ae --- /dev/null +++ b/src/main/java/org/etsi/osl/osom/lcm/ChatClient.java @@ -0,0 +1,66 @@ +package org.etsi.osl.osom.lcm; + +import org.springframework.stereotype.Service; +import lombok.extern.slf4j.Slf4j; +import org.apache.camel.CamelExecutionException; +import org.apache.camel.ExchangeTimedOutException; +import org.apache.camel.ProducerTemplate; + +@Service +@Slf4j +public class ChatClient { + + + + private static final int MAX_ATTEMPTS = 3; + + private final ProducerTemplate producerTemplate; + + public ChatClient(ProducerTemplate producerTemplate) { + this.producerTemplate = producerTemplate; + } + + /** + * Sends a String message to ActiveMQ and waits for a String reply. + * Retries up to 3 times in case of timeout. + * + * @param payload the request payload + * @return the response String, or "" if all attempts time out or fail + */ + public String ask(String agentName, String payload, String defaultText, Integer timeOut) { + for (int attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) { + try { + String ENDPOINT_URI = + "jms:queue:agents/" + agentName + + "?exchangePattern=InOut" + + "&requestTimeout=" + timeOut ; // x milliseconds timeout per attempt + + String response = producerTemplate.requestBody( + ENDPOINT_URI, + payload, + String.class); + + // If response is non-null, return it + if (response != null) { + return response; + } + } catch (CamelExecutionException ex) { + // Check if the underlying cause is a timeout + if (ex.getCause() instanceof ExchangeTimedOutException) { + log.warn("Timeout on attempt {} for payload {}", attempt, payload, ex); + } else { + // Non-timeout error; break or handle differently + log.error("Non-timeout error on attempt {}", attempt, ex); + break; + } + } catch (Exception ex) { + log.error("Unexpected error on attempt {}", attempt, ex); + break; + } + } + + // All attempts failed or timed out + return ""; + } + +} diff --git a/src/main/java/org/etsi/osl/osom/lcm/LcmBaseExecutor.java b/src/main/java/org/etsi/osl/osom/lcm/LcmBaseExecutor.java index 741676df2304f99327e3d3124c91552ad930e6a7..fbe909d3890cda193653f99f58d8c1837f349567 100644 --- a/src/main/java/org/etsi/osl/osom/lcm/LcmBaseExecutor.java +++ b/src/main/java/org/etsi/osl/osom/lcm/LcmBaseExecutor.java @@ -44,6 +44,7 @@ import org.etsi.osl.tmf.so641.model.ServiceOrder; import org.etsi.osl.tmf.so641.model.ServiceOrderCreate; import org.etsi.osl.tmf.so641.model.ServiceOrderItemRelationship; import org.etsi.osl.tmf.so641.model.ServiceOrderStateType; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatusCode; @@ -1156,6 +1157,18 @@ public abstract class LcmBaseExecutor { return ""; } + + public String askAgent(String agentName,String payload, String defaultText, Integer timeOut) { + ChatClient chatClient = this.vars.getServiceOrderManager().getChatClient(agentName); + if ( chatClient !=null ) { + if (timeOut == null) { + timeOut = 60000; + } + return chatClient.ask(agentName, payload, defaultText, timeOut); + }else { + return defaultText; + } + } static T toJsonObj(String content, TypeReference typeReference) throws IOException { ObjectMapper mapper = new ObjectMapper(); @@ -1168,4 +1181,6 @@ public abstract class LcmBaseExecutor { mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); return mapper.writeValueAsString(object); } + + } diff --git a/src/main/java/org/etsi/osl/osom/management/ServiceOrderManager.java b/src/main/java/org/etsi/osl/osom/management/ServiceOrderManager.java index 55c4dc0746ec57949651c93b2b94607fc91a5e63..91729c3d26c37543df3b2da0afd62d484eea62a3 100644 --- a/src/main/java/org/etsi/osl/osom/management/ServiceOrderManager.java +++ b/src/main/java/org/etsi/osl/osom/management/ServiceOrderManager.java @@ -34,6 +34,7 @@ import org.apache.commons.logging.LogFactory; import org.etsi.osl.model.nfv.DeploymentDescriptor; import org.etsi.osl.model.nfv.NetworkServiceDescriptor; import org.etsi.osl.model.nfv.ScaleDescriptor; +import org.etsi.osl.osom.lcm.ChatClient; import org.etsi.osl.osom.serviceactions.NSActionRequestPayload; import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob; import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJobFVO; @@ -204,6 +205,9 @@ public class ServiceOrderManager { @Value("${PM_MEASUREMENT_COLLECTION_JOB_UPDATE}") private String PM_MEASUREMENT_COLLECTION_JOB_UPDATE; + @Autowired + private ChatClient chatClient; + @Transactional public void processOrder(ServiceOrder serviceOrder) { @@ -1204,6 +1208,11 @@ public class ServiceOrderManager { return null; } + public ChatClient getChatClient(String agentName) { + + return chatClient; + } + diff --git a/src/main/java/org/etsi/osl/osom/serviceactions/AutomaticallyHandleAction.java b/src/main/java/org/etsi/osl/osom/serviceactions/AutomaticallyHandleAction.java index 2602be868670d9edc9ab2d3551eab2a468768d99..2d30dd45a26664ce6b8d4fdfdf554568fa7a5e78 100644 --- a/src/main/java/org/etsi/osl/osom/serviceactions/AutomaticallyHandleAction.java +++ b/src/main/java/org/etsi/osl/osom/serviceactions/AutomaticallyHandleAction.java @@ -67,7 +67,10 @@ public class AutomaticallyHandleAction implements JavaDelegate { ResourceRef rr = aService.getSupportingResource().stream().findFirst().get(); Resource relatedResource = serviceOrderManager.retrieveResource( rr.getId() ); - + if ( relatedResource == null ) { + serviceOrderManager.deleteServiceActionQueueItem( item ); + return; + } ResourceUpdate aResourceUpdate = resourceToResourceUpdate(relatedResource); //pass characteristic values from services to resource @@ -118,7 +121,7 @@ public class AutomaticallyHandleAction implements JavaDelegate { } } else { - + //metric deletion arrives here also response = createNewResourceDeleteRequest(aService, relatedResource, aResourceUpdate, serviceOrderID ); @@ -156,11 +159,11 @@ public class AutomaticallyHandleAction implements JavaDelegate { private ResourceUpdate resourceToResourceUpdate(Resource source) { + ResourceUpdate resourceUpdate = new ResourceUpdate(); if ( source == null ) { - return null; + return resourceUpdate; } - ResourceUpdate resourceUpdate = new ResourceUpdate(); resourceUpdate.setCategory( source.getCategory() ); resourceUpdate.setDescription( source.getDescription() );