aboutsummaryrefslogtreecommitdiffstats
path: root/participant/participant-intermediary/src/main/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'participant/participant-intermediary/src/main/java/org')
-rwxr-xr-xparticipant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/ParticipantIntermediaryApi.java40
-rwxr-xr-xparticipant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/comm/AutomationCompositionMigrationListener.java40
-rwxr-xr-xparticipant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandler.java45
-rwxr-xr-xparticipant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionOutHandler.java5
-rwxr-xr-xparticipant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ParticipantHandler.java14
-rwxr-xr-x[-rw-r--r--]participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ThreadHandler.java27
6 files changed, 164 insertions, 7 deletions
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 bca5f4830..9b3279232 100755
--- 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
@@ -74,27 +74,59 @@ public interface ParticipantIntermediaryApi {
*/
AutomationCompositionElement getAutomationCompositionElement(UUID automationCompositionId, UUID elementId);
+ /**
+ * Get a copy of all AutomationCompositionElementDefinition from all primed compositions.
+ *
+ * @return a Map by compositionId of Maps of AutomationCompositionElement
+ */
Map<UUID, Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition>> getAcElementsDefinitions();
+ /**
+ * Get a copy of AutomationCompositionElementDefinitions of a composition.
+ *
+ * @param compositionId the composition id
+ * @return a Map by element definition Id of AutomationCompositionElementDefinitions
+ */
Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> getAcElementsDefinitions(UUID compositionId);
- AutomationCompositionElementDefinition getAcElementDefinition(UUID compositionId,
- ToscaConceptIdentifier elementId);
+ /**
+ * Get a copy of the AutomationCompositionElementDefinition by compositionId and element definition Id.
+ *
+ * @param compositionId the composition id
+ * @param elementId the element definition Id
+ * @return the AutomationCompositionElementDefinition
+ */
+ AutomationCompositionElementDefinition getAcElementDefinition(UUID compositionId, ToscaConceptIdentifier elementId);
/**
* Send Automation Composition Element update Info to AC-runtime.
*
* @param automationCompositionId the ID of the automation composition to update the states
- * @param id the ID of the automation composition element to update the states
+ * @param elementId the ID of the automation composition element to update the states
* @param useState the use State
* @param operationalState the operational State
* @param outProperties the output Properties Map
*/
- void sendAcElementInfo(UUID automationCompositionId, UUID id, String useState, String operationalState,
+ void sendAcElementInfo(UUID automationCompositionId, UUID elementId, String useState, String operationalState,
Map<String, Object> outProperties);
+ /**
+ * Send Automation Composition Definition update Info to AC-runtime.
+ *
+ * @param compositionId the composition id
+ * @param elementId the element definition Id
+ * @param outProperties the output Properties Map
+ */
void sendAcDefinitionInfo(UUID compositionId, ToscaConceptIdentifier elementId, Map<String, Object> outProperties);
+ /**
+ * Update the state of a Automation Composition Definition.
+ *
+ * @param compositionId the composition id
+ * @param state the state of Automation Composition Definition
+ * @param stateChangeResult the indicator if error occurs
+ * @param message the message
+ */
void updateCompositionState(UUID compositionId, AcTypeState state, StateChangeResult stateChangeResult,
String message);
}
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/comm/AutomationCompositionMigrationListener.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/comm/AutomationCompositionMigrationListener.java
new file mode 100755
index 000000000..265502ec1
--- /dev/null
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/comm/AutomationCompositionMigrationListener.java
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2023 Nordix Foundation.
+ * ================================================================================
+ * 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.participant.intermediary.comm;
+
+import org.onap.policy.clamp.acm.participant.intermediary.handler.ParticipantHandler;
+import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionMigration;
+import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageType;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AutomationCompositionMigrationListener extends ParticipantListener<AutomationCompositionMigration> {
+
+ protected AutomationCompositionMigrationListener(final ParticipantHandler participantHandler) {
+ super(AutomationCompositionMigration.class, participantHandler,
+ participantHandler::handleAutomationCompositionMigration);
+ }
+
+ @Override
+ public String getType() {
+ return ParticipantMessageType.AUTOMATION_COMPOSITION_MIGRATION.name();
+ }
+}
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 c7cb54893..02fce5548 100755
--- 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
@@ -24,6 +24,7 @@ package org.onap.policy.clamp.acm.participant.intermediary.handler;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
+import lombok.NonNull;
import org.onap.policy.clamp.acm.participant.intermediary.comm.ParticipantMessagePublisher;
import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
@@ -37,6 +38,7 @@ 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.messages.dmaap.participant.AutomationCompositionDeploy;
import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionDeployAck;
+import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionMigration;
import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionStateChange;
import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageType;
import org.onap.policy.clamp.models.acm.messages.dmaap.participant.PropertiesUpdate;
@@ -194,7 +196,8 @@ public class AutomationCompositionHandler {
for (var participantDeploy : updateMsg.getParticipantUpdatesList()) {
if (cacheProvider.getParticipantId().equals(participantDeploy.getParticipantId())) {
- updateExistingElementsOnThisParticipant(updateMsg.getAutomationCompositionId(), participantDeploy);
+ updateExistingElementsOnThisParticipant(updateMsg.getAutomationCompositionId(), participantDeploy,
+ DeployState.UPDATING);
callParticipantUpdateProperty(updateMsg.getMessageId(), participantDeploy.getAcElementList(),
updateMsg.getAutomationCompositionId());
@@ -245,11 +248,13 @@ public class AutomationCompositionHandler {
}
}
- private void updateExistingElementsOnThisParticipant(UUID instanceId, ParticipantDeploy participantDeploy) {
+ private void updateExistingElementsOnThisParticipant(UUID instanceId, ParticipantDeploy participantDeploy,
+ DeployState deployState) {
var acElementList = cacheProvider.getAutomationComposition(instanceId).getElements();
for (var element : participantDeploy.getAcElementList()) {
var acElement = acElementList.get(element.getId());
acElement.getProperties().putAll(element.getProperties());
+ acElement.setDeployState(deployState);
}
}
@@ -360,4 +365,40 @@ public class AutomationCompositionHandler {
}
listener.restarted(messageId, compositionId, list, state, automationCompositionList);
}
+
+ /**
+ * Handles AutomationComposition Migration.
+ *
+ * @param migrationMsg the AutomationCompositionMigration
+ */
+ public void handleAutomationCompositionMigration(AutomationCompositionMigration migrationMsg) {
+ if (migrationMsg.getAutomationCompositionId() == null || migrationMsg.getCompositionTargetId() == null) {
+ return;
+ }
+
+ var automationComposition = cacheProvider.getAutomationComposition(migrationMsg.getAutomationCompositionId());
+ if (automationComposition == null) {
+ LOGGER.debug("Automation composition {} does not use this participant",
+ migrationMsg.getAutomationCompositionId());
+ return;
+ }
+ automationComposition.setCompositionTargetId(migrationMsg.getCompositionTargetId());
+ for (var participantDeploy : migrationMsg.getParticipantUpdatesList()) {
+ if (cacheProvider.getParticipantId().equals(participantDeploy.getParticipantId())) {
+
+ updateExistingElementsOnThisParticipant(migrationMsg.getAutomationCompositionId(), participantDeploy,
+ DeployState.MIGRATING);
+
+ callParticipantMigrate(migrationMsg.getMessageId(), participantDeploy.getAcElementList(),
+ migrationMsg.getAutomationCompositionId(), migrationMsg.getCompositionTargetId());
+ }
+ }
+ }
+
+ private void callParticipantMigrate(UUID messageId, List<AcElementDeploy> acElements, UUID instanceId,
+ UUID compositionTargetId) {
+ for (var element : acElements) {
+ listener.migrate(messageId, instanceId, element, compositionTargetId, element.getProperties());
+ }
+ }
}
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionOutHandler.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionOutHandler.java
index 7e4fedbf3..e2e93dabb 100755
--- a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionOutHandler.java
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionOutHandler.java
@@ -123,6 +123,11 @@ public class AutomationCompositionOutHandler {
var checkOpt = automationComposition.getElements().values().stream()
.filter(acElement -> !deployState.equals(acElement.getDeployState())).findAny();
if (checkOpt.isEmpty()) {
+ if (DeployState.MIGRATING.equals(automationComposition.getDeployState())) {
+ // migration scenario
+ automationComposition.setCompositionId(automationComposition.getCompositionTargetId());
+ automationComposition.setCompositionTargetId(null);
+ }
automationComposition.setDeployState(deployState);
automationComposition.setLockState(element.getLockState());
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ParticipantHandler.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ParticipantHandler.java
index 6b025c78c..8d33b3ed6 100755
--- a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ParticipantHandler.java
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ParticipantHandler.java
@@ -31,6 +31,7 @@ import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
import org.onap.policy.clamp.models.acm.concepts.ParticipantState;
import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionDeploy;
+import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionMigration;
import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionStateChange;
import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantAckMessage;
import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantDeregister;
@@ -56,7 +57,6 @@ public class ParticipantHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantHandler.class);
private final AutomationCompositionHandler automationCompositionHandler;
- private final AutomationCompositionOutHandler automationCompositionOutHandler;
private final ParticipantMessagePublisher publisher;
private final CacheProvider cacheProvider;
@@ -95,6 +95,18 @@ public class ParticipantHandler {
}
/**
+ * Handle a automation composition migration message.
+ *
+ * @param migrationMsg the migration message
+ */
+ @Timed(
+ value = "listener.automation_composition_migration",
+ description = "AUTOMATION_COMPOSITION_MIGRATION messages received")
+ public void handleAutomationCompositionMigration(AutomationCompositionMigration migrationMsg) {
+ automationCompositionHandler.handleAutomationCompositionMigration(migrationMsg);
+ }
+
+ /**
* Handle a automation composition property update message.
*
* @param propertyUpdateMsg the property update message
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ThreadHandler.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ThreadHandler.java
index 2018d435f..e29562a6e 100644..100755
--- a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ThreadHandler.java
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ThreadHandler.java
@@ -328,4 +328,31 @@ public class ThreadHandler implements Closeable {
public void close() throws IOException {
executor.shutdown();
}
+
+ /**
+ * Handles AutomationComposition Migration.
+ *
+ * @param messageId the messageId
+ * @param instanceId the automationComposition Id
+ * @param element the information on the automation composition element
+ * @param compositionTargetId the composition to migrate
+ */
+ public void migrate(UUID messageId, UUID instanceId, AcElementDeploy element, UUID compositionTargetId,
+ Map<String, Object> properties) {
+ cleanExecution(element.getId(), messageId);
+ var result = executor.submit(() -> this.migrateProcess(instanceId, element, compositionTargetId, properties));
+ executionMap.put(element.getId(), result);
+ }
+
+ private void migrateProcess(UUID instanceId, AcElementDeploy element, UUID compositionTargetId,
+ Map<String, Object> properties) {
+ try {
+ listener.migrate(instanceId, element, compositionTargetId, properties);
+ } catch (PfModelException e) {
+ LOGGER.error("Automation composition element migrate failed {} {}", instanceId, e.getMessage());
+ intermediaryApi.updateAutomationCompositionElementState(instanceId, element.getId(), DeployState.DEPLOYED,
+ null, StateChangeResult.FAILED, "Automation composition element migrate failed");
+ }
+ executionMap.remove(element.getId());
+ }
}