From 94b9734a794204b1059a13d715b8338b8b816125 Mon Sep 17 00:00:00 2001 From: FrancescoFioraEst Date: Tue, 22 Jul 2025 10:58:31 +0100 Subject: [PATCH] Add automatic sync up support in ACM-runtime Issue-ID: POLICY-5418 Change-Id: Idd889dac2d8afa79745c96fcbe1ffd0ed23faffa Signed-off-by: FrancescoFioraEst --- .../commissioning/CommissioningProvider.java | 7 +- ...AutomationCompositionInstantiationProvider.java | 100 ++++++-------- .../acm/runtime/main/utils/EncryptionUtils.java | 31 ++++- .../runtime/supervision/SupervisionAcHandler.java | 57 ++++---- .../supervision/SupervisionParticipantHandler.java | 68 +++++++-- .../comm/AcElementPropertiesPublisher.java | 16 ++- .../supervision/comm/AcPreparePublisher.java | 21 ++- .../comm/AutomationCompositionDeployPublisher.java | 11 +- .../AutomationCompositionMigrationPublisher.java | 17 ++- .../AutomationCompositionStateChangePublisher.java | 12 +- .../comm/ParticipantPrimePublisher.java | 17 ++- .../comm/ParticipantReqSyncListener.java | 60 ++++++++ .../supervision/comm/ParticipantSyncPublisher.java | 5 +- .../supervision/scanner/AbstractScanner.java | 8 +- .../supervision/scanner/AcDefinitionScanner.java | 2 + .../supervision/scanner/MonitoringScanner.java | 24 ++-- .../runtime/supervision/scanner/PhaseScanner.java | 18 +-- .../runtime/supervision/scanner/StageScanner.java | 23 ++-- .../commissioning/CommissioningProviderTest.java | 11 +- ...mationCompositionInstantiationProviderTest.java | 104 ++++++++------ .../acm/runtime/main/utils/EncryptionUtilTest.java | 27 ++-- .../supervision/SupervisionAcHandlerTest.java | 34 +++-- .../SupervisionParticipantHandlerTest.java | 152 ++++++++++++++++++--- .../supervision/SupervisionScannerTest.java | 24 ++-- .../supervision/comm/SupervisionMessagesTest.java | 19 +-- .../supervision/scanner/PhaseScannerTest.java | 53 +++---- .../supervision/scanner/StageScannerTest.java | 25 ++-- 27 files changed, 646 insertions(+), 300 deletions(-) create mode 100644 runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantReqSyncListener.java diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProvider.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProvider.java index 0d3375bae..a1540d373 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProvider.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/commissioning/CommissioningProvider.java @@ -215,7 +215,8 @@ public class CommissioningProvider { acRuntimeParameterGroup.getAcmParameters().getToscaCompositionName()); executor.execute( - () -> participantPrimePublisher.sendPriming(preparation, acmDefinition.getCompositionId(), null)); + () -> participantPrimePublisher.sendPriming( + preparation, acmDefinition.getCompositionId(), acmDefinition.getRevisionId())); } private void deprime(AutomationCompositionDefinition acmDefinition) { @@ -236,7 +237,7 @@ public class CommissioningProvider { acDefinitionProvider.updateAcDefinition(acmDefinition, acRuntimeParameterGroup.getAcmParameters().getToscaCompositionName()); - executor.execute(() -> participantPrimePublisher.sendDepriming(acmDefinition.getCompositionId())); + executor.execute(() -> participantPrimePublisher.sendDepriming( + acmDefinition.getCompositionId(), participantIds, acmDefinition.getRevisionId())); } - } diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java index 389f555d0..4e9ca3d6b 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProvider.java @@ -31,14 +31,12 @@ import lombok.RequiredArgsConstructor; import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup; import org.onap.policy.clamp.acm.runtime.main.utils.EncryptionUtils; import org.onap.policy.clamp.acm.runtime.supervision.SupervisionAcHandler; -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.AutomationCompositionElement; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions; 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.NodeTemplateState; import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils; import org.onap.policy.clamp.models.acm.concepts.StateChangeResult; import org.onap.policy.clamp.models.acm.concepts.SubState; @@ -53,8 +51,6 @@ import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositi import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider; import org.onap.policy.clamp.models.acm.utils.AcmUtils; import org.onap.policy.common.parameters.BeanValidationResult; -import org.onap.policy.common.parameters.ObjectValidationResult; -import org.onap.policy.common.parameters.ValidationStatus; import org.onap.policy.models.base.PfModelRuntimeException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -96,7 +92,9 @@ public class AutomationCompositionInstantiationProvider { AutomationCompositionProvider.validateInstanceEndpoint(compositionId, automationComposition); automationCompositionProvider.validateNameVersion(automationComposition.getKey().asIdentifier()); - var validationResult = validateAutomationComposition(automationComposition); + var acDefinition = acDefinitionProvider.getAcDefinition(compositionId); + AcDefinitionProvider.checkPrimedComposition(acDefinition); + var validationResult = validateAutomationComposition(automationComposition, acDefinition); if (!validationResult.isValid()) { throw new PfModelRuntimeException(Status.BAD_REQUEST, validationResult.getResult()); } @@ -125,13 +123,15 @@ public class AutomationCompositionInstantiationProvider { var instanceId = automationComposition.getInstanceId(); var acToUpdate = automationCompositionProvider.getAutomationComposition(instanceId); AutomationCompositionProvider.validateInstanceEndpoint(compositionId, acToUpdate); + var acDefinition = acDefinitionProvider.getAcDefinition(compositionId); + AcDefinitionProvider.checkPrimedComposition(acDefinition); if (DeployState.UNDEPLOYED.equals(acToUpdate.getDeployState())) { acToUpdate.setElements(automationComposition.getElements()); acToUpdate.setName(automationComposition.getName()); acToUpdate.setVersion(automationComposition.getVersion()); acToUpdate.setDescription(automationComposition.getDescription()); acToUpdate.setDerivedFrom(automationComposition.getDerivedFrom()); - var validationResult = validateAutomationComposition(acToUpdate); + var validationResult = validateAutomationComposition(acToUpdate, acDefinition); if (!validationResult.isValid()) { throw new PfModelRuntimeException(Status.BAD_REQUEST, validationResult.getResult()); } @@ -157,11 +157,11 @@ public class AutomationCompositionInstantiationProvider { acToUpdate.getDeployState(), acToUpdate.getLockState(), acToUpdate.getSubState(), acToUpdate.getStateChangeResult()); return switch (result) { - case "UPDATE" -> updateDeployedAutomationComposition(automationComposition, acToUpdate); + case "UPDATE" -> updateDeployedAutomationComposition(automationComposition, acToUpdate, acDefinition); - case "MIGRATE" -> migrateAutomationComposition(automationComposition, acToUpdate); + case "MIGRATE" -> migrateAutomationComposition(automationComposition, acToUpdate, acDefinition); - case "MIGRATE_PRECHECK" -> migratePrecheckAc(automationComposition, acToUpdate); + case "MIGRATE_PRECHECK" -> migratePrecheckAc(automationComposition, acToUpdate, acDefinition); default -> throw new PfModelRuntimeException(Status.BAD_REQUEST, "Not allowed to " + deployOrder + " in the state " + acToUpdate.getDeployState()); @@ -176,7 +176,8 @@ public class AutomationCompositionInstantiationProvider { * @return the result of the update */ private InstantiationResponse updateDeployedAutomationComposition( - AutomationComposition automationComposition, AutomationComposition acToBeUpdated) { + AutomationComposition automationComposition, AutomationComposition acToBeUpdated, + AutomationCompositionDefinition acDefinition) { // save copy in case of a rollback automationCompositionProvider.copyAcElementsBeforeUpdate(acToBeUpdated); @@ -190,24 +191,24 @@ public class AutomationCompositionInstantiationProvider { AcmUtils.recursiveMerge(dbAcElement.getProperties(), element.getValue().getProperties()); } - var validationResult = validateAutomationComposition(acToBeUpdated); + var validationResult = validateAutomationComposition(acToBeUpdated, acDefinition); if (!validationResult.isValid()) { throw new PfModelRuntimeException(Status.BAD_REQUEST, validationResult.getResult()); } updateAcForProperties(acToBeUpdated); var acToPublish = new AutomationComposition(acToBeUpdated); - encryptInstanceProperties(acToBeUpdated, acToBeUpdated.getCompositionId()); automationComposition = automationCompositionProvider.updateAutomationComposition(acToBeUpdated); // Publish property update event to the participants - supervisionAcHandler.update(acToPublish); + supervisionAcHandler.update(acToPublish, acDefinition.getRevisionId()); return createInstantiationResponse(automationComposition); } private InstantiationResponse migrateAutomationComposition( - AutomationComposition automationComposition, AutomationComposition acToBeUpdated) { + AutomationComposition automationComposition, AutomationComposition acToBeUpdated, + AutomationCompositionDefinition acDefinition) { if (!DeployState.DEPLOYED.equals(acToBeUpdated.getDeployState())) { throw new PfModelRuntimeException(Status.BAD_REQUEST, @@ -216,21 +217,21 @@ public class AutomationCompositionInstantiationProvider { // make copy for rollback automationCompositionProvider.copyAcElementsBeforeUpdate(acToBeUpdated); + var acDefinitionTarget = acDefinitionProvider.getAcDefinition(automationComposition.getCompositionTargetId()); + AcDefinitionProvider.checkPrimedComposition(acDefinitionTarget); // Iterate and update the element property values - var elementsRemoved = updateElementsProperties(automationComposition, acToBeUpdated); - var acDefinition = acDefinitionProvider.getAcDefinition(automationComposition.getCompositionTargetId()); + var elementsRemoved = updateElementsProperties(automationComposition, acToBeUpdated, acDefinitionTarget); - updateAcForMigration(acToBeUpdated, acDefinition, DeployState.MIGRATING); + updateAcForMigration(acToBeUpdated, acDefinitionTarget, DeployState.MIGRATING); var acToPublish = new AutomationComposition(acToBeUpdated); - encryptInstanceProperties(acToBeUpdated, acToBeUpdated.getCompositionTargetId()); var ac = automationCompositionProvider.updateAutomationComposition(acToBeUpdated); elementsRemoved.forEach(automationCompositionProvider::deleteAutomationCompositionElement); // Publish migrate event to the participants - supervisionAcHandler.migrate(acToPublish); + supervisionAcHandler.migrate(acToPublish, acDefinition.getRevisionId(), acDefinitionTarget.getRevisionId()); return createInstantiationResponse(ac); } @@ -252,16 +253,20 @@ public class AutomationCompositionInstantiationProvider { .filter(id -> acFromMigration.getElements().get(id) == null).toList(); } + private InstantiationResponse migratePrecheckAc( - AutomationComposition automationComposition, AutomationComposition acToBeUpdated) { + AutomationComposition automationComposition, AutomationComposition acToBeUpdated, + AutomationCompositionDefinition acDefinition) { acToBeUpdated.setPrecheck(true); var copyAc = new AutomationComposition(acToBeUpdated); + var acDefinitionTarget = acDefinitionProvider.getAcDefinition(automationComposition.getCompositionTargetId()); + AcDefinitionProvider.checkPrimedComposition(acDefinitionTarget); // Iterate and update the element property values - updateElementsProperties(automationComposition, copyAc); + updateElementsProperties(automationComposition, copyAc, acDefinitionTarget); // Publish migrate event to the participants - supervisionAcHandler.migratePrecheck(copyAc); + supervisionAcHandler.migratePrecheck(copyAc, acDefinition.getRevisionId(), acDefinitionTarget.getRevisionId()); AcmUtils.setCascadedState(acToBeUpdated, DeployState.DEPLOYED, LockState.LOCKED, SubState.MIGRATION_PRECHECKING); @@ -270,39 +275,19 @@ public class AutomationCompositionInstantiationProvider { return createInstantiationResponse(automationCompositionProvider.updateAutomationComposition(acToBeUpdated)); } - private BeanValidationResult validateAutomationComposition(AutomationComposition automationComposition) { - return validateAutomationComposition(automationComposition, automationComposition.getCompositionId()); - } - /** * Validate AutomationComposition. * * @param automationComposition AutomationComposition to validate - * @param compositionId the composition id + * @param acDefinition the Composition Definition * @return the result of validation */ private BeanValidationResult validateAutomationComposition(AutomationComposition automationComposition, - UUID compositionId) { - + AutomationCompositionDefinition acDefinition) { var result = new BeanValidationResult("AutomationComposition", automationComposition); - var acDefinitionOpt = acDefinitionProvider.findAcDefinition(compositionId); - if (acDefinitionOpt.isEmpty()) { - result.addResult(new ObjectValidationResult("ServiceTemplate", compositionId, ValidationStatus.INVALID, - "Commissioned automation composition definition not found")); - return result; - } - if (!AcTypeState.PRIMED.equals(acDefinitionOpt.get().getState())) { - result.addResult(new ObjectValidationResult("ServiceTemplate.state", acDefinitionOpt.get().getState(), - ValidationStatus.INVALID, "Commissioned automation composition definition not primed")); - return result; - } - var participantIds = acDefinitionOpt.get().getElementStateMap().values().stream() - .map(NodeTemplateState::getParticipantId).collect(Collectors.toSet()); - - participantProvider.verifyParticipantState(participantIds); - + participantProvider.checkRegisteredParticipant(acDefinition); result.addResult(AcmUtils.validateAutomationComposition(automationComposition, - acDefinitionOpt.get().getServiceTemplate(), + acDefinition.getServiceTemplate(), acRuntimeParameterGroup.getAcmParameters().getToscaCompositionName())); result.addResult(automationCompositionProvider.validateElementIds(automationComposition)); @@ -310,7 +295,7 @@ public class AutomationCompositionInstantiationProvider { if (result.isValid()) { for (var element : automationComposition.getElements().values()) { var name = element.getDefinition().getName(); - var participantId = acDefinitionOpt.get().getElementStateMap().get(name).getParticipantId(); + var participantId = acDefinition.getElementStateMap().get(name).getParticipantId(); element.setParticipantId(participantId); } } @@ -425,7 +410,7 @@ public class AutomationCompositionInstantiationProvider { break; case "REVIEW": - supervisionAcHandler.review(automationComposition); + supervisionAcHandler.review(automationComposition, acDefinition); break; default: @@ -460,22 +445,22 @@ public class AutomationCompositionInstantiationProvider { acToBeUpdated.setElements(automationCompositionToRollback.getElements().values().stream() .collect(Collectors.toMap(AutomationCompositionElement::getId, AutomationCompositionElement::new))); - var acDefinition = acDefinitionProvider.getAcDefinition(acToBeUpdated.getCompositionTargetId()); - var validationResult = - validateAutomationComposition(acToBeUpdated, acToBeUpdated.getCompositionTargetId()); + var acDefinitionTarget = acDefinitionProvider.getAcDefinition(acToBeUpdated.getCompositionTargetId()); + var validationResult = validateAutomationComposition(acToBeUpdated, acDefinitionTarget); if (!validationResult.isValid()) { throw new PfModelRuntimeException(Status.BAD_REQUEST, validationResult.getResult()); } - updateAcForMigration(acToBeUpdated, acDefinition, DeployState.MIGRATION_REVERTING); + updateAcForMigration(acToBeUpdated, acDefinitionTarget, DeployState.MIGRATION_REVERTING); var elementsRemoved = getElementRemoved(automationComposition, acToBeUpdated); automationCompositionProvider.updateAutomationComposition(acToBeUpdated); elementsRemoved.forEach(automationCompositionProvider::deleteAutomationCompositionElement); - supervisionAcHandler.migrate(acToBeUpdated); + var acDefinition = acDefinitionProvider.getAcDefinition(acToBeUpdated.getCompositionId()); + supervisionAcHandler.migrate(acToBeUpdated, acDefinition.getRevisionId(), acDefinitionTarget.getRevisionId()); } private List updateElementsProperties(AutomationComposition automationComposition, - AutomationComposition acToBeUpdated) { + AutomationComposition acToBeUpdated, AutomationCompositionDefinition acDefinitionTarget) { for (var element : automationComposition.getElements().entrySet()) { var elementId = element.getKey(); var dbAcElement = acToBeUpdated.getElements().get(elementId); @@ -487,8 +472,8 @@ public class AutomationCompositionInstantiationProvider { AcmUtils.recursiveMerge(dbAcElement.getProperties(), element.getValue().getProperties()); var newDefinition = element.getValue().getDefinition().asConceptKey(); var dbElementDefinition = dbAcElement.getDefinition().asConceptKey(); - AutomationCompositionProvider - .checkCompatibility(newDefinition, dbElementDefinition, automationComposition.getInstanceId()); + AutomationCompositionProvider.checkCompatibility( + newDefinition, dbElementDefinition, automationComposition.getInstanceId()); dbAcElement.setDefinition(element.getValue().getDefinition()); } } @@ -496,8 +481,7 @@ public class AutomationCompositionInstantiationProvider { var elementsRemoved = getElementRemoved(acToBeUpdated, automationComposition); elementsRemoved.forEach(uuid -> acToBeUpdated.getElements().remove(uuid)); - var validationResult = - validateAutomationComposition(acToBeUpdated, automationComposition.getCompositionTargetId()); + var validationResult = validateAutomationComposition(acToBeUpdated, acDefinitionTarget); if (!validationResult.isValid()) { throw new PfModelRuntimeException(Status.BAD_REQUEST, validationResult.getResult()); } diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/utils/EncryptionUtils.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/utils/EncryptionUtils.java index a0226e8a8..7a77aa10f 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/utils/EncryptionUtils.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/main/utils/EncryptionUtils.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2025 Nordix Foundation. + * Copyright (C) 2025 OpenInfra Foundation Europe. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -141,12 +141,7 @@ public class EncryptionUtils { } } - - /** - * Find and decrypt sensitive fields in an AC instance. - * @param automationComposition acInstance - */ - public void findAndDecryptSensitiveData(AutomationComposition automationComposition) { + private void findAndDecryptSensitiveData(AutomationComposition automationComposition) { for (var acInstanceElement: automationComposition.getElements().values()) { for (var property : acInstanceElement.getProperties().entrySet()) { var propertyVal = property.getValue(); @@ -309,4 +304,26 @@ public class EncryptionUtils { } } + + /** + * Find and decrypt sensitive fields in an AC instance. + * + * @param automationComposition acInstance + */ + public void decryptInstanceProperties(AutomationComposition automationComposition) { + if (encryptionEnabled()) { + findAndDecryptSensitiveData(automationComposition); + } + } + + /** + * Find and decrypt sensitive fields in an AC instance list. + * + * @param automationCompositionList acInstance list + */ + public void decryptInstanceProperties(List automationCompositionList) { + if (encryptionEnabled()) { + automationCompositionList.forEach(this::findAndDecryptSensitiveData); + } + } } 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 991a65379..37c386627 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 @@ -24,6 +24,7 @@ import io.micrometer.core.annotation.Timed; import io.opentelemetry.context.Context; import java.util.HashMap; import java.util.Map; +import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import lombok.AllArgsConstructor; @@ -100,8 +101,8 @@ public class SupervisionAcHandler { executor.execute( () -> { var acToSend = new AutomationComposition(automationComposition); - decryptInstanceProperties(acToSend); - automationCompositionDeployPublisher.send(acToSend, startPhase, true); + encryptionUtils.decryptInstanceProperties(acToSend); + automationCompositionDeployPublisher.send(acToSend, startPhase, true, acDefinition.getRevisionId()); }); } @@ -131,7 +132,8 @@ public class SupervisionAcHandler { automationComposition.setPhase(startPhase); automationCompositionProvider.updateAutomationComposition(automationComposition); executor.execute( - () -> automationCompositionStateChangePublisher.send(automationComposition, startPhase, true)); + () -> automationCompositionStateChangePublisher.send( + automationComposition, startPhase, true, acDefinition.getRevisionId())); } /** @@ -158,7 +160,8 @@ public class SupervisionAcHandler { automationComposition.setPhase(startPhase); automationCompositionProvider.updateAutomationComposition(automationComposition); executor.execute( - () -> automationCompositionStateChangePublisher.send(automationComposition, startPhase, true)); + () -> automationCompositionStateChangePublisher.send( + automationComposition, startPhase, true, acDefinition.getRevisionId())); } /** @@ -175,8 +178,8 @@ public class SupervisionAcHandler { automationCompositionProvider.updateAutomationComposition(automationComposition); executor.execute(() -> { var acToSend = new AutomationComposition(automationComposition); - decryptInstanceProperties(acToSend); - acPreparePublisher.sendPrepare(acToSend, stage); + encryptionUtils.decryptInstanceProperties(acToSend); + acPreparePublisher.sendPrepare(acToSend, stage, acDefinition.getRevisionId()); }); } @@ -184,12 +187,13 @@ public class SupervisionAcHandler { * Handle prepare Post Deploy an AutomationComposition instance. * * @param automationComposition the AutomationComposition + * @param acDefinition the AutomationCompositionDefinition */ - public void review(AutomationComposition automationComposition) { + public void review(AutomationComposition automationComposition, AutomationCompositionDefinition acDefinition) { AcmUtils.setCascadedState(automationComposition, DeployState.DEPLOYED, LockState.LOCKED, SubState.REVIEWING); automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR); automationCompositionProvider.updateAutomationComposition(automationComposition); - executor.execute(() -> acPreparePublisher.sendRevew(automationComposition)); + executor.execute(() -> acPreparePublisher.sendReview(automationComposition, acDefinition.getRevisionId())); } /** @@ -216,19 +220,21 @@ public class SupervisionAcHandler { automationComposition.setPhase(startPhase); automationCompositionProvider.updateAutomationComposition(automationComposition); executor.execute( - () -> automationCompositionStateChangePublisher.send(automationComposition, startPhase, true)); + () -> automationCompositionStateChangePublisher.send( + automationComposition, startPhase, true, acDefinition.getRevisionId())); } /** * Handle Element property update on a deployed instance. * * @param automationComposition the AutomationComposition + * @param revisionIdComposition the last Update from Composition */ - public void update(AutomationComposition automationComposition) { + public void update(AutomationComposition automationComposition, UUID revisionIdComposition) { executor.execute( () -> { - decryptInstanceProperties(automationComposition); - acElementPropertiesPublisher.send(automationComposition); + encryptionUtils.decryptInstanceProperties(automationComposition); + acElementPropertiesPublisher.send(automationComposition, revisionIdComposition); }); } @@ -245,7 +251,8 @@ public class SupervisionAcHandler { automationComposition.setPhase(startPhase); automationCompositionProvider.updateAutomationComposition(automationComposition); executor.execute( - () -> automationCompositionStateChangePublisher.send(automationComposition, startPhase, true)); + () -> automationCompositionStateChangePublisher.send( + automationComposition, startPhase, true, acDefinition.getRevisionId())); } /** @@ -334,11 +341,15 @@ public class SupervisionAcHandler { * Handle Migration of an AutomationComposition instance to other ACM Definition. * * @param automationComposition the AutomationComposition + * @param revisionIdComposition the last Update from Composition + * @param revisionIdCompositionTarget the last Update from Composition Target */ - public void migrate(AutomationComposition automationComposition) { + public void migrate(AutomationComposition automationComposition, UUID revisionIdComposition, + UUID revisionIdCompositionTarget) { executor.execute(() -> { - decryptInstanceProperties(automationComposition); - acCompositionMigrationPublisher.send(automationComposition, automationComposition.getPhase()); + encryptionUtils.decryptInstanceProperties(automationComposition); + acCompositionMigrationPublisher.send(automationComposition, automationComposition.getPhase(), + revisionIdComposition, revisionIdCompositionTarget); }); } @@ -346,14 +357,12 @@ public class SupervisionAcHandler { * Handle Migration precheck of an AutomationComposition instance to other ACM Definition. * * @param automationComposition the AutomationComposition + * @param revisionIdComposition the last Update from Composition + * @param revisionIdCompositionTarget the last Update from Composition Target */ - public void migratePrecheck(AutomationComposition automationComposition) { - executor.execute(() -> acCompositionMigrationPublisher.send(automationComposition, 0)); - } - - private void decryptInstanceProperties(AutomationComposition automationComposition) { - if (encryptionUtils.encryptionEnabled()) { - encryptionUtils.findAndDecryptSensitiveData(automationComposition); - } + public void migratePrecheck(AutomationComposition automationComposition, UUID revisionIdComposition, + UUID revisionIdCompositionTarget) { + executor.execute(() -> acCompositionMigrationPublisher.send(automationComposition, 0, + revisionIdComposition, revisionIdCompositionTarget)); } } 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 5627bead2..26374c1a3 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-2025 Nordix Foundation. + * Copyright (C) 2023-2025 OpenInfra Foundation Europe. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,19 +29,24 @@ import java.util.function.UnaryOperator; import java.util.stream.Collectors; import lombok.AllArgsConstructor; import org.apache.commons.collections4.MapUtils; +import org.onap.policy.clamp.acm.runtime.main.utils.EncryptionUtils; 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.AutomationCompositionElement; +import org.onap.policy.clamp.models.acm.concepts.DeployState; import org.onap.policy.clamp.models.acm.concepts.NodeTemplateState; import org.onap.policy.clamp.models.acm.concepts.Participant; 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; +import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils; import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantDeregister; import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantRegister; +import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantReqSync; 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; @@ -67,6 +72,7 @@ public class SupervisionParticipantHandler { private final AcDefinitionProvider acDefinitionProvider; private final ParticipantSyncPublisher participantSyncPublisher; private final MessageProvider messageProvider; + private final EncryptionUtils encryptionUtils; /** * Handle a ParticipantRegister message from a participant. @@ -75,8 +81,7 @@ public class SupervisionParticipantHandler { */ @Timed(value = "listener.participant_register", description = "PARTICIPANT_REGISTER messages received") public void handleParticipantMessage(ParticipantRegister participantRegisterMsg) { - saveIfNotPresent(participantRegisterMsg.getReplicaId(), - participantRegisterMsg.getParticipantId(), + saveIfNotPresent(participantRegisterMsg.getReplicaId(), participantRegisterMsg.getParticipantId(), participantRegisterMsg.getParticipantSupportedElementType(), true); participantRegisterAckPublisher.send(participantRegisterMsg.getMessageId(), @@ -118,9 +123,8 @@ public class SupervisionParticipantHandler { && participantStatusMsg.getCompositionId() != null) { var acDefinition = acDefinitionProvider.findAcDefinition(participantStatusMsg.getCompositionId()); if (acDefinition.isPresent()) { - var map = acDefinition.get().getElementStateMap() - .values().stream().collect(Collectors.toMap(NodeTemplateState::getNodeTemplateId, - UnaryOperator.identity())); + var map = acDefinition.get().getElementStateMap().values().stream() + .collect(Collectors.toMap(NodeTemplateState::getNodeTemplateId, UnaryOperator.identity())); messageProvider.saveCompositionOutProperties(participantStatusMsg, map); } else { LOGGER.error("Not valid ParticipantStatus message"); @@ -186,8 +190,9 @@ public class SupervisionParticipantHandler { LOGGER.debug("Composition to be send in Restart message {}", acDefinition.getCompositionId()); var automationCompositionList = automationCompositionProvider.getAcInstancesByCompositionId(acDefinition.getCompositionId()); - var automationCompositions = automationCompositionList.stream() - .filter(ac -> isAcToBeSyncRestarted(participantId, ac)).toList(); + encryptionUtils.decryptInstanceProperties(automationCompositionList); + var automationCompositions = + automationCompositionList.stream().filter(ac -> isAcToBeSyncRestarted(participantId, ac)).toList(); participantSyncPublisher.sendRestartMsg(participantId, replicaId, acDefinition, automationCompositions); } @@ -213,4 +218,51 @@ public class SupervisionParticipantHandler { MapUtils.populateMap(map, elementList, ParticipantSupportedElementType::getId); return map; } + + /** + * Handle a participantReqSync message from a participant. + * + * @param participantReqSync the message received from a participant + */ + @Timed(value = "listener.participant_req_sync", description = "PARTICIPANT_REQ_SYNC_MSG messages received") + public void handleParticipantReqSync(ParticipantReqSync participantReqSync) { + if (participantReqSync.getCompositionTargetId() != null) { + // outdated Composition Target + var acDefinition = acDefinitionProvider.getAcDefinition(participantReqSync.getCompositionTargetId()); + participantSyncPublisher.sendRestartMsg(participantReqSync.getParticipantId(), + participantReqSync.getReplicaId(), acDefinition, List.of()); + } + if (participantReqSync.getCompositionId() == null + && participantReqSync.getAutomationCompositionId() != null) { + // outdated AutomationComposition + var automationComposition = + getAutomationCompositionForSync(participantReqSync.getAutomationCompositionId()); + participantSyncPublisher.sendSync(automationComposition); + } + if (participantReqSync.getCompositionId() != null) { + // outdated Composition + var acDefinition = acDefinitionProvider.getAcDefinition(participantReqSync.getCompositionId()); + var automationCompositions = participantReqSync.getAutomationCompositionId() != null + ? List.of(getAutomationCompositionForSync(participantReqSync.getAutomationCompositionId())) : + List.of(); + participantSyncPublisher.sendRestartMsg(participantReqSync.getParticipantId(), + participantReqSync.getReplicaId(), acDefinition, automationCompositions); + } + } + + private AutomationComposition getAutomationCompositionForSync(UUID automationCompositionId) { + var automationComposition = automationCompositionProvider.getAutomationComposition(automationCompositionId); + encryptionUtils.decryptInstanceProperties(automationComposition); + if (DeployState.MIGRATING.equals(automationComposition.getDeployState())) { + var acDefinition = acDefinitionProvider.getAcDefinition(automationComposition.getCompositionTargetId()); + var stage = ParticipantUtils.getFirstStage(automationComposition, acDefinition.getServiceTemplate()); + if (automationComposition.getPhase().equals(stage)) { + // scenario first stage migration + var rollback = automationCompositionProvider.getAutomationCompositionRollback(automationCompositionId); + automationComposition.setElements(rollback.getElements().values().stream() + .collect(Collectors.toMap(AutomationCompositionElement::getId, AutomationCompositionElement::new))); + } + } + return automationComposition; + } } diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AcElementPropertiesPublisher.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AcElementPropertiesPublisher.java index cc5d1461f..68a70fa01 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AcElementPropertiesPublisher.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AcElementPropertiesPublisher.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2023-2024 Nordix Foundation. + * Copyright (C) 2023-2025 OpenInfra Foundation Europe. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,8 +23,10 @@ package org.onap.policy.clamp.acm.runtime.supervision.comm; import io.micrometer.core.annotation.Timed; import java.time.Instant; import java.util.UUID; +import java.util.stream.Collectors; import lombok.AllArgsConstructor; import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; +import org.onap.policy.clamp.models.acm.concepts.ParticipantDeploy; import org.onap.policy.clamp.models.acm.messages.kafka.participant.PropertiesUpdate; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder; import org.onap.policy.clamp.models.acm.utils.AcmUtils; @@ -45,17 +47,21 @@ public class AcElementPropertiesPublisher extends AbstractParticipantPublisher

> map = new HashMap<>(); for (var element : automationComposition.getElements().values()) { var acElementDeploy = AcmUtils.createAcElementDeploy(element, DeployOrder.DEPLOY); @@ -66,20 +68,23 @@ public class AutomationCompositionDeployPublisher extends AbstractParticipantPub map.get(element.getParticipantId()).add(acElementDeploy); } List participantDeploys = new ArrayList<>(); + var acDeployMsg = new AutomationCompositionDeploy(); for (var entry : map.entrySet()) { var participantDeploy = new ParticipantDeploy(); participantDeploy.setParticipantId(entry.getKey()); + acDeployMsg.getParticipantIdList().add(entry.getKey()); participantDeploy.setAcElementList(entry.getValue()); participantDeploys.add(participantDeploy); } - var acDeployMsg = new AutomationCompositionDeploy(); acDeployMsg.setCompositionId(automationComposition.getCompositionId()); acDeployMsg.setStartPhase(startPhase); acDeployMsg.setFirstStartPhase(firstStartPhase); acDeployMsg.setAutomationCompositionId(automationComposition.getInstanceId()); acDeployMsg.setMessageId(UUID.randomUUID()); acDeployMsg.setTimestamp(Instant.now()); + acDeployMsg.setRevisionIdInstance(automationComposition.getRevisionId()); + acDeployMsg.setRevisionIdComposition(revisionIdComposition); acDeployMsg.setParticipantUpdatesList(participantDeploys); LOGGER.debug("AutomationCompositionDeploy message sent {}", acDeployMsg.getMessageId()); diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionMigrationPublisher.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionMigrationPublisher.java index 4aef404fc..f19473fa6 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionMigrationPublisher.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionMigrationPublisher.java @@ -22,8 +22,10 @@ package org.onap.policy.clamp.acm.runtime.supervision.comm; import io.micrometer.core.annotation.Timed; import java.util.UUID; +import java.util.stream.Collectors; import org.onap.policy.clamp.models.acm.concepts.AutomationComposition; import org.onap.policy.clamp.models.acm.concepts.DeployState; +import org.onap.policy.clamp.models.acm.concepts.ParticipantDeploy; import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionMigration; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder; import org.onap.policy.clamp.models.acm.utils.AcmUtils; @@ -38,11 +40,14 @@ public class AutomationCompositionMigrationPublisher * * @param automationComposition the AutomationComposition * @param stage the stage to execute + * @param revisionIdComposition the last Update from Composition + * @param revisionIdCompositionTarget the last Update from Composition Target */ @Timed( value = "publisher.automation_composition_migration", description = "AUTOMATION_COMPOSITION_MIGRATION messages published") - public void send(AutomationComposition automationComposition, int stage) { + public void send(AutomationComposition automationComposition, int stage, UUID revisionIdComposition, + UUID revisionIdCompositionTarget) { var acMigration = new AutomationCompositionMigration(); acMigration.setRollback(DeployState.MIGRATION_REVERTING.equals(automationComposition.getDeployState())); acMigration.setPrecheck(Boolean.TRUE.equals(automationComposition.getPrecheck())); @@ -51,8 +56,14 @@ public class AutomationCompositionMigrationPublisher acMigration.setMessageId(UUID.randomUUID()); acMigration.setCompositionTargetId(automationComposition.getCompositionTargetId()); acMigration.setStage(stage); - acMigration.setParticipantUpdatesList( - AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.MIGRATE)); + acMigration.setRevisionIdInstance(automationComposition.getRevisionId()); + acMigration.setRevisionIdComposition(revisionIdComposition); + acMigration.setRevisionIdCompositionTarget(revisionIdCompositionTarget); + var participantUpdatesList = AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.MIGRATE); + acMigration.setParticipantUpdatesList(participantUpdatesList); + acMigration.setParticipantIdList(participantUpdatesList.stream() + .map(ParticipantDeploy::getParticipantId).collect(Collectors.toSet())); + super.send(acMigration); } } diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionStateChangePublisher.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionStateChangePublisher.java index 3160e3679..ee358ff21 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionStateChangePublisher.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionStateChangePublisher.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2021-2024 Nordix Foundation. + * Copyright (C) 2021-2025 OpenInfra Foundation Europe. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,9 @@ package org.onap.policy.clamp.acm.runtime.supervision.comm; import io.micrometer.core.annotation.Timed; import java.util.UUID; +import java.util.stream.Collectors; 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.messages.kafka.participant.AutomationCompositionStateChange; import org.onap.policy.clamp.models.acm.utils.AcmUtils; import org.springframework.stereotype.Component; @@ -39,11 +41,13 @@ public class AutomationCompositionStateChangePublisher * * @param automationComposition the AutomationComposition * @param startPhase the startPhase + * @param revisionIdComposition the last Update from Composition */ @Timed( value = "publisher.automation_composition_state_change", description = "AUTOMATION_COMPOSITION_STATE_CHANGE messages published") - public void send(AutomationComposition automationComposition, int startPhase, boolean firstStartPhase) { + public void send(AutomationComposition automationComposition, int startPhase, boolean firstStartPhase, + UUID revisionIdComposition) { var acsc = new AutomationCompositionStateChange(); acsc.setCompositionId(automationComposition.getCompositionId()); acsc.setAutomationCompositionId(automationComposition.getInstanceId()); @@ -52,6 +56,10 @@ public class AutomationCompositionStateChangePublisher acsc.setLockOrderedState(AcmUtils.stateLockToOrder(automationComposition.getLockState())); acsc.setStartPhase(startPhase); acsc.setFirstStartPhase(firstStartPhase); + acsc.setRevisionIdInstance(automationComposition.getRevisionId()); + acsc.setRevisionIdComposition(revisionIdComposition); + acsc.setParticipantIdList(automationComposition.getElements().values().stream() + .map(AutomationCompositionElement::getParticipantId).collect(Collectors.toSet())); super.send(acsc); } diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantPrimePublisher.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantPrimePublisher.java index 360e526cc..34bcb014d 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantPrimePublisher.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantPrimePublisher.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2021-2024 Nordix Foundation. + * Copyright (C) 2021-2025 OpenInfra Foundation Europe. All rights reserved. * ================================================================================ * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ @@ -28,7 +28,9 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; import lombok.AllArgsConstructor; import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup; import org.onap.policy.clamp.models.acm.concepts.AcTypeState; @@ -62,15 +64,17 @@ public class ParticipantPrimePublisher extends AbstractParticipantPublisher participantDefinitions, UUID compositionId, - UUID participantId) { + UUID revisionId) { var message = new ParticipantPrime(); message.setCompositionId(compositionId); - message.setParticipantId(participantId); + message.setParticipantIdList(participantDefinitions.stream() + .map(ParticipantDefinition::getParticipantId).collect(Collectors.toSet())); message.setTimestamp(Instant.now()); + message.setRevisionIdComposition(revisionId); message.setParticipantDefinitionUpdates(participantDefinitions); LOGGER.debug("Participant Update sent {}", message.getMessageId()); super.send(message); @@ -86,6 +90,7 @@ public class ParticipantPrimePublisher extends AbstractParticipantPublisher prepareParticipantPriming(AutomationCompositionDefinition acmDefinition) { acmDefinition.setStateChangeResult(StateChangeResult.NO_ERROR); acmDefinition.setState(AcTypeState.PRIMING); + acmDefinition.setRevisionId(UUID.randomUUID()); acmDefinition.setLastMsg(TimestampHelper.now()); var acElements = AcmUtils.extractAcElementsFromServiceTemplate(acmDefinition.getServiceTemplate(), acRuntimeParameterGroup.getAcmParameters().getToscaElementName()); @@ -120,10 +125,12 @@ public class ParticipantPrimePublisher extends AbstractParticipantPublisher participantIds, UUID revisionId) { var message = new ParticipantPrime(); message.setCompositionId(compositionId); + message.setParticipantIdList(participantIds); message.setTimestamp(Instant.now()); + message.setRevisionIdComposition(revisionId); // DeCommission the automation composition but deleting participantdefinitions on participants message.setParticipantDefinitionUpdates(null); diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantReqSyncListener.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantReqSyncListener.java new file mode 100644 index 000000000..71a545de2 --- /dev/null +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantReqSyncListener.java @@ -0,0 +1,60 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2025 OpenInfra Foundation Europe. All rights reserved. + * ================================================================================ + * 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.comm; + +import org.onap.policy.clamp.acm.runtime.config.messaging.Listener; +import org.onap.policy.clamp.acm.runtime.main.utils.NetLoggerUtil; +import org.onap.policy.clamp.acm.runtime.supervision.SupervisionParticipantHandler; +import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantMessageType; +import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantReqSync; +import org.onap.policy.common.endpoints.listeners.ScoListener; +import org.onap.policy.common.message.bus.event.Topic; +import org.onap.policy.common.utils.coder.StandardCoderObject; +import org.springframework.stereotype.Component; + +@Component +public class ParticipantReqSyncListener extends ScoListener + implements Listener { + + private final SupervisionParticipantHandler supervisionParticipantHandler; + + public ParticipantReqSyncListener(SupervisionParticipantHandler supervisionParticipantHandler) { + super(ParticipantReqSync.class); + this.supervisionParticipantHandler = supervisionParticipantHandler; + } + + @Override + public String getType() { + return ParticipantMessageType.PARTICIPANT_REQ_SYNC_MSG.name(); + } + + @Override + public ScoListener getScoListener() { + return this; + } + + @Override + public void onTopicEvent(final Topic.CommInfrastructure infra, final String topic, final StandardCoderObject sco, + ParticipantReqSync participantReqSync) { + NetLoggerUtil.log(NetLoggerUtil.EventType.IN, infra, topic, participantReqSync.toString()); + supervisionParticipantHandler.handleParticipantReqSync(participantReqSync); + } +} diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantSyncPublisher.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantSyncPublisher.java index 3e42f940c..b5fe22212 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantSyncPublisher.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantSyncPublisher.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2024 Nordix Foundation. + * Copyright (C) 2024-2025 OpenInfra Foundation Europe. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -64,6 +64,7 @@ public class ParticipantSyncPublisher extends AbstractParticipantPublisher instantiationProvider.updateAutomationComposition(compositionId, automationCompositionUpdate)) .hasMessageMatching( @@ -267,7 +273,7 @@ class AutomationCompositionInstantiationProviderTest { var acDefinitionProvider = mock(AcDefinitionProvider.class); var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); var compositionId = acDefinition.getCompositionId(); - when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition)); + when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition); var instanceId = UUID.randomUUID(); var automationComposition = @@ -287,7 +293,7 @@ class AutomationCompositionInstantiationProviderTest { var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplateMigration, AcTypeState.PRIMED); var compositionTargetId = acDefinitionTarget.getCompositionId(); automationCompositionTarget.setCompositionTargetId(compositionTargetId); - when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget)); + when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget); when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget); when(acProvider.updateAutomationComposition(any())).thenReturn(automationCompositionTarget); @@ -301,7 +307,7 @@ class AutomationCompositionInstantiationProviderTest { automationCompositionTarget.setPrecheck(true); var preCheckResponse = instantiationProvider.updateAutomationComposition(compositionId, automationCompositionTarget); - verify(supervisionAcHandler).migratePrecheck(any()); + verify(supervisionAcHandler).migratePrecheck(any(), any(), any()); InstantiationUtils.assertInstantiationResponse(preCheckResponse, automationCompositionTarget); automationCompositionTarget.setPrecheck(false); @@ -310,7 +316,7 @@ class AutomationCompositionInstantiationProviderTest { var instantiationResponse = instantiationProvider.updateAutomationComposition(compositionId, automationCompositionTarget); - verify(supervisionAcHandler).migrate(any()); + verify(supervisionAcHandler).migrate(any(), any(), any()); InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionTarget); } @@ -319,7 +325,7 @@ class AutomationCompositionInstantiationProviderTest { var acDefinitionProvider = mock(AcDefinitionProvider.class); var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); var compositionId = acDefinition.getCompositionId(); - when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition)); + when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud"); @@ -327,6 +333,9 @@ class AutomationCompositionInstantiationProviderTest { automationComposition.setDeployState(DeployState.DEPLOYED); automationComposition.setLockState(LockState.LOCKED); automationComposition.setCompositionTargetId(UUID.randomUUID()); + when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionTargetId())) + .thenThrow(new PfModelRuntimeException(Status.NOT_FOUND, + String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId()))); var acProvider = mock(AutomationCompositionProvider.class); when(acProvider.getAutomationComposition(automationComposition.getInstanceId())) .thenReturn(automationComposition); @@ -346,7 +355,6 @@ class AutomationCompositionInstantiationProviderTest { var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); var compositionTargetId = acDefinitionTarget.getCompositionId(); - when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget)); when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget); automationComposition.setCompositionTargetId(compositionTargetId); @@ -354,7 +362,7 @@ class AutomationCompositionInstantiationProviderTest { var instantiationResponse = instantiationProvider .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition); - verify(supervisionAcHandler).migrate(any()); + verify(supervisionAcHandler).migrate(any(), any(), any()); verify(acProvider).updateAutomationComposition(automationComposition); InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition); } @@ -364,7 +372,7 @@ class AutomationCompositionInstantiationProviderTest { var acDefinitionProvider = mock(AcDefinitionProvider.class); var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); var compositionId = acDefinition.getCompositionId(); - when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition)); + when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud"); @@ -385,23 +393,25 @@ class AutomationCompositionInstantiationProviderTest { new AcInstanceStateResolver(), supervisionAcHandler, acmParticipantProvider, new AcRuntimeParameterGroup(), encryptionUtils); - assertThatThrownBy(() -> instantiationProvider - .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition)) - .hasMessageMatching( - String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionTargetId())); - var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); var compositionTargetId = acDefinitionTarget.getCompositionId(); - when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget)); - + when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget); automationComposition.setCompositionTargetId(compositionTargetId); var instantiationResponse = instantiationProvider .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition); - verify(supervisionAcHandler).migratePrecheck(any()); + verify(supervisionAcHandler).migratePrecheck(any(), any(), any()); verify(acProvider).updateAutomationComposition(automationComposition); InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition); + + automationComposition.setSubState(SubState.NONE); + when(acDefinitionProvider.getAcDefinition(compositionTargetId)) + .thenThrow(new PfModelRuntimeException(Status.NOT_FOUND, + String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId))); + assertThatThrownBy(() -> instantiationProvider + .updateAutomationComposition(automationComposition.getCompositionId(), automationComposition)) + .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId)); } @Test @@ -409,7 +419,7 @@ class AutomationCompositionInstantiationProviderTest { var acDefinitionProvider = mock(AcDefinitionProvider.class); var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); var compositionId = acDefinition.getCompositionId(); - when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition)); + when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud"); @@ -423,7 +433,7 @@ class AutomationCompositionInstantiationProviderTest { var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); var compositionTargetId = acDefinitionTarget.getCompositionId(); - when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget)); + when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget); var acMigrate = new AutomationComposition(automationComposition); acMigrate.setCompositionTargetId(compositionTargetId); @@ -446,7 +456,7 @@ class AutomationCompositionInstantiationProviderTest { var acDefinitionProvider = mock(AcDefinitionProvider.class); var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); var compositionId = acDefinition.getCompositionId(); - when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition)); + when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud"); @@ -461,7 +471,7 @@ class AutomationCompositionInstantiationProviderTest { var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); var compositionTargetId = acDefinitionTarget.getCompositionId(); - when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget)); + when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget); var acMigrate = new AutomationComposition(automationComposition); acMigrate.setCompositionTargetId(compositionTargetId); @@ -584,7 +594,7 @@ class AutomationCompositionInstantiationProviderTest { var acDefinitionProvider = mock(AcDefinitionProvider.class); var acDefinition = CommonTestData.createAcDefinition(serviceTemplateMigration, AcTypeState.PRIMED); var compositionId = acDefinition.getCompositionId(); - when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition)); + when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_MIGRATE_JSON, "Crud"); @@ -615,15 +625,17 @@ class AutomationCompositionInstantiationProviderTest { var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, new AcInstanceStateResolver(), supervisionAcHandler, participantProvider, new AcRuntimeParameterGroup(), encryptionUtils); - assertThatThrownBy(() -> instantiationProvider.rollback(compositionId, instanceId)) - .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId)); - var acDefinitionTarget = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); - when(acDefinitionProvider.findAcDefinition(compositionTargetId)).thenReturn(Optional.of(acDefinitionTarget)); when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget); instantiationProvider.rollback(compositionId, automationComposition.getInstanceId()); verify(acProvider).updateAutomationComposition(any(AutomationComposition.class)); + + when(acDefinitionProvider.getAcDefinition(compositionTargetId)) + .thenThrow(new PfModelRuntimeException(Response.Status.NOT_FOUND, + String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId))); + assertThatThrownBy(() -> instantiationProvider.rollback(compositionId, instanceId)) + .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionTargetId)); } private void assertThatDeleteThrownBy(AutomationComposition automationComposition, DeployState deployState, @@ -656,7 +668,7 @@ class AutomationCompositionInstantiationProviderTest { var acDefinitionProvider = mock(AcDefinitionProvider.class); var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); var compositionId = acDefinition.getCompositionId(); - when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition)); + when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition); var automationCompositionCreate = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "NoDuplicates"); @@ -666,6 +678,7 @@ class AutomationCompositionInstantiationProviderTest { var acProvider = mock(AutomationCompositionProvider.class); when(acProvider.createAutomationComposition(automationCompositionCreate)) .thenReturn(automationCompositionCreate); + var acIdentifier = automationCompositionCreate.getKey().asIdentifier(); var participantProvider = mock(ParticipantProvider.class); var encryptionUtils = new EncryptionUtils(CommonTestData.getTestParamaterGroup()); @@ -676,13 +689,12 @@ class AutomationCompositionInstantiationProviderTest { var instantiationResponse = instantiationProvider.createAutomationComposition( automationCompositionCreate.getCompositionId(), automationCompositionCreate); InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionCreate); - var acIdentifier = automationCompositionCreate.getKey().asIdentifier(); + doThrow(new PfModelRuntimeException(Status.BAD_REQUEST, acIdentifier + " already defined")) .when(acProvider).validateNameVersion(acIdentifier); - assertThatThrownBy( () -> instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate)) - .hasMessageMatching(automationCompositionCreate.getKey().asIdentifier() + " already defined"); + .hasMessageMatching(acIdentifier + " already defined"); } @Test @@ -691,7 +703,7 @@ class AutomationCompositionInstantiationProviderTest { var participantProvider = mock(ParticipantProvider.class); var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); var compositionId = acDefinition.getCompositionId(); - when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition)); + when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource( AC_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "AcElementNotFound"); automationComposition.setCompositionId(compositionId); @@ -719,11 +731,15 @@ class AutomationCompositionInstantiationProviderTest { var acProvider = mock(AutomationCompositionProvider.class); when(acProvider.getAutomationComposition(automationComposition.getInstanceId())) .thenReturn(automationComposition); - var provider = new AutomationCompositionInstantiationProvider(acProvider, mock(AcDefinitionProvider.class), + var acDefinitionProvider = mock(AcDefinitionProvider.class); + var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null, mock(AcRuntimeParameterGroup.class), null); var compositionId = automationComposition.getCompositionId(); + when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionId())) + .thenThrow(new PfModelRuntimeException(Status.NOT_FOUND, + String.format(AC_DEFINITION_NOT_FOUND, automationComposition.getCompositionId()))); assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition)) .hasMessageMatching(String.format(AC_DEFINITION_NOT_FOUND, compositionId)); @@ -773,7 +789,7 @@ class AutomationCompositionInstantiationProviderTest { var acDefinitionProvider = mock(AcDefinitionProvider.class); var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.COMMISSIONED); var compositionId = acDefinition.getCompositionId(); - when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition)); + when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition); var acProvider = mock(AutomationCompositionProvider.class); var provider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null, null, @@ -782,11 +798,7 @@ class AutomationCompositionInstantiationProviderTest { var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud"); automationComposition.setCompositionId(compositionId); - var message = """ - "AutomationComposition" INVALID, item has status INVALID - item "ServiceTemplate.state" value "COMMISSIONED" INVALID, Commissioned automation composition \ - definition not primed - """; + var message = compositionId + " Commissioned automation composition definition not primed"; assertThatThrownBy(() -> provider.createAutomationComposition(compositionId, automationComposition)) .hasMessageMatching(message); @@ -848,7 +860,8 @@ class AutomationCompositionInstantiationProviderTest { acInstanceStateUpdate.setLockOrder(LockOrder.NONE); acInstanceStateUpdate.setSubOrder(SubOrder.PREPARE); provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate); - verify(supervisionAcHandler).prepare(any(AutomationComposition.class), any()); + verify(supervisionAcHandler).prepare(any(AutomationComposition.class), + any(AutomationCompositionDefinition.class)); automationComposition.setDeployState(DeployState.DEPLOYED); automationComposition.setLockState(LockState.LOCKED); @@ -856,6 +869,7 @@ class AutomationCompositionInstantiationProviderTest { acInstanceStateUpdate.setLockOrder(LockOrder.NONE); acInstanceStateUpdate.setSubOrder(SubOrder.REVIEW); provider.compositionInstanceState(compositionId, instanceId, acInstanceStateUpdate); - verify(supervisionAcHandler).review(any(AutomationComposition.class)); + verify(supervisionAcHandler).review(any(AutomationComposition.class), + any(AutomationCompositionDefinition.class)); } } diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/main/utils/EncryptionUtilTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/main/utils/EncryptionUtilTest.java index f4fffdb4d..49fb33c23 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/main/utils/EncryptionUtilTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/main/utils/EncryptionUtilTest.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2025 Nordix Foundation. + * Copyright (C) 2025 OpenInfra Foundation Europe. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import java.security.InvalidAlgorithmParameterException; +import java.util.List; import javax.crypto.Cipher; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -35,19 +36,17 @@ import org.onap.policy.clamp.common.acm.exception.AutomationCompositionRuntimeEx 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.persistence.provider.ProviderUtils; -import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate; class EncryptionUtilTest { - private static ToscaServiceTemplate serviceTemplateEncrypt; - public static final String TOSCA_TEMPLATE_YAML = "src/test/resources/providers/AcDefinitionEncryptTest.yaml"; - public static final String INSTANTIATE_JSON = "src/test/resources/providers/AcInstantiateEncryptTest.json"; + private static final String TOSCA_TEMPLATE_YAML = "src/test/resources/providers/AcDefinitionEncryptTest.yaml"; + private static final String INSTANTIATE_JSON = "src/test/resources/providers/AcInstantiateEncryptTest.json"; private static AutomationCompositionDefinition acDefinition; @BeforeAll static void setUpBeforeClass() { - serviceTemplateEncrypt = InstantiationUtils.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML); + var serviceTemplateEncrypt = InstantiationUtils.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML); var jpa2 = ProviderUtils.getJpaAndValidate(serviceTemplateEncrypt, JpaToscaServiceTemplate::new, "toscaServiceTemplate"); serviceTemplateEncrypt = jpa2.toAuthorative(); @@ -60,22 +59,17 @@ class EncryptionUtilTest { InstantiationUtils.getAutomationCompositionFromResource(INSTANTIATE_JSON, "Crud"); var encryptionUtils = new EncryptionUtils(CommonTestData.getEncryptionParameterGroup()); assertTrue(encryptionUtils.encryptionEnabled()); - assertDoesNotThrow(() - -> { - assert automationComposition != null; - encryptionUtils.findAndEncryptSensitiveData(acDefinition, automationComposition); - }); - assert automationComposition != null; + assertDoesNotThrow(() -> encryptionUtils.findAndEncryptSensitiveData(acDefinition, automationComposition)); + automationComposition.getElements().values().forEach(element -> { assertTrue(element.getProperties().get("secret").toString().startsWith("ENCRYPTED:")); assertTrue(element.getProperties().get("password").toString().startsWith("ENCRYPTED:")); }); var encryptionUtil2 = new EncryptionUtils(CommonTestData.getEncryptionParameterGroup()); - assertDoesNotThrow(() -> { - encryptionUtil2.findAndDecryptSensitiveData(automationComposition); - }); + assertDoesNotThrow(() -> encryptionUtil2.decryptInstanceProperties(automationComposition)); + assertDoesNotThrow(() -> encryptionUtil2.decryptInstanceProperties(List.of(automationComposition))); automationComposition.getElements().values().forEach(element -> { assertEquals("mysecret", element.getProperties().get("secret").toString()); assertEquals("mypass", element.getProperties().get("password").toString()); @@ -99,8 +93,7 @@ class EncryptionUtilTest { assert automationComposition != null; assertThrows(AutomationCompositionRuntimeException.class, - () -> encryptionUtils.findAndDecryptSensitiveData(automationComposition)); - + () -> encryptionUtils.decryptInstanceProperties(automationComposition)); } } 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 689a4bab5..d9ffb0abe 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 @@ -45,6 +45,7 @@ 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.AutomationCompositionDefinition; 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; @@ -282,7 +283,7 @@ class SupervisionAcHandlerTest { var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED); handler.deploy(automationComposition, acDefinition); verify(acProvider).updateAutomationComposition(automationComposition); - verify(acDeployPublisher, timeout(1000)).send(automationComposition, 0, true); + verify(acDeployPublisher, timeout(1000)).send(automationComposition, 0, true, acDefinition.getRevisionId()); } @Test @@ -308,7 +309,8 @@ class SupervisionAcHandlerTest { handler.undeploy(automationComposition, acDefinition); verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class)); - verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean()); + verify(acStateChangePublisher, timeout(1000)) + .send(any(AutomationComposition.class), anyInt(), anyBoolean(), any(UUID.class)); } @Test @@ -366,7 +368,8 @@ class SupervisionAcHandlerTest { handler.unlock(automationComposition, acDefinition); verify(acProvider).updateAutomationComposition(any(AutomationComposition.class)); - verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean()); + verify(acStateChangePublisher, timeout(1000)) + .send(any(AutomationComposition.class), anyInt(), anyBoolean(), any(UUID.class)); } @Test @@ -421,7 +424,8 @@ class SupervisionAcHandlerTest { handler.lock(automationComposition, acDefinition); verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class)); - verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean()); + verify(acStateChangePublisher, timeout(1000)) + .send(any(AutomationComposition.class), anyInt(), anyBoolean(), any(UUID.class)); } @Test @@ -492,8 +496,9 @@ class SupervisionAcHandlerTest { mock(AcPreparePublisher.class), mock(MessageProvider.class), mock(EncryptionUtils.class)); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock"); - handler.update(automationComposition); - verify(acElementPropertiesPublisher, timeout(1000)).send(any(AutomationComposition.class)); + handler.update(automationComposition, UUID.randomUUID()); + verify(acElementPropertiesPublisher, timeout(1000)).send(any(AutomationComposition.class), + any(UUID.class)); } @Test @@ -508,8 +513,9 @@ class SupervisionAcHandlerTest { InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate"); assert automationComposition != null; automationComposition.setPhase(0); - handler.migrate(automationComposition); - verify(acCompositionMigrationPublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt()); + handler.migrate(automationComposition, UUID.randomUUID(), UUID.randomUUID()); + verify(acCompositionMigrationPublisher, timeout(1000)) + .send(any(AutomationComposition.class), anyInt(), any(UUID.class), any(UUID.class)); } @Test @@ -522,8 +528,9 @@ class SupervisionAcHandlerTest { mock(AcPreparePublisher.class), mock(MessageProvider.class), mock(EncryptionUtils.class)); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate"); - handler.migratePrecheck(automationComposition); - verify(acCompositionMigrationPublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt()); + handler.migratePrecheck(automationComposition, UUID.randomUUID(), UUID.randomUUID()); + verify(acCompositionMigrationPublisher, timeout(1000)) + .send(any(AutomationComposition.class), anyInt(), any(UUID.class), any(UUID.class)); } @Test @@ -539,7 +546,8 @@ class SupervisionAcHandlerTest { var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate"); handler.prepare(automationComposition, acDefinition); - verify(acPreparePublisher, timeout(1000)).sendPrepare(any(AutomationComposition.class), anyInt()); + verify(acPreparePublisher, timeout(1000)).sendPrepare(any(AutomationComposition.class), anyInt(), + any(UUID.class)); } @Test @@ -552,7 +560,7 @@ class SupervisionAcHandlerTest { acPreparePublisher, mock(MessageProvider.class), mock(EncryptionUtils.class)); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate"); - handler.review(automationComposition); - verify(acPreparePublisher, timeout(1000)).sendRevew(any(AutomationComposition.class)); + handler.review(automationComposition, new AutomationCompositionDefinition()); + verify(acPreparePublisher, timeout(1000)).sendReview(any(AutomationComposition.class), any(UUID.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 index 2cdcf210a..67ac07743 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-2025 Nordix Foundation. + * Copyright (C) 2023-2025 OpenInfra Foundation Europe. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,14 +35,18 @@ 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.utils.EncryptionUtils; 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.acm.runtime.util.CommonTestData; 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.AutomationCompositionElementDefinition; import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionInfo; +import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionRollback; +import org.onap.policy.clamp.models.acm.concepts.DeployState; import org.onap.policy.clamp.models.acm.concepts.NodeTemplateState; import org.onap.policy.clamp.models.acm.concepts.Participant; import org.onap.policy.clamp.models.acm.concepts.ParticipantDefinition; @@ -50,12 +54,15 @@ 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.messages.kafka.participant.ParticipantDeregister; import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantRegister; +import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantReqSync; 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; +import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; +import org.onap.policy.models.tosca.authorative.concepts.ToscaTopologyTemplate; class SupervisionParticipantHandlerTest { @@ -72,7 +79,7 @@ class SupervisionParticipantHandlerTest { new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class), participantDeregisterAckPublisher, mock(AutomationCompositionProvider.class), mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class), - mock(MessageProvider.class)); + mock(MessageProvider.class), mock(EncryptionUtils.class)); handler.handleParticipantMessage(participantDeregisterMessage); verify(participantDeregisterAckPublisher).send(participantDeregisterMessage.getMessageId()); @@ -100,7 +107,7 @@ class SupervisionParticipantHandlerTest { var handler = new SupervisionParticipantHandler(participantProvider, participantRegisterAckPublisher, mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class), mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class), - mock(MessageProvider.class)); + mock(MessageProvider.class), mock(EncryptionUtils.class)); handler.handleParticipantMessage(participantRegisterMessage); verify(participantProvider).saveParticipant(any()); @@ -157,7 +164,7 @@ class SupervisionParticipantHandlerTest { var participantSyncPublisher = mock(ParticipantSyncPublisher.class); var handler = new SupervisionParticipantHandler(participantProvider, participantRegisterAckPublisher, mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider, acDefinitionProvider, - participantSyncPublisher, mock(MessageProvider.class)); + participantSyncPublisher, mock(MessageProvider.class), mock(EncryptionUtils.class)); handler.handleParticipantMessage(participantRegisterMessage); verify(participantRegisterAckPublisher) @@ -186,10 +193,10 @@ class SupervisionParticipantHandlerTest { var automationCompositionProvider = mock(AutomationCompositionProvider.class); var messageProvider = mock(MessageProvider.class); var acDefinitionProvider = mock(AcDefinitionProvider.class); - var handler = - new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class), - mock(ParticipantDeregisterAckPublisher.class), automationCompositionProvider, - acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider); + var handler = new SupervisionParticipantHandler(participantProvider, + mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), + automationCompositionProvider, acDefinitionProvider, mock(ParticipantSyncPublisher.class), + messageProvider, mock(EncryptionUtils.class)); handler.handleParticipantMessage(participantStatusMessage); verify(messageProvider).saveInstanceOutProperties(any(ParticipantStatus.class)); @@ -219,10 +226,10 @@ class SupervisionParticipantHandlerTest { when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition); var participantProvider = mock(ParticipantProvider.class); - var handler = - new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class), - mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class), - acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider); + var handler = new SupervisionParticipantHandler(participantProvider, + mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), + mock(AutomationCompositionProvider.class), acDefinitionProvider, mock(ParticipantSyncPublisher.class), + messageProvider, mock(EncryptionUtils.class)); handler.handleParticipantMessage(participantStatusMessage); verify(messageProvider).saveCompositionOutProperties(any(), any()); } @@ -242,10 +249,10 @@ class SupervisionParticipantHandlerTest { var acDefinitionProvider = mock(AcDefinitionProvider.class); var messageProvider = mock(MessageProvider.class); var participantProvider = mock(ParticipantProvider.class); - var handler = - new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class), - mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class), - acDefinitionProvider, mock(ParticipantSyncPublisher.class), messageProvider); + var handler = new SupervisionParticipantHandler(participantProvider, + mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), + mock(AutomationCompositionProvider.class), acDefinitionProvider, mock(ParticipantSyncPublisher.class), + messageProvider, mock(EncryptionUtils.class)); handler.handleParticipantMessage(participantStatusMessage); verify(messageProvider, times(0)).saveCompositionOutProperties(any(), any()); } @@ -261,7 +268,7 @@ class SupervisionParticipantHandlerTest { new SupervisionParticipantHandler(participantProvider, mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), mock(AutomationCompositionProvider.class), mock(AcDefinitionProvider.class), mock(ParticipantSyncPublisher.class), - mock(MessageProvider.class)); + mock(MessageProvider.class), mock(EncryptionUtils.class)); handler.handleParticipantMessage(participantStatusMessage); verify(participantProvider).saveParticipant(any()); @@ -280,10 +287,10 @@ 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), messageProvider); + var handler = new SupervisionParticipantHandler(participantProvider, + mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), + automationCompositionProvider, acDefinitionProvider, mock(ParticipantSyncPublisher.class), + messageProvider, mock(EncryptionUtils.class)); var participant = CommonTestData.createParticipant(CommonTestData.getParticipantId()); when(participantProvider.findParticipant(CommonTestData.getParticipantId())) .thenReturn(Optional.of(participant)); @@ -300,4 +307,107 @@ class SupervisionParticipantHandlerTest { statusMessage.setParticipantSupportedElementType(List.of(supportedElementType)); return statusMessage; } + + @Test + void testHandleParticipantReqSyncComposition() { + var acDefinitionProvider = mock(AcDefinitionProvider.class); + var acDefinition = new AutomationCompositionDefinition(); + var compositionId = UUID.randomUUID(); + acDefinition.setCompositionId(compositionId); + when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition); + + var participantSyncPublisher = mock(ParticipantSyncPublisher.class); + var automationCompositionProvider = mock(AutomationCompositionProvider.class); + var handler = + new SupervisionParticipantHandler(mock(ParticipantProvider.class), + mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), + automationCompositionProvider, acDefinitionProvider, participantSyncPublisher, + mock(MessageProvider.class), mock(EncryptionUtils.class)); + var participantReqSync = createParticipantReqSync(compositionId); + handler.handleParticipantReqSync(participantReqSync); + verify(participantSyncPublisher).sendRestartMsg(CommonTestData.getParticipantId(), + CommonTestData.getReplicaId(), acDefinition, List.of()); + + clearInvocations(participantSyncPublisher); + var automationComposition = + InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud"); + automationComposition.setCompositionId(compositionId); + automationComposition.setInstanceId(UUID.randomUUID()); + automationComposition.setDeployState(DeployState.DEPLOYED); + when(automationCompositionProvider.getAutomationComposition(automationComposition.getInstanceId())) + .thenReturn(automationComposition); + + participantReqSync.setAutomationCompositionId(automationComposition.getInstanceId()); + handler.handleParticipantReqSync(participantReqSync); + verify(participantSyncPublisher).sendRestartMsg(CommonTestData.getParticipantId(), + CommonTestData.getReplicaId(), acDefinition, List.of(automationComposition)); + } + + @Test + void testHandleParticipantReqSyncCompositionTarget() { + var acDefinitionProvider = mock(AcDefinitionProvider.class); + var acDefinition = new AutomationCompositionDefinition(); + var compositionId = UUID.randomUUID(); + acDefinition.setCompositionId(compositionId); + when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition); + + var participantSyncPublisher = mock(ParticipantSyncPublisher.class); + var handler = new SupervisionParticipantHandler(mock(ParticipantProvider.class), + mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), + mock(AutomationCompositionProvider.class), acDefinitionProvider, + participantSyncPublisher, mock(MessageProvider.class), mock(EncryptionUtils.class)); + var participantReqSync = createParticipantReqSync(null); + participantReqSync.setCompositionTargetId(compositionId); + handler.handleParticipantReqSync(participantReqSync); + verify(participantSyncPublisher).sendRestartMsg(CommonTestData.getParticipantId(), + CommonTestData.getReplicaId(), acDefinition, List.of()); + } + + + @Test + void testHandleParticipantReqSyncAutomationComposition() { + var acDefinition = new AutomationCompositionDefinition(); + acDefinition.setServiceTemplate(new ToscaServiceTemplate()); + acDefinition.getServiceTemplate().setToscaTopologyTemplate(new ToscaTopologyTemplate()); + var compositionId = UUID.randomUUID(); + acDefinition.setCompositionId(compositionId); + var acDefinitionProvider = mock(AcDefinitionProvider.class); + when(acDefinitionProvider.getAcDefinition(compositionId)).thenReturn(acDefinition); + var automationComposition = new AutomationComposition(); + automationComposition.setElements(Map.of()); + automationComposition.setPhase(1); + automationComposition.setCompositionTargetId(compositionId); + automationComposition.setInstanceId(UUID.randomUUID()); + automationComposition.setDeployState(DeployState.MIGRATING); + var automationCompositionProvider = mock(AutomationCompositionProvider.class); + when(automationCompositionProvider.getAutomationComposition(automationComposition.getInstanceId())) + .thenReturn(automationComposition); + + var participantSyncPublisher = mock(ParticipantSyncPublisher.class); + var handler = + new SupervisionParticipantHandler(mock(ParticipantProvider.class), + mock(ParticipantRegisterAckPublisher.class), mock(ParticipantDeregisterAckPublisher.class), + automationCompositionProvider, acDefinitionProvider, participantSyncPublisher, + mock(MessageProvider.class), mock(EncryptionUtils.class)); + var participantReqSync = createParticipantReqSync(null); + participantReqSync.setAutomationCompositionId(automationComposition.getInstanceId()); + + handler.handleParticipantReqSync(participantReqSync); + verify(participantSyncPublisher).sendSync(automationComposition); + + clearInvocations(participantSyncPublisher); + automationComposition.setPhase(0); + when(automationCompositionProvider.getAutomationCompositionRollback(automationComposition.getInstanceId())) + .thenReturn(new AutomationCompositionRollback()); + handler.handleParticipantReqSync(participantReqSync); + verify(participantSyncPublisher).sendSync(automationComposition); + } + + private ParticipantReqSync createParticipantReqSync(UUID compositionId) { + var participantReqSync = new ParticipantReqSync(); + participantReqSync.setCompositionId(compositionId); + participantReqSync.setParticipantId(CommonTestData.getParticipantId()); + participantReqSync.setReplicaId(CommonTestData.getReplicaId()); + return participantReqSync; + } } 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 44582d656..ca65a638c 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 @@ -206,7 +206,7 @@ class SupervisionScannerTest { private void verifyNoInteraction( StageScanner stageScanner, SimpleScanner simpleScanner, PhaseScanner phaseScanner) { - verify(stageScanner, times(0)).scanStage(any(), any(), any()); + verify(stageScanner, times(0)).scanStage(any(), any(), any(), any()); verify(simpleScanner, times(0)).simpleScan(any(), any()); verify(phaseScanner, times(0)).scanWithPhase(any(), any(), any()); } @@ -242,7 +242,7 @@ class SupervisionScannerTest { messageProvider, monitoringScanner); supervisionScanner.run(); - verify(stageScanner, times(0)).scanStage(any(), any(), any()); + verify(stageScanner, times(0)).scanStage(any(), any(), any(), any()); verify(simpleScanner, times(0)).simpleScan(any(), any()); verify(phaseScanner).scanWithPhase(any(), any(), any()); verify(messageProvider).removeMessage(message.getMessageId()); @@ -272,10 +272,13 @@ class SupervisionScannerTest { when(automationCompositionProvider.findAutomationComposition(automationComposition.getInstanceId())) .thenReturn(Optional.of(automationComposition)); - var definitionTarget = createAutomationCompositionDefinition(AcTypeState.PRIMED); - definitionTarget.setCompositionId(compositionTargetId); + var acDefinitionTarget = createAutomationCompositionDefinition(AcTypeState.PRIMED); + acDefinitionTarget.setCompositionId(compositionTargetId); var acDefinitionProvider = createAcDefinitionProvider(AcTypeState.PRIMED); - when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(definitionTarget); + when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(acDefinitionTarget); + var acDefinition = new AutomationCompositionDefinition(); + acDefinition.setCompositionId(COMPOSITION_ID); + when(acDefinitionProvider.getAcDefinition(COMPOSITION_ID)).thenReturn(acDefinition); var stageScanner = mock(StageScanner.class); var messageProvider = mock(MessageProvider.class); @@ -287,8 +290,8 @@ class SupervisionScannerTest { messageProvider, monitoringScanner); supervisionScanner.run(); - verify(stageScanner).scanStage(automationComposition, definitionTarget.getServiceTemplate(), - new UpdateSync()); + verify(stageScanner).scanStage(automationComposition, acDefinitionTarget, new UpdateSync(), + acDefinition.getRevisionId()); verify(messageProvider).removeJob(JOB_ID); } @@ -319,6 +322,9 @@ class SupervisionScannerTest { definitionTarget.setCompositionId(compositionTargetId); var acDefinitionProvider = createAcDefinitionProvider(AcTypeState.PRIMED); when(acDefinitionProvider.getAcDefinition(compositionTargetId)).thenReturn(definitionTarget); + var acDefinition = new AutomationCompositionDefinition(); + acDefinition.setCompositionId(COMPOSITION_ID); + when(acDefinitionProvider.getAcDefinition(COMPOSITION_ID)).thenReturn(acDefinition); var stageScanner = mock(StageScanner.class); var messageProvider = mock(MessageProvider.class); @@ -330,8 +336,8 @@ class SupervisionScannerTest { messageProvider, monitoringScanner); supervisionScanner.run(); - verify(stageScanner).scanStage(automationComposition, definitionTarget.getServiceTemplate(), - new UpdateSync()); + verify(stageScanner).scanStage(automationComposition, definitionTarget, new UpdateSync(), + acDefinition.getRevisionId()); verify(messageProvider).removeJob(JOB_ID); } 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 ad3feebe0..84b80ae56 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 @@ -32,6 +32,7 @@ import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVIC import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; import org.junit.jupiter.api.Test; import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils; @@ -124,7 +125,8 @@ class SupervisionMessagesTest { @Test void testSendAutomationCompositionStateChangePublisherNotActive() { var publisher = new AutomationCompositionStateChangePublisher(); - assertThatThrownBy(() -> publisher.send(getAutomationComposition(), 0, true)).hasMessage(NOT_ACTIVE); + assertThatThrownBy(() -> publisher.send(getAutomationComposition(), 0, true, UUID.randomUUID())) + .hasMessage(NOT_ACTIVE); } private AutomationComposition getAutomationComposition() { @@ -133,6 +135,7 @@ class SupervisionMessagesTest { automationComposition.setVersion("0.0.1"); automationComposition.setDeployState(DeployState.DEPLOYED); automationComposition.setLockState(LockState.UNLOCKING); + automationComposition.setElements(new HashMap<>()); return automationComposition; } @@ -141,7 +144,7 @@ class SupervisionMessagesTest { var publisher = new AutomationCompositionStateChangePublisher(); var topicSink = mock(TopicSink.class); publisher.active(topicSink); - publisher.send(getAutomationComposition(), 0, true); + publisher.send(getAutomationComposition(), 0, true, UUID.randomUUID()); verify(topicSink).send(anyString()); publisher.stop(); } @@ -152,7 +155,7 @@ class SupervisionMessagesTest { mock(AcRuntimeParameterGroup.class)); var topicSink = mock(TopicSink.class); publisher.active(topicSink); - publisher.sendDepriming(UUID.randomUUID()); + publisher.sendDepriming(UUID.randomUUID(), Set.of(UUID.randomUUID()), UUID.randomUUID()); verify(topicSink).send(anyString()); } @@ -183,7 +186,7 @@ class SupervisionMessagesTest { .extractAcElementsFromServiceTemplate(serviceTemplate, TOSCA_ELEMENT_NAME); acmDefinition.setElementStateMap(AcmUtils.createElementStateMap(acElements, AcTypeState.COMMISSIONED)); var preparation = publisher.prepareParticipantPriming(acmDefinition); - publisher.sendPriming(preparation, acmDefinition.getCompositionId(), null); + publisher.sendPriming(preparation, acmDefinition.getCompositionId(), acmDefinition.getRevisionId()); verify(topicSink).send(anyString()); } @@ -221,7 +224,7 @@ class SupervisionMessagesTest { publisher.active(topicSink); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud"); - publisher.send(automationComposition); + publisher.send(automationComposition, UUID.randomUUID()); verify(topicSink).send(anyString()); } @@ -232,7 +235,7 @@ class SupervisionMessagesTest { publisher.active(topicSink); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud"); - publisher.send(automationComposition, 0); + publisher.send(automationComposition, 0, UUID.randomUUID(), UUID.randomUUID()); verify(topicSink).send(anyString()); } @@ -243,7 +246,7 @@ class SupervisionMessagesTest { publisher.active(topicSink); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud"); - publisher.sendPrepare(automationComposition, 0); + publisher.sendPrepare(automationComposition, 0, UUID.randomUUID()); verify(topicSink).send(anyString()); } @@ -254,7 +257,7 @@ class SupervisionMessagesTest { publisher.active(topicSink); var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud"); - publisher.sendRevew(automationComposition); + publisher.sendReview(automationComposition, UUID.randomUUID()); verify(topicSink).send(anyString()); } diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/PhaseScannerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/PhaseScannerTest.java index 657a21f70..4f3dcce70 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/PhaseScannerTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/PhaseScannerTest.java @@ -41,6 +41,7 @@ import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionS 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.AutomationComposition; +import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition; 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; @@ -73,8 +74,9 @@ class PhaseScannerTest { var phaseScanner = new PhaseScanner(automationCompositionProvider, mock(ParticipantSyncPublisher.class), acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils); - var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); - phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync()); + var acDefinition = new AutomationCompositionDefinition(); + acDefinition.setServiceTemplate(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML)); + phaseScanner.scanWithPhase(automationComposition, acDefinition, new UpdateSync()); verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class)); } @@ -94,8 +96,9 @@ class PhaseScannerTest { var phaseScanner = new PhaseScanner(automationCompositionProvider, mock(ParticipantSyncPublisher.class), acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils); - var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); - phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync()); + var acDefinition = new AutomationCompositionDefinition(); + acDefinition.setServiceTemplate(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML)); + phaseScanner.scanWithPhase(automationComposition, acDefinition, new UpdateSync()); verify(automationCompositionProvider).deleteAutomationComposition(automationComposition.getInstanceId()); } @@ -117,21 +120,22 @@ class PhaseScannerTest { var automationCompositionProvider = mock(AutomationCompositionProvider.class); when(automationCompositionProvider.updateAutomationComposition(any())).thenReturn(automationComposition); - var acDeployPublisher = mock(AutomationCompositionDeployPublisher.class); - var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); - var participantSyncPublisher = mock(ParticipantSyncPublisher.class); var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner"); acRuntimeParameterGroup.getParticipantParameters().setMaxOperationWaitMs(-1); - var encryptionUtils = new EncryptionUtils(acRuntimeParameterGroup); // verify timeout scenario + automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR); + automationComposition.setLastMsg(TimestampHelper.now()); + var acDefinition = new AutomationCompositionDefinition(); + acDefinition.setServiceTemplate(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML)); + var acDeployPublisher = mock(AutomationCompositionDeployPublisher.class); + var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); + var encryptionUtils = new EncryptionUtils(acRuntimeParameterGroup); + var participantSyncPublisher = mock(ParticipantSyncPublisher.class); var phaseScanner = new PhaseScanner(automationCompositionProvider, participantSyncPublisher, acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils); - automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR); - automationComposition.setLastMsg(TimestampHelper.now()); - var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); - phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync()); + phaseScanner.scanWithPhase(automationComposition, acDefinition, new UpdateSync()); verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class)); verify(participantSyncPublisher).sendSync(any(AutomationComposition.class)); assertEquals(StateChangeResult.TIMEOUT, automationComposition.getStateChangeResult()); @@ -139,7 +143,7 @@ class PhaseScannerTest { //already in TIMEOUT clearInvocations(automationCompositionProvider); clearInvocations(participantSyncPublisher); - phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync()); + phaseScanner.scanWithPhase(automationComposition, acDefinition, new UpdateSync()); verify(automationCompositionProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class)); verify(participantSyncPublisher, times(0)) .sendSync(any(AutomationComposition.class)); @@ -149,7 +153,7 @@ class PhaseScannerTest { for (Map.Entry entry : automationComposition.getElements().entrySet()) { entry.getValue().setDeployState(DeployState.DEPLOYED); } - phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync()); + phaseScanner.scanWithPhase(automationComposition, acDefinition, new UpdateSync()); verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class)); verify(participantSyncPublisher).sendSync(any(AutomationComposition.class)); assertEquals(StateChangeResult.NO_ERROR, automationComposition.getStateChangeResult()); @@ -182,10 +186,11 @@ class PhaseScannerTest { var phaseScanner = new PhaseScanner(automationCompositionProvider, mock(ParticipantSyncPublisher.class), acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils); - var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); - phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync()); + var acDefinition = new AutomationCompositionDefinition(); + acDefinition.setServiceTemplate(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML)); + phaseScanner.scanWithPhase(automationComposition, acDefinition, new UpdateSync()); - verify(acDeployPublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean()); + verify(acDeployPublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean(), any(UUID.class)); } @Test @@ -218,11 +223,12 @@ class PhaseScannerTest { mock(AutomationCompositionStateChangePublisher.class), acDeployPublisher, acRuntimeParameterGroup, encryptionUtils); - var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); - phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync()); + var acDefinition = new AutomationCompositionDefinition(); + acDefinition.setServiceTemplate(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML)); + phaseScanner.scanWithPhase(automationComposition, acDefinition, new UpdateSync()); verify(acDeployPublisher, times(0)) - .send(any(AutomationComposition.class), anyInt(), anyBoolean()); + .send(any(AutomationComposition.class), anyInt(), anyBoolean(), any(UUID.class)); } @Test @@ -252,10 +258,11 @@ class PhaseScannerTest { var phaseScanner = new PhaseScanner(acProvider, mock(ParticipantSyncPublisher.class), acStateChangePublisher, acDeployPublisher, acRuntimeParameterGroup, encryptionUtils); - var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); - phaseScanner.scanWithPhase(automationComposition, serviceTemplate, new UpdateSync()); + var acDefinition = new AutomationCompositionDefinition(); + acDefinition.setServiceTemplate(InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML)); + phaseScanner.scanWithPhase(automationComposition, acDefinition, new UpdateSync()); verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), - anyBoolean()); + anyBoolean(), any(UUID.class)); } } diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/StageScannerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/StageScannerTest.java index f51d43d52..30d16d57b 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/StageScannerTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/supervision/scanner/StageScannerTest.java @@ -40,6 +40,7 @@ import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionM 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.AutomationComposition; +import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition; 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.SubState; @@ -77,7 +78,9 @@ class StageScannerTest { mock(AutomationCompositionMigrationPublisher.class), mock(AcPreparePublisher.class), acRuntimeParameterGroup, encryptionUtils); var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); - supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync()); + var acDefinition = new AutomationCompositionDefinition(); + acDefinition.setServiceTemplate(serviceTemplate); + supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID()); verify(acProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class)); assertEquals(DeployState.MIGRATING, automationComposition.getDeployState()); @@ -87,14 +90,14 @@ class StageScannerTest { .get(element.getDefinition().getName()); toscaNodeTemplate.setProperties(Map.of("stage", List.of(1))); - supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync()); + supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID()); verify(acProvider).updateAutomationComposition(any(AutomationComposition.class)); assertEquals(DeployState.MIGRATING, automationComposition.getDeployState()); // first element is migrated clearInvocations(acProvider); element.setDeployState(DeployState.DEPLOYED); - supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync()); + supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID()); verify(acProvider).updateAutomationComposition(any(AutomationComposition.class)); assertEquals(DeployState.DEPLOYED, automationComposition.getDeployState()); @@ -128,7 +131,9 @@ class StageScannerTest { mock(AutomationCompositionMigrationPublisher.class), mock(AcPreparePublisher.class), acRuntimeParameterGroup, encryptionUtils); var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); - supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync()); + var acDefinition = new AutomationCompositionDefinition(); + acDefinition.setServiceTemplate(serviceTemplate); + supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID()); verify(acProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class)); assertEquals(DeployState.MIGRATION_REVERTING, automationComposition.getDeployState()); @@ -138,14 +143,14 @@ class StageScannerTest { .get(element.getDefinition().getName()); toscaNodeTemplate.setProperties(Map.of("stage", List.of(1))); - supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync()); + supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID()); verify(acProvider).updateAutomationComposition(any(AutomationComposition.class)); assertEquals(DeployState.MIGRATION_REVERTING, automationComposition.getDeployState()); // first element is migrated clearInvocations(acProvider); element.setDeployState(DeployState.DEPLOYED); - supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync()); + supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID()); verify(acProvider).updateAutomationComposition(any(AutomationComposition.class)); assertEquals(DeployState.DEPLOYED, automationComposition.getDeployState()); @@ -180,7 +185,9 @@ class StageScannerTest { acRuntimeParameterGroup, encryptionUtils); var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML); - supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync()); + var acDefinition = new AutomationCompositionDefinition(); + acDefinition.setServiceTemplate(serviceTemplate); + supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID()); verify(acProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class)); assertEquals(SubState.PREPARING, automationComposition.getSubState()); @@ -191,14 +198,14 @@ class StageScannerTest { var prepare = Map.of("prepare", List.of(1)); toscaNodeTemplate.setProperties(Map.of("stage", prepare)); - supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync()); + supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID()); verify(acProvider).updateAutomationComposition(any(AutomationComposition.class)); assertEquals(SubState.PREPARING, automationComposition.getSubState()); // first element is prepared clearInvocations(acProvider); element.setSubState(SubState.NONE); - supervisionScanner.scanStage(automationComposition, serviceTemplate, new UpdateSync()); + supervisionScanner.scanStage(automationComposition, acDefinition, new UpdateSync(), UUID.randomUUID()); verify(acProvider).updateAutomationComposition(any(AutomationComposition.class)); assertEquals(SubState.NONE, automationComposition.getSubState()); -- 2.16.6