diff options
author | FrancescoFioraEst <francesco.fiora@est.tech> | 2023-05-16 15:24:54 +0100 |
---|---|---|
committer | Francesco Fiora <francesco.fiora@est.tech> | 2023-05-17 09:32:57 +0000 |
commit | db6eb3fc07398e31dfa664992117f33fa8489cec (patch) | |
tree | f492919cd5b1c2973e91b4866e49e1deb36f524b | |
parent | 722523f568a682f1e48f6998c24c945802fec782 (diff) |
Add extend instance deletion support in ACM
Extend the functionality of deletion step to also inform the participant of instance deletion. This allow the participant to take any necessary steps that might result from instance deletion.
Issue-ID: POLICY-4686
Change-Id: Ibeb44d472da20ad98dafa9ddd7ded28398f4ed10
Signed-off-by: FrancescoFioraEst <francesco.fiora@est.tech>
16 files changed, 201 insertions, 82 deletions
diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/DeployState.java b/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/DeployState.java index 659b312d4..94aa07097 100644 --- a/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/DeployState.java +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/DeployState.java @@ -24,5 +24,7 @@ public enum DeployState { DEPLOYED, DEPLOYING, UNDEPLOYED, - UNDEPLOYING + UNDEPLOYING, + DELETING, + DELETED } diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/DeployOrder.java b/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/DeployOrder.java index 6c1572d19..f4b57f1d1 100644 --- a/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/DeployOrder.java +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/messages/rest/instantiation/DeployOrder.java @@ -23,5 +23,6 @@ package org.onap.policy.clamp.models.acm.messages.rest.instantiation; public enum DeployOrder { NONE, UNDEPLOY, - DEPLOY + DEPLOY, + DELETE } diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AcInstanceStateResolver.java b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AcInstanceStateResolver.java index dba64f585..8676b3397 100644 --- a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AcInstanceStateResolver.java +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AcInstanceStateResolver.java @@ -44,6 +44,7 @@ public class AcInstanceStateResolver { // list of results public static final String DEPLOY = DeployOrder.DEPLOY.name(); public static final String UNDEPLOY = DeployOrder.UNDEPLOY.name(); + public static final String DELETE = DeployOrder.DELETE.name(); public static final String LOCK = LockOrder.LOCK.name(); public static final String UNLOCK = LockOrder.UNLOCK.name(); public static final String NONE = "NONE"; @@ -56,6 +57,7 @@ public class AcInstanceStateResolver { this.graph.put(new String[] {DEPLOY, LOCK_NONE, UNDEPLOYED, STATE_LOCKED_NONE}, DEPLOY); this.graph.put(new String[] {UNDEPLOY, LOCK_NONE, DEPLOYED, LOCKED}, UNDEPLOY); + this.graph.put(new String[] {DELETE, LOCK_NONE, UNDEPLOYED, LOCK_NONE}, DELETE); this.graph.put(new String[] {DEPLOY_NONE, UNLOCK, DEPLOYED, LOCKED}, UNLOCK); this.graph.put(new String[] {DEPLOY_NONE, LOCK, DEPLOYED, UNLOCKED}, LOCK); } diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProvider.java b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProvider.java index 94693fd0b..38add31dd 100644 --- a/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProvider.java +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/persistence/provider/AutomationCompositionProvider.java @@ -203,7 +203,7 @@ public class AutomationCompositionProvider { var jpa = acElementRepository.getReferenceById(element.getAutomationCompositionElementId().toString()); jpa.setUseState(element.getUseState()); jpa.setOperationalState(element.getOperationalState()); - jpa.setProperties(element.getStatusProperties()); + jpa.setStatusProperties(element.getStatusProperties()); jpaList.add(jpa); } } diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/utils/AcmUtils.java b/models/src/main/java/org/onap/policy/clamp/models/acm/utils/AcmUtils.java index 35482b9bb..7de4720ad 100644 --- a/models/src/main/java/org/onap/policy/clamp/models/acm/utils/AcmUtils.java +++ b/models/src/main/java/org/onap/policy/clamp/models/acm/utils/AcmUtils.java @@ -284,7 +284,8 @@ public final class AcmUtils { */ public static boolean isInTransitionalState(DeployState deployState, LockState lockState) { return DeployState.DEPLOYING.equals(deployState) || DeployState.UNDEPLOYING.equals(deployState) - || LockState.LOCKING.equals(lockState) || LockState.UNLOCKING.equals(lockState); + || LockState.LOCKING.equals(lockState) || LockState.UNLOCKING.equals(lockState) + || DeployState.DELETING.equals(deployState); } /** @@ -294,12 +295,24 @@ public final class AcmUtils { * @return the DeployOrder */ public static DeployOrder stateDeployToOrder(DeployState deployState) { - if (DeployState.DEPLOYING.equals(deployState)) { - return DeployOrder.DEPLOY; - } else if (DeployState.UNDEPLOYING.equals(deployState)) { - return DeployOrder.UNDEPLOY; + DeployOrder result = null; + switch (deployState) { + case DEPLOYING: + result = DeployOrder.DEPLOY; + break; + + case UNDEPLOYING: + result = DeployOrder.UNDEPLOY; + break; + + case DELETING: + result = DeployOrder.DELETE; + break; + + default: + result = DeployOrder.NONE; } - return DeployOrder.NONE; + return result; } /** @@ -324,12 +337,24 @@ public final class AcmUtils { * @return the DeployState */ public static DeployState deployCompleted(DeployState deployState) { - if (DeployState.DEPLOYING.equals(deployState)) { - return DeployState.DEPLOYED; - } else if (DeployState.UNDEPLOYING.equals(deployState)) { - return DeployState.UNDEPLOYED; + DeployState result = null; + switch (deployState) { + case DEPLOYING: + result = DeployState.DEPLOYED; + break; + + case UNDEPLOYING: + result = DeployState.UNDEPLOYED; + break; + + case DELETING: + result = DeployState.DELETED; + break; + + default: + return deployState; } - return deployState; + return result; } /** diff --git a/models/src/test/java/org/onap/policy/clamp/models/acm/utils/AcmUtilsTest.java b/models/src/test/java/org/onap/policy/clamp/models/acm/utils/AcmUtilsTest.java index b332d7d44..046d1b848 100644 --- a/models/src/test/java/org/onap/policy/clamp/models/acm/utils/AcmUtilsTest.java +++ b/models/src/test/java/org/onap/policy/clamp/models/acm/utils/AcmUtilsTest.java @@ -145,6 +145,7 @@ class AcmUtilsTest { // from transitional state to order state assertEquals(DeployOrder.DEPLOY, AcmUtils.stateDeployToOrder(DeployState.DEPLOYING)); assertEquals(DeployOrder.UNDEPLOY, AcmUtils.stateDeployToOrder(DeployState.UNDEPLOYING)); + assertEquals(DeployOrder.DELETE, AcmUtils.stateDeployToOrder(DeployState.DELETING)); assertEquals(DeployOrder.NONE, AcmUtils.stateDeployToOrder(DeployState.DEPLOYED)); } @@ -162,6 +163,7 @@ class AcmUtilsTest { assertEquals(DeployState.DEPLOYED, AcmUtils.deployCompleted(DeployState.DEPLOYING)); assertEquals(DeployState.UNDEPLOYED, AcmUtils.deployCompleted(DeployState.UNDEPLOYING)); assertEquals(DeployState.DEPLOYED, AcmUtils.deployCompleted(DeployState.DEPLOYED)); + assertEquals(DeployState.DELETED, AcmUtils.deployCompleted(DeployState.DELETING)); } @Test diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/AutomationCompositionElementListener.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/AutomationCompositionElementListener.java index 23390699a..d6ef80fbe 100644 --- a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/AutomationCompositionElementListener.java +++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/AutomationCompositionElementListener.java @@ -57,4 +57,9 @@ public interface AutomationCompositionElementListener { throws PfModelException { // default Unlock Operation } + + public default void delete(UUID automationCompositionId, UUID automationCompositionElementId) + throws PfModelException { + // default Delete Operation + } } diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/ParticipantIntermediaryApi.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/ParticipantIntermediaryApi.java index 509b6ed6e..f35572769 100644 --- a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/ParticipantIntermediaryApi.java +++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/ParticipantIntermediaryApi.java @@ -23,6 +23,7 @@ package org.onap.policy.clamp.acm.participant.intermediary.api; import java.util.Map; import java.util.UUID; +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.LockState; @@ -52,6 +53,13 @@ public interface ParticipantIntermediaryApi { LockState lockState, String message); /** + * Get AutomationCompositions. + * + * @return get all AutomationCompositions + */ + Map<UUID, AutomationComposition> getAutomationCompositions(); + + /** * Send Automation Composition Element update Info to AC-runtime. * * @param automationCompositionId the ID of the automation composition to update the states diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/ParticipantIntermediaryApiImpl.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/ParticipantIntermediaryApiImpl.java index 20f222ab3..69fd9f3e8 100644 --- a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/ParticipantIntermediaryApiImpl.java +++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/impl/ParticipantIntermediaryApiImpl.java @@ -26,8 +26,10 @@ import java.util.UUID; import org.onap.policy.clamp.acm.participant.intermediary.api.AutomationCompositionElementListener; import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi; import org.onap.policy.clamp.acm.participant.intermediary.handler.AutomationCompositionHandler; +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.LockState; +import org.onap.policy.models.base.PfUtils; import org.springframework.stereotype.Component; /** @@ -67,4 +69,9 @@ public class ParticipantIntermediaryApiImpl implements ParticipantIntermediaryAp automationCompositionHandler.sendAcElementInfo(automationCompositionId, elementId, useState, operationalState, statusProperties); } + + @Override + public Map<UUID, AutomationComposition> getAutomationCompositions() { + return PfUtils.mapMap(automationCompositionHandler.getAutomationCompositionMap(), AutomationComposition::new); + } } diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandler.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandler.java index e35582058..26ec1462c 100644 --- a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandler.java +++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandler.java @@ -129,13 +129,14 @@ public class AutomationCompositionHandler { if (deployState != null) { element.setDeployState(deployState); + element.setLockState( + DeployState.DEPLOYED.equals(element.getDeployState()) ? LockState.LOCKED : LockState.NONE); var checkOpt = automationComposition.getElements().values().stream() .filter(acElement -> !deployState.equals(acElement.getDeployState())).findAny(); if (checkOpt.isEmpty()) { automationComposition.setDeployState(deployState); + automationComposition.setLockState(element.getLockState()); } - element.setLockState( - DeployState.DEPLOYED.equals(element.getDeployState()) ? LockState.LOCKED : LockState.NONE); } if (lockState != null) { element.setLockState(lockState); @@ -191,14 +192,8 @@ public class AutomationCompositionHandler { if (!checkConsistantOrderState(automationComposition, stateChangeMsg.getDeployOrderedState(), stateChangeMsg.getLockOrderedState())) { - var automationCompositionAck = - new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATECHANGE_ACK); - automationCompositionAck.setParticipantId(participantId); - automationCompositionAck.setMessage("Automation composition is already in state " - + stateChangeMsg.getDeployOrderedState() + " and " + stateChangeMsg.getLockOrderedState()); - automationCompositionAck.setResult(false); - automationCompositionAck.setAutomationCompositionId(automationComposition.getInstanceId()); - publisher.sendAutomationCompositionAck(automationCompositionAck); + LOGGER.warn("Not Consistant OrderState Automation composition {}", + stateChangeMsg.getAutomationCompositionId()); return; } @@ -228,10 +223,17 @@ public class AutomationCompositionHandler { private void handleDeployOrderState(final AutomationComposition automationComposition, DeployOrder orderedState, Integer startPhaseMsg, List<AutomationCompositionElementDefinition> acElementDefinitions) { - if (DeployOrder.UNDEPLOY.equals(orderedState)) { - handleUndeployState(automationComposition, startPhaseMsg, acElementDefinitions); - } else { - LOGGER.debug("StateChange message has no state, state is null {}", automationComposition.getKey()); + switch (orderedState) { + case UNDEPLOY: + handleUndeployState(automationComposition, startPhaseMsg, acElementDefinitions); + break; + case DELETE: + handleDeleteState(automationComposition, startPhaseMsg, acElementDefinitions); + break; + + default: + LOGGER.debug("StateChange message has no state, state is null {}", automationComposition.getKey()); + break; } } @@ -287,23 +289,7 @@ public class AutomationCompositionHandler { } private void initializeDeploy(UUID messageId, UUID instanceId, ParticipantDeploy participantDeploy) { - var automationComposition = automationCompositionMap.get(instanceId); - - if (automationComposition != null) { - var automationCompositionUpdateAck = - new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK); - automationCompositionUpdateAck.setParticipantId(participantId); - - automationCompositionUpdateAck.setMessage( - "Automation composition " + instanceId + " already defined on participant " + participantId); - automationCompositionUpdateAck.setResult(false); - automationCompositionUpdateAck.setResponseTo(messageId); - automationCompositionUpdateAck.setAutomationCompositionId(instanceId); - publisher.sendAutomationCompositionAck(automationCompositionUpdateAck); - return; - } - - automationComposition = new AutomationComposition(); + var automationComposition = new AutomationComposition(); automationComposition.setInstanceId(instanceId); var acElements = storeElementsOnThisParticipant(participantDeploy); automationComposition.setElements(prepareAcElementMap(acElements)); @@ -379,9 +365,17 @@ public class AutomationCompositionHandler { automationComposition.getElements().values().stream() .forEach(acElement -> automationCompositionElementUndeploy(automationComposition.getInstanceId(), acElement, startPhaseMsg, acElementDefinitions)); + } + + private void handleDeleteState(final AutomationComposition automationComposition, Integer startPhaseMsg, + List<AutomationCompositionElementDefinition> acElementDefinitions) { + + automationComposition.getElements().values().stream() + .forEach(acElement -> automationCompositionElementDelete(automationComposition.getInstanceId(), + acElement, startPhaseMsg, acElementDefinitions)); boolean isAllUninitialised = automationComposition.getElements().values().stream() - .filter(element -> !DeployState.UNDEPLOYED.equals(element.getDeployState())).findAny().isEmpty(); + .filter(element -> !DeployState.DELETED.equals(element.getDeployState())).findAny().isEmpty(); if (isAllUninitialised) { automationCompositionMap.remove(automationComposition.getInstanceId()); } @@ -464,6 +458,24 @@ public class AutomationCompositionHandler { } } + private void automationCompositionElementDelete(UUID instanceId, AutomationCompositionElement acElement, + Integer startPhaseMsg, List<AutomationCompositionElementDefinition> acElementDefinitions) { + var acElementNodeTemplate = getAcElementNodeTemplate(acElementDefinitions, acElement.getDefinition()); + if (acElementNodeTemplate != null) { + int startPhase = ParticipantUtils.findStartPhase(acElementNodeTemplate.getProperties()); + if (startPhaseMsg.equals(startPhase)) { + for (var acElementListener : listeners) { + try { + acElementListener.delete(instanceId, acElement.getId()); + updateAutomationCompositionElementState(instanceId, acElement.getId(), DeployState.DELETED, + null, "Deleted"); + } catch (PfModelException e) { + LOGGER.error("Automation composition element unlock failed {}", instanceId); + } + } + } + } + } /** * Undeploy Instance Elements On Participant. 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 02e5b1ac6..4665fec37 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 @@ -196,8 +196,8 @@ public class AutomationCompositionInstantiationProvider { "Automation composition state is still " + automationComposition.getDeployState()); } var response = new InstantiationResponse(); - automationComposition = - automationCompositionProvider.deleteAutomationComposition(automationComposition.getInstanceId()); + var acDefinition = acDefinitionProvider.getAcDefinition(automationComposition.getCompositionId()); + supervisionAcHandler.delete(automationComposition, acDefinition); response.setInstanceId(automationComposition.getInstanceId()); response.setAffectedAutomationComposition(automationComposition.getKey().asIdentifier()); return response; 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 0eb4ecbd9..8032b4d5d 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 @@ -109,6 +109,19 @@ public class SupervisionAcHandler { } /** + * Handle Delete an AutomationComposition instance. + * + * @param automationComposition the AutomationComposition + * @param acDefinition the AutomationCompositionDefinition + */ + public void delete(AutomationComposition automationComposition, AutomationCompositionDefinition acDefinition) { + AcmUtils.setCascadedState(automationComposition, DeployState.DELETING, LockState.NONE); + automationCompositionProvider.updateAutomationComposition(automationComposition); + var startPhase = ParticipantUtils.getFirstStartPhase(automationComposition, acDefinition.getServiceTemplate()); + automationCompositionStateChangePublisher.send(automationComposition, startPhase, true); + } + + /** * Handle a AutomationComposition deploy acknowledge message from a participant. * * @param automationCompositionAckMessage the AutomationCompositionAck message received from a participant @@ -139,19 +152,33 @@ public class SupervisionAcHandler { } private void setAcElementStateInDb(AutomationCompositionDeployAck automationCompositionAckMessage) { - if (automationCompositionAckMessage.getAutomationCompositionResultMap() != null) { - var automationComposition = automationCompositionProvider - .findAutomationComposition(automationCompositionAckMessage.getAutomationCompositionId()); - if (automationComposition.isPresent()) { - var updated = updateState(automationComposition.get(), - automationCompositionAckMessage.getAutomationCompositionResultMap().entrySet()); - if (updated) { - automationCompositionProvider.updateAutomationComposition(automationComposition.get()); - } + var automationComposition = automationCompositionProvider + .findAutomationComposition(automationCompositionAckMessage.getAutomationCompositionId()); + if (automationComposition.isEmpty()) { + LOGGER.warn("AutomationComposition not found in database {}", + automationCompositionAckMessage.getAutomationCompositionId()); + return; + } + + if (automationCompositionAckMessage.getAutomationCompositionResultMap() == null + || automationCompositionAckMessage.getAutomationCompositionResultMap().isEmpty()) { + if (DeployState.DELETING.equals(automationComposition.get().getDeployState())) { + // scenario when Automation Composition instance has never been deployed + automationComposition.get().getElements().values() + .forEach(element -> element.setDeployState(DeployState.DELETED)); + automationCompositionProvider.updateAutomationComposition(automationComposition.get()); } else { - LOGGER.warn("AutomationComposition not found in database {}", - automationCompositionAckMessage.getAutomationCompositionId()); + LOGGER.warn("Empty AutomationCompositionResultMap {} {}", + automationCompositionAckMessage.getAutomationCompositionId(), + automationCompositionAckMessage.getMessage()); } + return; + } + + var updated = updateState(automationComposition.get(), + automationCompositionAckMessage.getAutomationCompositionResultMap().entrySet()); + if (updated) { + automationCompositionProvider.updateAutomationComposition(automationComposition.get()); } } @@ -163,15 +190,9 @@ public class SupervisionAcHandler { if (element != null) { element.setDeployState(acElementAck.getValue().getDeployState()); element.setLockState(acElementAck.getValue().getLockState()); - if (DeployState.DEPLOYED.equals(element.getDeployState())) { - element.setOperationalState(acElementAck.getValue().getOperationalState()); - element.setUseState(acElementAck.getValue().getUseState()); - element.setStatusProperties(acElementAck.getValue().getStatusProperties()); - } else { - element.setOperationalState(null); - element.setUseState(null); - element.setStatusProperties(Map.of()); - } + element.setOperationalState(acElementAck.getValue().getOperationalState()); + element.setUseState(acElementAck.getValue().getUseState()); + element.setStatusProperties(acElementAck.getValue().getStatusProperties()); updated = true; } } diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java index 7ee7267e2..e23d79d57 100644 --- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java +++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/SupervisionScanner.java @@ -133,14 +133,7 @@ public class SupervisionScanner { LOGGER.debug("automation composition scan: transition state {} {} ", automationComposition.getDeployState(), automationComposition.getLockState()); - var deployState = automationComposition.getDeployState(); - automationComposition.setDeployState(AcmUtils.deployCompleted(deployState)); - automationComposition - .setLockState(AcmUtils.lockCompleted(deployState, automationComposition.getLockState())); - automationCompositionProvider.updateAutomationComposition(automationComposition); - - // Clear missed report counter on automation composition - clearFaultAndCounter(automationComposition); + complete(automationComposition); } else { LOGGER.debug("automation composition scan: transition from state {} to {} not completed", automationComposition.getDeployState(), automationComposition.getLockState()); @@ -163,6 +156,21 @@ public class SupervisionScanner { } } + private void complete(final AutomationComposition automationComposition) { + var deployState = automationComposition.getDeployState(); + automationComposition.setDeployState(AcmUtils.deployCompleted(deployState)); + automationComposition + .setLockState(AcmUtils.lockCompleted(deployState, automationComposition.getLockState())); + if (DeployState.DELETED.equals(automationComposition.getDeployState())) { + automationCompositionProvider.deleteAutomationComposition(automationComposition.getInstanceId()); + } else { + automationCompositionProvider.updateAutomationComposition(automationComposition); + } + + // Clear missed report counter on automation composition + clearFaultAndCounter(automationComposition); + } + private void clearFaultAndCounter(AutomationComposition automationComposition) { automationCompositionCounter.clear(automationComposition.getInstanceId()); phaseMap.remove(automationComposition.getInstanceId()); diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProviderTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProviderTest.java index 9f39d8dc6..faf356c22 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProviderTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/AutomationCompositionInstantiationProviderTest.java @@ -95,8 +95,9 @@ class AutomationCompositionInstantiationProviderTest { var compositionId = acDefinition.getCompositionId(); when(acDefinitionProvider.findAcDefinition(compositionId)).thenReturn(Optional.of(acDefinition)); var acProvider = mock(AutomationCompositionProvider.class); - var instantiationProvider = - new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, null, null); + var supervisionAcHandler = mock(SupervisionAcHandler.class); + var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, acDefinitionProvider, + null, supervisionAcHandler); var automationCompositionCreate = InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud"); automationCompositionCreate.setCompositionId(compositionId); @@ -136,7 +137,7 @@ class AutomationCompositionInstantiationProviderTest { instantiationProvider.deleteAutomationComposition(automationCompositionCreate.getCompositionId(), automationCompositionCreate.getInstanceId()); - verify(acProvider).deleteAutomationComposition(automationCompositionCreate.getInstanceId()); + verify(supervisionAcHandler).delete(any(), any()); } @Test @@ -146,9 +147,10 @@ class AutomationCompositionInstantiationProviderTest { var acProvider = mock(AutomationCompositionProvider.class); var acDefinitionProvider = mock(AcDefinitionProvider.class); + var supervisionAcHandler = mock(SupervisionAcHandler.class); var instantiationProvider = new AutomationCompositionInstantiationProvider(acProvider, - acDefinitionProvider, null, null); + acDefinitionProvider, null, supervisionAcHandler); when(acProvider.getAutomationComposition(automationComposition.getInstanceId())) .thenReturn(automationComposition); @@ -168,6 +170,7 @@ class AutomationCompositionInstantiationProviderTest { when(acProvider.deleteAutomationComposition(instanceId)).thenReturn(automationComposition); instantiationProvider.deleteAutomationComposition(compositionId, instanceId); + verify(supervisionAcHandler).delete(any(), any()); } private void assertThatDeleteThrownBy(AutomationComposition automationComposition, diff --git a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/rest/InstantiationControllerTest.java b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/rest/InstantiationControllerTest.java index fe0a477f9..5380d67a6 100644 --- a/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/rest/InstantiationControllerTest.java +++ b/runtime-acm/src/test/java/org/onap/policy/clamp/acm/runtime/instantiation/rest/InstantiationControllerTest.java @@ -42,6 +42,7 @@ import org.onap.policy.clamp.acm.runtime.util.rest.CommonRestController; 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.AutomationCompositions; +import org.onap.policy.clamp.models.acm.concepts.DeployState; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.AcInstanceStateUpdate; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder; import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse; @@ -268,7 +269,8 @@ class InstantiationControllerTest extends CommonRestController { var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(compositionId, automationCompositionFromRsc.getKey().getName(), automationCompositionFromRsc.getKey().getVersion()); - assertThat(automationCompositionsFromDb.getAutomationCompositionList()).isEmpty(); + assertEquals(DeployState.DELETING, + automationCompositionsFromDb.getAutomationCompositionList().get(0).getDeployState()); } @Test 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 032468a56..8ead9a7c0 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 @@ -101,7 +101,28 @@ class SupervisionScannerTest { acRuntimeParameterGroup); supervisionScanner.run(false); - verify(automationCompositionProvider, times(1)).updateAutomationComposition(any(AutomationComposition.class)); + verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class)); + } + + @Test + void testScannerDelete() { + var automationComposition = InstantiationUtils.getAutomationCompositionFromResource(AC_JSON, "Crud"); + automationComposition.setDeployState(DeployState.DELETING); + automationComposition.setLockState(LockState.NONE); + var automationCompositionProvider = mock(AutomationCompositionProvider.class); + when(automationCompositionProvider.getAcInstancesByCompositionId(compositionId)) + .thenReturn(List.of(automationComposition)); + + var automationCompositionDeployPublisher = mock(AutomationCompositionDeployPublisher.class); + var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class); + var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner"); + + var supervisionScanner = new SupervisionScanner(automationCompositionProvider, acDefinitionProvider, + automationCompositionStateChangePublisher, automationCompositionDeployPublisher, + acRuntimeParameterGroup); + supervisionScanner.run(false); + + verify(automationCompositionProvider).deleteAutomationComposition(automationComposition.getInstanceId()); } @Test |