aboutsummaryrefslogtreecommitdiffstats
path: root/participant/participant-intermediary/src
diff options
context:
space:
mode:
authorrameshiyer27 <ramesh.murugan.iyer@est.tech>2023-05-18 16:47:10 +0100
committerLiam Fallon <liam.fallon@est.tech>2023-05-23 15:25:03 +0000
commit461bbdb67733552e78037bd96ca7efdfd3015e25 (patch)
treeefab4e35ea578f058879922588cd711d0e22d0ce /participant/participant-intermediary/src
parent4539ab951ef81839d38641fa09f2cbd490d71a63 (diff)
Update AC Element properties on the DEPLOYED state
User can update the instance property values on DEPLOYED state. The runtime sends PROPERTY_UPDATE event to the participants and the updated values are stored on the runtime database. Participants can implement the update method to perform the required action. Issue-ID: POLICY-4682 Signed-off-by: zrrmmua <ramesh.murugan.iyer@est.tech> Change-Id: Ic35fba669b5ffcf2c75d6deaa8c309d58e4026f0
Diffstat (limited to 'participant/participant-intermediary/src')
-rw-r--r--participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/api/AutomationCompositionElementListener.java5
-rw-r--r--participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/comm/AcPropertyUpdateListener.java49
-rw-r--r--participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/AutomationCompositionHandler.java95
-rw-r--r--participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/handler/ParticipantHandler.java14
4 files changed, 149 insertions, 14 deletions
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 d6ef80fbe..c8fd91d69 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
@@ -62,4 +62,9 @@ public interface AutomationCompositionElementListener {
throws PfModelException {
// default Delete Operation
}
+
+ public default void update(UUID automationCompositionId, AcElementDeploy element, Map<String, Object> properties)
+ throws PfModelException {
+ // default update Operation
+ }
}
diff --git a/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/comm/AcPropertyUpdateListener.java b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/comm/AcPropertyUpdateListener.java
new file mode 100644
index 000000000..d6f1970d7
--- /dev/null
+++ b/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/acm/participant/intermediary/comm/AcPropertyUpdateListener.java
@@ -0,0 +1,49 @@
+/*-
+ * ============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.AutomationCompositionDeploy;
+import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageType;
+import org.onap.policy.clamp.models.acm.messages.dmaap.participant.PropertiesUpdate;
+import org.springframework.stereotype.Component;
+
+/**
+ * Listener for AC Element property update messages sent by ACM.
+ */
+@Component
+public class AcPropertyUpdateListener extends ParticipantListener<PropertiesUpdate> {
+
+ /**
+ * Constructs the object.
+ *
+ * @param participantHandler the handler for managing the state of the participant
+ */
+ public AcPropertyUpdateListener(final ParticipantHandler participantHandler) {
+ super(PropertiesUpdate.class, participantHandler,
+ participantHandler::handleAcPropertyUpdate);
+ }
+
+ @Override
+ public String getType() {
+ return ParticipantMessageType.PROPERTIES_UPDATE.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 d33498518..9087054fe 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
@@ -49,6 +49,7 @@ import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCom
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.ParticipantStatus;
+import org.onap.policy.clamp.models.acm.messages.dmaap.participant.PropertiesUpdate;
import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
import org.onap.policy.clamp.models.acm.persistence.provider.AcInstanceStateResolver;
@@ -262,6 +263,33 @@ public class AutomationCompositionHandler {
}
/**
+ * Handle a automation composition properties update message.
+ *
+ * @param updateMsg the properties update message
+ * @param acElementDefinitions the list of AutomationCompositionElementDefinition
+ */
+ public void handleAcPropertyUpdate(PropertiesUpdate updateMsg,
+ List<AutomationCompositionElementDefinition> acElementDefinitions) {
+
+ if (updateMsg.getParticipantUpdatesList().isEmpty()) {
+ LOGGER.warn("No AutomationCompositionElement updates in message {}",
+ updateMsg.getAutomationCompositionId());
+ return;
+ }
+
+ for (var participantDeploy : updateMsg.getParticipantUpdatesList()) {
+ if (participantId.equals(participantDeploy.getParticipantId())) {
+
+ initializeDeploy(updateMsg.getMessageId(), updateMsg.getAutomationCompositionId(),
+ participantDeploy, DeployState.UPDATING);
+
+ callParticipantUpdateProperty(participantDeploy.getAcElementList(), acElementDefinitions,
+ updateMsg.getAutomationCompositionId());
+ }
+ }
+ }
+
+ /**
* Handle a automation composition Deploy message.
*
* @param updateMsg the Deploy message
@@ -280,28 +308,34 @@ public class AutomationCompositionHandler {
if (participantId.equals(participantDeploy.getParticipantId())) {
if (updateMsg.isFirstStartPhase()) {
initializeDeploy(updateMsg.getMessageId(), updateMsg.getAutomationCompositionId(),
- participantDeploy);
+ participantDeploy, DeployState.DEPLOYING);
}
- callParticipanDeploy(participantDeploy.getAcElementList(), acElementDefinitions,
+ callParticipantDeploy(participantDeploy.getAcElementList(), acElementDefinitions,
updateMsg.getStartPhase(), updateMsg.getAutomationCompositionId());
}
}
}
- private void initializeDeploy(UUID messageId, UUID instanceId, ParticipantDeploy participantDeploy) {
- var automationComposition = new AutomationComposition();
- automationComposition.setInstanceId(instanceId);
- var acElements = storeElementsOnThisParticipant(participantDeploy);
- automationComposition.setElements(prepareAcElementMap(acElements));
- automationCompositionMap.put(instanceId, automationComposition);
+ private void initializeDeploy(UUID messageId, UUID instanceId, ParticipantDeploy participantDeploy,
+ DeployState deployState) {
+ if (automationCompositionMap.containsKey(instanceId)) {
+ updateExistingElementsOnThisParticipant(instanceId, participantDeploy, deployState);
+ } else {
+ var automationComposition = new AutomationComposition();
+ automationComposition.setInstanceId(instanceId);
+ var acElements = storeElementsOnThisParticipant(participantDeploy, deployState);
+ automationComposition.setElements(prepareAcElementMap(acElements));
+ automationCompositionMap.put(instanceId, automationComposition);
+ }
}
- private void callParticipanDeploy(List<AcElementDeploy> acElements,
- List<AutomationCompositionElementDefinition> acElementDefinitions, Integer startPhaseMsg,
- UUID automationCompositionId) {
+ private void callParticipantDeploy(List<AcElementDeploy> acElements,
+ List<AutomationCompositionElementDefinition> acElementDefinitions,
+ Integer startPhaseMsg, UUID automationCompositionId) {
try {
for (var element : acElements) {
- var acElementNodeTemplate = getAcElementNodeTemplate(acElementDefinitions, element.getDefinition());
+ var acElementNodeTemplate = getAcElementNodeTemplate(acElementDefinitions,
+ element.getDefinition());
if (acElementNodeTemplate != null) {
int startPhase = ParticipantUtils.findStartPhase(acElementNodeTemplate.getProperties());
if (startPhaseMsg.equals(startPhase)) {
@@ -319,6 +353,27 @@ public class AutomationCompositionHandler {
}
+ private void callParticipantUpdateProperty(List<AcElementDeploy> acElements,
+ List<AutomationCompositionElementDefinition> acElementDefinitions,
+ UUID automationCompositionId) {
+ try {
+ for (var element : acElements) {
+ var acElementNodeTemplate = getAcElementNodeTemplate(acElementDefinitions,
+ element.getDefinition());
+ if (acElementNodeTemplate != null) {
+ for (var acElementListener : listeners) {
+ var map = new HashMap<>(acElementNodeTemplate.getProperties());
+ map.putAll(element.getProperties());
+ acElementListener.update(automationCompositionId, element, map);
+ }
+ }
+ }
+ } catch (PfModelException e) {
+ LOGGER.error("Automation composition element update failed for {} {}", automationCompositionId, e);
+ }
+
+ }
+
private ToscaNodeTemplate getAcElementNodeTemplate(
List<AutomationCompositionElementDefinition> acElementDefinitions, ToscaConceptIdentifier acElementDefId) {
@@ -330,20 +385,32 @@ public class AutomationCompositionHandler {
return null;
}
- private List<AutomationCompositionElement> storeElementsOnThisParticipant(ParticipantDeploy participantDeploy) {
+ private List<AutomationCompositionElement> storeElementsOnThisParticipant(ParticipantDeploy participantDeploy,
+ DeployState deployState) {
List<AutomationCompositionElement> acElementList = new ArrayList<>();
for (var element : participantDeploy.getAcElementList()) {
var acElement = new AutomationCompositionElement();
acElement.setId(element.getId());
acElement.setParticipantId(participantDeploy.getParticipantId());
acElement.setDefinition(element.getDefinition());
- acElement.setDeployState(DeployState.DEPLOYING);
+ acElement.setDeployState(deployState);
acElement.setLockState(LockState.NONE);
acElementList.add(acElement);
}
return acElementList;
}
+ private void updateExistingElementsOnThisParticipant(
+ UUID instanceId, ParticipantDeploy participantDeploy, DeployState deployState) {
+
+ Map<UUID, AutomationCompositionElement> elementList = automationCompositionMap.get(instanceId).getElements();
+ for (var element : participantDeploy.getAcElementList()) {
+ automationCompositionMap.get(instanceId).getElements().get(element.getId()).getProperties()
+ .putAll(element.getProperties());
+ automationCompositionMap.get(instanceId).getElements().get(element.getId()).setDeployState(deployState);
+ }
+ }
+
private Map<UUID, AutomationCompositionElement> prepareAcElementMap(List<AutomationCompositionElement> acElements) {
Map<UUID, AutomationCompositionElement> acElementMap = new LinkedHashMap<>();
for (var element : acElements) {
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 44a988a27..9e1216cec 100644
--- 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
@@ -47,6 +47,7 @@ import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantRe
import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantRegisterAck;
import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantStatus;
import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantStatusReq;
+import org.onap.policy.clamp.models.acm.messages.dmaap.participant.PropertiesUpdate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@@ -121,6 +122,19 @@ public class ParticipantHandler {
}
/**
+ * Handle a automation composition property update message.
+ *
+ * @param propertyUpdateMsg the property update message
+ */
+ @Timed(
+ value = "listener.properties_update",
+ description = "PROPERTIES_UPDATE message received")
+ public void handleAcPropertyUpdate(PropertiesUpdate propertyUpdateMsg) {
+ automationCompositionHandler.handleAcPropertyUpdate(propertyUpdateMsg,
+ acElementDefsMap.get(propertyUpdateMsg.getCompositionId()));
+ }
+
+ /**
* Check if a participant message applies to this participant handler.
*
* @param participantMsg the message to check