private DeployState deployState;
private LockState lockState;
+ private StateChangeResult stateChangeResult;
private List<AcElementRestart> acElementList = new ArrayList<>();
this.automationCompositionId = copyConstructor.automationCompositionId;
this.deployState = copyConstructor.deployState;
this.lockState = copyConstructor.lockState;
+ this.stateChangeResult = copyConstructor.stateChangeResult;
this.acElementList = PfUtils.mapList(copyConstructor.acElementList, AcElementRestart::new);
}
}
import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
import org.onap.policy.clamp.models.acm.concepts.ParticipantDefinition;
import org.onap.policy.clamp.models.acm.concepts.ParticipantRestartAc;
+import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
import org.onap.policy.models.base.PfUtils;
@Getter
private Set<UUID> excludeReplicas = new HashSet<>();
private boolean restarting = false;
private boolean delete = false;
+ private StateChangeResult stateChangeResult;
/**
* Constructor.
this.excludeReplicas = new HashSet<>(source.excludeReplicas);
this.restarting = source.restarting;
this.delete = source.delete;
+ this.stateChangeResult = source.getStateChangeResult();
}
}
public void handleParticipantSync(ParticipantSync participantSyncMsg) {
if (participantSyncMsg.isDelete()) {
- if (AcTypeState.COMMISSIONED.equals(participantSyncMsg.getState())) {
- cacheProvider.removeElementDefinition(participantSyncMsg.getCompositionId());
- }
- for (var automationcomposition : participantSyncMsg.getAutomationcompositionList()) {
- cacheProvider.removeAutomationComposition(automationcomposition.getAutomationCompositionId());
- }
+ deleteScenario(participantSyncMsg);
return;
}
if (!participantSyncMsg.getParticipantDefinitionUpdates().isEmpty()) {
+ if (StateChangeResult.TIMEOUT.equals(participantSyncMsg.getStateChangeResult())) {
+ listener.cleanExecution(participantSyncMsg.getCompositionId(), participantSyncMsg.getMessageId());
+ }
+
List<AutomationCompositionElementDefinition> list = new ArrayList<>();
for (var participantDefinition : participantSyncMsg.getParticipantDefinitionUpdates()) {
list.addAll(participantDefinition.getAutomationCompositionElementDefinitionList());
for (var automationcomposition : participantSyncMsg.getAutomationcompositionList()) {
cacheProvider
.initializeAutomationComposition(participantSyncMsg.getCompositionId(), automationcomposition);
+ if (StateChangeResult.TIMEOUT.equals(automationcomposition.getStateChangeResult())) {
+ for (var element : automationcomposition.getAcElementList()) {
+ listener.cleanExecution(element.getId(), participantSyncMsg.getMessageId());
+ }
+ }
+ }
+ }
+
+ private void deleteScenario(ParticipantSync participantSyncMsg) {
+ if (AcTypeState.COMMISSIONED.equals(participantSyncMsg.getState())) {
+ cacheProvider.removeElementDefinition(participantSyncMsg.getCompositionId());
+ }
+ for (var automationcomposition : participantSyncMsg.getAutomationcompositionList()) {
+ cacheProvider.removeAutomationComposition(automationcomposition.getAutomationCompositionId());
}
}
}
automationComposition.setLockState(participantRestartAc.getLockState());
automationComposition.setInstanceId(participantRestartAc.getAutomationCompositionId());
automationComposition.setElements(acElementMap);
+ automationComposition.setStateChangeResult(participantRestartAc.getStateChangeResult());
automationCompositions.put(automationComposition.getInstanceId(), automationComposition);
}
executionMap.remove(instanceElement.elementId());
}
- private void cleanExecution(UUID execIdentificationId, UUID messageId) {
+ /**
+ * Clean Execution.
+ *
+ * @param execIdentificationId the identification Id
+ * @param messageId the messageId
+ */
+ public void cleanExecution(UUID execIdentificationId, UUID messageId) {
var process = executionMap.get(execIdentificationId);
if (process != null) {
if (!process.isDone()) {
import org.onap.policy.clamp.acm.participant.intermediary.main.parameters.CommonTestData;
import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
import org.onap.policy.clamp.models.acm.concepts.ParticipantDefinition;
+import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantPrime;
import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantPrimeAck;
import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantSync;
verify(cacheProvider).addElementDefinition(any(), any());
}
+ @Test
+ void syncCompositionDefinitionTimeout() {
+ var participantSyncMsg = new ParticipantSync();
+ participantSyncMsg.setState(AcTypeState.PRIMED);
+ participantSyncMsg.setStateChangeResult(StateChangeResult.TIMEOUT);
+ participantSyncMsg.setCompositionId(UUID.randomUUID());
+ participantSyncMsg.getParticipantDefinitionUpdates().add(createParticipantDefinition());
+ var participantRestartAc = CommonTestData.createParticipantRestartAc();
+ participantRestartAc.setStateChangeResult(StateChangeResult.TIMEOUT);
+ participantSyncMsg.setAutomationcompositionList(List.of(participantRestartAc));
+
+ var cacheProvider = mock(CacheProvider.class);
+ var listener = mock(ThreadHandler.class);
+ var ach = new AcDefinitionHandler(cacheProvider, mock(ParticipantMessagePublisher.class), listener);
+ ach.handleParticipantSync(participantSyncMsg);
+ verify(cacheProvider).initializeAutomationComposition(any(UUID.class), any());
+ verify(cacheProvider).addElementDefinition(any(), any());
+ verify(listener).cleanExecution(participantSyncMsg.getCompositionId(), participantSyncMsg.getMessageId());
+ var elementId = participantRestartAc.getAcElementList().get(0).getId();
+ verify(listener).cleanExecution(elementId, participantSyncMsg.getMessageId());
+ }
+
@Test
void syncDeleteTest() {
var participantSyncMsg = new ParticipantSync();
if (nextSpNotCompleted != automationComposition.getPhase()) {
sendAutomationCompositionMsg(automationComposition, serviceTemplate, nextSpNotCompleted);
} else {
- handleTimeout(automationComposition);
+ handleTimeout(automationComposition, serviceTemplate);
}
}
}
if (completed) {
complete(automationComposition, serviceTemplate);
} else {
- handleTimeout(automationComposition);
+ handleTimeout(automationComposition, serviceTemplate);
}
}
automationComposition.getDeployState(), automationComposition.getLockState());
if (minStageNotCompleted != automationComposition.getPhase()) {
- savePahese(automationComposition, minStageNotCompleted);
+ savePhase(automationComposition, minStageNotCompleted);
LOGGER.debug("retry message AutomationCompositionMigration");
automationCompositionMigrationPublisher.send(automationComposition, minStageNotCompleted);
} else {
- handleTimeout(automationComposition);
+ handleTimeout(automationComposition, serviceTemplate);
}
}
}
acDefinition.setStateChangeResult(StateChangeResult.TIMEOUT);
acDefinitionProvider.updateAcDefinitionState(acDefinition.getCompositionId(),
acDefinition.getState(), acDefinition.getStateChangeResult());
+ participantSyncPublisher.sendSync(acDefinition, null);
}
}
- private void handleTimeout(AutomationComposition automationComposition) {
+ private void handleTimeout(AutomationComposition automationComposition,
+ ToscaServiceTemplate serviceTemplate) {
LOGGER.debug("automation composition scan: transition from state {} to {} {} not completed",
automationComposition.getDeployState(), automationComposition.getLockState(),
automationComposition.getSubState());
LOGGER.debug("Report timeout for the ac instance {}", automationComposition.getInstanceId());
automationComposition.setStateChangeResult(StateChangeResult.TIMEOUT);
automationCompositionProvider.updateAcState(automationComposition);
+ participantSyncPublisher.sendSync(serviceTemplate, automationComposition);
}
}
- private void savePahese(AutomationComposition automationComposition, int startPhase) {
+ private void savePhase(AutomationComposition automationComposition, int startPhase) {
automationComposition.setLastMsg(TimestampHelper.now());
automationComposition.setPhase(startPhase);
automationCompositionProvider.updateAcState(automationComposition);
private void sendAutomationCompositionMsg(AutomationComposition automationComposition,
ToscaServiceTemplate serviceTemplate, int startPhase) {
- savePahese(automationComposition, startPhase);
+ savePhase(automationComposition, startPhase);
if (DeployState.DEPLOYING.equals(automationComposition.getDeployState())) {
LOGGER.debug("retry message AutomationCompositionDeploy");
message.getExcludeReplicas().add(excludeReplicaId);
}
message.setState(acDefinition.getState());
+ message.setStateChangeResult(acDefinition.getStateChangeResult());
message.setMessageId(UUID.randomUUID());
message.setTimestamp(Instant.now());
if (AcTypeState.COMMISSIONED.equals(acDefinition.getState())) {
syncAc.setAutomationCompositionId(automationComposition.getInstanceId());
syncAc.setDeployState(automationComposition.getDeployState());
syncAc.setLockState(automationComposition.getLockState());
+ syncAc.setStateChangeResult(automationComposition.getStateChangeResult());
if (DeployState.DELETED.equals(automationComposition.getDeployState())) {
message.setDelete(true);
} else {
void testAcDefinitionPrimeTimeout() {
var acDefinition = createAutomationCompositionDefinition(AcTypeState.PRIMING, StateChangeResult.NO_ERROR);
var acDefinitionProvider = createAcDefinitionProvider(acDefinition);
+ var participantSyncPublisher = mock(ParticipantSyncPublisher.class);
var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
var supervisionScanner = new SupervisionScanner(mock(AutomationCompositionProvider.class), acDefinitionProvider,
mock(AutomationCompositionStateChangePublisher.class), mock(AutomationCompositionDeployPublisher.class),
- mock(ParticipantSyncPublisher.class), null, acRuntimeParameterGroup);
+ participantSyncPublisher, null, acRuntimeParameterGroup);
supervisionScanner.run();
// Ac Definition in Priming state
verify(acDefinitionProvider, times(0)).updateAcDefinitionState(any(), any(), any());
acRuntimeParameterGroup.getParticipantParameters().setMaxStatusWaitMs(-1);
supervisionScanner = new SupervisionScanner(mock(AutomationCompositionProvider.class), acDefinitionProvider,
mock(AutomationCompositionStateChangePublisher.class), mock(AutomationCompositionDeployPublisher.class),
- mock(ParticipantSyncPublisher.class), null, acRuntimeParameterGroup);
+ participantSyncPublisher, null, acRuntimeParameterGroup);
supervisionScanner.run();
// set Timeout
verify(acDefinitionProvider).updateAcDefinitionState(acDefinition.getCompositionId(), acDefinition.getState(),
StateChangeResult.TIMEOUT);
+ verify(participantSyncPublisher).sendSync(any(AutomationCompositionDefinition.class), any());
clearInvocations(acDefinitionProvider);
+ clearInvocations(participantSyncPublisher);
acDefinition.setStateChangeResult(StateChangeResult.TIMEOUT);
supervisionScanner.run();
// already in Timeout
verify(acDefinitionProvider, times(0)).updateAcDefinitionState(any(), any(), any());
+ verify(participantSyncPublisher, times(0)).sendSync(acDefinition, null);
clearInvocations(acDefinitionProvider);
+ clearInvocations(participantSyncPublisher);
// retry by the user
acDefinition.setStateChangeResult(StateChangeResult.NO_ERROR);
supervisionScanner.run();
// set Timeout
verify(acDefinitionProvider).updateAcDefinitionState(acDefinition.getCompositionId(), acDefinition.getState(),
StateChangeResult.TIMEOUT);
+ verify(participantSyncPublisher).sendSync(any(AutomationCompositionDefinition.class), any());
clearInvocations(acDefinitionProvider);
for (var element : acDefinition.getElementStateMap().values()) {
when(automationCompositionProvider.updateAcState(any())).thenReturn(automationComposition);
var automationCompositionDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
+ var participantSyncPublisher = mock(ParticipantSyncPublisher.class);
var acRuntimeParameterGroup = CommonTestData.geParameterGroup("dbScanner");
acRuntimeParameterGroup.getParticipantParameters().setMaxStatusWaitMs(-1);
// verify timeout scenario
var scannerObj2 = new SupervisionScanner(automationCompositionProvider, createAcDefinitionProvider(),
automationCompositionStateChangePublisher, automationCompositionDeployPublisher,
- mock(ParticipantSyncPublisher.class), null, acRuntimeParameterGroup);
+ participantSyncPublisher, null, acRuntimeParameterGroup);
automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
automationComposition.setLastMsg(TimestampHelper.now());
scannerObj2.run();
- verify(automationCompositionProvider, times(1)).updateAcState(any(AutomationComposition.class));
+ verify(automationCompositionProvider).updateAcState(any(AutomationComposition.class));
+ verify(participantSyncPublisher).sendSync(any(ToscaServiceTemplate.class), any(AutomationComposition.class));
assertEquals(StateChangeResult.TIMEOUT, automationComposition.getStateChangeResult());
//already in TIMEOUT
clearInvocations(automationCompositionProvider);
+ clearInvocations(participantSyncPublisher);
scannerObj2.run();
verify(automationCompositionProvider, times(0)).updateAutomationComposition(any(AutomationComposition.class));
+ verify(participantSyncPublisher, times(0))
+ .sendSync(any(ToscaServiceTemplate.class), any(AutomationComposition.class));
clearInvocations(automationCompositionProvider);
+ clearInvocations(participantSyncPublisher);
for (Map.Entry<UUID, AutomationCompositionElement> entry : automationComposition.getElements().entrySet()) {
entry.getValue().setDeployState(DeployState.DEPLOYED);
}
scannerObj2.run();
- verify(automationCompositionProvider, times(1)).updateAcState(any(AutomationComposition.class));
+ verify(automationCompositionProvider).updateAcState(any(AutomationComposition.class));
+ verify(participantSyncPublisher).sendSync(any(ToscaServiceTemplate.class), any(AutomationComposition.class));
assertEquals(StateChangeResult.NO_ERROR, automationComposition.getStateChangeResult());
}