From 026cfefbe02cfc87c04f13d4b5ce7085f3ee360b Mon Sep 17 00:00:00 2001 From: FrancescoFioraEst Date: Wed, 4 Jan 2023 17:04:37 +0000 Subject: Refactor register deregister a Participant and Supervise Participants MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor register deregister a Participant and Supervise Participants using ON_LINE/OFF_LINE as Participant Status. Issue-ID: POLICY-4497 Change-Id: If9c5b92131c99132c18340e56334fb9453745526 Signed-off-by: FrancescoFioraEst --- .../runtime/supervision/SupervisionHandler.java | 154 ++------------------- .../supervision/SupervisionParticipantHandler.java | 116 ++++++++++++++++ .../runtime/supervision/SupervisionScanner.java | 43 ++---- .../comm/ParticipantDeregisterListener.java | 8 +- .../comm/ParticipantRegisterListener.java | 8 +- .../comm/ParticipantStatusListener.java | 8 +- .../supervision/SupervisionHandlerTest.java | 154 ++++----------------- .../SupervisionParticipantHandlerTest.java | 107 ++++++++++++++ .../supervision/SupervisionScannerTest.java | 28 ++-- .../supervision/comm/SupervisionMessagesTest.java | 9 +- 10 files changed, 302 insertions(+), 333 deletions(-) create mode 100644 runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionParticipantHandler.java create mode 100644 runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionParticipantHandlerTest.java (limited to 'runtime-acm') diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java index 9a80508e5..c27447405 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandler.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2021,2022 Nordix Foundation. + * Copyright (C) 2021,2023 Nordix Foundation. * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -29,28 +29,17 @@ import javax.ws.rs.core.Response; import lombok.AllArgsConstructor; import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher; import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionUpdatePublisher; -import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantDeregisterAckPublisher; -import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantRegisterAckPublisher; import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantUpdatePublisher; import org.onap.policy.clamp.common.acm.exception.AutomationCompositionException; import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementAck; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState; -import org.onap.policy.clamp.models.acm.concepts.Participant; -import org.onap.policy.clamp.models.acm.concepts.ParticipantHealthStatus; -import org.onap.policy.clamp.models.acm.concepts.ParticipantState; import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils; import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionAck; -import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantDeregister; -import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessage; -import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantRegister; -import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantStatus; import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantUpdateAck; import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider; import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider; -import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider; -import org.onap.policy.models.base.PfModelException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -75,109 +64,13 @@ public class SupervisionHandler { private static final String AND_TRANSITIONING_TO_STATE = " and transitioning to state "; private final AutomationCompositionProvider automationCompositionProvider; - private final ParticipantProvider participantProvider; private final AcDefinitionProvider acDefinitionProvider; // Publishers for participant communication private final AutomationCompositionUpdatePublisher automationCompositionUpdatePublisher; private final AutomationCompositionStateChangePublisher automationCompositionStateChangePublisher; - private final ParticipantRegisterAckPublisher participantRegisterAckPublisher; - private final ParticipantDeregisterAckPublisher participantDeregisterAckPublisher; private final ParticipantUpdatePublisher participantUpdatePublisher; - /** - * Handle a ParticipantStatus message from a participant. - * - * @param participantStatusMessage the ParticipantStatus message received from a participant - */ - @MessageIntercept - @Timed(value = "listener.participant_status", description = "PARTICIPANT_STATUS messages received") - public void handleParticipantMessage(ParticipantStatus participantStatusMessage) { - LOGGER.debug("Participant Status received {}", participantStatusMessage); - try { - superviseParticipant(participantStatusMessage); - } catch (PfModelException | AutomationCompositionException svExc) { - LOGGER.warn("error supervising participant {}", participantStatusMessage.getParticipantId(), svExc); - } - } - - /** - * Handle a ParticipantRegister message from a participant. - * - * @param participantRegisterMessage the ParticipantRegister message received from a participant - */ - @MessageIntercept - @Timed(value = "listener.participant_register", description = "PARTICIPANT_REGISTER messages received") - public void handleParticipantMessage(ParticipantRegister participantRegisterMessage) { - LOGGER.debug("Participant Register received {}", participantRegisterMessage); - try { - checkParticipant(participantRegisterMessage, ParticipantState.UNKNOWN, ParticipantHealthStatus.UNKNOWN); - } catch (PfModelException | AutomationCompositionException svExc) { - LOGGER.warn("error saving participant {}", participantRegisterMessage.getParticipantId(), svExc); - } - - participantUpdatePublisher.sendCommissioning(participantRegisterMessage.getParticipantId(), - participantRegisterMessage.getParticipantType()); - - participantRegisterAckPublisher.send(participantRegisterMessage.getMessageId(), - participantRegisterMessage.getParticipantId(), participantRegisterMessage.getParticipantType()); - } - - /** - * Handle a ParticipantDeregister message from a participant. - * - * @param participantDeregisterMessage the ParticipantDeregister message received from a participant - */ - @MessageIntercept - @Timed(value = "listener.participant_deregister", description = "PARTICIPANT_DEREGISTER messages received") - public void handleParticipantMessage(ParticipantDeregister participantDeregisterMessage) { - LOGGER.debug("Participant Deregister received {}", participantDeregisterMessage); - try { - var participantOpt = - participantProvider.findParticipant(participantDeregisterMessage.getParticipantId().getName(), - participantDeregisterMessage.getParticipantId().getVersion()); - - if (participantOpt.isPresent()) { - var participant = participantOpt.get(); - participant.setParticipantState(ParticipantState.TERMINATED); - participant.setHealthStatus(ParticipantHealthStatus.OFF_LINE); - participantProvider.saveParticipant(participant); - } - } catch (PfModelException pfme) { - LOGGER.warn("Model exception occured with participant id {}", - participantDeregisterMessage.getParticipantId()); - } - - participantDeregisterAckPublisher.send(participantDeregisterMessage.getMessageId()); - } - - /** - * Handle a ParticipantUpdateAck message from a participant. - * - * @param participantUpdateAckMessage the ParticipantUpdateAck message received from a participant - */ - @MessageIntercept - @Timed(value = "listener.participant_update_ack", description = "PARTICIPANT_UPDATE_ACK messages received") - public void handleParticipantMessage(ParticipantUpdateAck participantUpdateAckMessage) { - LOGGER.debug("Participant Update Ack received {}", participantUpdateAckMessage); - try { - var participantOpt = - participantProvider.findParticipant(participantUpdateAckMessage.getParticipantId().getName(), - participantUpdateAckMessage.getParticipantId().getVersion()); - - if (participantOpt.isPresent()) { - var participant = participantOpt.get(); - participant.setParticipantState(participantUpdateAckMessage.getState()); - participantProvider.saveParticipant(participant); - } else { - LOGGER.warn("Participant not found in database {}", participantUpdateAckMessage.getParticipantId()); - } - } catch (PfModelException pfme) { - LOGGER.warn("Model exception occured with participant id {}", - participantUpdateAckMessage.getParticipantId()); - } - } - /** * Send commissioning update message to dmaap. * @@ -212,6 +105,17 @@ public class SupervisionHandler { setAcElementStateInDb(automationCompositionAckMessage); } + /** + * Handle a ParticipantUpdateAck message from a participant. + * + * @param participantUpdateAckMessage the ParticipantUpdateAck message received from a participant + */ + @MessageIntercept + @Timed(value = "listener.participant_update_ack", description = "PARTICIPANT_UPDATE_ACK messages received") + public void handleParticipantMessage(ParticipantUpdateAck participantUpdateAckMessage) { + LOGGER.debug("Participant Update Ack message received {}", participantUpdateAckMessage); + } + /** * Handle a AutomationComposition statechange acknowledge message from a participant. * @@ -405,40 +309,6 @@ public class SupervisionHandler { return ParticipantUtils.getFirstStartPhase(automationComposition, toscaServiceTemplate); } - private void checkParticipant(ParticipantMessage participantMessage, ParticipantState participantState, - ParticipantHealthStatus healthStatus) throws AutomationCompositionException, PfModelException { - if (participantMessage.getParticipantId() == null) { - exceptionOccured(Response.Status.NOT_FOUND, "Participant ID on PARTICIPANT_STATUS message is null"); - } - var participantOpt = participantProvider.findParticipant(participantMessage.getParticipantId().getName(), - participantMessage.getParticipantId().getVersion()); - - if (participantOpt.isEmpty()) { - var participant = new Participant(); - participant.setName(participantMessage.getParticipantId().getName()); - participant.setVersion(participantMessage.getParticipantId().getVersion()); - participant.setDefinition(participantMessage.getParticipantId()); - participant.setParticipantType(participantMessage.getParticipantType()); - participant.setParticipantState(participantState); - participant.setHealthStatus(healthStatus); - - participantProvider.saveParticipant(participant); - } else { - var participant = participantOpt.get(); - participant.setParticipantState(participantState); - participant.setHealthStatus(healthStatus); - - participantProvider.saveParticipant(participant); - } - } - - private void superviseParticipant(ParticipantStatus participantStatusMessage) - throws PfModelException, AutomationCompositionException { - - checkParticipant(participantStatusMessage, participantStatusMessage.getState(), - participantStatusMessage.getHealthStatus()); - } - private void exceptionOccured(Response.Status status, String reason) throws AutomationCompositionException { throw new AutomationCompositionException(status, reason); } diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionParticipantHandler.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionParticipantHandler.java new file mode 100644 index 000000000..da9187d22 --- /dev/null +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionParticipantHandler.java @@ -0,0 +1,116 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2023 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.clamp.acm.runtime.supervision; + +import io.micrometer.core.annotation.Timed; +import lombok.AllArgsConstructor; +import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantDeregisterAckPublisher; +import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantRegisterAckPublisher; +import org.onap.policy.clamp.models.acm.concepts.Participant; +import org.onap.policy.clamp.models.acm.concepts.ParticipantState; +import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantDeregister; +import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessage; +import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantRegister; +import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantStatus; +import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * This class handles supervision of participant status. + */ +@Component +@AllArgsConstructor +public class SupervisionParticipantHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(SupervisionParticipantHandler.class); + + private final ParticipantProvider participantProvider; + private final ParticipantRegisterAckPublisher participantRegisterAckPublisher; + private final ParticipantDeregisterAckPublisher participantDeregisterAckPublisher; + + /** + * Handle a ParticipantRegister message from a participant. + * + * @param participantRegisterMsg the ParticipantRegister message received from a participant + */ + @MessageIntercept + @Timed(value = "listener.participant_register", description = "PARTICIPANT_REGISTER messages received") + public void handleParticipantMessage(ParticipantRegister participantRegisterMsg) { + LOGGER.debug("Participant Register received {}", participantRegisterMsg); + saveParticipantStatus(participantRegisterMsg); + + participantRegisterAckPublisher.send(participantRegisterMsg.getMessageId(), + participantRegisterMsg.getParticipantId(), participantRegisterMsg.getParticipantType()); + } + + /** + * Handle a ParticipantDeregister message from a participant. + * + * @param participantDeregisterMsg the ParticipantDeregister message received from a participant + */ + @MessageIntercept + @Timed(value = "listener.participant_deregister", description = "PARTICIPANT_DEREGISTER messages received") + public void handleParticipantMessage(ParticipantDeregister participantDeregisterMsg) { + LOGGER.debug("Participant Deregister received {}", participantDeregisterMsg); + var participantOpt = participantProvider.findParticipant(participantDeregisterMsg.getParticipantId()); + + if (participantOpt.isPresent()) { + var participant = participantOpt.get(); + participant.setParticipantState(ParticipantState.OFF_LINE); + participantProvider.saveParticipant(participant); + } + + participantDeregisterAckPublisher.send(participantDeregisterMsg.getMessageId()); + } + + /** + * Handle a ParticipantStatus message from a participant. + * + * @param participantStatusMsg the ParticipantStatus message received from a participant + */ + @MessageIntercept + @Timed(value = "listener.participant_status", description = "PARTICIPANT_STATUS messages received") + public void handleParticipantMessage(ParticipantStatus participantStatusMsg) { + LOGGER.debug("Participant Status received {}", participantStatusMsg); + saveParticipantStatus(participantStatusMsg); + } + + private void saveParticipantStatus(ParticipantMessage participantMessage) { + var participantOpt = participantProvider.findParticipant(participantMessage.getParticipantId()); + + if (participantOpt.isEmpty()) { + var participant = new Participant(); + participant.setName(participantMessage.getParticipantId().getName()); + participant.setVersion(participantMessage.getParticipantId().getVersion()); + participant.setDefinition(participantMessage.getParticipantId()); + participant.setParticipantType(participantMessage.getParticipantType()); + participant.setParticipantState(ParticipantState.ON_LINE); + + participantProvider.saveParticipant(participant); + } else { + var participant = participantOpt.get(); + participant.setParticipantState(ParticipantState.ON_LINE); + + participantProvider.saveParticipant(participant); + } + } +} diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java index a71f49c10..e595f3bee 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2021-2022 Nordix Foundation. + * Copyright (C) 2021-2023 Nordix Foundation. * ================================================================================ * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ @@ -28,16 +28,14 @@ import java.util.UUID; import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup; import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher; import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionUpdatePublisher; -import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantStatusReqPublisher; import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState; import org.onap.policy.clamp.models.acm.concepts.Participant; -import org.onap.policy.clamp.models.acm.concepts.ParticipantHealthStatus; +import org.onap.policy.clamp.models.acm.concepts.ParticipantState; import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils; import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider; import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider; import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider; -import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; import org.slf4j.Logger; @@ -61,7 +59,6 @@ public class SupervisionScanner { private final AutomationCompositionStateChangePublisher automationCompositionStateChangePublisher; private final AutomationCompositionUpdatePublisher automationCompositionUpdatePublisher; private final ParticipantProvider participantProvider; - private final ParticipantStatusReqPublisher participantStatusReqPublisher; /** * Constructor for instantiating SupervisionScanner. @@ -71,21 +68,18 @@ public class SupervisionScanner { * @param automationCompositionStateChangePublisher the AutomationComposition StateChange Publisher * @param automationCompositionUpdatePublisher the AutomationCompositionUpdate Publisher * @param participantProvider the Participant Provider - * @param participantStatusReqPublisher the Participant StatusReq Publisher * @param acRuntimeParameterGroup the parameters for the automation composition runtime */ public SupervisionScanner(final AutomationCompositionProvider automationCompositionProvider, AcDefinitionProvider acDefinitionProvider, final AutomationCompositionStateChangePublisher automationCompositionStateChangePublisher, AutomationCompositionUpdatePublisher automationCompositionUpdatePublisher, - ParticipantProvider participantProvider, ParticipantStatusReqPublisher participantStatusReqPublisher, - final AcRuntimeParameterGroup acRuntimeParameterGroup) { + ParticipantProvider participantProvider, final AcRuntimeParameterGroup acRuntimeParameterGroup) { this.automationCompositionProvider = automationCompositionProvider; this.acDefinitionProvider = acDefinitionProvider; this.automationCompositionStateChangePublisher = automationCompositionStateChangePublisher; this.automationCompositionUpdatePublisher = automationCompositionUpdatePublisher; this.participantProvider = participantProvider; - this.participantStatusReqPublisher = participantStatusReqPublisher; automationCompositionCounter.setMaxRetryCount( acRuntimeParameterGroup.getParticipantParameters().getUpdateParameters().getMaxRetryCount()); @@ -106,13 +100,8 @@ public class SupervisionScanner { LOGGER.debug("Scanning automation compositions in the database . . ."); if (counterCheck) { - try { - for (var participant : participantProvider.getParticipants()) { - scanParticipantStatus(participant); - } - } catch (PfModelException pfme) { - LOGGER.warn("error reading participant from database", pfme); - return; + for (var participant : participantProvider.getParticipants()) { + scanParticipantStatus(participant); } } @@ -127,22 +116,17 @@ public class SupervisionScanner { LOGGER.debug("Automation composition scan complete . . ."); } - private void scanParticipantStatus(Participant participant) throws PfModelException { - ToscaConceptIdentifier id = participant.getKey().asIdentifier(); + private void scanParticipantStatus(Participant participant) { + var id = participant.getKey().asIdentifier(); if (participantStatusCounter.isFault(id)) { LOGGER.debug("report Participant fault"); return; } - if (participantStatusCounter.getDuration(id) > participantStatusCounter.getMaxWaitMs()) { - if (participantStatusCounter.count(id)) { - LOGGER.debug("retry message ParticipantStatusReq"); - participantStatusReqPublisher.send(id); - participant.setHealthStatus(ParticipantHealthStatus.NOT_HEALTHY); - } else { - LOGGER.debug("report Participant fault"); - participantStatusCounter.setFault(id); - participant.setHealthStatus(ParticipantHealthStatus.OFF_LINE); - } + if (participantStatusCounter.getDuration(id) > participantStatusCounter.getMaxWaitMs() + && !participantStatusCounter.count(id)) { + LOGGER.debug("report Participant fault"); + participantStatusCounter.setFault(id); + participant.setParticipantState(ParticipantState.OFF_LINE); participantProvider.saveParticipant(participant); } } @@ -209,8 +193,7 @@ public class SupervisionScanner { ? defaultMin : defaultMax; - if (nextSpNotCompleted != phaseMap.getOrDefault(automationComposition.getInstanceId(), - firstStartPhase)) { + if (nextSpNotCompleted != phaseMap.getOrDefault(automationComposition.getInstanceId(), firstStartPhase)) { phaseMap.put(automationComposition.getInstanceId(), nextSpNotCompleted); sendAutomationCompositionMsg(automationComposition, nextSpNotCompleted); } else if (counterCheck) { diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantDeregisterListener.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantDeregisterListener.java index eec21235f..62280a17c 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantDeregisterListener.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantDeregisterListener.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2021 Nordix Foundation. + * Copyright (C) 2021-2023 Nordix Foundation. * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,7 +22,7 @@ package org.onap.policy.clamp.acm.runtime.supervision.comm; import org.onap.policy.clamp.acm.runtime.config.messaging.Listener; -import org.onap.policy.clamp.acm.runtime.supervision.SupervisionHandler; +import org.onap.policy.clamp.acm.runtime.supervision.SupervisionParticipantHandler; import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantDeregister; import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageType; import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure; @@ -40,12 +40,12 @@ public class ParticipantDeregisterListener extends ScoListener { private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantDeregisterListener.class); - private final SupervisionHandler supervisionHandler; + private final SupervisionParticipantHandler supervisionHandler; /** * Constructs the object. */ - public ParticipantDeregisterListener(SupervisionHandler supervisionHandler) { + public ParticipantDeregisterListener(SupervisionParticipantHandler supervisionHandler) { super(ParticipantDeregister.class); this.supervisionHandler = supervisionHandler; } diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantRegisterListener.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantRegisterListener.java index 852340000..b082e6f30 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantRegisterListener.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantRegisterListener.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2021 Nordix Foundation. + * Copyright (C) 2021-2023 Nordix Foundation. * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,7 +22,7 @@ package org.onap.policy.clamp.acm.runtime.supervision.comm; import org.onap.policy.clamp.acm.runtime.config.messaging.Listener; -import org.onap.policy.clamp.acm.runtime.supervision.SupervisionHandler; +import org.onap.policy.clamp.acm.runtime.supervision.SupervisionParticipantHandler; import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageType; import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantRegister; import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure; @@ -40,12 +40,12 @@ public class ParticipantRegisterListener extends ScoListener { private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantRegisterListener.class); - private final SupervisionHandler supervisionHandler; + private final SupervisionParticipantHandler supervisionHandler; /** * Constructs the object. */ - public ParticipantRegisterListener(SupervisionHandler supervisionHandler) { + public ParticipantRegisterListener(SupervisionParticipantHandler supervisionHandler) { super(ParticipantRegister.class); this.supervisionHandler = supervisionHandler; } diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantStatusListener.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantStatusListener.java index 4ae1a1a2d..2118fe548 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantStatusListener.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantStatusListener.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2021 Nordix Foundation. + * Copyright (C) 2021-2023 Nordix Foundation. * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,7 +22,7 @@ package org.onap.policy.clamp.acm.runtime.supervision.comm; import org.onap.policy.clamp.acm.runtime.config.messaging.Listener; -import org.onap.policy.clamp.acm.runtime.supervision.SupervisionHandler; +import org.onap.policy.clamp.acm.runtime.supervision.SupervisionParticipantHandler; import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageType; import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantStatus; import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure; @@ -39,12 +39,12 @@ import org.springframework.stereotype.Component; public class ParticipantStatusListener extends ScoListener implements Listener { private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantStatusListener.class); - private final SupervisionHandler supervisionHandler; + private final SupervisionParticipantHandler supervisionHandler; /** * Constructs the object. */ - public ParticipantStatusListener(SupervisionHandler supervisionHandler) { + public ParticipantStatusListener(SupervisionParticipantHandler supervisionHandler) { super(ParticipantStatus.class); this.supervisionHandler = supervisionHandler; } diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandlerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandlerTest.java index 2da869072..fd6c9a008 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandlerTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionHandlerTest.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2021-2022 Nordix Foundation. + * Copyright (C) 2021-2023 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,8 +38,6 @@ import org.mockito.Mockito; import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils; import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher; import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionUpdatePublisher; -import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantDeregisterAckPublisher; -import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantRegisterAckPublisher; import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantUpdatePublisher; import org.onap.policy.clamp.common.acm.exception.AutomationCompositionException; import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; @@ -47,17 +45,12 @@ import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionOrderedState; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState; import org.onap.policy.clamp.models.acm.concepts.Participant; -import org.onap.policy.clamp.models.acm.concepts.ParticipantHealthStatus; import org.onap.policy.clamp.models.acm.concepts.ParticipantState; import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionAck; -import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantDeregister; import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageType; -import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantRegister; -import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantStatus; import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantUpdateAck; import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider; import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider; -import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider; import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; @@ -109,10 +102,9 @@ class SupervisionHandlerTest { var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); - var handler = new SupervisionHandler(automationCompositionProvider, mock(ParticipantProvider.class), - acDefinitionProvider, mock(AutomationCompositionUpdatePublisher.class), - automationCompositionStateChangePublisher, mock(ParticipantRegisterAckPublisher.class), - mock(ParticipantDeregisterAckPublisher.class), mock(ParticipantUpdatePublisher.class)); + var handler = new SupervisionHandler(automationCompositionProvider, acDefinitionProvider, + mock(AutomationCompositionUpdatePublisher.class), automationCompositionStateChangePublisher, + mock(ParticipantUpdatePublisher.class)); handler.triggerAutomationCompositionSupervision(automationComposition); @@ -160,10 +152,9 @@ class SupervisionHandlerTest { void testAcRunningToPassive() throws AutomationCompositionException { var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), - mock(ParticipantProvider.class), mock(ParticipantRegisterAckPublisher.class), - mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class), - automationCompositionStateChangePublisher, mock(ParticipantUpdatePublisher.class), - AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); + mock(AutomationCompositionUpdatePublisher.class), automationCompositionStateChangePublisher, + mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE, + AutomationCompositionState.UNINITIALISED); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud"); @@ -206,10 +197,9 @@ class SupervisionHandlerTest { void testAcPassiveToRunning() throws AutomationCompositionException { var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), - mock(ParticipantProvider.class), mock(ParticipantRegisterAckPublisher.class), - mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class), - automationCompositionStateChangePublisher, mock(ParticipantUpdatePublisher.class), - AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); + mock(AutomationCompositionUpdatePublisher.class), automationCompositionStateChangePublisher, + mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE, + AutomationCompositionState.UNINITIALISED); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud"); @@ -224,8 +214,7 @@ class SupervisionHandlerTest { @Test void testHandleAutomationCompositionStateChangeAckMessage() { var automationCompositionProvider = mock(AutomationCompositionProvider.class); - var handler = createSupervisionHandler(automationCompositionProvider, mock(ParticipantProvider.class), - mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), + var handler = createSupervisionHandler(automationCompositionProvider, mock(AutomationCompositionUpdatePublisher.class), mock(AutomationCompositionStateChangePublisher.class), mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); @@ -248,8 +237,7 @@ class SupervisionHandlerTest { automationCompositionAckMessage.setAutomationCompositionResultMap(Map.of()); automationCompositionAckMessage.setAutomationCompositionId(identifier); var automationCompositionProvider = mock(AutomationCompositionProvider.class); - var handler = createSupervisionHandler(automationCompositionProvider, mock(ParticipantProvider.class), - mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), + var handler = createSupervisionHandler(automationCompositionProvider, mock(AutomationCompositionUpdatePublisher.class), mock(AutomationCompositionStateChangePublisher.class), mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); @@ -259,60 +247,6 @@ class SupervisionHandlerTest { verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class)); } - @Test - void testHandleParticipantDeregister() throws PfModelException { - var participant = new Participant(); - participant.setName(participantId.getName()); - participant.setVersion(participantId.getVersion()); - participant.setParticipantType(participantType); - - var participantProvider = mock(ParticipantProvider.class); - when(participantProvider.findParticipant(participantId.getName(), participantId.getVersion())) - .thenReturn(Optional.of(participant)); - - var participantDeregisterMessage = new ParticipantDeregister(); - participantDeregisterMessage.setMessageId(UUID.randomUUID()); - participantDeregisterMessage.setParticipantId(participantId); - participantDeregisterMessage.setParticipantType(participantType); - var participantDeregisterAckPublisher = mock(ParticipantDeregisterAckPublisher.class); - var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), participantProvider, - mock(ParticipantRegisterAckPublisher.class), participantDeregisterAckPublisher, - mock(AutomationCompositionUpdatePublisher.class), mock(AutomationCompositionStateChangePublisher.class), - mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE, - AutomationCompositionState.UNINITIALISED); - - handler.handleParticipantMessage(participantDeregisterMessage); - - verify(participantProvider).saveParticipant(any()); - verify(participantDeregisterAckPublisher).send(participantDeregisterMessage.getMessageId()); - } - - @Test - void testHandleParticipantRegister() throws PfModelException { - var participant = new Participant(); - participant.setName(participantId.getName()); - participant.setVersion(participantId.getVersion()); - participant.setParticipantType(participantType); - - var participantRegisterMessage = new ParticipantRegister(); - participantRegisterMessage.setMessageId(UUID.randomUUID()); - participantRegisterMessage.setParticipantId(participantId); - participantRegisterMessage.setParticipantType(participantType); - var participantProvider = mock(ParticipantProvider.class); - var participantRegisterAckPublisher = mock(ParticipantRegisterAckPublisher.class); - var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), participantProvider, - participantRegisterAckPublisher, mock(ParticipantDeregisterAckPublisher.class), - mock(AutomationCompositionUpdatePublisher.class), mock(AutomationCompositionStateChangePublisher.class), - mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE, - AutomationCompositionState.UNINITIALISED); - - handler.handleParticipantMessage(participantRegisterMessage); - - verify(participantProvider).saveParticipant(any()); - verify(participantRegisterAckPublisher).send(participantRegisterMessage.getMessageId(), participantId, - participantType); - } - @Test void testParticipantUpdateAck() throws PfModelException { var participant = new Participant(); @@ -320,52 +254,25 @@ class SupervisionHandlerTest { participant.setVersion(participantId.getVersion()); participant.setParticipantType(participantType); - var participantProvider = mock(ParticipantProvider.class); - when(participantProvider.findParticipant(participantId.getName(), participantId.getVersion())) - .thenReturn(Optional.of(participant)); - var participantUpdateAckMessage = new ParticipantUpdateAck(); participantUpdateAckMessage.setParticipantId(participantId); participantUpdateAckMessage.setParticipantType(participantType); - participantUpdateAckMessage.setState(ParticipantState.PASSIVE); - var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), participantProvider, - mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), + participantUpdateAckMessage.setState(ParticipantState.ON_LINE); + var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), mock(AutomationCompositionUpdatePublisher.class), mock(AutomationCompositionStateChangePublisher.class), mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); handler.handleParticipantMessage(participantUpdateAckMessage); - - verify(participantProvider).saveParticipant(any()); - } - - @Test - void testHandleParticipantStatus() throws PfModelException { - var participantStatusMessage = new ParticipantStatus(); - participantStatusMessage.setParticipantId(participantId); - participantStatusMessage.setParticipantType(participantType); - participantStatusMessage.setState(ParticipantState.PASSIVE); - participantStatusMessage.setHealthStatus(ParticipantHealthStatus.HEALTHY); - - var participantProvider = mock(ParticipantProvider.class); - var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), participantProvider, - mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), - mock(AutomationCompositionUpdatePublisher.class), mock(AutomationCompositionStateChangePublisher.class), - mock(ParticipantUpdatePublisher.class), AutomationCompositionOrderedState.PASSIVE, - AutomationCompositionState.UNINITIALISED); - handler.handleParticipantMessage(participantStatusMessage); - - verify(participantProvider).saveParticipant(any()); } @Test void testHandleSendCommissionMessage() throws PfModelException { var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class); var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), - mock(ParticipantProvider.class), mock(ParticipantRegisterAckPublisher.class), - mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class), - mock(AutomationCompositionStateChangePublisher.class), participantUpdatePublisher, - AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); + mock(AutomationCompositionUpdatePublisher.class), mock(AutomationCompositionStateChangePublisher.class), + participantUpdatePublisher, AutomationCompositionOrderedState.PASSIVE, + AutomationCompositionState.UNINITIALISED); var acmDefinition = new AutomationCompositionDefinition(); handler.handleSendCommissionMessage(acmDefinition); @@ -376,18 +283,15 @@ class SupervisionHandlerTest { void testHandleSendDeCommissionMessage() throws PfModelException { var participantUpdatePublisher = mock(ParticipantUpdatePublisher.class); var handler = createSupervisionHandler(mock(AutomationCompositionProvider.class), - mock(ParticipantProvider.class), mock(ParticipantRegisterAckPublisher.class), - mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionUpdatePublisher.class), - mock(AutomationCompositionStateChangePublisher.class), participantUpdatePublisher, - AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.UNINITIALISED); + mock(AutomationCompositionUpdatePublisher.class), mock(AutomationCompositionStateChangePublisher.class), + participantUpdatePublisher, AutomationCompositionOrderedState.PASSIVE, + AutomationCompositionState.UNINITIALISED); handler.handleSendDeCommissionMessage(identifier); verify(participantUpdatePublisher).sendDecomisioning(identifier); } private SupervisionHandler createSupervisionHandler(AutomationCompositionProvider automationCompositionProvider, - ParticipantProvider participantProvider, ParticipantRegisterAckPublisher participantRegisterAckPublisher, - ParticipantDeregisterAckPublisher participantDeregisterAckPublisher, AutomationCompositionUpdatePublisher automationCompositionUpdatePublisher, AutomationCompositionStateChangePublisher automationCompositionStateChangePublisher, ParticipantUpdatePublisher participantUpdatePublisher, AutomationCompositionOrderedState orderedState, @@ -406,24 +310,22 @@ class SupervisionHandlerTest { when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionId())) .thenReturn(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML)); - return new SupervisionHandler(automationCompositionProvider, participantProvider, acDefinitionProvider, + return new SupervisionHandler(automationCompositionProvider, acDefinitionProvider, automationCompositionUpdatePublisher, automationCompositionStateChangePublisher, - participantRegisterAckPublisher, participantDeregisterAckPublisher, participantUpdatePublisher); + participantUpdatePublisher); } private SupervisionHandler createSupervisionHandlerForTrigger() { - return new SupervisionHandler(mock(AutomationCompositionProvider.class), mock(ParticipantProvider.class), - mock(AcDefinitionProvider.class), mock(AutomationCompositionUpdatePublisher.class), - mock(AutomationCompositionStateChangePublisher.class), mock(ParticipantRegisterAckPublisher.class), - mock(ParticipantDeregisterAckPublisher.class), mock(ParticipantUpdatePublisher.class)); + return new SupervisionHandler(mock(AutomationCompositionProvider.class), mock(AcDefinitionProvider.class), + mock(AutomationCompositionUpdatePublisher.class), mock(AutomationCompositionStateChangePublisher.class), + mock(ParticipantUpdatePublisher.class)); } private SupervisionHandler createSupervisionHandlerForTrigger( AutomationCompositionUpdatePublisher automationCompositionUpdatePublisher) { - return new SupervisionHandler(mock(AutomationCompositionProvider.class), mock(ParticipantProvider.class), - mock(AcDefinitionProvider.class), automationCompositionUpdatePublisher, - mock(AutomationCompositionStateChangePublisher.class), mock(ParticipantRegisterAckPublisher.class), - mock(ParticipantDeregisterAckPublisher.class), mock(ParticipantUpdatePublisher.class)); + return new SupervisionHandler(mock(AutomationCompositionProvider.class), mock(AcDefinitionProvider.class), + automationCompositionUpdatePublisher, mock(AutomationCompositionStateChangePublisher.class), + mock(ParticipantUpdatePublisher.class)); } } diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionParticipantHandlerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionParticipantHandlerTest.java new file mode 100644 index 000000000..9e35f2cf5 --- /dev/null +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionParticipantHandlerTest.java @@ -0,0 +1,107 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2023 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.clamp.acm.runtime.supervision; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Optional; +import java.util.UUID; +import org.junit.jupiter.api.Test; +import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantDeregisterAckPublisher; +import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantRegisterAckPublisher; +import org.onap.policy.clamp.models.acm.concepts.Participant; +import org.onap.policy.clamp.models.acm.concepts.ParticipantState; +import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantDeregister; +import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantRegister; +import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantStatus; +import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; + +class SupervisionParticipantHandlerTest { + private static final ToscaConceptIdentifier PARTICIPANT_ID = new ToscaConceptIdentifier("ParticipantId", "1.0.0"); + private static final ToscaConceptIdentifier PARTICIPANT_TYPE = + new ToscaConceptIdentifier("ParticipantType", "1.0.0"); + + @Test + void testHandleParticipantDeregister() { + var participant = new Participant(); + participant.setName(PARTICIPANT_ID.getName()); + participant.setVersion(PARTICIPANT_ID.getVersion()); + participant.setParticipantType(PARTICIPANT_TYPE); + + var participantProvider = mock(ParticipantProvider.class); + when(participantProvider.findParticipant(PARTICIPANT_ID)).thenReturn(Optional.of(participant)); + + var participantDeregisterMessage = new ParticipantDeregister(); + participantDeregisterMessage.setMessageId(UUID.randomUUID()); + participantDeregisterMessage.setParticipantId(PARTICIPANT_ID); + participantDeregisterMessage.setParticipantType(PARTICIPANT_TYPE); + var participantDeregisterAckPublisher = mock(ParticipantDeregisterAckPublisher.class); + var handler = new SupervisionParticipantHandler(participantProvider, + mock(ParticipantRegisterAckPublisher.class), participantDeregisterAckPublisher); + + handler.handleParticipantMessage(participantDeregisterMessage); + + verify(participantProvider).saveParticipant(any()); + verify(participantDeregisterAckPublisher).send(participantDeregisterMessage.getMessageId()); + } + + @Test + void testHandleParticipantRegister() { + var participant = new Participant(); + participant.setName(PARTICIPANT_ID.getName()); + participant.setVersion(PARTICIPANT_ID.getVersion()); + participant.setParticipantType(PARTICIPANT_TYPE); + + var participantRegisterMessage = new ParticipantRegister(); + participantRegisterMessage.setMessageId(UUID.randomUUID()); + participantRegisterMessage.setParticipantId(PARTICIPANT_ID); + participantRegisterMessage.setParticipantType(PARTICIPANT_TYPE); + var participantProvider = mock(ParticipantProvider.class); + var participantRegisterAckPublisher = mock(ParticipantRegisterAckPublisher.class); + var handler = new SupervisionParticipantHandler(participantProvider, participantRegisterAckPublisher, + mock(ParticipantDeregisterAckPublisher.class)); + + handler.handleParticipantMessage(participantRegisterMessage); + + verify(participantProvider).saveParticipant(any()); + verify(participantRegisterAckPublisher).send(participantRegisterMessage.getMessageId(), PARTICIPANT_ID, + PARTICIPANT_TYPE); + } + + @Test + void testHandleParticipantStatus() { + var participantStatusMessage = new ParticipantStatus(); + participantStatusMessage.setParticipantId(PARTICIPANT_ID); + participantStatusMessage.setParticipantType(PARTICIPANT_TYPE); + participantStatusMessage.setState(ParticipantState.ON_LINE); + + var participantProvider = mock(ParticipantProvider.class); + var handler = new SupervisionParticipantHandler(participantProvider, + mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class)); + handler.handleParticipantMessage(participantStatusMessage); + + verify(participantProvider).saveParticipant(any()); + } +} diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScannerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScannerTest.java index a6d4d3b0d..0142f294c 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScannerTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScannerTest.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2021-2022 Nordix Foundation. + * Copyright (C) 2021-2023 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,14 +36,12 @@ import org.junit.jupiter.api.Test; import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils; import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher; import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionUpdatePublisher; -import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantStatusReqPublisher; import org.onap.policy.clamp.acm.runtime.util.CommonTestData; import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionOrderedState; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState; import org.onap.policy.clamp.models.acm.concepts.Participant; -import org.onap.policy.clamp.models.acm.concepts.ParticipantHealthStatus; import org.onap.policy.clamp.models.acm.concepts.ParticipantState; import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider; import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider; @@ -81,7 +79,6 @@ class SupervisionScannerTest { var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); var automationCompositionUpdatePublisher = mock(AutomationCompositionUpdatePublisher.class); var participantProvider = mock(ParticipantProvider.class); - var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class); var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner"); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_JSON, "Crud"); @@ -90,7 +87,7 @@ class SupervisionScannerTest { var supervisionScanner = new SupervisionScanner(automationCompositionProvider, acDefinitionProvider, automationCompositionStateChangePublisher, automationCompositionUpdatePublisher, participantProvider, - participantStatusReqPublisher, acRuntimeParameterGroup); + acRuntimeParameterGroup); supervisionScanner.run(false); verify(automationCompositionProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class)); @@ -108,12 +105,11 @@ class SupervisionScannerTest { var automationCompositionUpdatePublisher = mock(AutomationCompositionUpdatePublisher.class); var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); var participantProvider = mock(ParticipantProvider.class); - var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class); var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner"); var supervisionScanner = new SupervisionScanner(automationCompositionProvider, acDefinitionProvider, automationCompositionStateChangePublisher, automationCompositionUpdatePublisher, participantProvider, - participantStatusReqPublisher, acRuntimeParameterGroup); + acRuntimeParameterGroup); supervisionScanner.run(false); verify(automationCompositionProvider, times(1)).updateAutomationComposition(any(AutomationComposition.class)); @@ -133,18 +129,16 @@ class SupervisionScannerTest { when(participantProvider.getParticipants(null, null)).thenReturn(List.of(participant)); var automationCompositionUpdatePublisher = mock(AutomationCompositionUpdatePublisher.class); - var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class); var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner"); var supervisionScanner = new SupervisionScanner(automationCompositionProvider, acDefinitionProvider, automationCompositionStateChangePublisher, automationCompositionUpdatePublisher, participantProvider, - participantStatusReqPublisher, acRuntimeParameterGroup); + acRuntimeParameterGroup); supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier()); supervisionScanner.run(true); verify(automationCompositionProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class)); - verify(participantStatusReqPublisher, times(0)).send(any(ToscaConceptIdentifier.class)); } @Test @@ -169,13 +163,12 @@ class SupervisionScannerTest { var participantProvider = mock(ParticipantProvider.class); var automationCompositionUpdatePublisher = mock(AutomationCompositionUpdatePublisher.class); - var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class); var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner"); var supervisionScanner = new SupervisionScanner(automationCompositionProvider, acDefinitionProvider, automationCompositionStateChangePublisher, automationCompositionUpdatePublisher, participantProvider, - participantStatusReqPublisher, acRuntimeParameterGroup); + acRuntimeParameterGroup); supervisionScanner.run(false); @@ -196,27 +189,24 @@ class SupervisionScannerTest { var participant = new Participant(); participant.setName(PARTICIPANT_NAME); participant.setVersion(PARTICIPANT_VERSION); - participant.setHealthStatus(ParticipantHealthStatus.HEALTHY); - participant.setParticipantState(ParticipantState.ACTIVE); + participant.setParticipantState(ParticipantState.OFF_LINE); participant.setDefinition(new ToscaConceptIdentifier("unknown", "0.0.0")); participant.setParticipantType(PARTICIPANT_TYPE); var participantProvider = mock(ParticipantProvider.class); when(participantProvider.getParticipants()).thenReturn(List.of(participant)); var automationCompositionUpdatePublisher = mock(AutomationCompositionUpdatePublisher.class); - var participantStatusReqPublisher = mock(ParticipantStatusReqPublisher.class); var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); var supervisionScanner = new SupervisionScanner(automationCompositionProvider, acDefinitionProvider, automationCompositionStateChangePublisher, automationCompositionUpdatePublisher, participantProvider, - participantStatusReqPublisher, acRuntimeParameterGroup); + acRuntimeParameterGroup); supervisionScanner.handleParticipantStatus(participant.getKey().asIdentifier()); supervisionScanner.run(true); - verify(participantStatusReqPublisher).send(any(ToscaConceptIdentifier.class)); - verify(participantProvider).saveParticipant(any()); + verify(participantProvider, times(0)).saveParticipant(any()); supervisionScanner.run(true); - verify(participantProvider, times(2)).saveParticipant(any()); + verify(participantProvider, times(1)).saveParticipant(any()); } } diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/comm/SupervisionMessagesTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/comm/SupervisionMessagesTest.java index b545fd957..b7d2d9303 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/comm/SupervisionMessagesTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/comm/SupervisionMessagesTest.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2021-2022 Nordix Foundation. + * Copyright (C) 2021-2023 Nordix Foundation. * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -33,6 +33,7 @@ import java.util.UUID; import org.junit.jupiter.api.Test; import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils; import org.onap.policy.clamp.acm.runtime.supervision.SupervisionHandler; +import org.onap.policy.clamp.acm.runtime.supervision.SupervisionParticipantHandler; import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState; @@ -75,7 +76,7 @@ class SupervisionMessagesTest { @Test void testReceiveParticipantDeregister() { final var participantDeregisterMsg = new ParticipantDeregister(); - var supervisionHandler = mock(SupervisionHandler.class); + var supervisionHandler = mock(SupervisionParticipantHandler.class); var participantDeregisterListener = new ParticipantDeregisterListener(supervisionHandler); participantDeregisterListener.onTopicEvent(INFRA, TOPIC, null, participantDeregisterMsg); verify(supervisionHandler).handleParticipantMessage(participantDeregisterMsg); @@ -192,7 +193,7 @@ class SupervisionMessagesTest { @Test void testParticipantRegisterListener() { final var participantRegister = new ParticipantRegister(); - var supervisionHandler = mock(SupervisionHandler.class); + var supervisionHandler = mock(SupervisionParticipantHandler.class); var participantRegisterListener = new ParticipantRegisterListener(supervisionHandler); participantRegisterListener.onTopicEvent(INFRA, TOPIC, null, participantRegister); verify(supervisionHandler).handleParticipantMessage(participantRegister); @@ -201,7 +202,7 @@ class SupervisionMessagesTest { @Test void testParticipantStatusListener() { final var participantStatus = new ParticipantStatus(); - var supervisionHandler = mock(SupervisionHandler.class); + var supervisionHandler = mock(SupervisionParticipantHandler.class); var participantStatusListener = new ParticipantStatusListener(supervisionHandler); participantStatusListener.onTopicEvent(INFRA, TOPIC, null, participantStatus); verify(supervisionHandler).handleParticipantMessage(participantStatus); -- cgit 1.2.3-korg