Update controlloop messages 98/123098/2
authorSirisha_Manchikanti <sirisha.manchikanti@est.tech>
Tue, 3 Aug 2021 16:49:00 +0000 (17:49 +0100)
committerSirisha_Manchikanti <sirisha.manchikanti@est.tech>
Wed, 4 Aug 2021 13:35:55 +0000 (14:35 +0100)
Updated controlloop messages according to
https://wiki.onap.org/display/DW/The+CLAMP+Control+Loop+Participant+Protocol

Issue-ID: POLICY-3417
Signed-off-by: Sirisha_Manchikanti <sirisha.manchikanti@est.tech>
Change-Id: Ied32ea5bb63a6b69286d03f1a7b2b86e3acad7a7

19 files changed:
models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopInfo.java [moved from models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheck.java with 50% similarity]
models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopStatistics.java [new file with mode: 0644]
models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ControlLoopAck.java
models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantAckMessage.java
models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseDetails.java [deleted file]
models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatus.java
models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ControlLoopAckTest.java
models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheckTest.java [deleted file]
models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatusTest.java
participant/participant-impl/participant-impl-dcae/src/test/java/org/onap/policy/clamp/controlloop/participant/dcae/main/rest/TestListenerUtils.java
participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/endtoend/ParticipantMessagesTest.java
participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/utils/TestListenerUtils.java
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/MessageSender.java
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ParticipantMessagePublisher.java
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ParticipantStatusReqListener.java [moved from participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/comm/ParticipantHealthCheckListener.java with 76% similarity]
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ControlLoopHandler.java
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/IntermediaryActivator.java
participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ParticipantHandler.java
runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/supervision/SupervisionHandler.java

  * ============LICENSE_END=========================================================
  */
 
-package org.onap.policy.clamp.controlloop.models.messages.dmaap.participant;
+package org.onap.policy.clamp.controlloop.models.controlloop.concepts;
 
-import lombok.Getter;
-import lombok.Setter;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 import lombok.ToString;
-import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
 
 /**
- * Class to represent the PARTICIPANT_HEALTHCHECK message that the control loop runtime will send to
- * participants to change the state of a control loop they are running.
+ * Class to represent a control loop info instance.
  */
-@Getter
-@Setter
-@ToString(callSuper = true)
-public class ParticipantHealthCheck extends ParticipantMessage {
-    private ParticipantState state;
+@NoArgsConstructor
+@Data
+@ToString
+public class ControlLoopInfo {
 
-    /**
-     * Constructor for instantiating ParticipantHealthCheck class with message name.
-     *
-     */
-    public ParticipantHealthCheck() {
-        super(ParticipantMessageType.PARTICIPANT_HEALTH_CHECK);
-    }
+    private ControlLoopState state = ControlLoopState.UNINITIALISED;
+
+    private ControlLoopStatistics controlLoopStatistics;
 
     /**
-     * Constructs the object, making a deep copy.
+     * Copy constructor, does a deep copy but as all fields here are immutable, it's just a regular copy.
      *
-     * @param source source from which to copy
+     * @param otherElement the other element to copy from
      */
-    public ParticipantHealthCheck(ParticipantHealthCheck source) {
-        super(source);
-
-        this.state = source.state;
+    public ControlLoopInfo(final ControlLoopInfo otherElement) {
+        this.state = otherElement.state;
+        this.controlLoopStatistics = otherElement.controlLoopStatistics;
     }
 }
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopStatistics.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopStatistics.java
new file mode 100644 (file)
index 0000000..685947b
--- /dev/null
@@ -0,0 +1,50 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 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.controlloop.models.controlloop.concepts;
+
+import java.time.Instant;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import lombok.ToString;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+@NoArgsConstructor
+@Data
+@ToString
+public class ControlLoopStatistics {
+
+    @NonNull
+    private ToscaConceptIdentifier controlLoopId;
+
+    @NonNull
+    private Instant timeStamp;
+
+    @NonNull
+    private ClElementStatisticsList clElementStatisticsList;
+
+    private long eventCount;
+    private long lastExecutionTime;
+    private double averageExecutionTime;
+    private long upTime;
+    private long lastEnterTime;
+    private long lastStart;
+}
index 6a72ec1..3411a03 100644 (file)
@@ -28,7 +28,6 @@ import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
 import org.apache.commons.lang3.tuple.Pair;
-import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElementDefinition;
 import org.onap.policy.models.base.PfUtils;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 
@@ -59,7 +58,7 @@ public class ControlLoopAck extends ParticipantAckMessage {
 
     // A map with ControlLoopElementID as its key, and a pair of result and message as value per
     // ControlLoopElement.
-    private Map<UUID, Map<UUID, Boolean>> controlLoopResultMap = new LinkedHashMap<>();
+    private Map<UUID, Pair<Boolean, String>> controlLoopResultMap = new LinkedHashMap<>();
 
     /**
      * Constructor for instantiating ParticipantRegisterAck class with message name.
@@ -79,7 +78,6 @@ public class ControlLoopAck extends ParticipantAckMessage {
         this.participantId = source.participantId;
         this.participantType = source.participantType;
         this.controlLoopId = source.controlLoopId;
-        this.controlLoopResultMap = PfUtils.mapMap(source.controlLoopResultMap,
-                clElementResultMap -> PfUtils.mapMap(clElementResultMap, UnaryOperator.identity()));
+        this.controlLoopResultMap = PfUtils.mapMap(source.controlLoopResultMap, UnaryOperator.identity());
     }
 }
index 1e53921..8b59a18 100644 (file)
@@ -24,6 +24,7 @@ import java.util.UUID;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 
 /**
  * Class to represent participant Ack message.
@@ -44,6 +45,16 @@ public class ParticipantAckMessage {
 
     private ParticipantMessageType messageType;
 
+    /**
+     * Participant Type, or {@code null} for messages from participants.
+     */
+    private ToscaConceptIdentifier participantType;
+
+    /**
+     * Participant ID, or {@code null} for messages from participants.
+     */
+    private ToscaConceptIdentifier participantId;
+
     /**
      * Constructor for instantiating a participant ack message class.
      *
@@ -63,5 +74,7 @@ public class ParticipantAckMessage {
         this.result = source.result;
         this.message = source.message;
         this.messageType = source.messageType;
+        this.participantType = source.participantType;
+        this.participantId = source.participantId;
     }
 }
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseDetails.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseDetails.java
deleted file mode 100644 (file)
index 4c771b4..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
-
-import java.util.UUID;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-import lombok.ToString;
-
-/**
- * Class to represent participant response details.
- */
-@Getter
-@Setter
-@ToString
-@NoArgsConstructor
-public class ParticipantResponseDetails {
-
-    // The responseTo field should match the original request id in the request.
-    private UUID responseTo;
-    private ParticipantResponseStatus responseStatus;
-    private String responseMessage;
-
-    /**
-     * Constructs the object as a response to.
-     *
-     * @param triggerMessage the message to which this is a response
-     */
-    public ParticipantResponseDetails(ParticipantMessage triggerMessage) {
-        this.responseMessage = null;
-        this.responseStatus = ParticipantResponseStatus.FAIL;
-        this.responseTo = triggerMessage.getMessageId();
-    }
-
-    /**
-     * Constructs the object, making a deep copy.
-     *
-     * @param source source from which to copy
-     */
-    public ParticipantResponseDetails(ParticipantResponseDetails source) {
-        this.responseMessage = source.responseMessage;
-        this.responseStatus = source.responseStatus;
-        this.responseTo = source.responseTo;
-    }
-}
index 5b92842..c3e6306 100644 (file)
 
 package org.onap.policy.clamp.controlloop.models.messages.dmaap.participant;
 
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.UUID;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
-import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElementDefinition;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopInfo;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.models.base.PfUtils;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 
 /**
  * Class to represent the PARTICIPANT_STATUS message that all the participants send to the control loop runtime.
@@ -35,21 +41,21 @@ import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant
 @Setter
 @ToString(callSuper = true)
 public class ParticipantStatus extends ParticipantMessage {
-    // The response should be completed if this message is a response to a request from the Control Loop Runtime
-    private ParticipantResponseDetails response;
 
     // State and health status of the participant
     private ParticipantState state;
     private ParticipantHealthStatus healthStatus;
 
-    // Control Loops on the participant
-    private ControlLoops controlLoops;
-
     // Participant statistics
     private ParticipantStatistics participantStatistics;
 
-    // Description. May be left {@code null}.
-    private String message;
+    // A map with Participant ID as its key, and a map of ControlLoopElements as value.
+    // Returned in response to ParticipantStatusReq only
+    private Map<ToscaConceptIdentifier, Map<UUID, ControlLoopElementDefinition>>
+            participantDefinitionUpdateMap = new LinkedHashMap<>();
+
+    // Map of ControlLoopInfo types indexed by ControlLoopId, one entry for each control loop
+    private Map<ToscaConceptIdentifier, ControlLoopInfo> controlLoopInfoMap;
 
     /**
      * Constructor for instantiating ParticipantStatus class with message name.
@@ -69,8 +75,10 @@ public class ParticipantStatus extends ParticipantMessage {
 
         this.state = source.state;
         this.healthStatus = source.healthStatus;
-        this.message = source.message;
-        this.controlLoops = (source.controlLoops == null ? null : new ControlLoops(source.controlLoops));
-        this.response = (source.response == null ? null : new ParticipantResponseDetails(source.response));
+        this.participantStatistics = (source.participantStatistics == null ? null : new ParticipantStatistics());
+        this.participantDefinitionUpdateMap = PfUtils.mapMap(source.participantDefinitionUpdateMap,
+                clElementDefinitionMap -> PfUtils.mapMap(clElementDefinitionMap,
+                        ControlLoopElementDefinition::new));
+        this.controlLoopInfoMap = PfUtils.mapMap(source.controlLoopInfoMap, ControlLoopInfo::new);
     }
 }
index 8734a43..d7d7e43 100644 (file)
@@ -26,6 +26,7 @@ import static org.onap.policy.clamp.controlloop.models.messages.dmaap.participan
 
 import java.util.Map;
 import java.util.UUID;
+import org.apache.commons.lang3.tuple.Pair;
 import org.junit.jupiter.api.Test;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 
@@ -48,8 +49,8 @@ class ControlLoopAckTest {
         orig.setParticipantId(id);
         orig.setParticipantType(id);
 
-        Map<UUID, Boolean> clElementResult = Map.of(UUID.randomUUID(), true);
-        final Map<UUID, Map<UUID, Boolean>> controlLoopResultMap = Map.of(UUID.randomUUID(), clElementResult);
+        Pair<Boolean, String> clElementResult = Pair.of(true, "ControlLoopElement result");
+        final Map<UUID, Pair<Boolean, String>> controlLoopResultMap = Map.of(UUID.randomUUID(), clElementResult);
         orig.setControlLoopResultMap(controlLoopResultMap);
 
         orig.setResponseTo(UUID.randomUUID());
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheckTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheckTest.java
deleted file mode 100644 (file)
index 52f1cc4..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * Copyright (C) 2021 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.controlloop.models.messages.dmaap.participant;
-
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.junit.Assert.assertEquals;
-import static org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageUtils.removeVariableFields;
-
-import java.time.Instant;
-import java.util.UUID;
-import org.junit.jupiter.api.Test;
-import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-
-/**
- * Test the copy constructor and other methods.
- */
-class ParticipantHealthCheckTest {
-
-    @Test
-    void testCopyConstructor() {
-        assertThatThrownBy(() -> new ParticipantHealthCheck(null)).isInstanceOf(NullPointerException.class);
-
-        ParticipantHealthCheck orig = new ParticipantHealthCheck();
-
-        // verify with null values
-        assertEquals(removeVariableFields(orig.toString()),
-                removeVariableFields(new ParticipantHealthCheck(orig).toString()));
-
-        // verify with all values
-        ToscaConceptIdentifier id = new ToscaConceptIdentifier();
-        id.setName("id");
-        id.setVersion("1.2.3");
-        orig.setControlLoopId(id);
-        orig.setParticipantId(id);
-        orig.setMessageId(UUID.randomUUID());
-        orig.setState(ParticipantState.ACTIVE);
-        orig.setTimestamp(Instant.ofEpochMilli(3000));
-
-        assertEquals(removeVariableFields(orig.toString()),
-                        removeVariableFields(new ParticipantHealthCheck(orig).toString()));
-    }
-}
index 706e58b..05cfdd7 100644 (file)
@@ -25,10 +25,20 @@ import static org.junit.Assert.assertEquals;
 import static org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageUtils.removeVariableFields;
 
 import java.time.Instant;
+import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 import org.junit.jupiter.api.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatisticsList;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElementDefinition;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopInfo;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 
 class ParticipantStatusTest {
 
@@ -43,20 +53,64 @@ class ParticipantStatusTest {
                 removeVariableFields(new ParticipantStatus(orig).toString()));
 
         // verify with all values
-        ToscaConceptIdentifier id = new ToscaConceptIdentifier();
-        id.setName("id");
-        id.setVersion("1.2.3");
+        ToscaConceptIdentifier id = new ToscaConceptIdentifier("id", "1.2.3");
         orig.setControlLoopId(id);
         orig.setParticipantId(id);
+        orig.setParticipantType(id);
         orig.setMessageId(UUID.randomUUID());
         orig.setState(ParticipantState.ACTIVE);
+        orig.setHealthStatus(ParticipantHealthStatus.HEALTHY);
         orig.setTimestamp(Instant.ofEpochMilli(3000));
 
-        final ParticipantResponseDetails resp = new ParticipantResponseDetails();
-        resp.setResponseMessage("my-response");
-        orig.setResponse(resp);
+        ControlLoopInfo clInfo = getControlLoopInfo(id);
+        orig.setControlLoopInfoMap(Map.of(id, clInfo));
+
+        ControlLoopElementDefinition clDefinition = getClElementDefinition();
+        Map<UUID, ControlLoopElementDefinition> clElementDefinitionMap = Map.of(UUID.randomUUID(), clDefinition);
+        Map<ToscaConceptIdentifier, Map<UUID, ControlLoopElementDefinition>>
+            participantDefinitionUpdateMap = Map.of(id, clElementDefinitionMap);
+        orig.setParticipantDefinitionUpdateMap(participantDefinitionUpdateMap);
 
         assertEquals(removeVariableFields(orig.toString()),
                 removeVariableFields(new ParticipantStatus(orig).toString()));
     }
+
+    private ControlLoopInfo getControlLoopInfo(ToscaConceptIdentifier id) {
+        ControlLoopInfo clInfo = new ControlLoopInfo();
+        clInfo.setState(ControlLoopState.PASSIVE2RUNNING);
+
+        ControlLoopStatistics clStatistics = new ControlLoopStatistics();
+        clStatistics.setControlLoopId(id);
+        clStatistics.setAverageExecutionTime(12345);
+        clStatistics.setEventCount(12345);
+        clStatistics.setLastEnterTime(12345);
+        clStatistics.setLastExecutionTime(12345);
+        clStatistics.setLastStart(12345);
+        clStatistics.setTimeStamp(Instant.ofEpochMilli(3000));
+        clStatistics.setUpTime(12345);
+        ClElementStatisticsList clElementStatisticsList = new ClElementStatisticsList();
+        ClElementStatistics clElementStatistics = new ClElementStatistics();
+        clElementStatistics.setParticipantId(new ToscaConceptIdentifier("defName", "0.0.1"));
+        clElementStatistics.setTimeStamp(Instant.now());
+        clElementStatisticsList.setClElementStatistics(List.of(clElementStatistics));
+        clStatistics.setClElementStatisticsList(clElementStatisticsList);
+
+        clInfo.setControlLoopStatistics(clStatistics);
+        return clInfo;
+    }
+
+    private ControlLoopElementDefinition getClElementDefinition() {
+        ToscaServiceTemplate toscaServiceTemplate = new ToscaServiceTemplate();
+        toscaServiceTemplate.setName("serviceTemplate");
+        toscaServiceTemplate.setDerivedFrom("parentServiceTemplate");
+        toscaServiceTemplate.setDescription("Description of serviceTemplate");
+        toscaServiceTemplate.setVersion("1.2.3");
+
+        ControlLoopElementDefinition clDefinition = new ControlLoopElementDefinition();
+        clDefinition.setId(UUID.randomUUID());
+        clDefinition.setControlLoopElementToscaServiceTemplate(toscaServiceTemplate);
+        Map<String, String> commonPropertiesMap = Map.of("Prop1", "PropValue");
+        clDefinition.setCommonPropertiesMap(commonPropertiesMap);
+        return clDefinition;
+    }
 }
index bb1021d..136d0e5 100644 (file)
@@ -32,7 +32,6 @@ import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopStateChange;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopUpdate;
-import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantHealthCheck;
 import org.onap.policy.common.utils.coder.Coder;
 import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.common.utils.coder.StandardCoder;
@@ -169,29 +168,6 @@ public class TestListenerUtils {
         return new ControlLoopUpdate(cpy);
     }
 
-    /**
-     * Method to create ParticipantHealthCheck message.
-     *
-     * @return ParticipantHealthCheck message
-     */
-    public static ParticipantHealthCheck createParticipantHealthCheckMsg() {
-        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier();
-        participantId.setName("DCAEParticipant0");
-        participantId.setVersion("1.0.0");
-
-        ToscaConceptIdentifier controlLoopId = new ToscaConceptIdentifier();
-        controlLoopId.setName("PMSHInstance0");
-        controlLoopId.setVersion("1.0.0");
-
-        final ParticipantHealthCheck participantHealthCheckMsg = new ParticipantHealthCheck();
-        participantHealthCheckMsg.setParticipantId(participantId);
-        participantHealthCheckMsg.setControlLoopId(controlLoopId);
-        participantHealthCheckMsg.setTimestamp(Instant.now());
-        participantHealthCheckMsg.setState(ParticipantState.PASSIVE);
-
-        return participantHealthCheckMsg;
-    }
-
     /**
      * Method to create ControlLoopUpdate using the arguments passed.
      *
index 093ac19..aed0355 100644 (file)
@@ -24,15 +24,22 @@ import static org.assertj.core.api.Assertions.assertThatCode;
 
 import java.time.Instant;
 import java.util.Collections;
+import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mockito;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatisticsList;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElementDefinition;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopInfo;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopStatistics;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantDeregister;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantDeregisterAck;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantRegister;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantRegisterAck;
-import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantResponseDetails;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStatus;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantUpdate;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantUpdateAck;
@@ -45,6 +52,7 @@ import org.onap.policy.clamp.controlloop.participant.policy.main.utils.TestListe
 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
 import org.onap.policy.common.endpoints.event.comm.TopicSink;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
@@ -146,9 +154,16 @@ class ParticipantMessagesTest {
     @Test
     void testParticipantStatusHeartbeat() throws Exception {
         final ParticipantStatus heartbeat = new ParticipantStatus();
-        heartbeat.setMessage("ParticipantStatus message");
-        heartbeat.setResponse(new ParticipantResponseDetails());
         heartbeat.setParticipantId(getParticipantId());
+        ControlLoopInfo clInfo = getControlLoopInfo(getControlLoopId());
+        heartbeat.setControlLoopInfoMap(Map.of(getControlLoopId(), clInfo));
+
+        ControlLoopElementDefinition clDefinition = getClElementDefinition();
+        Map<UUID, ControlLoopElementDefinition> clElementDefinitionMap = Map.of(UUID.randomUUID(), clDefinition);
+        Map<ToscaConceptIdentifier, Map<UUID, ControlLoopElementDefinition>>
+            participantDefinitionUpdateMap = Map.of(getParticipantId(), clElementDefinitionMap);
+        heartbeat.setParticipantDefinitionUpdateMap(participantDefinitionUpdateMap);
+
         synchronized (lockit) {
             ParticipantMessagePublisher publisher =
                     new ParticipantMessagePublisher(Collections.singletonList(Mockito.mock(TopicSink.class)));
@@ -156,7 +171,6 @@ class ParticipantMessagesTest {
         }
     }
 
-
     private ToscaConceptIdentifier getParticipantId() {
         return new ToscaConceptIdentifier("org.onap.PM_Policy", "1.0.0");
     }
@@ -164,4 +178,47 @@ class ParticipantMessagesTest {
     private ToscaConceptIdentifier getParticipantType() {
         return new ToscaConceptIdentifier("org.onap.policy.controlloop.PolicyControlLoopParticipant", "2.3.1");
     }
+
+    private ToscaConceptIdentifier getControlLoopId() {
+        return new ToscaConceptIdentifier("PMSHInstance0", "1.0.0");
+    }
+
+    private ControlLoopInfo getControlLoopInfo(ToscaConceptIdentifier id) {
+        ControlLoopInfo clInfo = new ControlLoopInfo();
+        clInfo.setState(ControlLoopState.PASSIVE2RUNNING);
+
+        ControlLoopStatistics clStatistics = new ControlLoopStatistics();
+        clStatistics.setControlLoopId(id);
+        clStatistics.setAverageExecutionTime(12345);
+        clStatistics.setEventCount(12345);
+        clStatistics.setLastEnterTime(12345);
+        clStatistics.setLastExecutionTime(12345);
+        clStatistics.setLastStart(12345);
+        clStatistics.setTimeStamp(Instant.ofEpochMilli(3000));
+        clStatistics.setUpTime(12345);
+        ClElementStatisticsList clElementStatisticsList = new ClElementStatisticsList();
+        ClElementStatistics clElementStatistics = new ClElementStatistics();
+        clElementStatistics.setParticipantId(new ToscaConceptIdentifier("defName", "0.0.1"));
+        clElementStatistics.setTimeStamp(Instant.now());
+        clElementStatisticsList.setClElementStatistics(List.of(clElementStatistics));
+        clStatistics.setClElementStatisticsList(clElementStatisticsList);
+
+        clInfo.setControlLoopStatistics(clStatistics);
+        return clInfo;
+    }
+
+    private ControlLoopElementDefinition getClElementDefinition() {
+        ToscaServiceTemplate toscaServiceTemplate = new ToscaServiceTemplate();
+        toscaServiceTemplate.setName("serviceTemplate");
+        toscaServiceTemplate.setDerivedFrom("parentServiceTemplate");
+        toscaServiceTemplate.setDescription("Description of serviceTemplate");
+        toscaServiceTemplate.setVersion("1.2.3");
+
+        ControlLoopElementDefinition clDefinition = new ControlLoopElementDefinition();
+        clDefinition.setId(UUID.randomUUID());
+        clDefinition.setControlLoopElementToscaServiceTemplate(toscaServiceTemplate);
+        Map<String, String> commonPropertiesMap = Map.of("Prop1", "PropValue");
+        clDefinition.setCommonPropertiesMap(commonPropertiesMap);
+        return clDefinition;
+    }
 }
index fe7e17f..b91cff2 100644 (file)
@@ -37,7 +37,6 @@ import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopStateChange;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopUpdate;
-import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantHealthCheck;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantUpdate;
 import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.CommonTestData;
 import org.onap.policy.common.utils.coder.Coder;
@@ -156,6 +155,7 @@ public class TestListenerUtils {
             clElementParticipantId.setName(toscaInputEntry.getKey());
             clElementParticipantId.setVersion(toscaInputEntry.getValue().getVersion());
             clElement.setParticipantId(clElementParticipantId);
+            clElement.setParticipantType(clElementParticipantId);
 
             clElement.setDefinition(clElementParticipantId);
             clElement.setState(ControlLoopState.UNINITIALISED);
@@ -209,29 +209,6 @@ public class TestListenerUtils {
         return participantUpdateMsg;
     }
 
-    /**
-     * Method to create ParticipantHealthCheck message.
-     *
-     * @return ParticipantHealthCheck message
-     */
-    public static ParticipantHealthCheck createParticipantHealthCheckMsg() {
-        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier();
-        participantId.setName("org.onap.PM_Policy");
-        participantId.setVersion("0.0.0");
-
-        ToscaConceptIdentifier controlLoopId = new ToscaConceptIdentifier();
-        controlLoopId.setName("PMSHInstance0");
-        controlLoopId.setVersion("1.0.0");
-
-        final ParticipantHealthCheck participantHealthCheckMsg = new ParticipantHealthCheck();
-        participantHealthCheckMsg.setParticipantId(participantId);
-        participantHealthCheckMsg.setControlLoopId(controlLoopId);
-        participantHealthCheckMsg.setTimestamp(Instant.now());
-        participantHealthCheckMsg.setState(ParticipantState.PASSIVE);
-
-        return participantHealthCheckMsg;
-    }
-
     /**
      * Method to create ControlLoopUpdate using the arguments passed.
      *
index 1741d95..3ff420f 100644 (file)
@@ -22,7 +22,10 @@ package org.onap.policy.clamp.controlloop.participant.intermediary.comm;
 
 import java.io.Closeable;
 import java.time.Instant;
+import java.util.LinkedHashMap;
+import java.util.Map;
 import java.util.TimerTask;
+import java.util.UUID;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -30,9 +33,9 @@ import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopAck;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantDeregister;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantRegister;
-import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantResponseDetails;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantResponseStatus;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStatus;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantUpdateAck;
@@ -84,48 +87,23 @@ public class MessageSender extends TimerTask implements Closeable {
     /**
      * Send a response message for this participant.
      *
-     * @param response the details to include in the response message
+     * @param ackMessage the details to include in the response message
      */
-    public void sendResponse(ParticipantResponseDetails response) {
-        sendResponse(null, response);
+    public void sendAckResponse(ControlLoopAck ackMessage) {
+        sendAckResponse(null, ackMessage);
     }
 
     /**
      * Dispatch a response message for this participant.
      *
      * @param controlLoopId the control loop to which this message is a response
-     * @param response the details to include in the response message
+     * @param ackMessage the details to include in the response message
      */
-    public void sendResponse(ToscaConceptIdentifier controlLoopId, ParticipantResponseDetails response) {
-        var status = new ParticipantStatus();
-
+    public void sendAckResponse(ToscaConceptIdentifier controlLoopId, ControlLoopAck ackMessage) {
         // Participant related fields
-        status.setParticipantType(participantHandler.getParticipantType());
-        status.setParticipantId(participantHandler.getParticipantId());
-        status.setState(participantHandler.getState());
-        status.setHealthStatus(participantHandler.getHealthStatus());
-
-        // Control loop related fields
-        var controlLoops = participantHandler.getControlLoopHandler().getControlLoops();
-        status.setControlLoopId(controlLoopId);
-        status.setControlLoops(controlLoops);
-        status.setResponse(response);
-
-        var participantStatistics = new ParticipantStatistics();
-        participantStatistics.setTimeStamp(Instant.now());
-        participantStatistics.setParticipantId(participantHandler.getParticipantId());
-        participantStatistics.setHealthStatus(participantHandler.getHealthStatus());
-        participantStatistics.setState(participantHandler.getState());
-        status.setParticipantStatistics(participantStatistics);
-
-        for (ControlLoopElementListener clElementListener :
-            participantHandler.getControlLoopHandler().getListeners()) {
-            updateClElementStatistics(controlLoops, clElementListener);
-        }
-
-        status.setControlLoops(controlLoops);
-
-        publisher.sendParticipantStatus(status);
+        ackMessage.setParticipantType(participantHandler.getParticipantType());
+        ackMessage.setParticipantId(participantHandler.getParticipantId());
+        publisher.sendControlLoopAck(ackMessage);
     }
 
     /**
@@ -155,6 +133,21 @@ public class MessageSender extends TimerTask implements Closeable {
         publisher.sendParticipantUpdateAck(message);
     }
 
+    /**
+     * Send a ParticipantStatus message for this participant.
+     *
+     * @param participantStatus the ParticipantStatus message
+     */
+    public void sendParticipantStatus(ParticipantStatus participantStatus) {
+        var controlLoops = participantHandler.getControlLoopHandler().getControlLoops();
+        for (ControlLoopElementListener clElementListener :
+            participantHandler.getControlLoopHandler().getListeners()) {
+            updateClElementStatistics(controlLoops, clElementListener);
+        }
+
+        publisher.sendParticipantStatus(participantStatus);
+    }
+
     /**
      * Dispatch a heartbeat for this participant.
      */
index 051f000..d8cc9eb 100644 (file)
@@ -21,6 +21,7 @@
 package org.onap.policy.clamp.controlloop.participant.intermediary.comm;
 
 import java.util.List;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopAck;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantDeregister;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantRegister;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStatus;
@@ -91,6 +92,16 @@ public class ParticipantMessagePublisher {
         LOGGER.debug("Sent Participant Update Ack message to CLAMP - {}", participantUpdateAck);
     }
 
+    /**
+     * Method to send ControlLoop Update/StateChange Ack message to runtime.
+     *
+     * @param controlLoopAck ControlLoop Update/StateChange Ack
+     */
+    public void sendControlLoopAck(final ControlLoopAck controlLoopAck) {
+        topicSinkClient.send(controlLoopAck);
+        LOGGER.debug("Sent ControlLoop Update/StateChange Ack to runtime - {}", controlLoopAck);
+    }
+
     /**
      * Method to send Participant heartbeat to clamp on demand.
      *
 
 package org.onap.policy.clamp.controlloop.participant.intermediary.comm;
 
-import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantHealthCheck;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStatusReq;
 import org.onap.policy.clamp.controlloop.participant.intermediary.handler.ParticipantHandler;
 import org.springframework.stereotype.Component;
 
 /**
- * Listener for Participant health status messages sent by CLAMP.
+ * Listener for Participant status request messages sent by runtime to all/one participant.
  */
 @Component
-public class ParticipantHealthCheckListener extends ParticipantListener<ParticipantHealthCheck> {
+public class ParticipantStatusReqListener extends ParticipantListener<ParticipantStatusReq> {
 
     /**
      * Constructs the object.
      *
      * @param participantHandler the handler for managing the state and health of the participant
      */
-    public ParticipantHealthCheckListener(final ParticipantHandler participantHandler) {
-        super(ParticipantHealthCheck.class, participantHandler, participantHandler::handleParticipantHealthCheck);
+    public ParticipantStatusReqListener(final ParticipantHandler participantHandler) {
+        super(ParticipantStatusReq.class, participantHandler, participantHandler::handleParticipantStatusReq);
     }
 }
index c9da127..876a4cc 100644 (file)
@@ -28,6 +28,7 @@ import java.util.UUID;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.tuple.Pair;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
@@ -35,10 +36,10 @@ import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopAck;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopStateChange;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopUpdate;
-import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantResponseDetails;
-import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantResponseStatus;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageType;
 import org.onap.policy.clamp.controlloop.participant.intermediary.api.ControlLoopElementListener;
 import org.onap.policy.clamp.controlloop.participant.intermediary.comm.MessageSender;
 import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
@@ -60,6 +61,7 @@ public class ControlLoopHandler {
 
     private final Map<ToscaConceptIdentifier, ControlLoop> controlLoopMap = new LinkedHashMap<>();
 
+    @Getter
     private final Map<UUID, ControlLoopElement> elementsOnThisParticipant = new LinkedHashMap<>();
 
     @Getter
@@ -93,21 +95,23 @@ public class ControlLoopHandler {
             ControlLoopState newState) {
 
         if (id == null) {
-            return null;
+            LOGGER.warn("Cannot update Control loop element state, id is null");
         }
 
+        ControlLoopAck controlLoopStateChangeAck =
+                new ControlLoopAck(ParticipantMessageType.CONTROLLOOP_STATECHANGE_ACK);
         ControlLoopElement clElement = elementsOnThisParticipant.get(id);
         if (clElement != null) {
             clElement.setOrderedState(orderedState);
             clElement.setState(newState);
+            controlLoopStateChangeAck.getControlLoopResultMap().put(clElement.getId(),
+                Pair.of(true, "Control loop element {} state changed to {}\", id, newState)"));
             LOGGER.debug("Control loop element {} state changed to {}", id, newState);
-            var response = new ParticipantResponseDetails();
-            response.setResponseStatus(ParticipantResponseStatus.SUCCESS);
-            response.setResponseMessage("ControlLoopElement state changed to {} " + newState);
-            messageSender.sendResponse(response);
+            controlLoopStateChangeAck.setMessage("ControlLoopElement state changed to {} " + newState);
+            controlLoopStateChangeAck.setResult(true);
+            messageSender.sendAckResponse(controlLoopStateChangeAck);
             return clElement;
         }
-
         return null;
     }
 
@@ -143,9 +147,11 @@ public class ControlLoopHandler {
             return;
         }
 
-        var response = new ParticipantResponseDetails(stateChangeMsg);
-        handleState(controlLoop, response, stateChangeMsg.getOrderedState());
-        messageSender.sendResponse(response);
+        var controlLoopStateChangeAck = new ControlLoopAck(ParticipantMessageType.CONTROLLOOP_STATECHANGE_ACK);
+        controlLoopStateChangeAck.setResponseTo(stateChangeMsg.getMessageId());
+        controlLoopStateChangeAck.setControlLoopId(stateChangeMsg.getControlLoopId());
+        handleState(controlLoop, controlLoopStateChangeAck, stateChangeMsg.getOrderedState());
+        messageSender.sendAckResponse(controlLoopStateChangeAck);
     }
 
     /**
@@ -155,7 +161,7 @@ public class ControlLoopHandler {
      * @param response participant response
      * @param orderedState controlloop ordered state
      */
-    private void handleState(final ControlLoop controlLoop, final ParticipantResponseDetails response,
+    private void handleState(final ControlLoop controlLoop, final ControlLoopAck response,
             ControlLoopOrderedState orderedState) {
         switch (orderedState) {
             case UNINITIALISED:
@@ -187,16 +193,17 @@ public class ControlLoopHandler {
 
         var controlLoop = controlLoopMap.get(updateMsg.getControlLoopId());
 
-        var response = new ParticipantResponseDetails(updateMsg);
+        var controlLoopUpdateAck = new ControlLoopAck(ParticipantMessageType.CONTROLLOOP_UPDATE_ACK);
 
         // TODO: Updates to existing ControlLoops are not supported yet (Addition/Removal of ControlLoop
         // elements to existing ControlLoop has to be supported).
         if (controlLoop != null) {
-            response.setResponseStatus(ParticipantResponseStatus.FAIL);
-            response.setResponseMessage("Control loop " + updateMsg.getControlLoopId()
-                    + " already defined on participant " + participantId);
-
-            messageSender.sendResponse(response);
+            controlLoopUpdateAck.setResponseTo(updateMsg.getMessageId());
+            controlLoopUpdateAck.setControlLoopId(updateMsg.getControlLoopId());
+            controlLoopUpdateAck.setMessage("Control loop " + updateMsg.getControlLoopId()
+                + " already defined on participant " + participantId);
+            controlLoopUpdateAck.setResult(false);
+            messageSender.sendAckResponse(controlLoopUpdateAck);
             return;
         }
 
@@ -221,11 +228,12 @@ public class ControlLoopHandler {
             }
         }
 
-        response.setResponseStatus(ParticipantResponseStatus.SUCCESS);
-        response.setResponseMessage(
-                "Control loop " + updateMsg.getControlLoopId() + " defined on participant " + participantId);
-
-        messageSender.sendResponse(response);
+        controlLoopUpdateAck.setResponseTo(updateMsg.getMessageId());
+        controlLoopUpdateAck.setControlLoopId(updateMsg.getControlLoopId());
+        controlLoopUpdateAck.setMessage("Control loop " + updateMsg.getControlLoopId()
+                + " defined on participant " + participantId);
+        controlLoopUpdateAck.setResult(true);
+        messageSender.sendAckResponse(controlLoopUpdateAck);
     }
 
     /**
@@ -236,7 +244,7 @@ public class ControlLoopHandler {
      * @param response participant response
      */
     private void handleUninitialisedState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState,
-            final ParticipantResponseDetails response) {
+            final ControlLoopAck response) {
         handleStateChange(controlLoop, orderedState, ControlLoopState.UNINITIALISED, response);
         controlLoopMap.remove(controlLoop.getKey().asIdentifier());
 
@@ -259,7 +267,7 @@ public class ControlLoopHandler {
      * @param response participant response
      */
     private void handlePassiveState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState,
-            final ParticipantResponseDetails response) {
+            final ControlLoopAck response) {
         handleStateChange(controlLoop, orderedState, ControlLoopState.PASSIVE, response);
     }
 
@@ -271,7 +279,7 @@ public class ControlLoopHandler {
      * @param response participant response
      */
     private void handleRunningState(final ControlLoop controlLoop, final ControlLoopOrderedState orderedState,
-            final ParticipantResponseDetails response) {
+            final ControlLoopAck response) {
         handleStateChange(controlLoop, orderedState, ControlLoopState.RUNNING, response);
     }
 
@@ -284,11 +292,11 @@ public class ControlLoopHandler {
      * @param response the response to the state change request
      */
     private void handleStateChange(ControlLoop controlLoop, final ControlLoopOrderedState orderedState,
-            ControlLoopState newState, ParticipantResponseDetails response) {
+            ControlLoopState newState, ControlLoopAck response) {
 
         if (orderedState.equals(controlLoop.getOrderedState())) {
-            response.setResponseStatus(ParticipantResponseStatus.SUCCESS);
-            response.setResponseMessage("Control loop is already in state " + orderedState);
+            response.setMessage("Control loop is already in state " + orderedState);
+            response.setResult(false);
             return;
         }
 
@@ -299,9 +307,8 @@ public class ControlLoopHandler {
             });
         }
 
-        response.setResponseStatus(ParticipantResponseStatus.SUCCESS);
-        response.setResponseMessage(
-                "ControlLoop state changed from " + controlLoop.getOrderedState() + " to " + orderedState);
+        response.setMessage("ControlLoop state changed from " + controlLoop.getOrderedState() + " to " + orderedState);
+        response.setResult(true);
         controlLoop.setOrderedState(orderedState);
     }
 
index f846b2d..4fc0ae1 100644 (file)
@@ -28,8 +28,8 @@ import org.onap.policy.clamp.controlloop.participant.intermediary.api.Participan
 import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ControlLoopStateChangeListener;
 import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ControlLoopUpdateListener;
 import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ParticipantDeregisterAckListener;
-import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ParticipantHealthCheckListener;
 import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ParticipantRegisterAckListener;
+import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ParticipantStatusReqListener;
 import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ParticipantUpdateListener;
 import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantParameters;
 import org.onap.policy.common.endpoints.event.comm.TopicEndpointManager;
@@ -119,8 +119,8 @@ public class IntermediaryActivator extends ServiceManagerContainer implements Cl
     private void registerMsgDispatcher() {
         MessageTypeDispatcher msgDispatcher = applicationContext.getBean(MessageTypeDispatcher.class);
 
-        msgDispatcher.register(ParticipantMessageType.PARTICIPANT_HEALTH_CHECK.name(),
-                applicationContext.getBean(ParticipantHealthCheckListener.class));
+        msgDispatcher.register(ParticipantMessageType.PARTICIPANT_STATUS_REQ.name(),
+                applicationContext.getBean(ParticipantStatusReqListener.class));
 
         msgDispatcher.register(ParticipantMessageType.CONTROL_LOOP_STATE_CHANGE.name(),
                 applicationContext.getBean(ControlLoopStateChangeListener.class));
index 9daff72..6a0e758 100644 (file)
@@ -32,17 +32,18 @@ import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantHealthStatus;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopAck;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopStateChange;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ControlLoopUpdate;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantDeregister;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantDeregisterAck;
-import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantHealthCheck;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessage;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageType;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantRegister;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantRegisterAck;
-import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantResponseDetails;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantResponseStatus;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStatus;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStatusReq;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantUpdate;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantUpdateAck;
 import org.onap.policy.clamp.controlloop.participant.intermediary.comm.MessageSender;
@@ -99,14 +100,15 @@ public class ParticipantHandler implements Closeable {
     /**
      * Method which handles a participant health check event from clamp.
      *
-     * @param healthCheckMsg participant health check message
+     * @param participantStatusReqMsg participant participantStatusReq message
      */
-    public void handleParticipantHealthCheck(final ParticipantHealthCheck healthCheckMsg) {
-        var response = new ParticipantResponseDetails(healthCheckMsg);
-        response.setResponseStatus(ParticipantResponseStatus.SUCCESS);
-        response.setResponseMessage(healthStatus.toString());
-
-        sender.sendResponse(response);
+    public void handleParticipantStatusReq(final ParticipantStatusReq participantStatusReqMsg) {
+        ParticipantStatus participantStatus = new ParticipantStatus();
+        participantStatus.setParticipantId(participantId);
+        participantStatus.setParticipantStatistics(participantStatistics);
+        participantStatus.setParticipantType(participantType);
+        participantStatus.setHealthStatus(healthStatus);
+        sender.sendParticipantStatus(participantStatus);
     }
 
     /**
@@ -127,13 +129,13 @@ public class ParticipantHandler implements Closeable {
         controlLoopHandler.handleControlLoopStateChange(stateChangeMsg);
     }
 
-    private void handleStateChange(ParticipantState newParticipantState, ParticipantResponseDetails response) {
+    private void handleStateChange(ParticipantState newParticipantState, ParticipantUpdateAck response) {
         if (state.equals(newParticipantState)) {
-            response.setResponseStatus(ParticipantResponseStatus.SUCCESS);
-            response.setResponseMessage("Participant already in state " + newParticipantState);
+            response.setResult(false);
+            response.setMessage("Participant already in state " + newParticipantState);
         } else {
-            response.setResponseStatus(ParticipantResponseStatus.SUCCESS);
-            response.setResponseMessage("Participant state changed from " + state + " to " + newParticipantState);
+            response.setResult(true);
+            response.setMessage("Participant state changed from " + state + " to " + newParticipantState);
             state = newParticipantState;
         }
     }
@@ -150,9 +152,10 @@ public class ParticipantHandler implements Closeable {
             LOGGER.debug("No participant with this ID {}", definition.getName());
             return null;
         }
-        var response = new ParticipantResponseDetails();
-        handleStateChange(participantState, response);
-        sender.sendResponse(response);
+
+        var participantUpdateAck = new ParticipantUpdateAck();
+        handleStateChange(participantState, participantUpdateAck);
+        sender.sendParticipantUpdateAck(participantUpdateAck);
         return getParticipant(definition.getName(), definition.getVersion());
     }
 
@@ -257,6 +260,8 @@ public class ParticipantHandler implements Closeable {
         participantUpdateAck.setResponseTo(messageId);
         participantUpdateAck.setMessage("Participant Update Ack message");
         participantUpdateAck.setResult(true);
+        participantUpdateAck.setParticipantId(participantId);
+        participantUpdateAck.setParticipantType(participantType);
 
         sender.sendParticipantUpdateAck(participantUpdateAck);
     }
@@ -270,7 +275,6 @@ public class ParticipantHandler implements Closeable {
         heartbeat.setParticipantStatistics(participantStatistics);
         heartbeat.setParticipantType(participantType);
         heartbeat.setHealthStatus(healthStatus);
-        heartbeat.setMessage("Participant heartbeat message sent from -> " + participantId.getName());
         return heartbeat;
     }
 }
index dadfe0d..16dba0f 100644 (file)
 package org.onap.policy.clamp.controlloop.runtime.supervision;
 
 import java.util.List;
+import java.util.Map;
 import javax.ws.rs.core.Response;
 import lombok.AllArgsConstructor;
 import org.apache.commons.collections4.CollectionUtils;
 import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopInfo;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
@@ -310,39 +312,17 @@ public class SupervisionHandler {
 
     private void superviseControlLoops(ParticipantStatus participantStatusMessage)
             throws PfModelException, ControlLoopException {
-        if (CollectionUtils.isEmpty(participantStatusMessage.getControlLoops().getControlLoopList())) {
-            return;
-        }
-
-        for (ControlLoop controlLoop : participantStatusMessage.getControlLoops().getControlLoopList()) {
-            if (controlLoop == null) {
-                exceptionOccured(Response.Status.NOT_FOUND,
-                        "PARTICIPANT_STATUS message references unknown control loop: " + controlLoop);
-            }
-
-            var dbControlLoop = controlLoopProvider
-                    .getControlLoop(new ToscaConceptIdentifier(controlLoop.getName(), controlLoop.getVersion()));
+        for (Map.Entry<ToscaConceptIdentifier, ControlLoopInfo> clEntry :
+                participantStatusMessage.getControlLoopInfoMap().entrySet()) {
+            var dbControlLoop = controlLoopProvider.getControlLoop(new ToscaConceptIdentifier(
+                                clEntry.getKey().getName(), clEntry.getKey().getVersion()));
             if (dbControlLoop == null) {
                 exceptionOccured(Response.Status.NOT_FOUND,
-                        "PARTICIPANT_STATUS control loop not found in database: " + controlLoop);
+                        "PARTICIPANT_STATUS control loop not found in database: " + clEntry.getKey());
             }
-
-            for (ControlLoopElement element : controlLoop.getElements().values()) {
-                ControlLoopElement dbElement = dbControlLoop.getElements().get(element.getId());
-
-                if (dbElement == null) {
-                    exceptionOccured(Response.Status.NOT_FOUND,
-                            "PARTICIPANT_STATUS message references unknown control loop element: " + element);
-                }
-
-                // Replace element entry in the database
-                dbControlLoop.getElements().put(element.getId(), element);
-            }
-            controlLoopProvider.updateControlLoop(dbControlLoop);
-        }
-
-        for (ControlLoop controlLoop : participantStatusMessage.getControlLoops().getControlLoopList()) {
-            monitoringProvider.createClElementStatistics(controlLoop.getControlLoopElementStatisticsList(controlLoop));
+            dbControlLoop.setState(clEntry.getValue().getState());
+            monitoringProvider.createClElementStatistics(clEntry.getValue()
+                .getControlLoopStatistics().getClElementStatisticsList().getClElementStatistics());
         }
     }