From 3971c419e094cb149c3e01781343d6265af64db6 Mon Sep 17 00:00:00 2001 From: Sirisha_Manchikanti Date: Fri, 20 Aug 2021 17:21:11 +0100 Subject: Updated handling of ack messages Issue-ID: POLICY-3417 Signed-off-by: Sirisha_Manchikanti Change-Id: I5784debf2e17fd1018b3feb7c9e2ae08d5f93d23 --- .../api/ParticipantIntermediaryApi.java | 3 +- .../api/impl/ParticipantIntermediaryApiImpl.java | 6 +- .../intermediary/comm/MessageSender.java | 2 +- .../intermediary/handler/ControlLoopHandler.java | 67 +++++++++------------- .../intermediary/handler/ParticipantHandler.java | 51 ++++++++++++++-- 5 files changed, 81 insertions(+), 48 deletions(-) (limited to 'participant/participant-intermediary/src') diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ParticipantIntermediaryApi.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ParticipantIntermediaryApi.java index aa2027ab8..ed0aea4b3 100644 --- a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ParticipantIntermediaryApi.java +++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ParticipantIntermediaryApi.java @@ -31,6 +31,7 @@ import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics; +import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageType; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; @@ -123,7 +124,7 @@ public interface ParticipantIntermediaryApi { * @return ControlLoopElement updated control loop element */ ControlLoopElement updateControlLoopElementState(UUID id, ControlLoopOrderedState currentState, - ControlLoopState newState); + ControlLoopState newState, ParticipantMessageType messageType); /** * Update the control loop element statistics. diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/impl/ParticipantIntermediaryApiImpl.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/impl/ParticipantIntermediaryApiImpl.java index a2a4c3436..ded102f5a 100644 --- a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/impl/ParticipantIntermediaryApiImpl.java +++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/impl/ParticipantIntermediaryApiImpl.java @@ -33,6 +33,7 @@ import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics; +import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageType; import org.onap.policy.clamp.controlloop.participant.intermediary.api.ControlLoopElementListener; import org.onap.policy.clamp.controlloop.participant.intermediary.api.ParticipantIntermediaryApi; import org.onap.policy.clamp.controlloop.participant.intermediary.handler.ParticipantHandler; @@ -127,8 +128,9 @@ public class ParticipantIntermediaryApiImpl implements ParticipantIntermediaryAp @Override public ControlLoopElement updateControlLoopElementState(UUID id, ControlLoopOrderedState currentState, - ControlLoopState newState) { - return participantHandler.getControlLoopHandler().updateControlLoopElementState(id, currentState, newState); + ControlLoopState newState, ParticipantMessageType messageType) { + return participantHandler.getControlLoopHandler().updateControlLoopElementState(id, currentState, newState, + messageType); } @Override diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/MessageSender.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/MessageSender.java index 990c3df7d..680acd276 100644 --- a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/MessageSender.java +++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/MessageSender.java @@ -146,7 +146,7 @@ public class MessageSender extends TimerTask implements Closeable { * Dispatch a heartbeat for this participant. */ public void sendHeartbeat() { - publisher.sendHeartbeat(participantHandler.makeHeartbeat()); + publisher.sendHeartbeat(participantHandler.makeHeartbeat(false)); } /** diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ControlLoopHandler.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ControlLoopHandler.java index daf9ebe39..fbe940c7f 100644 --- a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ControlLoopHandler.java +++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ControlLoopHandler.java @@ -63,6 +63,7 @@ public class ControlLoopHandler { private ToscaConceptIdentifier participantId = null; private MessageSender messageSender = null; + @Getter private final Map controlLoopMap = new LinkedHashMap<>(); @Getter @@ -96,7 +97,7 @@ public class ControlLoopHandler { * @return controlLoopElement the updated controlloop element */ public ControlLoopElement updateControlLoopElementState(UUID id, ControlLoopOrderedState orderedState, - ControlLoopState newState) { + ControlLoopState newState, ParticipantMessageType messageType) { if (id == null) { LOGGER.warn("Cannot update Control loop element state, id is null"); @@ -145,37 +146,38 @@ public class ControlLoopHandler { } var controlLoop = controlLoopMap.get(stateChangeMsg.getControlLoopId()); + var controlLoopAck = new ControlLoopAck(ParticipantMessageType.CONTROL_LOOP_STATE_CHANGE); if (controlLoop == null) { + controlLoopAck.setMessage("Control loop " + stateChangeMsg.getControlLoopId() + + " does not use this participant " + participantId); + controlLoopAck.setResult(false); + controlLoopAck.setResponseTo(stateChangeMsg.getMessageId()); + controlLoopAck.setControlLoopId(stateChangeMsg.getControlLoopId()); + messageSender.sendAckResponse(controlLoopAck); LOGGER.debug("Control loop {} does not use this participant", stateChangeMsg.getControlLoopId()); return; } - var controlLoopStateChangeAck = new ControlLoopAck(ParticipantMessageType.CONTROLLOOP_STATECHANGE_ACK); - controlLoopStateChangeAck.setResponseTo(stateChangeMsg.getMessageId()); - controlLoopStateChangeAck.setControlLoopId(stateChangeMsg.getControlLoopId()); - handleState(controlLoop, controlLoopStateChangeAck, stateChangeMsg.getOrderedState()); - messageSender.sendAckResponse(controlLoopStateChangeAck); + handleState(controlLoop, stateChangeMsg.getOrderedState()); } /** * Method to handle state changes. * * @param controlLoop participant response - * @param response participant response * @param orderedState controlloop ordered state */ - private void handleState(final ControlLoop controlLoop, final ControlLoopAck response, - ControlLoopOrderedState orderedState) { + private void handleState(final ControlLoop controlLoop, ControlLoopOrderedState orderedState) { switch (orderedState) { case UNINITIALISED: - handleUninitialisedState(controlLoop, orderedState, response); + handleUninitialisedState(controlLoop, orderedState); break; case PASSIVE: - handlePassiveState(controlLoop, orderedState, response); + handlePassiveState(controlLoop, orderedState); break; case RUNNING: - handleRunningState(controlLoop, orderedState, response); + handleRunningState(controlLoop, orderedState); break; default: LOGGER.debug("StateChange message has no state, state is null {}", controlLoop.getDefinition()); @@ -202,11 +204,11 @@ public class ControlLoopHandler { // TODO: Updates to existing ControlLoops are not supported yet (Addition/Removal of ControlLoop // elements to existing ControlLoop has to be supported). if (controlLoop != null) { - controlLoopUpdateAck.setResponseTo(updateMsg.getMessageId()); - controlLoopUpdateAck.setControlLoopId(updateMsg.getControlLoopId()); controlLoopUpdateAck.setMessage("Control loop " + updateMsg.getControlLoopId() + " already defined on participant " + participantId); controlLoopUpdateAck.setResult(false); + controlLoopUpdateAck.setResponseTo(updateMsg.getMessageId()); + controlLoopUpdateAck.setControlLoopId(updateMsg.getControlLoopId()); messageSender.sendAckResponse(controlLoopUpdateAck); return; } @@ -230,13 +232,6 @@ public class ControlLoopHandler { controlLoop.setDefinition(updateMsg.getControlLoopId()); controlLoop.setElements(clElementMap); controlLoopMap.put(updateMsg.getControlLoopId(), controlLoop); - - controlLoopUpdateAck.setResponseTo(updateMsg.getMessageId()); - controlLoopUpdateAck.setControlLoopId(updateMsg.getControlLoopId()); - controlLoopUpdateAck.setMessage("Control loop " + updateMsg.getControlLoopId() - + " defined on participant " + participantId); - controlLoopUpdateAck.setResult(true); - messageSender.sendAckResponse(controlLoopUpdateAck); } private ToscaNodeTemplate getClElementNodeTemplate(List clElementDefinitions, @@ -275,11 +270,9 @@ public class ControlLoopHandler { * * @param controlLoop participant response * @param orderedState orderedState - * @param response participant response */ - private void handleUninitialisedState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState, - final ControlLoopAck response) { - handleStateChange(controlLoop, orderedState, ControlLoopState.UNINITIALISED, response); + private void handleUninitialisedState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState) { + handleStateChange(controlLoop, orderedState, ControlLoopState.UNINITIALISED); controlLoopMap.remove(controlLoop.getKey().asIdentifier()); for (ControlLoopElementListener clElementListener : listeners) { @@ -298,11 +291,9 @@ public class ControlLoopHandler { * * @param controlLoop participant response * @param orderedState orderedState - * @param response participant response */ - private void handlePassiveState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState, - final ControlLoopAck response) { - handleStateChange(controlLoop, orderedState, ControlLoopState.PASSIVE, response); + private void handlePassiveState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState) { + handleStateChange(controlLoop, orderedState, ControlLoopState.PASSIVE); } /** @@ -310,11 +301,9 @@ public class ControlLoopHandler { * * @param controlLoop participant response * @param orderedState orderedState - * @param response participant response */ - private void handleRunningState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState, - final ControlLoopAck response) { - handleStateChange(controlLoop, orderedState, ControlLoopState.RUNNING, response); + private void handleRunningState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState) { + handleStateChange(controlLoop, orderedState, ControlLoopState.RUNNING); } /** @@ -323,14 +312,16 @@ public class ControlLoopHandler { * @param controlLoop participant status in memory * @param orderedState orderedState the new ordered state the participant should have * @param newState new state of the control loop elements - * @param response the response to the state change request */ private void handleStateChange(ControlLoop controlLoop, final ControlLoopOrderedState orderedState, - ControlLoopState newState, ControlLoopAck response) { + ControlLoopState newState) { if (orderedState.equals(controlLoop.getOrderedState())) { - response.setMessage("Control loop is already in state " + orderedState); - response.setResult(false); + var controlLoopAck = new ControlLoopAck(ParticipantMessageType.CONTROL_LOOP_STATE_CHANGE); + controlLoopAck.setMessage("Control loop is already in state" + orderedState); + controlLoopAck.setResult(false); + controlLoopAck.setControlLoopId(controlLoop.getDefinition()); + messageSender.sendAckResponse(controlLoopAck); return; } @@ -341,8 +332,6 @@ public class ControlLoopHandler { }); } - response.setMessage("ControlLoop state changed from " + controlLoop.getOrderedState() + " to " + orderedState); - response.setResult(true); controlLoop.setOrderedState(orderedState); } diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ParticipantHandler.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ParticipantHandler.java index f887f6578..1947fda1a 100644 --- a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ParticipantHandler.java +++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ParticipantHandler.java @@ -26,11 +26,16 @@ import java.io.Closeable; import java.time.Instant; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.UUID; import lombok.Getter; import lombok.Setter; +import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatisticsList; +import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElementDefinition; +import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopInfo; +import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopStatistics; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantDefinition; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus; @@ -112,7 +117,7 @@ public class ParticipantHandler implements Closeable { * @param participantStatusReqMsg participant participantStatusReq message */ public void handleParticipantStatusReq(final ParticipantStatusReq participantStatusReqMsg) { - sender.sendParticipantStatus(makeHeartbeat()); + sender.sendParticipantStatus(makeHeartbeat(true)); } /** @@ -247,10 +252,17 @@ public class ParticipantHandler implements Closeable { } toscaServiceTemplate = participantUpdateMsg.getToscaServiceTemplate(); - for (ParticipantDefinition participantDefinition : participantUpdateMsg.getParticipantDefinitionUpdates()) { - if (participantDefinition.getParticipantId().equals(participantType)) { - clElementDefsOnThisParticipant = participantDefinition.getControlLoopElementDefinitionList(); + if (toscaServiceTemplate != null) { + // This message is to commission the controlloop + for (ParticipantDefinition participantDefinition : participantUpdateMsg.getParticipantDefinitionUpdates()) { + if (participantDefinition.getParticipantId().equals(participantType)) { + clElementDefsOnThisParticipant = participantDefinition.getControlLoopElementDefinitionList(); + break; + } } + } else { + // This message is to decommision the controlloop + clElementDefsOnThisParticipant.clear(); } sendParticipantUpdateAck(participantUpdateMsg.getMessageId()); } @@ -272,7 +284,7 @@ public class ParticipantHandler implements Closeable { /** * Method to send heartbeat to controlloop runtime. */ - public ParticipantStatus makeHeartbeat() { + public ParticipantStatus makeHeartbeat(boolean responseToParticipantStatusReq) { this.participantStatistics.setState(state); this.participantStatistics.setHealthStatus(healthStatus); this.participantStatistics.setTimeStamp(Instant.now()); @@ -283,6 +295,35 @@ public class ParticipantHandler implements Closeable { heartbeat.setParticipantType(participantType); heartbeat.setHealthStatus(healthStatus); heartbeat.setState(state); + heartbeat.setControlLoopInfoList(getControlLoopInfoList()); + + if (responseToParticipantStatusReq) { + List participantDefinitionUpdates = new ArrayList<>(); + ParticipantDefinition participantDefinition = new ParticipantDefinition(); + participantDefinition.setParticipantId(participantId); + participantDefinition.setControlLoopElementDefinitionList(clElementDefsOnThisParticipant); + participantDefinitionUpdates.add(participantDefinition); + heartbeat.setParticipantDefinitionUpdates(participantDefinitionUpdates); + } + return heartbeat; } + + private List getControlLoopInfoList() { + List controlLoopInfoList = new ArrayList<>(); + for (Map.Entry entry : + controlLoopHandler.getControlLoopMap().entrySet()) { + ControlLoopInfo clInfo = new ControlLoopInfo(); + clInfo.setControlLoopId(entry.getKey()); + ControlLoopStatistics clStatitistics = new ControlLoopStatistics(); + clStatitistics.setControlLoopId(entry.getKey()); + ClElementStatisticsList clElementStatisticsList = new ClElementStatisticsList(); + clElementStatisticsList.setClElementStatistics( + entry.getValue().getControlLoopElementStatisticsList(entry.getValue())); + clStatitistics.setClElementStatisticsList(clElementStatisticsList); + clInfo.setControlLoopStatistics(clStatitistics); + clInfo.setState(entry.getValue().getState()); + } + return controlLoopInfoList; + } } -- cgit 1.2.3-korg