Add restart publisher to support participant restart scenario in ACM
Issue-ID: POLICY-4743
Change-Id: Iecb8b4f5f5bf9be788d3507354f267f73d8c53d8
Signed-off-by: FrancescoFioraEst <francesco.fiora@est.tech>
diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AcTypeState.java b/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AcTypeState.java
index 76851b4..8e36f7a 100644
--- a/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AcTypeState.java
+++ b/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/AcTypeState.java
@@ -25,5 +25,6 @@
COMMISSIONED,
PRIMING,
PRIMED,
- DEPRIMING
+ DEPRIMING,
+ RESTARTING
}
diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/ParticipantRestartAc.java b/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/ParticipantRestartAc.java
new file mode 100644
index 0000000..b8ee020
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/models/acm/concepts/ParticipantRestartAc.java
@@ -0,0 +1,57 @@
+/*-
+ * ============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.models.acm.concepts;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.models.base.PfUtils;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@ToString
+public class ParticipantRestartAc {
+
+ private UUID automationCompositionId;
+
+ // current state of auto composition
+ private DeployState deployState;
+ private LockState lockState;
+
+ private List<AcElementDeploy> acElementList = new ArrayList<>();
+
+ /**
+ * Copy constructor.
+ *
+ * @param copyConstructor the participant with updates to copy from
+ */
+ public ParticipantRestartAc(ParticipantRestartAc copyConstructor) {
+ this.automationCompositionId = copyConstructor.automationCompositionId;
+ this.deployState = copyConstructor.deployState;
+ this.lockState = copyConstructor.lockState;
+ this.acElementList = PfUtils.mapList(copyConstructor.acElementList, AcElementDeploy::new);
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/ParticipantMessageType.java b/models/src/main/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/ParticipantMessageType.java
index e60a132..c42778a 100644
--- a/models/src/main/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/ParticipantMessageType.java
+++ b/models/src/main/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/ParticipantMessageType.java
@@ -49,12 +49,6 @@
AUTOMATION_COMPOSITION_STATE_CHANGE,
/**
- * Used by the automation composition runtime to order a health check on participants, triggers a
- * PARTICIPANT_STATUS message with the result of the PARTICIPANT_HEALTH_CHECK operation.
- */
- PARTICIPANT_HEALTH_CHECK,
-
- /**
* Used by participant to register itself with automation composition runtime.
*/
PARTICIPANT_REGISTER,
@@ -108,8 +102,7 @@
PROPERTIES_UPDATE,
/**
- * Used by participant to acknowledge the receipt of PROPERTIES_UPDATE message
- * from automation composition runtime.
+ * Used by runtime to send composition and instances to a restarted participant.
*/
- PROPERTIES_UPDATE_ACK
+ PARTICIPANT_RESTART
}
diff --git a/models/src/main/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/ParticipantRestart.java b/models/src/main/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/ParticipantRestart.java
new file mode 100644
index 0000000..6b801ce
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/ParticipantRestart.java
@@ -0,0 +1,61 @@
+/*-
+ * ============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.models.acm.messages.dmaap.participant;
+
+import java.util.ArrayList;
+import java.util.List;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.clamp.models.acm.concepts.ParticipantDefinition;
+import org.onap.policy.clamp.models.acm.concepts.ParticipantRestartAc;
+import org.onap.policy.models.base.PfUtils;
+
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class ParticipantRestart extends ParticipantMessage {
+
+ // priming
+ private List<ParticipantDefinition> participantDefinitionUpdates = new ArrayList<>();
+
+ // autocomposition list
+ private List<ParticipantRestartAc> autocompositionList = new ArrayList<>();
+
+ /**
+ * Constructor.
+ */
+ public ParticipantRestart() {
+ super(ParticipantMessageType.PARTICIPANT_RESTART);
+ }
+
+ /**
+ * Constructs the object, making a deep copy.
+ *
+ * @param source source from which to copy
+ */
+ public ParticipantRestart(ParticipantRestart source) {
+ super(source);
+ this.participantDefinitionUpdates =
+ PfUtils.mapList(source.participantDefinitionUpdates, ParticipantDefinition::new);
+ this.autocompositionList = PfUtils.mapList(source.autocompositionList, ParticipantRestartAc::new);
+ }
+}
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 318b36a..24197f1 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
@@ -25,5 +25,6 @@
UNDEPLOY,
DEPLOY,
DELETE,
- UPDATE
+ UPDATE,
+ RESTARTING
}
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 671aca6..ee8e010 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
@@ -35,8 +35,10 @@
import lombok.NoArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
+import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
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.AutomationCompositionElement;
import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
import org.onap.policy.clamp.models.acm.concepts.DeployState;
import org.onap.policy.clamp.models.acm.concepts.LockState;
@@ -49,6 +51,7 @@
import org.onap.policy.common.parameters.ValidationResult;
import org.onap.policy.common.parameters.ValidationStatus;
import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.base.PfUtils;
import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
@@ -406,4 +409,21 @@
element.setLockState(lockState);
}
}
+
+ /**
+ * Create a new AcElementDeploy from an AutomationCompositionElement.
+ *
+ * @param element the AutomationCompositionElement
+ * @param deployOrder the DeployOrder
+ * @return the AcElementDeploy
+ */
+ public static AcElementDeploy createAcElementDeploy(AutomationCompositionElement element, DeployOrder deployOrder) {
+ var acElementDeploy = new AcElementDeploy();
+ acElementDeploy.setId(element.getId());
+ acElementDeploy.setDefinition(new ToscaConceptIdentifier(element.getDefinition()));
+ acElementDeploy.setOrderedState(deployOrder);
+ acElementDeploy.setProperties(PfUtils.mapMap(element.getProperties(), UnaryOperator.identity()));
+ return acElementDeploy;
+ }
+
}
diff --git a/models/src/test/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/ParticipantPrimeTest.java b/models/src/test/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/ParticipantPrimeTest.java
index 890fc55..859b422 100644
--- a/models/src/test/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/ParticipantPrimeTest.java
+++ b/models/src/test/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/ParticipantPrimeTest.java
@@ -29,13 +29,10 @@
import java.util.List;
import java.util.UUID;
import org.junit.jupiter.api.Test;
-import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
import org.onap.policy.clamp.models.acm.concepts.ParticipantDefinition;
import org.onap.policy.clamp.models.acm.utils.CommonTestData;
import org.onap.policy.common.utils.coder.CoderException;
import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
/**
* Test the copy constructor.
@@ -52,21 +49,9 @@
orig.setMessageId(UUID.randomUUID());
orig.setTimestamp(Instant.ofEpochMilli(3000));
- var toscaServiceTemplate = new ToscaServiceTemplate();
- toscaServiceTemplate.setName("serviceTemplate");
- toscaServiceTemplate.setDerivedFrom("parentServiceTemplate");
- toscaServiceTemplate.setDescription("Description of serviceTemplate");
- toscaServiceTemplate.setVersion("1.2.3");
-
- var toscaNodeTemplate = new ToscaNodeTemplate();
- toscaNodeTemplate.setName("nodeTemplate");
- toscaNodeTemplate.setDerivedFrom("parentNodeTemplate");
- toscaNodeTemplate.setDescription("Description of nodeTemplate");
- toscaNodeTemplate.setVersion("1.2.3");
-
var participantDefinitionUpdate = new ParticipantDefinition();
var type = new ToscaConceptIdentifier("id", "1.2.3");
- var acDefinition = getAcElementDefinition(type);
+ var acDefinition = CommonTestData.getAcElementDefinition(type);
participantDefinitionUpdate.setAutomationCompositionElementDefinitionList(List.of(acDefinition));
orig.setParticipantDefinitionUpdates(List.of(participantDefinitionUpdate));
@@ -76,17 +61,4 @@
assertSerializable(orig, ParticipantPrime.class);
}
-
- private AutomationCompositionElementDefinition getAcElementDefinition(ToscaConceptIdentifier id) {
- var toscaNodeTemplate = new ToscaNodeTemplate();
- toscaNodeTemplate.setName("nodeTemplate");
- toscaNodeTemplate.setDerivedFrom("parentNodeTemplate");
- toscaNodeTemplate.setDescription("Description of nodeTemplate");
- toscaNodeTemplate.setVersion("1.2.3");
-
- var acDefinition = new AutomationCompositionElementDefinition();
- acDefinition.setAcElementDefinitionId(id);
- acDefinition.setAutomationCompositionElementToscaNodeTemplate(toscaNodeTemplate);
- return acDefinition;
- }
}
diff --git a/models/src/test/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/ParticipantRestartTest.java b/models/src/test/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/ParticipantRestartTest.java
new file mode 100644
index 0000000..1ae607e
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/models/acm/messages/dmaap/participant/ParticipantRestartTest.java
@@ -0,0 +1,81 @@
+/*-
+ * ============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.models.acm.messages.dmaap.participant;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageUtils.assertSerializable;
+import static org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageUtils.removeVariableFields;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.UUID;
+import org.junit.jupiter.api.Test;
+import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
+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.ParticipantDefinition;
+import org.onap.policy.clamp.models.acm.concepts.ParticipantRestartAc;
+import org.onap.policy.clamp.models.acm.utils.CommonTestData;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+class ParticipantRestartTest {
+
+ @Test
+ void testCopyConstructor() throws CoderException {
+ assertThatThrownBy(() -> new ParticipantRestart(null)).isInstanceOf(NullPointerException.class);
+
+ final var orig = new ParticipantRestart();
+ // verify with null values
+ assertEquals(removeVariableFields(orig.toString()),
+ removeVariableFields(new ParticipantRestart(orig).toString()));
+
+ orig.setMessageId(UUID.randomUUID());
+ orig.setCompositionId(UUID.randomUUID());
+ orig.setTimestamp(Instant.ofEpochMilli(3000));
+ orig.setParticipantId(CommonTestData.getParticipantId());
+
+ var participantDefinitionUpdate = new ParticipantDefinition();
+ var type = new ToscaConceptIdentifier("id", "1.2.3");
+ var acDefinition = CommonTestData.getAcElementDefinition(type);
+ participantDefinitionUpdate.setAutomationCompositionElementDefinitionList(List.of(acDefinition));
+ orig.setParticipantDefinitionUpdates(List.of(participantDefinitionUpdate));
+
+ var acElement = new AcElementDeploy();
+ acElement.setId(UUID.randomUUID());
+ var id = new ToscaConceptIdentifier("id", "1.2.3");
+ acElement.setDefinition(id);
+
+ var acRestart = new ParticipantRestartAc();
+ acRestart.setAcElementList(List.of(acElement));
+ acRestart.setAutomationCompositionId(UUID.randomUUID());
+ acRestart.setDeployState(DeployState.DEPLOYED);
+ acRestart.setLockState(LockState.LOCKED);
+
+ orig.setAutocompositionList(List.of(acRestart));
+
+ assertEquals(removeVariableFields(orig.toString()),
+ removeVariableFields(new ParticipantRestart(orig).toString()));
+
+ assertSerializable(orig, ParticipantRestart.class);
+ }
+}
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 046d1b8..7e8f605 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
@@ -183,6 +183,15 @@
assertFalse(AcmUtils.isForward(DeployState.UNDEPLOYING, LockState.LOCKED));
}
+ @Test
+ void testCreateAcElementDeploy() {
+ var element = getDummyAutomationComposition().getElements().values().iterator().next();
+ var result = AcmUtils.createAcElementDeploy(element, DeployOrder.DEPLOY);
+ assertEquals(DeployOrder.DEPLOY, result.getOrderedState());
+ assertEquals(element.getId(), result.getId());
+ assertEquals(element.getDefinition(), result.getDefinition());
+ }
+
private AutomationComposition getDummyAutomationComposition() {
var automationComposition = new AutomationComposition();
automationComposition.setCompositionId(UUID.randomUUID());
diff --git a/models/src/test/java/org/onap/policy/clamp/models/acm/utils/CommonTestData.java b/models/src/test/java/org/onap/policy/clamp/models/acm/utils/CommonTestData.java
index 21666e4..03a3fb1 100644
--- a/models/src/test/java/org/onap/policy/clamp/models/acm/utils/CommonTestData.java
+++ b/models/src/test/java/org/onap/policy/clamp/models/acm/utils/CommonTestData.java
@@ -23,9 +23,12 @@
import static org.junit.jupiter.api.Assertions.fail;
import java.util.UUID;
+import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
import org.onap.policy.common.utils.coder.CoderException;
import org.onap.policy.common.utils.coder.StandardYamlCoder;
import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
/**
@@ -78,4 +81,23 @@
return null;
}
}
+
+ /**
+ * Get new AutomationCompositionElementDefinition.
+ *
+ * @param id the ToscaConceptIdentifier
+ * @return a new AutomationCompositionElementDefinition
+ */
+ public static AutomationCompositionElementDefinition getAcElementDefinition(ToscaConceptIdentifier id) {
+ var toscaNodeTemplate = new ToscaNodeTemplate();
+ toscaNodeTemplate.setName("nodeTemplate");
+ toscaNodeTemplate.setDerivedFrom("parentNodeTemplate");
+ toscaNodeTemplate.setDescription("Description of nodeTemplate");
+ toscaNodeTemplate.setVersion("1.2.3");
+
+ var acDefinition = new AutomationCompositionElementDefinition();
+ acDefinition.setAcElementDefinitionId(id);
+ acDefinition.setAutomationCompositionElementToscaNodeTemplate(toscaNodeTemplate);
+ return acDefinition;
+ }
}
diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AcElementPropertiesPublisher.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AcElementPropertiesPublisher.java
index c5f33ad..78a9e8a 100644
--- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AcElementPropertiesPublisher.java
+++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AcElementPropertiesPublisher.java
@@ -27,15 +27,13 @@
import java.util.List;
import java.util.Map;
import java.util.UUID;
-import java.util.function.UnaryOperator;
import lombok.AllArgsConstructor;
import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
import org.onap.policy.clamp.models.acm.concepts.ParticipantDeploy;
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.models.base.PfUtils;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.clamp.models.acm.utils.AcmUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@@ -47,7 +45,7 @@
@AllArgsConstructor
public class AcElementPropertiesPublisher extends AbstractParticipantPublisher<PropertiesUpdate> {
- private static final Logger LOGGER = LoggerFactory.getLogger(AutomationCompositionDeployPublisher.class);
+ private static final Logger LOGGER = LoggerFactory.getLogger(AcElementPropertiesPublisher.class);
/**
* Send ACElementPropertiesUpdate to Participant.
@@ -59,12 +57,7 @@
public void send(AutomationComposition automationComposition) {
Map<UUID, List<AcElementDeploy>> map = new HashMap<>();
for (var element : automationComposition.getElements().values()) {
- var acElementDeploy = new AcElementDeploy();
- acElementDeploy.setId(element.getId());
- acElementDeploy.setDefinition(new ToscaConceptIdentifier(element.getDefinition()));
- acElementDeploy.setOrderedState(DeployOrder.UPDATE);
- acElementDeploy.setProperties(PfUtils.mapMap(element.getProperties(), UnaryOperator.identity()));
-
+ var acElementDeploy = AcmUtils.createAcElementDeploy(element, DeployOrder.UPDATE);
map.putIfAbsent(element.getParticipantId(), new ArrayList<>());
map.get(element.getParticipantId()).add(acElementDeploy);
}
diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionDeployPublisher.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionDeployPublisher.java
index 2628f03..fbb6e14 100644
--- a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionDeployPublisher.java
+++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/AutomationCompositionDeployPublisher.java
@@ -29,7 +29,6 @@
import java.util.List;
import java.util.Map;
import java.util.UUID;
-import java.util.function.UnaryOperator;
import lombok.AllArgsConstructor;
import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
@@ -37,8 +36,6 @@
import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionDeploy;
import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
import org.onap.policy.clamp.models.acm.utils.AcmUtils;
-import org.onap.policy.models.base.PfUtils;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -67,11 +64,7 @@
var toscaServiceTemplateFragment = AcmUtils.getToscaServiceTemplateFragment(toscaServiceTemplate);
Map<UUID, List<AcElementDeploy>> map = new HashMap<>();
for (var element : automationComposition.getElements().values()) {
- var acElementDeploy = new AcElementDeploy();
- acElementDeploy.setId(element.getId());
- acElementDeploy.setDefinition(new ToscaConceptIdentifier(element.getDefinition()));
- acElementDeploy.setOrderedState(DeployOrder.DEPLOY);
- acElementDeploy.setProperties(PfUtils.mapMap(element.getProperties(), UnaryOperator.identity()));
+ var acElementDeploy = AcmUtils.createAcElementDeploy(element, DeployOrder.DEPLOY);
acElementDeploy.setToscaServiceTemplateFragment(toscaServiceTemplateFragment);
map.putIfAbsent(element.getParticipantId(), new ArrayList<>());
diff --git a/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantRestartPublisher.java b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantRestartPublisher.java
new file mode 100644
index 0000000..cb00c8e
--- /dev/null
+++ b/runtime-acm/src/main/java/org/onap/policy/clamp/acm/runtime/supervision/comm/ParticipantRestartPublisher.java
@@ -0,0 +1,103 @@
+/*-
+ * ============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.runtime.supervision.comm;
+
+import io.micrometer.core.annotation.Timed;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.UUID;
+import lombok.AllArgsConstructor;
+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.ParticipantDefinition;
+import org.onap.policy.clamp.models.acm.concepts.ParticipantRestartAc;
+import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantRestart;
+import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
+import org.onap.policy.clamp.models.acm.utils.AcmUtils;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+@AllArgsConstructor
+public class ParticipantRestartPublisher extends AbstractParticipantPublisher<ParticipantRestart> {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantRestartPublisher.class);
+
+ /**
+ * Send Restart to Participant.
+ *
+ */
+ @Timed(value = "publisher.participant_restart", description = "Participant Restart published")
+ public void send(UUID participantId, AutomationCompositionDefinition acmDefinition,
+ List<AutomationComposition> automationCompositions) {
+
+ var message = new ParticipantRestart();
+ message.setParticipantId(participantId);
+ message.setCompositionId(acmDefinition.getCompositionId());
+ message.setMessageId(UUID.randomUUID());
+ message.setTimestamp(Instant.now());
+ message.setParticipantDefinitionUpdates(prepareParticipantRestarting(participantId, acmDefinition));
+
+ for (var automationComposition : automationCompositions) {
+ var restartAc = new ParticipantRestartAc();
+ restartAc.setAutomationCompositionId(automationComposition.getInstanceId());
+ restartAc.setDeployState(automationComposition.getDeployState());
+ restartAc.setLockState(automationComposition.getLockState());
+ for (var element : automationComposition.getElements().values()) {
+ if (participantId.equals(element.getParticipantId())) {
+ var acElementDeploy = AcmUtils.createAcElementDeploy(element, DeployOrder.RESTARTING);
+ acElementDeploy.setToscaServiceTemplateFragment(acmDefinition.getServiceTemplate());
+ restartAc.getAcElementList().add(acElementDeploy);
+ }
+ }
+ message.getAutocompositionList().add(restartAc);
+ }
+
+ LOGGER.debug("Participant Restart sent {}", message);
+ super.send(message);
+ }
+
+ private List<ParticipantDefinition> prepareParticipantRestarting(UUID participantId,
+ AutomationCompositionDefinition acmDefinition) {
+ var acElements = AcmUtils.extractAcElementsFromServiceTemplate(acmDefinition.getServiceTemplate());
+
+ // list of entry entry filtered by participantId
+ List<Entry<String, ToscaNodeTemplate>> elementList = new ArrayList<>();
+ Map<ToscaConceptIdentifier, UUID> supportedElementMap = new HashMap<>();
+ for (var elementEntry : acElements) {
+ var elementState = acmDefinition.getElementStateMap().get(elementEntry.getKey());
+ if (participantId.equals(elementState.getParticipantId())) {
+ var type = new ToscaConceptIdentifier(elementEntry.getValue().getType(),
+ elementEntry.getValue().getTypeVersion());
+ supportedElementMap.put(type, participantId);
+ elementList.add(elementEntry);
+ }
+ }
+ return AcmUtils.prepareParticipantPriming(elementList, supportedElementMap);
+ }
+}