* @param deployOrder the DeployOrder
*/
public static List<ParticipantDeploy> createParticipantDeployList(AutomationComposition automationComposition,
- DeployOrder deployOrder) {
+ DeployOrder deployOrder, List<AutomationCompositionElement> removedElements) {
Map<UUID, List<AcElementDeploy>> map = new HashMap<>();
for (var element : automationComposition.getElements().values()) {
var acElementDeploy = createAcElementDeploy(element, deployOrder);
participantDeploy.setAcElementList(entry.getValue());
participantDeploys.add(participantDeploy);
}
+ // Include the participantIds for the removed elements
+ for (var element : removedElements) {
+ if (map.get(element.getParticipantId()) == null) {
+ var participantDeploy = new ParticipantDeploy();
+ participantDeploy.setParticipantId(element.getParticipantId());
+ participantDeploys.add(participantDeploy);
+ map.put(element.getParticipantId(), new ArrayList<>());
+ }
+
+ }
return participantDeploys;
}
import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
import org.onap.policy.clamp.models.acm.concepts.DeployState;
import org.onap.policy.clamp.models.acm.concepts.LockState;
+import org.onap.policy.clamp.models.acm.concepts.ParticipantDeploy;
import org.onap.policy.clamp.models.acm.concepts.SubState;
import org.onap.policy.clamp.models.acm.document.concepts.DocToscaServiceTemplate;
import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
@Test
void testCreateAcElementDeployList() {
var automationComposition = getDummyAutomationComposition();
- var result = AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.DEPLOY);
+ var result = AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.DEPLOY, List.of());
assertThat(result).hasSameSizeAs(automationComposition.getElements().values());
for (var participantDeploy : result) {
for (var element : participantDeploy.getAcElementList()) {
}
}
+ @Test
+ void testAcDeployListWithRemovedElements() {
+ var removedElement1 = CommonTestData.getJsonObject(
+ "src/test/resources/json/AutomationCompositionElementNoOrderedState.json",
+ AutomationCompositionElement.class);
+ var participantId1 = UUID.randomUUID();
+ var participantId2 = UUID.randomUUID();
+ assert removedElement1 != null;
+ removedElement1.setParticipantId(participantId1);
+ var removedElement2 = new AutomationCompositionElement(removedElement1);
+ removedElement2.setParticipantId(participantId2);
+
+ var automationComposition = getDummyAutomationComposition();
+ var result = AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.DEPLOY,
+ List.of(removedElement1, removedElement2));
+ assertThat(result).hasSize(automationComposition.getElements().values().size() + 2);
+ var participantIds = result.stream().map(ParticipantDeploy::getParticipantId).toList();
+ assertThat(participantIds).containsAll(List.of(participantId1, participantId2));
+ }
+
@Test
void testCreateAcElementRestart() {
var element = getDummyAutomationComposition().getElements().values().iterator().next();
import org.onap.policy.clamp.models.acm.persistence.provider.AcInstanceStateResolver;
import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
-import org.onap.policy.clamp.models.acm.persistence.provider.ProviderUtils;
import org.onap.policy.clamp.models.acm.utils.AcmUtils;
import org.onap.policy.common.parameters.BeanValidationResult;
import org.onap.policy.models.base.PfModelRuntimeException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
encryptInstanceProperties(acToBeUpdated, acToBeUpdated.getCompositionTargetId());
var ac = automationCompositionProvider.updateAutomationComposition(acToBeUpdated);
- elementsRemoved.forEach(automationCompositionProvider::deleteAutomationCompositionElement);
+ for (var element : elementsRemoved) {
+ automationCompositionProvider.deleteAutomationCompositionElement(element.getId());
+ }
// Publish migrate event to the participants
- supervisionAcHandler.migrate(acToPublish, acDefinition.getRevisionId(), acDefinitionTarget.getRevisionId());
+ supervisionAcHandler.migrate(acToPublish, acDefinition.getRevisionId(), acDefinitionTarget.getRevisionId(),
+ elementsRemoved);
return createInstantiationResponse(ac);
}
acToBeUpdated.setStateChangeResult(StateChangeResult.NO_ERROR);
}
- private List<UUID> getElementRemoved(AutomationComposition acFromDb, AutomationComposition acFromMigration) {
- return acFromDb.getElements().keySet().stream()
- .filter(id -> acFromMigration.getElements().get(id) == null).toList();
+ private List<AutomationCompositionElement> getElementRemoved(AutomationComposition acFromDb,
+ AutomationComposition acFromMigration) {
+ return acFromDb.getElements().values().stream()
+ .filter(element -> acFromMigration.getElements().get(element.getId()) == null).toList();
}
var acDefinitionTarget = acDefinitionProvider.getAcDefinition(automationComposition.getCompositionTargetId());
AcDefinitionProvider.checkPrimedComposition(acDefinitionTarget);
// Iterate and update the element property values
- updateElementsProperties(automationComposition, copyAc, acDefinitionTarget);
+ var removedElements = updateElementsProperties(automationComposition, copyAc, acDefinitionTarget);
// Publish migrate event to the participants
- supervisionAcHandler.migratePrecheck(copyAc, acDefinition.getRevisionId(), acDefinitionTarget.getRevisionId());
+ supervisionAcHandler.migratePrecheck(copyAc, acDefinition.getRevisionId(), acDefinitionTarget.getRevisionId(),
+ removedElements);
AcmUtils.setCascadedState(acToBeUpdated, DeployState.DEPLOYED, LockState.LOCKED,
SubState.MIGRATION_PRECHECKING);
updateAcForMigration(acToBeUpdated, acDefinitionTarget, DeployState.MIGRATION_REVERTING);
var elementsRemoved = getElementRemoved(automationComposition, acToBeUpdated);
automationCompositionProvider.updateAutomationComposition(acToBeUpdated);
- elementsRemoved.forEach(automationCompositionProvider::deleteAutomationCompositionElement);
+ for (var element : elementsRemoved) {
+ automationCompositionProvider.deleteAutomationCompositionElement(element.getId());
+ }
var acDefinition = acDefinitionProvider.getAcDefinition(acToBeUpdated.getCompositionId());
- supervisionAcHandler.migrate(acToBeUpdated, acDefinition.getRevisionId(), acDefinitionTarget.getRevisionId());
+ supervisionAcHandler.migrate(acToBeUpdated, acDefinition.getRevisionId(), acDefinitionTarget.getRevisionId(),
+ elementsRemoved);
}
- private List<UUID> updateElementsProperties(AutomationComposition automationComposition,
+ private List<AutomationCompositionElement> updateElementsProperties(AutomationComposition automationComposition,
AutomationComposition acToBeUpdated, AutomationCompositionDefinition acDefinitionTarget) {
for (var element : automationComposition.getElements().entrySet()) {
var elementId = element.getKey();
}
// Remove element which is not present in the new Ac instance
var elementsRemoved = getElementRemoved(acToBeUpdated, automationComposition);
- elementsRemoved.forEach(uuid -> acToBeUpdated.getElements().remove(uuid));
+ elementsRemoved.forEach(element -> acToBeUpdated.getElements().remove(element.getId()));
var validationResult = validateAutomationComposition(acToBeUpdated, acDefinitionTarget);
if (!validationResult.isValid()) {
import io.micrometer.core.annotation.Timed;
import io.opentelemetry.context.Context;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import org.onap.policy.clamp.models.acm.concepts.AcElementDeployAck;
import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
import org.onap.policy.clamp.models.acm.concepts.DeployState;
import org.onap.policy.clamp.models.acm.concepts.LockState;
import org.onap.policy.clamp.models.acm.concepts.ParticipantUtils;
* @param revisionIdCompositionTarget the last Update from Composition Target
*/
public void migrate(AutomationComposition automationComposition, UUID revisionIdComposition,
- UUID revisionIdCompositionTarget) {
+ UUID revisionIdCompositionTarget, List<AutomationCompositionElement> removedElements) {
executor.execute(() -> {
encryptionUtils.decryptInstanceProperties(automationComposition);
acCompositionMigrationPublisher.send(automationComposition, automationComposition.getPhase(),
- revisionIdComposition, revisionIdCompositionTarget);
+ revisionIdComposition, revisionIdCompositionTarget, removedElements);
});
}
* @param revisionIdCompositionTarget the last Update from Composition Target
*/
public void migratePrecheck(AutomationComposition automationComposition, UUID revisionIdComposition,
- UUID revisionIdCompositionTarget) {
+ UUID revisionIdCompositionTarget, List<AutomationCompositionElement> removedElements) {
executor.execute(() -> acCompositionMigrationPublisher.send(automationComposition, 0,
- revisionIdComposition, revisionIdCompositionTarget));
+ revisionIdComposition, revisionIdCompositionTarget, removedElements));
}
}
import io.micrometer.core.annotation.Timed;
import java.time.Instant;
+import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import lombok.AllArgsConstructor;
propertiesUpdate.setTimestamp(Instant.now());
propertiesUpdate.setRevisionIdInstance(automationComposition.getRevisionId());
propertiesUpdate.setRevisionIdComposition(revisionIdComposition);
- var participantUpdatesList = AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.UPDATE);
+ var participantUpdatesList = AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.UPDATE,
+ List.of());
propertiesUpdate.setParticipantUpdatesList(participantUpdatesList);
propertiesUpdate.setParticipantIdList(participantUpdatesList.stream()
.map(ParticipantDeploy::getParticipantId).collect(Collectors.toSet()));
import io.micrometer.core.annotation.Timed;
import java.time.Instant;
+import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import lombok.AllArgsConstructor;
var acPrepare = createAutomationCompositionPrepare(automationComposition.getCompositionId(),
automationComposition.getInstanceId());
acPrepare.setStage(stage);
- var participantUpdatesList = AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.NONE);
+ var participantUpdatesList = AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.NONE,
+ List.of());
acPrepare.setParticipantList(participantUpdatesList);
acPrepare.setParticipantIdList(participantUpdatesList.stream()
.map(ParticipantDeploy::getParticipantId).collect(Collectors.toSet()));
package org.onap.policy.clamp.acm.runtime.supervision.comm;
import io.micrometer.core.annotation.Timed;
+import java.util.List;
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.concepts.DeployState;
import org.onap.policy.clamp.models.acm.concepts.ParticipantDeploy;
import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionMigration;
value = "publisher.automation_composition_migration",
description = "AUTOMATION_COMPOSITION_MIGRATION messages published")
public void send(AutomationComposition automationComposition, int stage, UUID revisionIdComposition,
- UUID revisionIdCompositionTarget) {
+ UUID revisionIdCompositionTarget, List<AutomationCompositionElement> removedElements) {
var acMigration = new AutomationCompositionMigration();
acMigration.setRollback(DeployState.MIGRATION_REVERTING.equals(automationComposition.getDeployState()));
acMigration.setPrecheck(Boolean.TRUE.equals(automationComposition.getPrecheck()));
acMigration.setRevisionIdInstance(automationComposition.getRevisionId());
acMigration.setRevisionIdComposition(revisionIdComposition);
acMigration.setRevisionIdCompositionTarget(revisionIdCompositionTarget);
- var participantUpdatesList = AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.MIGRATE);
+ var participantUpdatesList = AcmUtils.createParticipantDeployList(automationComposition, DeployOrder.MIGRATE,
+ removedElements);
acMigration.setParticipantUpdatesList(participantUpdatesList);
acMigration.setParticipantIdList(participantUpdatesList.stream()
.map(ParticipantDeploy::getParticipantId).collect(Collectors.toSet()));
package org.onap.policy.clamp.acm.runtime.supervision.scanner;
import java.util.Comparator;
+import java.util.List;
import java.util.UUID;
import org.onap.policy.clamp.acm.runtime.main.parameters.AcRuntimeParameterGroup;
import org.onap.policy.clamp.acm.runtime.main.utils.EncryptionUtils;
LOGGER.debug("retry message AutomationCompositionMigration");
// acDefinition for migration is the Composition target
acMigrationPublisher.send(automationComposition, minStageNotCompleted, revisionIdComposition,
- acDefinition.getRevisionId());
+ acDefinition.getRevisionId(), List.of());
}
if (SubState.PREPARING.equals(automationComposition.getSubState())) {
LOGGER.debug("retry message AutomationCompositionPrepare");
automationCompositionTarget.setPrecheck(true);
var preCheckResponse = instantiationProvider.updateAutomationComposition(compositionId,
automationCompositionTarget);
- verify(supervisionAcHandler).migratePrecheck(any(), any(), any());
+ verify(supervisionAcHandler).migratePrecheck(any(), any(), any(), any());
InstantiationUtils.assertInstantiationResponse(preCheckResponse, automationCompositionTarget);
automationCompositionTarget.setPrecheck(false);
var instantiationResponse = instantiationProvider.updateAutomationComposition(compositionId,
automationCompositionTarget);
- verify(supervisionAcHandler).migrate(any(), any(), any());
+ verify(supervisionAcHandler).migrate(any(), any(), any(), any());
InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationCompositionTarget);
}
var instantiationResponse = instantiationProvider
.updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
- verify(supervisionAcHandler).migrate(any(), any(), any());
+ verify(supervisionAcHandler).migrate(any(), any(), any(), any());
verify(acProvider).updateAutomationComposition(automationComposition);
InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
}
var instantiationResponse = instantiationProvider
.updateAutomationComposition(automationComposition.getCompositionId(), automationComposition);
- verify(supervisionAcHandler).migratePrecheck(any(), any(), any());
+ verify(supervisionAcHandler).migratePrecheck(any(), any(), any(), any());
verify(acProvider).updateAutomationComposition(automationComposition);
InstantiationUtils.assertInstantiationResponse(instantiationResponse, automationComposition);
import static org.mockito.Mockito.when;
import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate");
assert automationComposition != null;
automationComposition.setPhase(0);
- handler.migrate(automationComposition, UUID.randomUUID(), UUID.randomUUID());
+ handler.migrate(automationComposition, UUID.randomUUID(), UUID.randomUUID(), List.of());
verify(acCompositionMigrationPublisher, timeout(1000))
- .send(any(AutomationComposition.class), anyInt(), any(UUID.class), any(UUID.class));
+ .send(any(AutomationComposition.class), anyInt(), any(UUID.class), any(UUID.class), any());
}
@Test
mock(AcPreparePublisher.class), mock(MessageProvider.class), mock(EncryptionUtils.class));
var automationComposition =
InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate");
- handler.migratePrecheck(automationComposition, UUID.randomUUID(), UUID.randomUUID());
+ handler.migratePrecheck(automationComposition, UUID.randomUUID(), UUID.randomUUID(), List.of());
verify(acCompositionMigrationPublisher, timeout(1000))
- .send(any(AutomationComposition.class), anyInt(), any(UUID.class), any(UUID.class));
+ .send(any(AutomationComposition.class), anyInt(), any(UUID.class), any(UUID.class), any());
}
@Test
publisher.active(topicSink);
var automationComposition =
InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
- publisher.send(automationComposition, 0, UUID.randomUUID(), UUID.randomUUID());
+ publisher.send(automationComposition, 0, UUID.randomUUID(), UUID.randomUUID(), List.of());
verify(topicSink).send(anyString());
}