diff options
Diffstat (limited to 'runtime-acm')
9 files changed, 344 insertions, 261 deletions
diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionAcHandler.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionAcHandler.java index 05a866e43..126ffafd0 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionAcHandler.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionAcHandler.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2023-2024 Nordix Foundation. + * Copyright (C) 2023-2025 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,9 +22,8 @@ package org.onap.policy.clamp.acm.runtime.supervision; import io.micrometer.core.annotation.Timed; import io.opentelemetry.context.Context; +import java.util.HashMap; import java.util.Map; -import java.util.Set; -import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import lombok.AllArgsConstructor; @@ -33,7 +32,6 @@ import org.onap.policy.clamp.acm.runtime.supervision.comm.AcPreparePublisher; import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionDeployPublisher; import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionMigrationPublisher; import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher; -import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher; import org.onap.policy.clamp.models.acm.concepts.AcElementDeployAck; import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition; @@ -44,6 +42,7 @@ import org.onap.policy.clamp.models.acm.concepts.StateChangeResult; import org.onap.policy.clamp.models.acm.concepts.SubState; import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionDeployAck; import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider; +import org.onap.policy.clamp.models.acm.persistence.provider.MessageProvider; import org.onap.policy.clamp.models.acm.utils.AcmUtils; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; import org.slf4j.Logger; @@ -66,8 +65,8 @@ public class SupervisionAcHandler { private final AutomationCompositionStateChangePublisher automationCompositionStateChangePublisher; private final AcElementPropertiesPublisher acElementPropertiesPublisher; private final AutomationCompositionMigrationPublisher acCompositionMigrationPublisher; - private final ParticipantSyncPublisher participantSyncPublisher; private final AcPreparePublisher acPreparePublisher; + private final MessageProvider messageProvider; private final ExecutorService executor = Context.taskWrapping(Executors.newFixedThreadPool(1)); @@ -270,22 +269,24 @@ public class SupervisionAcHandler { if (automationCompositionAckMessage.getAutomationCompositionResultMap() == null || automationCompositionAckMessage.getAutomationCompositionResultMap().isEmpty()) { if (DeployState.DELETING.equals(automationComposition.getDeployState())) { - deleteAcInstance(automationComposition, automationCompositionAckMessage.getParticipantId()); + // scenario automationComposition has never deployed + automationCompositionAckMessage.setAutomationCompositionResultMap(new HashMap<>()); + for (var element : automationComposition.getElements().values()) { + if (element.getParticipantId().equals(automationCompositionAckMessage.getParticipantId())) { + var acElement = new AcElementDeployAck(DeployState.DELETED, LockState.NONE, + null, null, Map.of(), true, ""); + automationCompositionAckMessage.getAutomationCompositionResultMap() + .put(element.getId(), acElement); + } + } } else { LOGGER.warn("Empty AutomationCompositionResultMap {} {}", automationCompositionAckMessage.getAutomationCompositionId(), automationCompositionAckMessage.getMessage()); + return; } - return; - } - - var updated = updateState(automationComposition, - automationCompositionAckMessage.getAutomationCompositionResultMap().entrySet(), - automationCompositionAckMessage.getStateChangeResult(), automationCompositionAckMessage.getStage()); - if (updated) { - automationComposition = automationCompositionProvider.updateAcState(automationComposition); - participantSyncPublisher.sendSync(automationComposition); } + messageProvider.save(automationCompositionAckMessage); } private boolean validateMessage(AutomationCompositionDeployAck acAckMessage) { @@ -301,7 +302,8 @@ public class SupervisionAcHandler { return false; } - if (acAckMessage.getStage() == null) { + if ((acAckMessage.getStage() == null) + && (acAckMessage.getAutomationCompositionResultMap() != null)) { for (var el : acAckMessage.getAutomationCompositionResultMap().values()) { if (AcmUtils.isInTransitionalState(el.getDeployState(), el.getLockState(), SubState.NONE)) { LOGGER.error("Not valid AutomationCompositionDeployAck message, states are not valid"); @@ -312,43 +314,6 @@ public class SupervisionAcHandler { return true; } - private void deleteAcInstance(AutomationComposition automationComposition, UUID participantId) { - // scenario when Automation Composition instance has never been deployed - for (var element : automationComposition.getElements().values()) { - if (element.getParticipantId().equals(participantId)) { - element.setDeployState(DeployState.DELETED); - automationCompositionProvider.updateAutomationCompositionElement(element); - } - } - } - - private boolean updateState(AutomationComposition automationComposition, - Set<Map.Entry<UUID, AcElementDeployAck>> automationCompositionResultSet, - StateChangeResult stateChangeResult, Integer stage) { - var updated = false; - boolean inProgress = !StateChangeResult.FAILED.equals(automationComposition.getStateChangeResult()); - if (inProgress && !stateChangeResult.equals(automationComposition.getStateChangeResult())) { - automationComposition.setStateChangeResult(stateChangeResult); - updated = true; - } - - for (var acElementAck : automationCompositionResultSet) { - var element = automationComposition.getElements().get(acElementAck.getKey()); - if (element != null) { - element.setMessage(AcmUtils.validatedMessage(acElementAck.getValue().getMessage())); - if (stage == null) { - element.setSubState(SubState.NONE); - } - element.setDeployState(acElementAck.getValue().getDeployState()); - element.setLockState(acElementAck.getValue().getLockState()); - element.setStage(stage); - automationCompositionProvider.updateAutomationCompositionElement(element); - } - } - - return updated; - } - /** * Handle Migration of an AutomationComposition instance to other ACM Definition. * 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 f13f5da2c..276a26f61 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-2024 Nordix Foundation. + * Copyright (C) 2021-2025 Nordix Foundation. * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,14 +23,11 @@ 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.ParticipantSyncPublisher; import org.onap.policy.clamp.models.acm.concepts.AcTypeState; -import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition; -import org.onap.policy.clamp.models.acm.concepts.NodeTemplateState; import org.onap.policy.clamp.models.acm.concepts.StateChangeResult; import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantPrimeAck; import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider; -import org.onap.policy.clamp.models.acm.utils.AcmUtils; +import org.onap.policy.clamp.models.acm.persistence.provider.MessageProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -45,13 +42,14 @@ public class SupervisionHandler { private static final Logger LOGGER = LoggerFactory.getLogger(SupervisionHandler.class); private final AcDefinitionProvider acDefinitionProvider; - private final ParticipantSyncPublisher participantSyncPublisher; + private final MessageProvider messageProvider; /** * Handle a ParticipantPrimeAck message from a participant. * * @param participantPrimeAckMessage the ParticipantPrimeAck message received from a participant */ + @MessageIntercept @Timed(value = "listener.participant_prime_ack", description = "PARTICIPANT_PRIME_ACK messages received") public void handleParticipantMessage(ParticipantPrimeAck participantPrimeAckMessage) { if (participantPrimeAckMessage.getCompositionId() == null @@ -82,50 +80,6 @@ public class SupervisionHandler { participantPrimeAckMessage.getCompositionId(), participantPrimeAckMessage.getParticipantId()); return; } - handleParticipantPrimeAck(participantPrimeAckMessage, acDefinition); - } - - private void handleParticipantPrimeAck(ParticipantPrimeAck participantPrimeAckMessage, - AutomationCompositionDefinition acDefinition) { - var finalState = AcTypeState.PRIMING.equals(acDefinition.getState()) - || AcTypeState.PRIMED.equals(acDefinition.getState()) ? AcTypeState.PRIMED : AcTypeState.COMMISSIONED; - var msgInErrors = StateChangeResult.FAILED.equals(participantPrimeAckMessage.getStateChangeResult()); - boolean inProgress = !StateChangeResult.FAILED.equals(acDefinition.getStateChangeResult()); - boolean toUpdate = false; - if (inProgress && msgInErrors) { - acDefinition.setStateChangeResult(StateChangeResult.FAILED); - toUpdate = true; - } - - boolean completed = true; - for (var element : acDefinition.getElementStateMap().values()) { - handlePrimeAckElement(participantPrimeAckMessage, element); - if (!finalState.equals(element.getState())) { - completed = false; - } - } - - if (inProgress && !msgInErrors && completed) { - toUpdate = true; - acDefinition.setState(finalState); - if (StateChangeResult.TIMEOUT.equals(acDefinition.getStateChangeResult())) { - acDefinition.setStateChangeResult(StateChangeResult.NO_ERROR); - } - } - if (toUpdate) { - acDefinitionProvider.updateAcDefinitionState(acDefinition.getCompositionId(), acDefinition.getState(), - acDefinition.getStateChangeResult()); - if (!participantPrimeAckMessage.getParticipantId().equals(participantPrimeAckMessage.getReplicaId())) { - participantSyncPublisher.sendSync(acDefinition, participantPrimeAckMessage.getReplicaId()); - } - } - } - - private void handlePrimeAckElement(ParticipantPrimeAck participantPrimeAckMessage, NodeTemplateState element) { - if (participantPrimeAckMessage.getParticipantId().equals(element.getParticipantId())) { - element.setMessage(AcmUtils.validatedMessage(participantPrimeAckMessage.getMessage())); - element.setState(participantPrimeAckMessage.getCompositionState()); - acDefinitionProvider.updateAcDefinitionElement(element, participantPrimeAckMessage.getCompositionId()); - } + messageProvider.save(participantPrimeAckMessage); } } 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 index 5de6a4c74..d0b7b62b6 100644 --- 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 @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2023-2024 Nordix Foundation. + * Copyright (C) 2023-2025 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,16 +27,13 @@ import java.util.Map; import java.util.UUID; import lombok.AllArgsConstructor; import org.apache.commons.collections4.MapUtils; -import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup; 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.ParticipantSyncPublisher; import org.onap.policy.clamp.models.acm.concepts.AcTypeState; 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.AutomationCompositionInfo; import org.onap.policy.clamp.models.acm.concepts.Participant; -import org.onap.policy.clamp.models.acm.concepts.ParticipantDefinition; import org.onap.policy.clamp.models.acm.concepts.ParticipantReplica; import org.onap.policy.clamp.models.acm.concepts.ParticipantState; import org.onap.policy.clamp.models.acm.concepts.ParticipantSupportedElementType; @@ -45,6 +42,7 @@ import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantRe import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantStatus; 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.MessageProvider; import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider; import org.onap.policy.clamp.models.acm.utils.TimestampHelper; import org.slf4j.Logger; @@ -65,7 +63,7 @@ public class SupervisionParticipantHandler { private final AutomationCompositionProvider automationCompositionProvider; private final AcDefinitionProvider acDefinitionProvider; private final ParticipantSyncPublisher participantSyncPublisher; - private final AcRuntimeParameterGroup acRuntimeParameterGroup; + private final MessageProvider messageProvider; /** * Handle a ParticipantRegister message from a participant. @@ -104,18 +102,18 @@ public class SupervisionParticipantHandler { * * @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) { saveIfNotPresent(participantStatusMsg.getReplicaId(), participantStatusMsg.getParticipantId(), participantStatusMsg.getParticipantSupportedElementType(), false); if (!participantStatusMsg.getAutomationCompositionInfoList().isEmpty()) { - updateAcOutProperties(participantStatusMsg.getAutomationCompositionInfoList()); + messageProvider.save(participantStatusMsg); } if (!participantStatusMsg.getParticipantDefinitionUpdates().isEmpty() && participantStatusMsg.getCompositionId() != null) { - updateAcDefinitionOutProperties(participantStatusMsg.getCompositionId(), - participantStatusMsg.getReplicaId(), participantStatusMsg.getParticipantDefinitionUpdates()); + messageProvider.save(participantStatusMsg); } } @@ -151,34 +149,6 @@ public class SupervisionParticipantHandler { } - private void updateAcOutProperties(List<AutomationCompositionInfo> automationCompositionInfoList) { - automationCompositionProvider.upgradeStates(automationCompositionInfoList); - for (var acInfo : automationCompositionInfoList) { - var ac = automationCompositionProvider.getAutomationComposition(acInfo.getAutomationCompositionId()); - participantSyncPublisher.sendSync(ac); - } - } - - private void updateAcDefinitionOutProperties(UUID compositionId, UUID replicaId, List<ParticipantDefinition> list) { - var acDefinitionOpt = acDefinitionProvider.findAcDefinition(compositionId); - if (acDefinitionOpt.isEmpty()) { - LOGGER.error("Ac Definition with id {} not found", compositionId); - return; - } - var acDefinition = acDefinitionOpt.get(); - for (var acElements : list) { - for (var element : acElements.getAutomationCompositionElementDefinitionList()) { - var state = acDefinition.getElementStateMap().get(element.getAcElementDefinitionId().getName()); - if (state != null) { - state.setOutProperties(element.getOutProperties()); - } - } - } - acDefinitionProvider.updateAcDefinition(acDefinition, - acRuntimeParameterGroup.getAcmParameters().getToscaCompositionName()); - participantSyncPublisher.sendSync(acDefinition, replicaId); - } - private void checkOnline(ParticipantReplica replica) { if (ParticipantState.OFF_LINE.equals(replica.getParticipantState())) { replica.setParticipantState(ParticipantState.ON_LINE); 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 3b17565ef..718bccefb 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 @@ -38,6 +38,7 @@ import org.onap.policy.clamp.models.acm.concepts.StateChangeResult; import org.onap.policy.clamp.models.acm.concepts.SubState; 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.MessageProvider; import org.onap.policy.clamp.models.acm.utils.AcmUtils; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; import org.slf4j.Logger; @@ -58,6 +59,7 @@ public class SupervisionScanner { private final StageScanner stageScanner; private final SimpleScanner simpleScanner; private final PhaseScanner phaseScanner; + private final MessageProvider messageProvider; /** * Run Scanning. @@ -65,30 +67,54 @@ public class SupervisionScanner { public void run() { LOGGER.debug("Scanning automation compositions in the database . . ."); - var acDefinitions = acDefinitionProvider.getAllAcDefinitionsInTransition(); - for (var acDefinition : acDefinitions) { - scanAcDefinition(acDefinition.getCompositionId()); + messageProvider.removeOldJobs(); + + var compositionIds = acDefinitionProvider.getAllAcDefinitionsInTransition(); + compositionIds.addAll(messageProvider.findCompositionMessages()); + for (var compositionId : compositionIds) { + scanAcDefinition(compositionId); } - var instances = automationCompositionProvider.getAcInstancesInTransition(); + var instanceIds = automationCompositionProvider.getAcInstancesInTransition(); + instanceIds.addAll(messageProvider.findInstanceMessages()); Map<UUID, AutomationCompositionDefinition> acDefinitionMap = new HashMap<>(); - for (var instance : instances) { - scanAutomationComposition(instance.getInstanceId(), acDefinitionMap); + for (var instanceId : instanceIds) { + scanAutomationComposition(instanceId, acDefinitionMap); } LOGGER.debug("Automation composition scan complete . . ."); } private void scanAcDefinition(UUID compositionId) { + var optJobId = messageProvider.createJob(compositionId); + if (optJobId.isEmpty()) { + return; + } + var messages = messageProvider.getAllMessages(compositionId); var acDefinitionOpt = acDefinitionProvider.findAcDefinition(compositionId); var updateSync = new UpdateSync(); + for (var message : messages) { + acDefinitionOpt.ifPresent( + acDefinition -> updateSync.or(acDefinitionScanner.scanMessage(acDefinition, message))); + messageProvider.removeMessage(message.getMessageId()); + } acDefinitionOpt.ifPresent(acDefinition -> acDefinitionScanner.scanAutomationCompositionDefinition(acDefinition, updateSync)); + messageProvider.removeJob(optJobId.get()); } private void scanAutomationComposition(UUID instanceId, Map<UUID, AutomationCompositionDefinition> acDefinitionMap) { + var optJobId = messageProvider.createJob(instanceId); + if (optJobId.isEmpty()) { + return; + } + var messages = messageProvider.getAllMessages(instanceId); var automationCompositionOpt = automationCompositionProvider.findAutomationComposition(instanceId); var updateSync = new UpdateSync(); + for (var message : messages) { + automationCompositionOpt.ifPresent(ac -> updateSync.or(simpleScanner.scanMessage(ac, message))); + messageProvider.removeMessage(message.getMessageId()); + } if (automationCompositionOpt.isPresent()) { var automationComposition = automationCompositionOpt.get(); var compositionId = automationComposition.getCompositionTargetId() != null @@ -96,6 +122,8 @@ public class SupervisionScanner { var acDefinition = acDefinitionMap.computeIfAbsent(compositionId, acDefinitionProvider::getAcDefinition); scanAutomationComposition(automationComposition, acDefinition.getServiceTemplate(), updateSync); } + + messageProvider.removeJob(optJobId.get()); } private void scanAutomationComposition(final AutomationComposition automationComposition, @@ -107,6 +135,7 @@ public class SupervisionScanner { || StateChangeResult.FAILED.equals(automationComposition.getStateChangeResult())) { LOGGER.debug("automation composition {} scanned, OK", automationComposition.getInstanceId()); simpleScanner.saveAndSync(automationComposition, updateSync); + return; } if (DeployState.MIGRATING.equals(automationComposition.getDeployState())) { diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/SimpleScanner.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/SimpleScanner.java index e35d5f03a..c102412bb 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/SimpleScanner.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/SimpleScanner.java @@ -80,10 +80,10 @@ public class SimpleScanner extends AbstractScanner { if (element != null) { element.setDeployState(message.getDeployState()); element.setLockState(message.getLockState()); - if (element.getStage() == null) { + if (message.getStage() == null) { element.setSubState(SubState.NONE); } - element.setStage(element.getStage()); + element.setStage(message.getStage()); element.setMessage(message.getMessage()); result.setUpdated(true); } diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionAcHandlerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionAcHandlerTest.java index c5345f2f1..448a96b21 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionAcHandlerTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionAcHandlerTest.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2023-2024 Nordix Foundation. + * Copyright (C) 2023-2025 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,30 +40,30 @@ import org.onap.policy.clamp.acm.runtime.supervision.comm.AcPreparePublisher; import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionDeployPublisher; import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionMigrationPublisher; import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher; -import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher; import org.onap.policy.clamp.acm.runtime.util.CommonTestData; import org.onap.policy.clamp.models.acm.concepts.AcElementDeployAck; import org.onap.policy.clamp.models.acm.concepts.AcTypeState; import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; -import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement; import org.onap.policy.clamp.models.acm.concepts.DeployState; import org.onap.policy.clamp.models.acm.concepts.LockState; import org.onap.policy.clamp.models.acm.concepts.StateChangeResult; import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionDeployAck; import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantMessageType; import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider; +import org.onap.policy.clamp.models.acm.persistence.provider.MessageProvider; class SupervisionAcHandlerTest { private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json"; private static final UUID IDENTIFIER = UUID.randomUUID(); @Test - void testAutomationCompositionDeployAckNull() { + void testAutomationCompositionDeployAckValidation() { var automationCompositionProvider = mock(AutomationCompositionProvider.class); + var messageProvider = mock(MessageProvider.class); var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class), - mock(AcElementPropertiesPublisher.class), null, - mock(ParticipantSyncPublisher.class), null); + mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class), + mock(AcPreparePublisher.class), messageProvider); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud"); @@ -89,7 +89,13 @@ class SupervisionAcHandlerTest { automationComposition, DeployState.DEPLOYING, LockState.UNLOCKED); handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage); - verify(automationCompositionProvider, times(0)).updateAutomationCompositionElement(any()); + verify(messageProvider, times(0)).save(any(AutomationCompositionDeployAck.class)); + + when(automationCompositionProvider.findAutomationComposition(IDENTIFIER)) + .thenReturn(Optional.of(automationComposition)); + automationCompositionAckMessage.setAutomationCompositionResultMap(null); + handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage); + verify(messageProvider, times(0)).save(any(AutomationCompositionDeployAck.class)); } @Test @@ -100,13 +106,12 @@ class SupervisionAcHandlerTest { var automationCompositionProvider = mock(AutomationCompositionProvider.class); when(automationCompositionProvider.findAutomationComposition(IDENTIFIER)) .thenReturn(Optional.of(automationComposition)); - when(automationCompositionProvider.updateAcState(any(AutomationComposition.class))) - .thenReturn(automationComposition); + var messageProvider = mock(MessageProvider.class); var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class), - mock(AcElementPropertiesPublisher.class), null, - mock(ParticipantSyncPublisher.class), null); + mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class), + mock(AcPreparePublisher.class), messageProvider); var automationCompositionAckMessage = getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATECHANGE_ACK, @@ -114,8 +119,7 @@ class SupervisionAcHandlerTest { automationCompositionAckMessage.setStage(1); handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage); - verify(automationCompositionProvider, times(3)) - .updateAutomationCompositionElement(any(AutomationCompositionElement.class)); + verify(messageProvider).save(any(AutomationCompositionDeployAck.class)); } @Test @@ -126,21 +130,19 @@ class SupervisionAcHandlerTest { var automationCompositionProvider = mock(AutomationCompositionProvider.class); when(automationCompositionProvider.findAutomationComposition(IDENTIFIER)) .thenReturn(Optional.of(automationComposition)); - when(automationCompositionProvider.updateAcState(any(AutomationComposition.class))) - .thenReturn(automationComposition); + var messageProvider = mock(MessageProvider.class); var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class), - mock(AcElementPropertiesPublisher.class), null, - mock(ParticipantSyncPublisher.class), null); + mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class), + mock(AcPreparePublisher.class), messageProvider); var automationCompositionAckMessage = getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATECHANGE_ACK, automationComposition, DeployState.DEPLOYED, LockState.UNLOCKED); handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage); - verify(automationCompositionProvider, times(3)) - .updateAutomationCompositionElement(any(AutomationCompositionElement.class)); + verify(messageProvider).save(any(AutomationCompositionDeployAck.class)); } private AutomationCompositionDeployAck getAutomationCompositionDeployAck(ParticipantMessageType messageType, @@ -165,8 +167,7 @@ class SupervisionAcHandlerTest { var automationCompositionProvider = mock(AutomationCompositionProvider.class); when(automationCompositionProvider.findAutomationComposition(IDENTIFIER)) .thenReturn(Optional.of(automationComposition)); - when(automationCompositionProvider.updateAcState(any(AutomationComposition.class))) - .thenReturn(automationComposition); + var messageProvider = mock(MessageProvider.class); var automationCompositionAckMessage = getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK, @@ -175,12 +176,12 @@ class SupervisionAcHandlerTest { var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class), - mock(AcElementPropertiesPublisher.class), null, - mock(ParticipantSyncPublisher.class), null); + mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class), + mock(AcPreparePublisher.class), messageProvider); handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage); - verify(automationCompositionProvider).updateAcState(any(AutomationComposition.class)); + verify(messageProvider).save(any(AutomationCompositionDeployAck.class)); } @Test @@ -210,15 +211,16 @@ class SupervisionAcHandlerTest { automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER); var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); + var messageProvider = mock(MessageProvider.class); var handler = new SupervisionAcHandler(automationCompositionProvider, - mock(AutomationCompositionDeployPublisher.class), automationCompositionStateChangePublisher, null, - null, mock(ParticipantSyncPublisher.class), null); + mock(AutomationCompositionDeployPublisher.class), automationCompositionStateChangePublisher, + mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class), + mock(AcPreparePublisher.class), messageProvider); handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage); - verify(automationCompositionProvider) - .updateAutomationCompositionElement(any(AutomationCompositionElement.class)); + verify(messageProvider).save(any(AutomationCompositionDeployAck.class)); } @Test @@ -227,8 +229,8 @@ class SupervisionAcHandlerTest { var automationCompositionProvider = mock(AutomationCompositionProvider.class); var handler = new SupervisionAcHandler(automationCompositionProvider, automationCompositionDeployPublisher, mock(AutomationCompositionStateChangePublisher.class), - mock(AcElementPropertiesPublisher.class), null, - mock(ParticipantSyncPublisher.class), null); + mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class), + mock(AcPreparePublisher.class), mock(MessageProvider.class)); var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); @@ -246,8 +248,8 @@ class SupervisionAcHandlerTest { var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher, - mock(AcElementPropertiesPublisher.class), null, - mock(ParticipantSyncPublisher.class), null); + mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class), + mock(AcPreparePublisher.class), mock(MessageProvider.class)); var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); var automationComposition = @@ -264,8 +266,8 @@ class SupervisionAcHandlerTest { var automationCompositionProvider = mock(AutomationCompositionProvider.class); var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher, - mock(AcElementPropertiesPublisher.class), null, - mock(ParticipantSyncPublisher.class), null); + mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class), + mock(AcPreparePublisher.class), mock(MessageProvider.class)); var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); @@ -285,8 +287,8 @@ class SupervisionAcHandlerTest { var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher, - mock(AcElementPropertiesPublisher.class), null, - mock(ParticipantSyncPublisher.class), null); + mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class), + mock(AcPreparePublisher.class), mock(MessageProvider.class)); var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); var automationComposition = @@ -303,8 +305,8 @@ class SupervisionAcHandlerTest { var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher, - mock(AcElementPropertiesPublisher.class), null, - mock(ParticipantSyncPublisher.class), null); + mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class), + mock(AcPreparePublisher.class), mock(MessageProvider.class)); var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); var automationComposition = @@ -323,8 +325,8 @@ class SupervisionAcHandlerTest { var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher, - mock(AcElementPropertiesPublisher.class), null, - mock(ParticipantSyncPublisher.class), null); + mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class), + mock(AcPreparePublisher.class), mock(MessageProvider.class)); var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); var automationComposition = @@ -341,8 +343,8 @@ class SupervisionAcHandlerTest { var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher, - mock(AcElementPropertiesPublisher.class), null, - mock(ParticipantSyncPublisher.class), null); + mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class), + mock(AcPreparePublisher.class), mock(MessageProvider.class)); var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); var automationComposition = @@ -370,16 +372,16 @@ class SupervisionAcHandlerTest { .setParticipantId(automationComposition.getElements().values().iterator().next().getParticipantId()); automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER); automationCompositionAckMessage.setStateChangeResult(StateChangeResult.NO_ERROR); + var messageProvider = mock(MessageProvider.class); var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class), - mock(AcElementPropertiesPublisher.class), null, - mock(ParticipantSyncPublisher.class), null); + mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class), + mock(AcPreparePublisher.class), messageProvider); handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage); - verify(automationCompositionProvider) - .updateAutomationCompositionElement(any(AutomationCompositionElement.class)); + verify(messageProvider).save(any(AutomationCompositionDeployAck.class)); } @Test @@ -387,8 +389,9 @@ class SupervisionAcHandlerTest { var acElementPropertiesPublisher = mock(AcElementPropertiesPublisher.class); var handler = new SupervisionAcHandler(mock(AutomationCompositionProvider.class), mock(AutomationCompositionDeployPublisher.class), - mock(AutomationCompositionStateChangePublisher.class), acElementPropertiesPublisher, null, - mock(ParticipantSyncPublisher.class), null); + mock(AutomationCompositionStateChangePublisher.class), acElementPropertiesPublisher, + mock(AutomationCompositionMigrationPublisher.class), + mock(AcPreparePublisher.class), mock(MessageProvider.class)); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock"); handler.update(automationComposition); @@ -400,8 +403,9 @@ class SupervisionAcHandlerTest { var automationCompositionProvider = mock(AutomationCompositionProvider.class); var acCompositionMigrationPublisher = mock(AutomationCompositionMigrationPublisher.class); var handler = new SupervisionAcHandler(automationCompositionProvider, - null, null, null, - acCompositionMigrationPublisher, mock(ParticipantSyncPublisher.class), null); + mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class), + mock(AcElementPropertiesPublisher.class), acCompositionMigrationPublisher, + mock(AcPreparePublisher.class), mock(MessageProvider.class)); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate"); var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); @@ -413,8 +417,10 @@ class SupervisionAcHandlerTest { void testMigratePrecheck() { var automationCompositionProvider = mock(AutomationCompositionProvider.class); var acCompositionMigrationPublisher = mock(AutomationCompositionMigrationPublisher.class); - var handler = new SupervisionAcHandler(automationCompositionProvider, null, null, - null, acCompositionMigrationPublisher, null, null); + var handler = new SupervisionAcHandler(automationCompositionProvider, + mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class), + mock(AcElementPropertiesPublisher.class), acCompositionMigrationPublisher, + mock(AcPreparePublisher.class), mock(MessageProvider.class)); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate"); handler.migratePrecheck(automationComposition); @@ -425,8 +431,10 @@ class SupervisionAcHandlerTest { void testPrepare() { var automationCompositionProvider = mock(AutomationCompositionProvider.class); var acPreparePublisher = mock(AcPreparePublisher.class); - var handler = new SupervisionAcHandler(automationCompositionProvider, null, null, - null, null, null, acPreparePublisher); + var handler = new SupervisionAcHandler(automationCompositionProvider, + mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class), + mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class), + acPreparePublisher, mock(MessageProvider.class)); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate"); handler.prepare(automationComposition); @@ -437,8 +445,10 @@ class SupervisionAcHandlerTest { void testReview() { var automationCompositionProvider = mock(AutomationCompositionProvider.class); var acPreparePublisher = mock(AcPreparePublisher.class); - var handler = new SupervisionAcHandler(automationCompositionProvider, null, null, - null, null, null, acPreparePublisher); + var handler = new SupervisionAcHandler(automationCompositionProvider, + mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class), + mock(AcElementPropertiesPublisher.class), mock(AutomationCompositionMigrationPublisher.class), + acPreparePublisher, mock(MessageProvider.class)); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate"); handler.review(automationComposition); 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 09a79d890..6e2e66f92 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-2024 Nordix Foundation. + * Copyright (C) 2021-2025 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,19 +31,19 @@ import java.util.Optional; 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.comm.ParticipantSyncPublisher; import org.onap.policy.clamp.acm.runtime.util.CommonTestData; import org.onap.policy.clamp.models.acm.concepts.AcTypeState; import org.onap.policy.clamp.models.acm.concepts.StateChangeResult; import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantPrimeAck; import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider; +import org.onap.policy.clamp.models.acm.persistence.provider.MessageProvider; class SupervisionHandlerTest { @Test void testParticipantPrimeAckNull() { var acDefinitionProvider = mock(AcDefinitionProvider.class); - var handler = new SupervisionHandler(acDefinitionProvider, mock(ParticipantSyncPublisher.class)); + var handler = new SupervisionHandler(acDefinitionProvider, mock(MessageProvider.class)); var participantPrimeAckMessage = new ParticipantPrimeAck(); participantPrimeAckMessage.setParticipantId(CommonTestData.getParticipantId()); @@ -66,8 +66,11 @@ class SupervisionHandlerTest { participantPrimeAckMessage.setCompositionState(AcTypeState.DEPRIMING); handler.handleParticipantMessage(participantPrimeAckMessage); + participantPrimeAckMessage.setCompositionState(AcTypeState.COMMISSIONED); + participantPrimeAckMessage.setStateChangeResult(StateChangeResult.TIMEOUT); + handler.handleParticipantMessage(participantPrimeAckMessage); + verify(acDefinitionProvider, times(0)).findAcDefinition(any()); - verify(acDefinitionProvider, times(0)).updateAcDefinitionElement(any(), any()); } @Test @@ -78,10 +81,9 @@ class SupervisionHandlerTest { participantPrimeAckMessage.setCompositionId(UUID.randomUUID()); participantPrimeAckMessage.setCompositionState(AcTypeState.PRIMED); var acDefinitionProvider = mock(AcDefinitionProvider.class); - var handler = new SupervisionHandler(acDefinitionProvider, mock(ParticipantSyncPublisher.class)); + var handler = new SupervisionHandler(acDefinitionProvider, mock(MessageProvider.class)); handler.handleParticipantMessage(participantPrimeAckMessage); verify(acDefinitionProvider).findAcDefinition(participantPrimeAckMessage.getCompositionId()); - verify(acDefinitionProvider, times(0)).updateAcDefinitionElement(any(), any()); } @Test @@ -98,7 +100,7 @@ class SupervisionHandlerTest { var acDefinitionProvider = mock(AcDefinitionProvider.class); when(acDefinitionProvider.findAcDefinition(acDefinition.getCompositionId())) .thenReturn(Optional.of(acDefinition)); - var handler = new SupervisionHandler(acDefinitionProvider, mock(ParticipantSyncPublisher.class)); + var handler = new SupervisionHandler(acDefinitionProvider, mock(MessageProvider.class)); handler.handleParticipantMessage(participantPrimeAckMessage); verify(acDefinitionProvider).findAcDefinition(any()); @@ -123,14 +125,10 @@ class SupervisionHandlerTest { when(acDefinitionProvider.findAcDefinition(acDefinition.getCompositionId())) .thenReturn(Optional.of(acDefinition)); - var handler = new SupervisionHandler(acDefinitionProvider, mock(ParticipantSyncPublisher.class)); + var handler = new SupervisionHandler(acDefinitionProvider, mock(MessageProvider.class)); handler.handleParticipantMessage(participantPrimeAckMessage); verify(acDefinitionProvider).findAcDefinition(any()); - verify(acDefinitionProvider, times(acDefinition.getElementStateMap().size())) - .updateAcDefinitionElement(any(), any()); - verify(acDefinitionProvider).updateAcDefinitionState(acDefinition.getCompositionId(), AcTypeState.PRIMED, - StateChangeResult.NO_ERROR); } @Test @@ -150,12 +148,9 @@ class SupervisionHandlerTest { when(acDefinitionProvider.findAcDefinition(acDefinition.getCompositionId())) .thenReturn(Optional.of(acDefinition)); - var handler = new SupervisionHandler(acDefinitionProvider, mock(ParticipantSyncPublisher.class)); + var handler = new SupervisionHandler(acDefinitionProvider, mock(MessageProvider.class)); handler.handleParticipantMessage(participantPrimeAckMessage); verify(acDefinitionProvider).findAcDefinition(any()); - verify(acDefinitionProvider).updateAcDefinitionElement(any(), any()); - verify(acDefinitionProvider).updateAcDefinitionState(acDefinition.getCompositionId(), AcTypeState.PRIMING, - StateChangeResult.FAILED); } } 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 index e3387c668..315fb8c48 100644 --- 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 @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2023-2024 Nordix Foundation. + * Copyright (C) 2023-2025 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,7 +35,6 @@ import java.util.Set; 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.main.parameters.AcRuntimeParameterGroup; 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.ParticipantSyncPublisher; @@ -54,6 +53,7 @@ import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantRe import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantStatus; 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.MessageProvider; import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; @@ -72,7 +72,7 @@ class SupervisionParticipantHandlerTest { new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class), participantDeregisterAckPublisher, mock(AutomationCompositionProvider.class), mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class), - mock(AcRuntimeParameterGroup.class)); + mock(MessageProvider.class)); handler.handleParticipantMessage(participantDeregisterMessage); verify(participantDeregisterAckPublisher).send(participantDeregisterMessage.getMessageId()); @@ -100,7 +100,7 @@ class SupervisionParticipantHandlerTest { var handler = new SupervisionParticipantHandler(participantProvider, participantRegisterAckPublisher, mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class), mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class), - mock(AcRuntimeParameterGroup.class)); + mock(MessageProvider.class)); handler.handleParticipantMessage(participantRegisterMessage); verify(participantProvider).saveParticipant(any()); @@ -157,7 +157,7 @@ class SupervisionParticipantHandlerTest { var participantSyncPublisher = mock(ParticipantSyncPublisher.class); var handler = new SupervisionParticipantHandler(participantProvider, participantRegisterAckPublisher, mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider, acDefinitionProvider, - participantSyncPublisher, CommonTestData.getTestParamaterGroup()); + participantSyncPublisher, mock(MessageProvider.class)); handler.handleParticipantMessage(participantRegisterMessage); verify(participantRegisterAckPublisher) @@ -189,20 +189,19 @@ class SupervisionParticipantHandlerTest { .thenReturn(Optional.of(replica)); var automationCompositionProvider = mock(AutomationCompositionProvider.class); + var messageProvider = mock(MessageProvider.class); var handler = new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider, - acDefinitionProvider, mock(ParticipantSyncPublisher.class), - mock(AcRuntimeParameterGroup.class)); + acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider); handler.handleParticipantMessage(participantStatusMessage); - verify(automationCompositionProvider).upgradeStates(any()); + verify(messageProvider).save(any(ParticipantStatus.class)); } @Test void testAcDefinitionOutProperties() { var participantStatusMessage = createParticipantStatus(); - participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo())); var participantDefinition = new ParticipantDefinition(); participantStatusMessage.setParticipantDefinitionUpdates(List.of(participantDefinition)); participantDefinition.setParticipantId(participantStatusMessage.getParticipantId()); @@ -219,6 +218,7 @@ class SupervisionParticipantHandlerTest { acDefinition.setElementStateMap( Map.of(acElementDefinition.getAcElementDefinitionId().getName(), nodeTemplateState)); var acDefinitionProvider = mock(AcDefinitionProvider.class); + var messageProvider = mock(MessageProvider.class); when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition)); when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition); @@ -226,11 +226,33 @@ class SupervisionParticipantHandlerTest { var handler = new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class), - acDefinitionProvider, mock(ParticipantSyncPublisher.class), - CommonTestData.getTestParamaterGroup()); + acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider); handler.handleParticipantMessage(participantStatusMessage); + verify(messageProvider).save(participantStatusMessage); + } + + @Test + void testAcOutProperties() { + var participantStatusMessage = createParticipantStatus(); + participantStatusMessage.setAutomationCompositionInfoList(List.of(new AutomationCompositionInfo())); + + var compositionId = UUID.randomUUID(); + participantStatusMessage.setCompositionId(compositionId); + var acDefinition = new AutomationCompositionDefinition(); + acDefinition.setState(AcTypeState.COMMISSIONED); + acDefinition.setCompositionId(compositionId); + var acDefinitionProvider = mock(AcDefinitionProvider.class); + var messageProvider = mock(MessageProvider.class); + when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition)); + when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition); - verify(acDefinitionProvider).updateAcDefinition(acDefinition, CommonTestData.TOSCA_COMP_NAME); + var participantProvider = mock(ParticipantProvider.class); + var handler = + new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class), + mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class), + acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider); + handler.handleParticipantMessage(participantStatusMessage); + verify(messageProvider).save(participantStatusMessage); } @Test @@ -244,7 +266,7 @@ class SupervisionParticipantHandlerTest { new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class), mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class), - mock(AcRuntimeParameterGroup.class)); + mock(MessageProvider.class)); handler.handleParticipantMessage(participantStatusMessage); verify(participantProvider).saveParticipant(any()); @@ -263,18 +285,18 @@ class SupervisionParticipantHandlerTest { var participantProvider = mock(ParticipantProvider.class); var automationCompositionProvider = mock(AutomationCompositionProvider.class); + var messageProvider = mock(MessageProvider.class); var handler = new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider, - acDefinitionProvider, mock(ParticipantSyncPublisher.class), - mock(AcRuntimeParameterGroup.class)); + acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider); var participant = CommonTestData.createParticipant(CommonTestData.getParticipantId()); when(participantProvider.findParticipant(CommonTestData.getParticipantId())) .thenReturn(Optional.of(participant)); handler.handleParticipantMessage(participantStatusMessage); verify(participantProvider).saveParticipant(any()); - verify(automationCompositionProvider).upgradeStates(any()); + verify(messageProvider).save(any(ParticipantStatus.class)); } private ParticipantStatus createParticipantStatus() { 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 a555d82c6..ab1564bec 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 @@ -28,10 +28,12 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; import java.util.UUID; import org.junit.jupiter.api.Test; import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils; @@ -48,23 +50,27 @@ import org.onap.policy.clamp.models.acm.concepts.LockState; import org.onap.policy.clamp.models.acm.concepts.NodeTemplateState; import org.onap.policy.clamp.models.acm.concepts.StateChangeResult; import org.onap.policy.clamp.models.acm.concepts.SubState; +import org.onap.policy.clamp.models.acm.document.concepts.DocMessage; 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.MessageProvider; import org.onap.policy.clamp.models.acm.utils.TimestampHelper; class SupervisionScannerTest { private static final String AC_JSON = "src/test/resources/rest/acm/AutomationCompositionSmoke.json"; - private static final UUID compositionId = UUID.randomUUID(); + private static final UUID COMPOSITION_ID = UUID.randomUUID(); + private static final UUID INSTANCE_ID = UUID.randomUUID(); + private static final String JOB_ID = "JOB_ID"; - private AutomationCompositionDefinition createAutomationCompositionDefinition(AcTypeState acTypeState, - StateChangeResult stateChangeResult) { + private AutomationCompositionDefinition createAutomationCompositionDefinition( + AcTypeState acTypeState, StateChangeResult stateChangeResult) { var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); var acDefinition = new AutomationCompositionDefinition(); acDefinition.setState(acTypeState); acDefinition.setStateChangeResult(stateChangeResult); - acDefinition.setCompositionId(compositionId); + acDefinition.setCompositionId(COMPOSITION_ID); acDefinition.setLastMsg(TimestampHelper.now()); acDefinition.setServiceTemplate(Objects.requireNonNull(serviceTemplate)); var node = new NodeTemplateState(); @@ -78,13 +84,15 @@ class SupervisionScannerTest { var acDefinitionProvider = mock(AcDefinitionProvider.class); var acTypeState = acDefinition.getState(); if (AcTypeState.PRIMING.equals(acTypeState) || AcTypeState.DEPRIMING.equals(acTypeState)) { - when(acDefinitionProvider.getAllAcDefinitionsInTransition()).thenReturn(List.of(acDefinition)); + Set<UUID> set = new HashSet<>(); + set.add(acDefinition.getCompositionId()); + when(acDefinitionProvider.getAllAcDefinitionsInTransition()).thenReturn(set); when(acDefinitionProvider.getAcDefinition(acDefinition.getCompositionId())) .thenReturn(Objects.requireNonNull(acDefinition)); when(acDefinitionProvider.findAcDefinition(acDefinition.getCompositionId())) .thenReturn(Optional.of(Objects.requireNonNull(acDefinition))); } - when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition); + when(acDefinitionProvider.getAcDefinition(COMPOSITION_ID)).thenReturn(acDefinition); return acDefinitionProvider; } @@ -101,36 +109,95 @@ class SupervisionScannerTest { void testAcDefinition() { var acDefinitionProvider = createAcDefinitionProvider(AcTypeState.PRIMING, StateChangeResult.NO_ERROR); var acDefinitionScanner = mock(AcDefinitionScanner.class); + when(acDefinitionScanner.scanMessage(any(), any())).thenReturn(new UpdateSync()); + var messageProvider = mock(MessageProvider.class); + when(messageProvider.createJob(COMPOSITION_ID)).thenReturn(Optional.of(JOB_ID)); + when(messageProvider.findCompositionMessages()).thenReturn(Set.of(COMPOSITION_ID)); + var message = new DocMessage(); + when(messageProvider.getAllMessages(COMPOSITION_ID)).thenReturn(List.of(message)); var supervisionScanner = new SupervisionScanner(mock(AutomationCompositionProvider.class), acDefinitionProvider, - acDefinitionScanner, mock(StageScanner.class), mock(SimpleScanner.class), mock(PhaseScanner.class)); + acDefinitionScanner, mock(StageScanner.class), mock(SimpleScanner.class), mock(PhaseScanner.class), + messageProvider); supervisionScanner.run(); verify(acDefinitionScanner).scanAutomationCompositionDefinition(any(), any()); + verify(messageProvider).removeMessage(message.getMessageId()); + verify(messageProvider).removeJob(JOB_ID); } @Test - void testAcNotInTransitionOrFailed() { - var automationCompositionProvider = mock(AutomationCompositionProvider.class); + void testAcDefinitionJobExist() { + var acDefinitionProvider = createAcDefinitionProvider(AcTypeState.PRIMING, StateChangeResult.NO_ERROR); + var acDefinitionScanner = mock(AcDefinitionScanner.class); + var messageProvider = mock(MessageProvider.class); + when(messageProvider.createJob(COMPOSITION_ID)).thenReturn(Optional.empty()); + when(messageProvider.findCompositionMessages()).thenReturn(Set.of()); + var supervisionScanner = new SupervisionScanner(mock(AutomationCompositionProvider.class), acDefinitionProvider, + acDefinitionScanner, mock(StageScanner.class), mock(SimpleScanner.class), mock(PhaseScanner.class), + messageProvider); + supervisionScanner.run(); + verify(acDefinitionScanner, times(0)).scanAutomationCompositionDefinition(any(), any()); + } + @Test + void testAcNotInTransitionOrFailed() { var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_JSON, "Crud"); - automationComposition.setCompositionId(Objects.requireNonNull(compositionId)); - when(automationCompositionProvider.getAcInstancesInTransition()).thenReturn(List.of(automationComposition)); + automationComposition.setInstanceId(Objects.requireNonNull(INSTANCE_ID)); + automationComposition.setCompositionId(Objects.requireNonNull(COMPOSITION_ID)); + Set<UUID> set = new HashSet<>(); + set.add(automationComposition.getInstanceId()); + var automationCompositionProvider = mock(AutomationCompositionProvider.class); + when(automationCompositionProvider.getAcInstancesInTransition()).thenReturn(set); var stageScanner = mock(StageScanner.class); var simpleScanner = mock(SimpleScanner.class); var phaseScanner = mock(PhaseScanner.class); + var messageProvider = mock(MessageProvider.class); var supervisionScanner = new SupervisionScanner(automationCompositionProvider, createAcDefinitionProvider(), - mock(AcDefinitionScanner.class), stageScanner, simpleScanner, phaseScanner); + mock(AcDefinitionScanner.class), stageScanner, simpleScanner, phaseScanner, messageProvider); // not in transition supervisionScanner.run(); - verify(stageScanner, times(0)).scanStage(any(), any(), any()); - verify(simpleScanner, times(0)).simpleScan(any(), any()); - verify(phaseScanner, times(0)).scanWithPhase(any(), any(), any()); + verifyNoInteraction(stageScanner, simpleScanner, phaseScanner); + // failed automationComposition.setDeployState(DeployState.DEPLOYING); automationComposition.setStateChangeResult(StateChangeResult.FAILED); supervisionScanner.run(); - // failed + verifyNoInteraction(stageScanner, simpleScanner, phaseScanner); + + // job already exist + automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR); + when(messageProvider.createJob(automationComposition.getInstanceId())).thenReturn(Optional.empty()); + supervisionScanner.run(); + verifyNoInteraction(stageScanner, simpleScanner, phaseScanner); + } + + @Test + void testAcRemoved() { + var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_JSON, "Crud"); + automationComposition.setInstanceId(Objects.requireNonNull(INSTANCE_ID)); + automationComposition.setCompositionId(Objects.requireNonNull(COMPOSITION_ID)); + Set<UUID> set = new HashSet<>(); + set.add(automationComposition.getInstanceId()); + var automationCompositionProvider = mock(AutomationCompositionProvider.class); + when(automationCompositionProvider.getAcInstancesInTransition()).thenReturn(set); + + var stageScanner = mock(StageScanner.class); + var simpleScanner = mock(SimpleScanner.class); + var phaseScanner = mock(PhaseScanner.class); + var messageProvider = mock(MessageProvider.class); + when(messageProvider.createJob(automationComposition.getInstanceId())).thenReturn(Optional.of(JOB_ID)); + var supervisionScanner = new SupervisionScanner(automationCompositionProvider, createAcDefinitionProvider(), + mock(AcDefinitionScanner.class), stageScanner, simpleScanner, phaseScanner, messageProvider); + + // automationComposition not present in DB + supervisionScanner.run(); + verifyNoInteraction(stageScanner, simpleScanner, phaseScanner); + verify(messageProvider).removeJob(JOB_ID); + } + + private void verifyNoInteraction( + StageScanner stageScanner, SimpleScanner simpleScanner, PhaseScanner phaseScanner) { verify(stageScanner, times(0)).scanStage(any(), any(), any()); verify(simpleScanner, times(0)).simpleScan(any(), any()); verify(phaseScanner, times(0)).scanWithPhase(any(), any(), any()); @@ -139,31 +206,44 @@ class SupervisionScannerTest { @Test void testScanner() { var automationComposition = new AutomationComposition(); - automationComposition.setCompositionId(compositionId); + automationComposition.setInstanceId(INSTANCE_ID); + automationComposition.setCompositionId(COMPOSITION_ID); automationComposition.setDeployState(DeployState.DEPLOYING); + Set<UUID> set = new HashSet<>(); + set.add(automationComposition.getInstanceId()); var automationCompositionProvider = mock(AutomationCompositionProvider.class); - when(automationCompositionProvider.getAcInstancesInTransition()).thenReturn(List.of(automationComposition)); + when(automationCompositionProvider.getAcInstancesInTransition()).thenReturn(set); when(automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId())) .thenReturn(Optional.of(automationComposition)); var stageScanner = mock(StageScanner.class); var simpleScanner = mock(SimpleScanner.class); + when(simpleScanner.scanMessage(any(), any())).thenReturn(new UpdateSync()); var phaseScanner = mock(PhaseScanner.class); + var messageProvider = mock(MessageProvider.class); + when(messageProvider.createJob(automationComposition.getInstanceId())).thenReturn(Optional.of(JOB_ID)); + var message = new DocMessage(); + when(messageProvider.getAllMessages(INSTANCE_ID)).thenReturn(List.of(message)); + when(messageProvider.findInstanceMessages()).thenReturn(Set.of(INSTANCE_ID)); + var supervisionScanner = new SupervisionScanner(automationCompositionProvider, createAcDefinitionProvider(), - mock(AcDefinitionScanner.class), stageScanner, simpleScanner, phaseScanner); + mock(AcDefinitionScanner.class), stageScanner, simpleScanner, phaseScanner, messageProvider); supervisionScanner.run(); verify(stageScanner, times(0)).scanStage(any(), any(), any()); verify(simpleScanner, times(0)).simpleScan(any(), any()); verify(phaseScanner).scanWithPhase(any(), any(), any()); + verify(messageProvider).removeMessage(message.getMessageId()); + verify(messageProvider).removeJob(JOB_ID); } @Test void testSendAutomationCompositionMigrate() { var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_JSON, "Crud"); automationComposition.setDeployState(DeployState.MIGRATING); - automationComposition.setCompositionId(compositionId); + automationComposition.setInstanceId(INSTANCE_ID); + automationComposition.setCompositionId(COMPOSITION_ID); var compositionTargetId = UUID.randomUUID(); automationComposition.setCompositionTargetId(compositionTargetId); automationComposition.setLockState(LockState.LOCKED); @@ -175,7 +255,9 @@ class SupervisionScannerTest { } var automationCompositionProvider = mock(AutomationCompositionProvider.class); - when(automationCompositionProvider.getAcInstancesInTransition()).thenReturn(List.of(automationComposition)); + Set<UUID> set = new HashSet<>(); + set.add(automationComposition.getInstanceId()); + when(automationCompositionProvider.getAcInstancesInTransition()).thenReturn(set); when(automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId())) .thenReturn(Optional.of(automationComposition)); @@ -185,12 +267,17 @@ class SupervisionScannerTest { when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(definitionTarget); var stageScanner = mock(StageScanner.class); + var messageProvider = mock(MessageProvider.class); + when(messageProvider.createJob(automationComposition.getInstanceId())).thenReturn(Optional.of(JOB_ID)); + var supervisionScanner = new SupervisionScanner(automationCompositionProvider, acDefinitionProvider, - mock(AcDefinitionScanner.class), stageScanner, mock(SimpleScanner.class), mock(PhaseScanner.class)); + mock(AcDefinitionScanner.class), stageScanner, mock(SimpleScanner.class), + mock(PhaseScanner.class), messageProvider); supervisionScanner.run(); verify(stageScanner).scanStage(automationComposition, definitionTarget.getServiceTemplate(), new UpdateSync()); + verify(messageProvider).removeJob(JOB_ID); } @Test @@ -200,35 +287,86 @@ class SupervisionScannerTest { automationComposition.setDeployState(DeployState.DEPLOYED); automationComposition.setSubState(SubState.MIGRATION_PRECHECKING); automationComposition.setLockState(LockState.NONE); - automationComposition.setCompositionId(compositionId); + automationComposition.setInstanceId(INSTANCE_ID); + automationComposition.setCompositionId(COMPOSITION_ID); automationComposition.setLastMsg(TimestampHelper.now()); var automationCompositionProvider = mock(AutomationCompositionProvider.class); - when(automationCompositionProvider.getAcInstancesInTransition()).thenReturn(List.of(automationComposition)); + Set<UUID> set = new HashSet<>(); + set.add(automationComposition.getInstanceId()); + when(automationCompositionProvider.getAcInstancesInTransition()).thenReturn(set); when(automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId())) .thenReturn(Optional.of(automationComposition)); + var messageProvider = mock(MessageProvider.class); + when(messageProvider.createJob(automationComposition.getInstanceId())).thenReturn(Optional.of(JOB_ID)); + var simpleScanner = mock(SimpleScanner.class); var supervisionScanner = new SupervisionScanner(automationCompositionProvider, createAcDefinitionProvider(), - mock(AcDefinitionScanner.class), mock(StageScanner.class), simpleScanner, mock(PhaseScanner.class)); + mock(AcDefinitionScanner.class), mock(StageScanner.class), simpleScanner, mock(PhaseScanner.class), + messageProvider); supervisionScanner.run(); verify(simpleScanner).simpleScan(automationComposition, new UpdateSync()); + verify(messageProvider).removeJob(JOB_ID); clearInvocations(simpleScanner); + clearInvocations(messageProvider); automationComposition.setDeployState(DeployState.UNDEPLOYED); automationComposition.setSubState(SubState.PREPARING); supervisionScanner.run(); verify(simpleScanner).simpleScan(automationComposition, new UpdateSync()); + verify(messageProvider).removeJob(JOB_ID); clearInvocations(simpleScanner); + clearInvocations(messageProvider); automationComposition.setDeployState(DeployState.DEPLOYED); automationComposition.setSubState(SubState.REVIEWING); supervisionScanner.run(); verify(simpleScanner).simpleScan(automationComposition, new UpdateSync()); + verify(messageProvider).removeJob(JOB_ID); clearInvocations(simpleScanner); + clearInvocations(messageProvider); automationComposition.setDeployState(DeployState.UPDATING); automationComposition.setSubState(SubState.NONE); supervisionScanner.run(); verify(simpleScanner).simpleScan(automationComposition, new UpdateSync()); + verify(messageProvider).removeJob(JOB_ID); + } + + @Test + void testSaveAcByMessageUpdate() { + var automationComposition = new AutomationComposition(); + automationComposition.setInstanceId(INSTANCE_ID); + automationComposition.setCompositionId(COMPOSITION_ID); + automationComposition.setDeployState(DeployState.DEPLOYED); + automationComposition.setLockState(LockState.LOCKED); + automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR); + var automationCompositionProvider = mock(AutomationCompositionProvider.class); + when(automationCompositionProvider.getAcInstancesInTransition()).thenReturn(new HashSet<>()); + when(automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId())) + .thenReturn(Optional.of(automationComposition)); + + var simpleScanner = mock(SimpleScanner.class); + var updateSync = new UpdateSync(); + updateSync.setUpdated(true); + when(simpleScanner.scanMessage(any(), any())).thenReturn(updateSync); + + var messageProvider = mock(MessageProvider.class); + when(messageProvider.createJob(automationComposition.getInstanceId())).thenReturn(Optional.of(JOB_ID)); + var message = new DocMessage(); + when(messageProvider.getAllMessages(INSTANCE_ID)).thenReturn(List.of(message)); + when(messageProvider.findInstanceMessages()).thenReturn(Set.of(INSTANCE_ID)); + + var phaseScanner = mock(PhaseScanner.class); + var stageScanner = mock(StageScanner.class); + var supervisionScanner = new SupervisionScanner(automationCompositionProvider, createAcDefinitionProvider(), + mock(AcDefinitionScanner.class), stageScanner, simpleScanner, phaseScanner, messageProvider); + + supervisionScanner.run(); + verifyNoInteraction(stageScanner, simpleScanner, phaseScanner); + verify(simpleScanner).saveAndSync(any(), any()); + verify(messageProvider).removeMessage(message.getMessageId()); + verify(messageProvider).removeJob(JOB_ID); } + } |