summaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
Diffstat (limited to 'models')
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatistics.java53
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatisticsList.java33
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoop.java113
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElement.java75
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopOrderedState.java44
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopState.java63
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoops.java47
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/Participant.java73
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantHealthStatus.java47
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantState.java61
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatistics.java52
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatisticsList.java33
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaClElementStatistics.java194
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoop.java258
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopElement.java251
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipant.java220
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantStatistics.java237
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProvider.java154
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProvider.java248
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantProvider.java195
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProvider.java159
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopNotification.java56
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopStatus.java36
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChange.java56
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdate.java63
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheck.java56
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessage.java113
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageType.java56
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseDetails.java64
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseStatus.java42
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChange.java56
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatus.java76
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/SimpleResponse.java37
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/TypedSimpleResponse.java35
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/commissioning/CommissioningResponse.java38
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationCommand.java35
-rw-r--r--models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationResponse.java38
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatisticsTest.java67
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopConceptPojosTest.java62
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElementTest.java81
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopTest.java102
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatisticsTest.java65
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantTest.java84
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaClElementStatisticsChild.java28
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaControlLoopChild.java28
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaControlLoopElementChild.java28
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaParticipantChild.java28
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaParticipantStatisticsChild.java28
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaClElementStatisticsTest.java189
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopElementTest.java300
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopTest.java296
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantStatisticsTest.java193
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantTest.java253
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/PojosTest.java62
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProviderTest.java115
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProviderTest.java160
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantProviderTest.java154
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProviderTest.java109
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopNotificationTest.java83
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopStatusTest.java48
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/NotificationPojosTest.java58
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChangeTest.java61
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdateTest.java71
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheckTest.java61
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageTest.java103
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageUtils.java35
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantPojosTest.java61
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChangeTest.java61
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatusTest.java62
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/rest/MessagesRestPojosTest.java59
-rw-r--r--models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationCommandTest.java60
-rw-r--r--models/src/test/resources/META-INF/persistence.xml138
-rw-r--r--models/src/test/resources/json/ControlLoopElementNoOrderedState.json13
-rw-r--r--models/src/test/resources/json/ControlLoopNoOrderedState.json12
-rw-r--r--models/src/test/resources/providers/TestClElementStatistics.json24
-rw-r--r--models/src/test/resources/providers/TestControlLoops.json142
-rw-r--r--models/src/test/resources/providers/TestParticipant.json11
-rw-r--r--models/src/test/resources/providers/TestParticipantStatistics.json32
-rw-r--r--models/src/test/resources/providers/UpdateControlLoops.json73
79 files changed, 7167 insertions, 0 deletions
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatistics.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatistics.java
new file mode 100644
index 000000000..4ef9bdcd9
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatistics.java
@@ -0,0 +1,53 @@
+/*-
+ * ============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.io.Serializable;
+import java.time.Instant;
+import java.util.UUID;
+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 ClElementStatistics implements Serializable {
+
+ private static final long serialVersionUID = 3284285693112271055L;
+
+ @NonNull
+ private UUID id = UUID.randomUUID();
+
+ @NonNull
+ private ToscaConceptIdentifier participantId;
+
+ @NonNull
+ private Instant timeStamp;
+
+ @NonNull
+ private ControlLoopState controlLoopState;
+
+ private long clElementUptime;
+
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatisticsList.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatisticsList.java
new file mode 100644
index 000000000..166f1e48f
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatisticsList.java
@@ -0,0 +1,33 @@
+/*-
+ * ============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.util.List;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter
+@Setter
+@ToString
+public class ClElementStatisticsList {
+ private List<ClElementStatistics> clElementStatistics;
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoop.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoop.java
new file mode 100644
index 000000000..d0d79274c
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoop.java
@@ -0,0 +1,113 @@
+/*-
+ * ============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.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.stream.Collectors;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import org.apache.commons.collections4.MapUtils;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfUtils;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
+
+/**
+ * Class to represent a control loop instance.
+ */
+@NoArgsConstructor
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ControlLoop extends ToscaEntity implements Comparable<ControlLoop> {
+ @NonNull
+ private ToscaConceptIdentifier definition = new ToscaConceptIdentifier(PfConceptKey.getNullKey());
+
+ @NonNull
+ private ControlLoopState state = ControlLoopState.UNINITIALISED;
+
+ @NonNull
+ private ControlLoopOrderedState orderedState = ControlLoopOrderedState.UNINITIALISED;
+
+ private Map<UUID, ControlLoopElement> elements;
+
+ @Override
+ public String getType() {
+ return definition.getName();
+ }
+
+ @Override
+ public String getTypeVersion() {
+ return definition.getVersion();
+ }
+
+ /**
+ * Copy contructor, does a deep copy.
+ *
+ * @param otherControlLoop the other element to copy from
+ */
+ public ControlLoop(final ControlLoop otherControlLoop) {
+ super(otherControlLoop);
+ this.definition = new ToscaConceptIdentifier(otherControlLoop.definition);
+ this.state = otherControlLoop.state;
+ this.orderedState = otherControlLoop.orderedState;
+ this.elements = PfUtils.mapMap(otherControlLoop.elements, ControlLoopElement::new);
+ }
+
+ @Override
+ public int compareTo(final ControlLoop other) {
+ return compareNameVersion(this, other);
+ }
+
+ /**
+ * Set the ordered state on the control loop and on all its control loop elements.
+ *
+ * @param orderedState the state we want the control loop to transition to
+ */
+ public void setCascadedOrderedState(final ControlLoopOrderedState orderedState) {
+ this.orderedState = orderedState;
+
+ if (MapUtils.isEmpty(elements)) {
+ return;
+ }
+
+ elements.values().forEach(element -> element.setOrderedState(orderedState));
+ }
+
+ /**
+ * Get a list of control loop element statistics.
+ *
+ * @param controlLoop the control loop
+ * @return List of ClElementStatistics
+ */
+ public List<ClElementStatistics> getControlLoopElementStatisticsList(final ControlLoop controlLoop) {
+ if (MapUtils.isEmpty(controlLoop.elements)) {
+ return null;
+ }
+
+ return controlLoop.elements.values().stream().map(ControlLoopElement::getClElementStatistics)
+ .collect(Collectors.toList());
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElement.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElement.java
new file mode 100644
index 000000000..83f062c74
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElement.java
@@ -0,0 +1,75 @@
+/*-
+ * ============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.util.UUID;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import lombok.ToString;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to represent a control loop instance.
+ */
+@NoArgsConstructor
+@Data
+@ToString
+public class ControlLoopElement {
+ @NonNull
+ private UUID id = UUID.randomUUID();
+
+ @NonNull
+ private ToscaConceptIdentifier definition = new ToscaConceptIdentifier(PfConceptKey.getNullKey());
+
+ @NonNull
+ private ToscaConceptIdentifier participantType = new ToscaConceptIdentifier(PfConceptKey.getNullKey());
+
+ @NonNull
+ private ToscaConceptIdentifier participantId = new ToscaConceptIdentifier(PfConceptKey.getNullKey());
+
+ @NonNull
+ private ControlLoopState state = ControlLoopState.UNINITIALISED;
+
+ @NonNull
+ private ControlLoopOrderedState orderedState = ControlLoopOrderedState.UNINITIALISED;
+
+ private String description;
+
+ private ClElementStatistics clElementStatistics;
+
+ /**
+ * Copy constructor, does a deep copy but as all fields here are immutable, it's just a regular copy.
+ *
+ * @param otherElement the other element to copy from
+ */
+ public ControlLoopElement(final ControlLoopElement otherElement) {
+ this.id = otherElement.id;
+ this.definition = new ToscaConceptIdentifier(otherElement.definition);
+ this.participantType = new ToscaConceptIdentifier(otherElement.participantType);
+ this.participantId = new ToscaConceptIdentifier(otherElement.participantId);
+ this.state = otherElement.state;
+ this.orderedState = otherElement.orderedState;
+ this.description = otherElement.description;
+ this.clElementStatistics = otherElement.clElementStatistics;
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopOrderedState.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopOrderedState.java
new file mode 100644
index 000000000..91f90275e
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopOrderedState.java
@@ -0,0 +1,44 @@
+/*-
+ * ============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;
+
+public enum ControlLoopOrderedState {
+ /**
+ * The control loop or control loop element should become uninitialised on participants, it should not exist on
+ * participants.
+ */
+ UNINITIALISED,
+ /**
+ * The control loop or control loop element should initialised on the participants and be passive, that is, it is
+ * not handling control loop messages yet.
+ */
+ PASSIVE,
+ /** The control loop or control loop element should running and is executing control loops. */
+ RUNNING;
+
+ public boolean equalsControlLoopState(final ControlLoopState controlLoopState) {
+ return this.name().equals(controlLoopState.name());
+ }
+
+ public ControlLoopState asState() {
+ return ControlLoopState.valueOf(this.name());
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopState.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopState.java
new file mode 100644
index 000000000..ff0d553af
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopState.java
@@ -0,0 +1,63 @@
+/*-
+ * ============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;
+
+public enum ControlLoopState {
+ /**
+ * The control loop or control loop element is not initialised on participants, it does not exist on participants.
+ */
+ UNINITIALISED,
+ /**
+ * The control loop or control loop element is changing from unitialised to passive, it is being initialised onto
+ * participants.
+ */
+ UNINITIALISED2PASSIVE,
+ /**
+ * The control loop or control loop element is initialised on the participants but is passive, that is, it is not
+ * handling control loop messages yet.
+ */
+ PASSIVE,
+ /**
+ * The control loop or control loop element is changing from passive to running, the participants are preparing to
+ * execute control loops.
+ */
+ PASSIVE2RUNNING,
+ /** The control loop or control loop element is running and is executing control loops. */
+ RUNNING,
+ /**
+ * The control loop or control loop element is completing execution of current control loops but will not start
+ * running any more control loops and will become passive.
+ */
+ RUNNING2PASSIVE,
+ /**
+ * The control loop or control loop element is changing from passive to unitialised, the control loop is being
+ * removed from participants.
+ */
+ PASSIVE2UNINITIALISED;
+
+ public boolean equalsControlLoopOrderedState(final ControlLoopOrderedState controlLoopOrderedState) {
+ return this.name().equals(controlLoopOrderedState.name());
+ }
+
+ public ControlLoopOrderedState asOrderedState() {
+ return ControlLoopOrderedState.valueOf(this.name());
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoops.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoops.java
new file mode 100644
index 000000000..8edcc3c11
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoops.java
@@ -0,0 +1,47 @@
+/*-
+ * ============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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.models.controlloop.concepts;
+
+import java.util.List;
+import lombok.AllArgsConstructor;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.models.base.PfUtils;
+
+@Getter
+@Setter
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode
+public class ControlLoops {
+ private List<ControlLoop> controlLoopList;
+
+ /**
+ * Copy contructor, does a deep copy.
+ *
+ * @param otherControlLoops the other element to copy from
+ */
+ public ControlLoops(final ControlLoops otherControlLoops) {
+ this.controlLoopList = PfUtils.mapList(controlLoopList, ControlLoop::new);
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/Participant.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/Participant.java
new file mode 100644
index 000000000..3130b6c2f
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/Participant.java
@@ -0,0 +1,73 @@
+/*-
+ * ============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 lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
+
+/**
+ * Class to represent details of a running participant instance.
+ */
+@NoArgsConstructor
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Participant extends ToscaEntity implements Comparable<Participant> {
+ @NonNull
+ private ToscaConceptIdentifier definition = new ToscaConceptIdentifier(PfConceptKey.getNullKey());
+
+ @NonNull
+ private ParticipantState participantState = ParticipantState.UNKNOWN;
+
+ @NonNull
+ private ParticipantHealthStatus healthStatus = ParticipantHealthStatus.UNKNOWN;
+
+ @Override
+ public String getType() {
+ return definition.getName();
+ }
+
+ @Override
+ public String getTypeVersion() {
+ return definition.getVersion();
+ }
+
+ @Override
+ public int compareTo(final Participant other) {
+ return compareNameVersion(this, other);
+ }
+
+ /**
+ * Copy constructor.
+ *
+ * @param otherParticipant the participant to copy from
+ */
+ public Participant(Participant otherParticipant) {
+ super(otherParticipant);
+ this.definition = new ToscaConceptIdentifier(otherParticipant.definition);
+ this.participantState = otherParticipant.participantState;
+ this.healthStatus = otherParticipant.healthStatus;
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantHealthStatus.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantHealthStatus.java
new file mode 100644
index 000000000..0cf41c9cd
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantHealthStatus.java
@@ -0,0 +1,47 @@
+/*-
+ * ============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;
+
+/**
+ * Class to hold the possible values for health status of Participant.
+ */
+public enum ParticipantHealthStatus {
+
+ /**
+ * Participant is healthy and working fine.
+ */
+ HEALTHY,
+
+ /**
+ * Participant is not healthy.
+ */
+ NOT_HEALTHY,
+
+ /**
+ * Participant is currently under test state and performing tests.
+ */
+ TEST_IN_PROGRESS,
+
+ /**
+ * The health status of the Participant is unknown.
+ */
+ UNKNOWN
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantState.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantState.java
new file mode 100644
index 000000000..1af32660d
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantState.java
@@ -0,0 +1,61 @@
+/*-
+ * ============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;
+
+/**
+ * Class to hold the possible values for mode of participant.
+ */
+public enum ParticipantState {
+
+ /**
+ * Control Loop execution is unknown.
+ */
+ UNKNOWN,
+
+ /**
+ * Control Loop execution is always rejected.
+ */
+ PASSIVE,
+
+ /**
+ * Control Loop execution execution proceeds, but changes to domain state or context are not carried out. The
+ * participant returns an indication that it is running in SAFE mode together with the action it would have
+ * performed if it was operating in ACTIVE mode.
+ */
+ SAFE,
+
+ /**
+ * Control Loop execution execution proceeds and changes to domain and state are carried out in a test environment.
+ * The participant returns an indication that it is running in TEST mode together with the action it has performed
+ * on the test environment.
+ */
+ TEST,
+
+ /**
+ * Control Loop execution execution is executed in the live environment by the participant.
+ */
+ ACTIVE,
+
+ /**
+ * Control Loop execution execution is terminated and not available.
+ */
+ TERMINATED
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatistics.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatistics.java
new file mode 100644
index 000000000..3a7b21fa1
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatistics.java
@@ -0,0 +1,52 @@
+/*-
+ * ============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.io.Serializable;
+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 ParticipantStatistics implements Serializable {
+ private static final long serialVersionUID = 744036598792333124L;
+
+
+ @NonNull
+ private ToscaConceptIdentifier participantId;
+
+ @NonNull
+ private Instant timeStamp;
+
+ private ParticipantState state;
+ private ParticipantHealthStatus healthStatus;
+ private long eventCount;
+ private long lastExecutionTime;
+ private double averageExecutionTime;
+ private long upTime;
+ private long lastEnterTime;
+ private long lastStart;
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatisticsList.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatisticsList.java
new file mode 100644
index 000000000..a69f96f85
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatisticsList.java
@@ -0,0 +1,33 @@
+/*-
+ * ============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.util.List;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter
+@Setter
+@ToString
+public class ParticipantStatisticsList {
+ private List<ParticipantStatistics> statisticsList;
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaClElementStatistics.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaClElementStatistics.java
new file mode 100644
index 000000000..c5ce99677
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaClElementStatistics.java
@@ -0,0 +1,194 @@
+/*-
+ * ============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.persistence.concepts;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.UUID;
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import org.apache.commons.lang3.builder.CompareToBuilder;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.models.base.PfAuthorative;
+import org.onap.policy.models.base.PfConcept;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.PfReferenceTimestampKey;
+import org.onap.policy.models.base.validation.annotations.VerifyKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to represent a controlloop element statistics in the database.
+ *
+ * @author Ramesh Murugan Iyer (ramesh.murugan.iyer@est.tech)
+ */
+@Entity
+@Table(name = "ClElementStatistics")
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+@Data
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class JpaClElementStatistics extends PfConcept implements PfAuthorative<ClElementStatistics>, Serializable {
+
+ private static final long serialVersionUID = 621426717868738629L;
+
+ @EmbeddedId
+ @VerifyKey
+ @NotNull
+ private PfReferenceTimestampKey key = new PfReferenceTimestampKey();
+
+
+ @VerifyKey
+ @NotNull
+ // @formatter:off
+ @AttributeOverride(name = "name", column = @Column(name = "participant_name"))
+ @AttributeOverride(name = "version", column = @Column(name = "participant_version"))
+ private PfConceptKey participantId;
+ // @formatter: on
+
+ @Column
+ @NotNull
+ private ControlLoopState state;
+
+ @Column
+ private long clElementUptime;
+
+
+ /**
+ * The Default Constructor creates a {@link JpaClElementStatistics} object with a null key.
+ */
+ public JpaClElementStatistics() {
+ this(new PfReferenceTimestampKey());
+ }
+
+
+ /**
+ * The Key Constructor creates a {@link JpaClElementStatistics} object with the given Reference Timestamp key.
+ *
+ * @param key the key
+ */
+ public JpaClElementStatistics(@NonNull final PfReferenceTimestampKey key) {
+ this(key, new PfConceptKey(), ControlLoopState.PASSIVE, 0L);
+ }
+
+ /**
+ * The Key Constructor creates a {@link JpaClElementStatistics} object with all mandatory fields.
+ *
+ * @param key the key
+ * @param participantId the TOSCA definition of the control loop element
+ */
+ public JpaClElementStatistics(@NonNull final PfReferenceTimestampKey key,
+ @NonNull final PfConceptKey participantId) {
+ this.key = key;
+ this.participantId = participantId;
+ }
+
+ /**
+ * Copy constructor.
+ *
+ * @param copyConcept the concept to copy from
+ */
+ public JpaClElementStatistics(@NonNull final JpaClElementStatistics copyConcept) {
+ super(copyConcept);
+ this.key = new PfReferenceTimestampKey(copyConcept.key);
+ this.participantId = new PfConceptKey(copyConcept.participantId);
+ this.state = copyConcept.state;
+ this.clElementUptime = copyConcept.clElementUptime;
+ }
+
+
+ /**
+ * Authorative constructor.
+ *
+ * @param authorativeConcept the authorative concept to copy from
+ */
+ public JpaClElementStatistics(@NonNull final ClElementStatistics authorativeConcept) {
+ this.fromAuthorative(authorativeConcept);
+ }
+
+
+
+ @Override
+ public ClElementStatistics toAuthorative() {
+ ClElementStatistics clElementStatistics = new ClElementStatistics();
+ clElementStatistics.setId(UUID.fromString(getKey().getReferenceKey().getLocalName()));
+ clElementStatistics.setTimeStamp(key.getInstant());
+ clElementStatistics.setParticipantId(new ToscaConceptIdentifier(participantId));
+ clElementStatistics.setControlLoopState(state);
+ clElementStatistics.setClElementUptime(clElementUptime);
+
+ return clElementStatistics;
+ }
+
+ @Override
+ public void fromAuthorative(@NonNull ClElementStatistics clElementStatistics) {
+ // @formatter:off
+ if (this.key == null || this.getKey().isNullKey()) {
+ this.setKey(new PfReferenceTimestampKey(clElementStatistics.getParticipantId().getName(),
+ clElementStatistics.getParticipantId().getVersion(), clElementStatistics.getId().toString(),
+ clElementStatistics.getTimeStamp()));
+ }
+ // @formatter:on
+ this.setParticipantId(clElementStatistics.getParticipantId().asConceptKey());
+ this.setState(clElementStatistics.getControlLoopState());
+ this.setClElementUptime(clElementStatistics.getClElementUptime());
+ }
+
+ @Override
+ public List<PfKey> getKeys() {
+ return getKey().getKeys();
+ }
+
+ @Override
+ public void clean() {
+ key.clean();
+ participantId.clean();
+ }
+
+
+ @Override
+ public int compareTo(PfConcept otherConcept) {
+ if (otherConcept == null) {
+ return -1;
+ }
+ if (this == otherConcept) {
+ return 0;
+ }
+ if (getClass() != otherConcept.getClass()) {
+ return getClass().getName().compareTo(otherConcept.getClass().getName());
+ }
+
+ final JpaClElementStatistics other = (JpaClElementStatistics) otherConcept;
+ return new CompareToBuilder().append(this.key, other.key).append(this.state, other.state)
+ .append(this.clElementUptime, other.clElementUptime).toComparison();
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoop.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoop.java
new file mode 100644
index 000000000..cac405abd
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoop.java
@@ -0,0 +1,258 @@
+/*-
+ * ============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.persistence.concepts;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.UUID;
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.ManyToMany;
+import javax.persistence.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import org.apache.commons.lang3.ObjectUtils;
+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.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.common.parameters.annotations.Valid;
+import org.onap.policy.models.base.PfAuthorative;
+import org.onap.policy.models.base.PfConcept;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.PfReferenceKey;
+import org.onap.policy.models.base.PfUtils;
+import org.onap.policy.models.base.validation.annotations.VerifyKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to represent a control loop in the database.
+ *
+ * @author Liam Fallon (liam.fallon@est.tech)
+ */
+@Entity
+@Table(name = "ControlLoop")
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class JpaControlLoop extends PfConcept implements PfAuthorative<ControlLoop> {
+ private static final long serialVersionUID = -4725410933242154805L;
+
+ @EmbeddedId
+ @VerifyKey
+ @NotNull
+ private PfConceptKey key;
+
+ // @formatter:off
+ @VerifyKey
+ @NotNull
+ @AttributeOverrides({
+ @AttributeOverride(name = "name", column = @Column(name = "definition_name")),
+ @AttributeOverride(name = "version", column = @Column(name = "definition_version"))
+ }
+ )
+ private PfConceptKey definition;
+ // @formatter:on
+
+ @Column
+ @NotNull
+ private ControlLoopState state;
+
+ @Column
+ @NotNull
+ private ControlLoopOrderedState orderedState;
+
+ @Column
+ private String description;
+
+ // @formatter:off
+ @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
+ @NotNull
+ private Map<@NotNull UUID, @NotNull @Valid JpaControlLoopElement> elements;
+
+ /**
+ * The Default Constructor creates a {@link JpaControlLoop} object with a null key.
+ */
+ public JpaControlLoop() {
+ this(new PfConceptKey());
+ }
+
+ /**
+ * The Key Constructor creates a {@link JpaControlLoop} object with the given concept key.
+ *
+ * @param key the key
+ */
+ public JpaControlLoop(@NonNull final PfConceptKey key) {
+ this(key, new PfConceptKey(), ControlLoopState.UNINITIALISED, new LinkedHashMap<>());
+ }
+
+ /**
+ * The Key Constructor creates a {@link JpaControlLoop} object with all mandatory fields.
+ *
+ * @param key the key
+ * @param definition the TOSCA definition of the control loop
+ * @param state the state of the control loop
+ * @param elements the elements of the control looop in participants
+ */
+ public JpaControlLoop(@NonNull final PfConceptKey key, @NonNull final PfConceptKey definition,
+ @NonNull final ControlLoopState state, @NonNull final Map<UUID, JpaControlLoopElement> elements) {
+ this.key = key;
+ this.definition = definition;
+ this.state = state;
+ this.elements = elements;
+ }
+
+ /**
+ * Copy constructor.
+ *
+ * @param copyConcept the concept to copy from
+ */
+ public JpaControlLoop(@NonNull final JpaControlLoop copyConcept) {
+ super(copyConcept);
+ this.key = new PfConceptKey(copyConcept.key);
+ this.definition = new PfConceptKey(copyConcept.definition);
+ this.state = copyConcept.state;
+ this.orderedState = copyConcept.orderedState;
+ this.description = copyConcept.description;
+ this.elements = PfUtils.mapMap(copyConcept.elements, JpaControlLoopElement::new, new LinkedHashMap<>(0));
+ }
+
+ /**
+ * Authorative constructor.
+ *
+ * @param authorativeConcept the authorative concept to copy from
+ */
+ public JpaControlLoop(@NonNull final ControlLoop authorativeConcept) {
+ this.fromAuthorative(authorativeConcept);
+ }
+
+ @Override
+ public ControlLoop toAuthorative() {
+ ControlLoop controlLoop = new ControlLoop();
+
+ controlLoop.setName(getKey().getName());
+ controlLoop.setVersion(getKey().getVersion());
+ controlLoop.setDefinition(new ToscaConceptIdentifier(definition));
+ controlLoop.setState(state);
+ controlLoop.setOrderedState(orderedState != null ? orderedState : state.asOrderedState());
+ controlLoop.setDescription(description);
+ controlLoop.setElements(PfUtils.mapMap(elements, JpaControlLoopElement::toAuthorative, new LinkedHashMap<>(0)));
+
+ return controlLoop;
+ }
+
+ @Override
+ public void fromAuthorative(@NonNull final ControlLoop controlLoop) {
+ if (this.key == null || this.getKey().isNullKey()) {
+ this.setKey(new PfConceptKey(controlLoop.getName(), controlLoop.getVersion()));
+ }
+
+ this.definition = controlLoop.getDefinition().asConceptKey();
+ this.state = controlLoop.getState();
+ this.orderedState = controlLoop.getOrderedState();
+ this.description = controlLoop.getDescription();
+
+ this.elements = new LinkedHashMap<>(controlLoop.getElements().size());
+ for (Entry<UUID, ControlLoopElement> elementEntry : controlLoop.getElements().entrySet()) {
+ JpaControlLoopElement jpaControlLoopElement = new JpaControlLoopElement();
+ jpaControlLoopElement.setKey(new PfReferenceKey(getKey(), elementEntry.getValue().getId().toString()));
+ jpaControlLoopElement.fromAuthorative(elementEntry.getValue());
+ this.elements.put(elementEntry.getKey(), jpaControlLoopElement);
+ }
+ }
+
+ @Override
+ public List<PfKey> getKeys() {
+ List<PfKey> keyList = getKey().getKeys();
+
+ keyList.add(definition);
+
+ for (JpaControlLoopElement element : elements.values()) {
+ keyList.addAll(element.getKeys());
+ }
+
+ return keyList;
+ }
+
+ @Override
+ public void clean() {
+ key.clean();
+ definition.clean();
+ description = (description == null ? null : description.trim());
+
+ for (JpaControlLoopElement element : elements.values()) {
+ element.clean();
+ }
+ }
+
+ @Override
+ public int compareTo(final PfConcept otherConcept) {
+ if (otherConcept == null) {
+ return -1;
+ }
+ if (this == otherConcept) {
+ return 0;
+ }
+ if (getClass() != otherConcept.getClass()) {
+ return this.getClass().getName().compareTo(otherConcept.getClass().getName());
+ }
+
+ final JpaControlLoop other = (JpaControlLoop) otherConcept;
+ int result = key.compareTo(other.key);
+ if (result != 0) {
+ return result;
+ }
+
+ result = definition.compareTo(other.definition);
+ if (result != 0) {
+ return result;
+ }
+
+ result = ObjectUtils.compare(state, other.state);
+ if (result != 0) {
+ return result;
+ }
+
+ result = ObjectUtils.compare(orderedState, other.orderedState);
+ if (result != 0) {
+ return result;
+ }
+
+ result = ObjectUtils.compare(description, other.description);
+ if (result != 0) {
+ return result;
+ }
+
+ return PfUtils.compareObjects(elements, other.elements);
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopElement.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopElement.java
new file mode 100644
index 000000000..911a52089
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopElement.java
@@ -0,0 +1,251 @@
+/*-
+ * ============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.persistence.concepts;
+
+import java.util.List;
+import java.util.UUID;
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import org.apache.commons.lang3.ObjectUtils;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.models.base.PfAuthorative;
+import org.onap.policy.models.base.PfConcept;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.PfReferenceKey;
+import org.onap.policy.models.base.validation.annotations.VerifyKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to represent a participant control loop element in the database.
+ *
+ * @author Liam Fallon (liam.fallon@est.tech)
+ */
+@Entity
+@Table(name = "ControlLoopElement")
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class JpaControlLoopElement extends PfConcept implements PfAuthorative<ControlLoopElement> {
+ private static final long serialVersionUID = -1791732273187890213L;
+
+ @EmbeddedId
+ @VerifyKey
+ @NotNull
+ private PfReferenceKey key;
+
+ // @formatter:off
+ @VerifyKey
+ @NotNull
+ @AttributeOverride(name = "name", column = @Column(name = "definition_name"))
+ @AttributeOverride(name = "version", column = @Column(name = "definition_version"))
+ private PfConceptKey definition;
+
+ @VerifyKey
+ @NotNull
+ @AttributeOverride(name = "name", column = @Column(name = "participant_type_name"))
+ @AttributeOverride(name = "version", column = @Column(name = "participant_type_version"))
+ private PfConceptKey participantType;
+
+ @NotNull
+ @AttributeOverride(name = "name", column = @Column(name = "participant_name"))
+ @AttributeOverride(name = "version", column = @Column(name = "participant_version"))
+ private PfConceptKey participantId;
+ // @formatter:on
+
+ @Column
+ @NotNull
+ private ControlLoopState state;
+
+ @Column
+ @NotNull
+ private ControlLoopOrderedState orderedState;
+
+ @Column
+ private String description;
+
+ /**
+ * The Default Constructor creates a {@link JpaControlLoopElement} object with a null key.
+ */
+ public JpaControlLoopElement() {
+ this(new PfReferenceKey());
+ }
+
+ /**
+ * The Key Constructor creates a {@link JpaControlLoopElement} object with the given concept key.
+ *
+ * @param key the key
+ */
+ public JpaControlLoopElement(@NonNull final PfReferenceKey key) {
+ this(key, new PfConceptKey(), new PfConceptKey(), ControlLoopState.UNINITIALISED);
+ }
+
+ /**
+ * The Key Constructor creates a {@link JpaControlLoopElement} object with all mandatory fields.
+ *
+ * @param key the key
+ * @param definition the TOSCA definition of the control loop element
+ * @param participantType the TOSCA definition of the participant running the control loop element
+ * @param state the state of the control loop
+ */
+ public JpaControlLoopElement(@NonNull final PfReferenceKey key, @NonNull final PfConceptKey definition,
+ @NonNull final PfConceptKey participantType, @NonNull final ControlLoopState state) {
+ this.key = key;
+ this.definition = definition;
+ this.participantType = participantType;
+ this.state = state;
+ }
+
+ /**
+ * Copy constructor.
+ *
+ * @param copyConcept the concept to copy from
+ */
+ public JpaControlLoopElement(@NonNull final JpaControlLoopElement copyConcept) {
+ super(copyConcept);
+ this.key = new PfReferenceKey(copyConcept.key);
+ this.definition = new PfConceptKey(copyConcept.definition);
+ this.participantType = new PfConceptKey(copyConcept.participantType);
+ this.participantId = new PfConceptKey(copyConcept.participantId);
+ this.state = copyConcept.state;
+ this.orderedState = copyConcept.orderedState;
+ this.description = copyConcept.description;
+ }
+
+ /**
+ * Authorative constructor.
+ *
+ * @param authorativeConcept the authorative concept to copy from
+ */
+ public JpaControlLoopElement(@NonNull final ControlLoopElement authorativeConcept) {
+ this.fromAuthorative(authorativeConcept);
+ }
+
+ @Override
+ public ControlLoopElement toAuthorative() {
+ ControlLoopElement element = new ControlLoopElement();
+
+ element.setId(UUID.fromString(getKey().getLocalName()));
+ element.setDefinition(new ToscaConceptIdentifier(definition));
+ element.setParticipantType(new ToscaConceptIdentifier(participantType));
+ element.setParticipantId(new ToscaConceptIdentifier(participantId));
+ element.setState(state);
+ element.setOrderedState(orderedState != null ? orderedState : state.asOrderedState());
+ element.setDescription(description);
+
+ return element;
+ }
+
+ @Override
+ public void fromAuthorative(@NonNull final ControlLoopElement element) {
+ if (this.key == null || this.getKey().isNullKey()) {
+ this.setKey(new PfReferenceKey());
+ getKey().setLocalName(element.getId().toString());
+ }
+
+ this.definition = element.getDefinition().asConceptKey();
+ this.participantType = element.getParticipantType().asConceptKey();
+ this.participantId = element.getParticipantId().asConceptKey();
+ this.state = element.getState();
+ this.orderedState = element.getOrderedState();
+ this.description = element.getDescription();
+ }
+
+ @Override
+ public List<PfKey> getKeys() {
+ List<PfKey> keyList = getKey().getKeys();
+
+ keyList.add(definition);
+ keyList.add(participantType);
+ keyList.add(participantId);
+
+ return keyList;
+ }
+
+ @Override
+ public void clean() {
+ key.clean();
+ definition.clean();
+ participantType.clean();
+ participantId.clean();
+
+ if (description != null) {
+ description = description.trim();
+ }
+ }
+
+ @Override
+ public int compareTo(final PfConcept otherConcept) {
+ if (otherConcept == null) {
+ return -1;
+ }
+ if (this == otherConcept) {
+ return 0;
+ }
+ if (getClass() != otherConcept.getClass()) {
+ return this.getClass().getName().compareTo(otherConcept.getClass().getName());
+ }
+
+ final JpaControlLoopElement other = (JpaControlLoopElement) otherConcept;
+ int result = key.compareTo(other.key);
+ if (result != 0) {
+ return result;
+ }
+
+ result = definition.compareTo(other.definition);
+ if (result != 0) {
+ return result;
+ }
+
+ result = participantType.compareTo(other.participantType);
+ if (result != 0) {
+ return result;
+ }
+
+ result = participantId.compareTo(other.participantId);
+ if (result != 0) {
+ return result;
+ }
+
+ result = ObjectUtils.compare(state, other.state);
+ if (result != 0) {
+ return result;
+ }
+
+ result = ObjectUtils.compare(orderedState, other.orderedState);
+ if (result != 0) {
+ return result;
+ }
+
+ return ObjectUtils.compare(description, other.description);
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipant.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipant.java
new file mode 100644
index 000000000..69b565266
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipant.java
@@ -0,0 +1,220 @@
+/*-
+ * ============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.persistence.concepts;
+
+import java.io.Serializable;
+import java.util.List;
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import org.apache.commons.lang3.ObjectUtils;
+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.common.parameters.annotations.NotNull;
+import org.onap.policy.models.base.PfAuthorative;
+import org.onap.policy.models.base.PfConcept;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.validation.annotations.VerifyKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to represent a participant in the database.
+ *
+ * @author Liam Fallon (liam.fallon@est.tech)
+ */
+@Entity
+@Table(name = "Participant")
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class JpaParticipant extends PfConcept implements PfAuthorative<Participant>, Serializable {
+ private static final long serialVersionUID = -4697758484642403483L;
+
+ @EmbeddedId
+ @VerifyKey
+ @NotNull
+ private PfConceptKey key;
+
+ // @formatter:off
+ @VerifyKey
+ @NotNull
+ @AttributeOverrides({
+ @AttributeOverride(name = "name", column = @Column(name = "definition_name")),
+ @AttributeOverride(name = "version", column = @Column(name = "definition_version"))
+ }
+ )
+ private PfConceptKey definition;
+ // @formatter:on
+
+ @Column
+ @NotNull
+ private ParticipantState participantState;
+
+ @Column
+ @NotNull
+ private ParticipantHealthStatus healthStatus;
+
+ @Column
+ private String description;
+
+ /**
+ * The Default Constructor creates a {@link JpaParticipant} object with a null key.
+ */
+ public JpaParticipant() {
+ this(new PfConceptKey());
+ }
+
+ /**
+ * The Key Constructor creates a {@link JpaParticipant} object with the given concept key.
+ *
+ * @param key the key
+ */
+ public JpaParticipant(@NonNull final PfConceptKey key) {
+ this(key, new PfConceptKey(), ParticipantState.PASSIVE, ParticipantHealthStatus.UNKNOWN);
+ }
+
+ /**
+ * The Key Constructor creates a {@link JpaParticipant} object with all mandatory fields.
+ *
+ * @param key the key
+ * @param definition the TOSCA definition of the participant
+ * @param participantState the state of the participant
+ * @param healthStatus the health state of the participant
+ */
+ public JpaParticipant(@NonNull final PfConceptKey key, @NonNull final PfConceptKey definition,
+ @NonNull final ParticipantState participantState, @NonNull ParticipantHealthStatus healthStatus) {
+ this.key = key;
+ this.definition = definition;
+ this.participantState = participantState;
+ this.healthStatus = healthStatus;
+ }
+
+ /**
+ * Copy constructor.
+ *
+ * @param copyConcept the concept to copy from
+ */
+ public JpaParticipant(@NonNull final JpaParticipant copyConcept) {
+ super(copyConcept);
+ this.key = new PfConceptKey(copyConcept.key);
+ this.definition = new PfConceptKey(copyConcept.definition);
+ this.participantState = copyConcept.participantState;
+ this.healthStatus = copyConcept.healthStatus;
+ this.description = copyConcept.description;
+ }
+
+ /**
+ * Authorative constructor.
+ *
+ * @param authorativeConcept the authorative concept to copy from
+ */
+ public JpaParticipant(@NonNull final Participant authorativeConcept) {
+ this.fromAuthorative(authorativeConcept);
+ }
+
+ @Override
+ public Participant toAuthorative() {
+ Participant participant = new Participant();
+
+ participant.setName(key.getName());
+ participant.setVersion(key.getVersion());
+ participant.setDefinition(new ToscaConceptIdentifier(definition));
+ participant.setParticipantState(participantState);
+ participant.setHealthStatus(healthStatus);
+ participant.setDescription(description);
+
+ return participant;
+ }
+
+ @Override
+ public void fromAuthorative(@NonNull final Participant participant) {
+ if (this.key == null || this.getKey().isNullKey()) {
+ this.setKey(new PfConceptKey(participant.getName(), participant.getVersion()));
+ }
+
+ this.definition = participant.getDefinition().asConceptKey();
+ this.setParticipantState(participant.getParticipantState());
+ this.setHealthStatus(participant.getHealthStatus());
+ this.setDescription(participant.getDescription());
+ }
+
+ @Override
+ public List<PfKey> getKeys() {
+ List<PfKey> keyList = getKey().getKeys();
+
+ keyList.add(definition);
+
+ return keyList;
+ }
+
+ @Override
+ public void clean() {
+ key.clean();
+ definition.clean();
+ description = (description == null ? null : description.trim());
+ }
+
+ @Override
+ public int compareTo(final PfConcept otherConcept) {
+ if (otherConcept == null) {
+ return -1;
+ }
+ if (this == otherConcept) {
+ return 0;
+ }
+ if (getClass() != otherConcept.getClass()) {
+ return getClass().getName().compareTo(otherConcept.getClass().getName());
+ }
+
+ final JpaParticipant other = (JpaParticipant) otherConcept;
+ int result = key.compareTo(other.key);
+ if (result != 0) {
+ return result;
+ }
+
+ result = definition.compareTo(other.definition);
+ if (result != 0) {
+ return result;
+ }
+
+ result = ObjectUtils.compare(participantState, other.participantState);
+ if (result != 0) {
+ return result;
+ }
+
+ result = ObjectUtils.compare(healthStatus, other.healthStatus);
+ if (result != 0) {
+ return result;
+ }
+
+ return ObjectUtils.compare(description, other.description);
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantStatistics.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantStatistics.java
new file mode 100644
index 000000000..b97f9ed69
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantStatistics.java
@@ -0,0 +1,237 @@
+/*-
+ * ============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.persistence.concepts;
+
+import java.io.Serializable;
+import java.util.List;
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import org.apache.commons.lang3.builder.CompareToBuilder;
+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.common.parameters.annotations.NotNull;
+import org.onap.policy.models.base.PfAuthorative;
+import org.onap.policy.models.base.PfConcept;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.PfTimestampKey;
+import org.onap.policy.models.base.validation.annotations.VerifyKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to represent a control loop statistics in the database.
+ *
+ * @author Ramesh Murugan Iyer (ramesh.murugan.iyer@est.tech)
+ */
+@Entity
+@Table(name = "ParticipantStatistics")
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+@Data
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class JpaParticipantStatistics extends PfConcept implements PfAuthorative<ParticipantStatistics>, Serializable {
+
+ private static final long serialVersionUID = -5992214428190133190L;
+
+ @EmbeddedId
+ @VerifyKey
+ @NotNull
+ private PfTimestampKey key;
+
+ @VerifyKey
+ @NotNull
+ @AttributeOverride(name = "name", column = @Column(name = "participant_name"))
+ @AttributeOverride(name = "version", column = @Column(name = "participant_version"))
+ private PfConceptKey participantId;
+
+ @Column
+ @NotNull
+ private ParticipantState state;
+
+ @Column
+ @NotNull
+ private ParticipantHealthStatus healthStatus;
+
+ @Column
+ private long eventCount;
+
+ @Column
+ private long lastExecutionTime;
+
+ @Column
+ private double averageExecutionTime;
+
+ @Column
+ private long upTime;
+
+ @Column
+ private long lastEnterTime;
+
+ @Column
+ private long lastStart;
+
+
+ /**
+ * The Default Constructor creates a {@link JpaParticipantStatistics} object with a null key.
+ */
+ public JpaParticipantStatistics() {
+ this(new PfTimestampKey());
+ }
+
+ /**
+ * The Key Constructor creates a {@link JpaParticipantStatistics} object with the given Timestamp key.
+ *
+ * @param key the key
+ */
+ public JpaParticipantStatistics(@NonNull final PfTimestampKey key) {
+ this(key, new PfConceptKey(), ParticipantState.PASSIVE, ParticipantHealthStatus.HEALTHY, 0L, 0L, 0.0d, 0L, 0L,
+ 0L);
+ }
+
+
+ /**
+ * The Key Constructor creates a {@link JpaParticipantStatistics} object with all mandatory fields.
+ *
+ * @param key the key
+ * @param participantId the TOSCA definition of the control loop participant
+ */
+ public JpaParticipantStatistics(@NonNull final PfTimestampKey key, @NonNull final PfConceptKey participantId) {
+ this.key = key;
+ this.participantId = participantId;
+ }
+
+
+ /**
+ * Copy constructor.
+ *
+ * @param copyConcept the concept to copy from
+ */
+ public JpaParticipantStatistics(@NonNull final JpaParticipantStatistics copyConcept) {
+ super(copyConcept);
+ this.key = new PfTimestampKey(copyConcept.key);
+ this.participantId = new PfConceptKey(copyConcept.participantId);
+ this.state = copyConcept.state;
+ this.healthStatus = copyConcept.healthStatus;
+ this.eventCount = copyConcept.eventCount;
+ this.lastExecutionTime = copyConcept.lastExecutionTime;
+ this.averageExecutionTime = copyConcept.averageExecutionTime;
+ this.upTime = copyConcept.upTime;
+ this.lastEnterTime = copyConcept.lastEnterTime;
+ this.lastStart = copyConcept.lastStart;
+ }
+
+ /**
+ * Authorative constructor.
+ *
+ * @param authorativeConcept the authorative concept to copy from
+ */
+ public JpaParticipantStatistics(@NonNull final ParticipantStatistics authorativeConcept) {
+ this.fromAuthorative(authorativeConcept);
+ }
+
+
+ @Override
+ public int compareTo(PfConcept otherConcept) {
+ if (otherConcept == null) {
+ return -1;
+ }
+ if (this == otherConcept) {
+ return 0;
+ }
+ if (getClass() != otherConcept.getClass()) {
+ return getClass().getName().compareTo(otherConcept.getClass().getName());
+ }
+
+ final JpaParticipantStatistics other = (JpaParticipantStatistics) otherConcept;
+ // @formatter:off
+ return new CompareToBuilder()
+ .append(this.key, other.key)
+ .append(this.participantId, other.participantId)
+ .append(this.state, other.state)
+ .append(this.healthStatus, other.healthStatus)
+ .append(this.eventCount, other.eventCount)
+ .append(this.lastExecutionTime, other.lastExecutionTime)
+ .append(this.averageExecutionTime, other.averageExecutionTime)
+ .append(this.upTime, other.upTime)
+ .append(this.lastEnterTime, other.lastEnterTime)
+ .append(this.lastStart, other.lastStart).toComparison();
+ // @formatter:on
+ }
+
+ @Override
+ public ParticipantStatistics toAuthorative() {
+ ParticipantStatistics participantStatistics = new ParticipantStatistics();
+ participantStatistics.setTimeStamp(key.getTimeStamp().toInstant());
+ participantStatistics.setParticipantId(new ToscaConceptIdentifier(participantId));
+ participantStatistics.setState(state);
+ participantStatistics.setHealthStatus(healthStatus);
+ participantStatistics.setAverageExecutionTime(averageExecutionTime);
+ participantStatistics.setEventCount(eventCount);
+ participantStatistics.setLastExecutionTime(lastExecutionTime);
+ participantStatistics.setUpTime(upTime);
+ participantStatistics.setLastEnterTime(lastEnterTime);
+ participantStatistics.setLastStart(lastStart);
+
+ return participantStatistics;
+ }
+
+ @Override
+ public void fromAuthorative(@NonNull final ParticipantStatistics participantStatistics) {
+ if (this.key == null || this.getKey().isNullKey()) {
+ this.setKey(new PfTimestampKey(participantStatistics.getParticipantId().getName(),
+ participantStatistics.getParticipantId().getVersion(), participantStatistics.getTimeStamp()));
+ }
+ this.setParticipantId(participantStatistics.getParticipantId().asConceptKey());
+ this.setState(participantStatistics.getState());
+ this.setHealthStatus(participantStatistics.getHealthStatus());
+ this.setAverageExecutionTime(participantStatistics.getAverageExecutionTime());
+ this.setEventCount(participantStatistics.getEventCount());
+ this.setLastExecutionTime(participantStatistics.getLastExecutionTime());
+ this.setUpTime(participantStatistics.getUpTime());
+ this.setLastEnterTime(participantStatistics.getLastEnterTime());
+ this.setLastStart(participantStatistics.getLastStart());
+
+ }
+
+ @Override
+ public List<PfKey> getKeys() {
+ List<PfKey> keyList = getKey().getKeys();
+ keyList.addAll(participantId.getKeys());
+ return keyList;
+ }
+
+ @Override
+ public void clean() {
+ key.clean();
+ participantId.clean();
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProvider.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProvider.java
new file mode 100644
index 000000000..8a06cbf1e
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProvider.java
@@ -0,0 +1,154 @@
+/*-
+ * ============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.persistence.provider;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import javax.ws.rs.core.Response;
+import lombok.NonNull;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.base.PfReferenceTimestampKey;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.provider.impl.AbstractModelsProvider;
+
+/**
+ * This class provides the provision of information on control loop element statistics in the database to callers.
+ *
+ * @author Ramesh Murugan Iyer (ramesh.murugan.iyer@est.tech)
+ */
+public class ClElementStatisticsProvider extends AbstractModelsProvider {
+
+ /**
+ * Create a provider for control loop element statistics.
+ *
+ * @param parameters the parameters for database access
+ * @throws PfModelException on initiation errors
+ */
+ public ClElementStatisticsProvider(@NonNull PolicyModelsProviderParameters parameters) throws PfModelException {
+ super(parameters);
+ this.init();
+ }
+
+ /**
+ * Creates control loop element statistics.
+ *
+ * @param clElementStatisticsList a specification of the CL element statistics to create
+ * @return the clElement statistics created
+ * @throws PfModelException on errors creating clElement statistics
+ */
+ public List<ClElementStatistics> createClElementStatistics(
+ @NonNull final List<ClElementStatistics> clElementStatisticsList) throws PfModelException {
+
+ BeanValidationResult validationResult =
+ new BeanValidationResult("control loop element statistics list", clElementStatisticsList);
+ for (ClElementStatistics clElementStatistics : clElementStatisticsList) {
+ JpaClElementStatistics jpaClElementStatistics = new JpaClElementStatistics();
+ jpaClElementStatistics.fromAuthorative(clElementStatistics);
+
+ validationResult.addResult(jpaClElementStatistics.validate("control loop element statistics"));
+ }
+
+ if (!validationResult.isValid()) {
+ throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult());
+ }
+
+ for (ClElementStatistics clElementStatistics : clElementStatisticsList) {
+ JpaClElementStatistics jpaClElementStatistics = new JpaClElementStatistics();
+ jpaClElementStatistics.fromAuthorative(clElementStatistics);
+ getPfDao().create(jpaClElementStatistics);
+ }
+
+ // Return the created control loop element statistics
+ List<ClElementStatistics> elementStatistics = new ArrayList<>(clElementStatisticsList.size());
+
+ for (ClElementStatistics clElementStat : clElementStatisticsList) {
+ JpaClElementStatistics jpaClElementStatistics = getPfDao().get(JpaClElementStatistics.class,
+ new PfReferenceTimestampKey(clElementStat.getParticipantId().getName(),
+ clElementStat.getParticipantId().getVersion(), clElementStat.getId().toString(),
+ clElementStat.getTimeStamp()));
+ elementStatistics.add(jpaClElementStatistics.toAuthorative());
+ }
+
+ return elementStatistics;
+ }
+
+ /**
+ * Convert JPA clElement statistics list to clElement statistics list.
+ *
+ * @param jpaClElementStatistics the list to convert
+ * @return the clElement statistics list
+ */
+ private List<ClElementStatistics> asClElementStatisticsList(List<JpaClElementStatistics> jpaClElementStatistics) {
+ return jpaClElementStatistics.stream().map(JpaClElementStatistics::toAuthorative).collect(Collectors.toList());
+ }
+
+ /**
+ * Get clElement statistics.
+ *
+ * @param name the name of the participant
+ * @param version version of the participant
+ * @param id of the control loop element
+ * @param timestamp timestamp of the statistics
+ * @return the clElement statistics found
+ * @throws PfModelException on errors getting clElement statistics
+ */
+ public List<ClElementStatistics> getClElementStatistics(final String name, final String version, final String id,
+ final Instant timestamp) throws PfModelException {
+ List<ClElementStatistics> clElementStatistics = new ArrayList<>(1);
+ if (name != null && version != null && timestamp != null && id != null) {
+ clElementStatistics.add(getPfDao()
+ .get(JpaClElementStatistics.class, new PfReferenceTimestampKey(name, version, id, timestamp))
+ .toAuthorative());
+ return clElementStatistics;
+ } else if (name != null) {
+ clElementStatistics.addAll(getFilteredClElementStatistics(name, version, null, null, null,
+ "DESC", 0));
+ } else {
+ clElementStatistics.addAll(asClElementStatisticsList(getPfDao().getAll(JpaClElementStatistics.class)));
+ }
+ return clElementStatistics;
+ }
+
+ /**
+ * Get filtered clElement statistics.
+ *
+ * @param name the clElement name for the statistics to get
+ * @param startTimeStamp startTimeStamp to filter statistics
+ * @param endTimeStamp endTimeStamp to filter statistics
+ * @param sortOrder sortOrder to query database
+ * @param getRecordNum Total query count from database
+ * @return the clElement statistics found
+ * @throws PfModelException on errors getting policies
+ */
+ public List<ClElementStatistics> getFilteredClElementStatistics(final String name, final String version,
+ final Instant startTimeStamp, final Instant endTimeStamp, Map<String, Object> filterMap,
+ final String sortOrder, final int getRecordNum) {
+ return asClElementStatisticsList(getPfDao().getFiltered(JpaClElementStatistics.class, name, version,
+ startTimeStamp, endTimeStamp, filterMap, sortOrder, getRecordNum));
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProvider.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProvider.java
new file mode 100644
index 000000000..520e9b864
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProvider.java
@@ -0,0 +1,248 @@
+/*-
+ * ============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.persistence.provider;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+import javax.ws.rs.core.Response;
+import lombok.NonNull;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoop;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.models.base.PfAuthorative;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.provider.impl.AbstractModelsProvider;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate;
+
+/**
+ * This class provides information on control loop concepts in the database to callers.
+ */
+public class ControlLoopProvider extends AbstractModelsProvider {
+
+ /**
+ * Create a provider for control loops.
+ *
+ * @param parameters the parameters for database access
+ * @throws PfModelException on initiation errors
+ */
+ public ControlLoopProvider(@NonNull PolicyModelsProviderParameters parameters) throws PfModelException {
+ super(parameters);
+ this.init();
+ }
+
+ /**
+ * Get Control Loop.
+ *
+ * @param controlLoopId the ID of the control loop to get
+ * @return the control loop found
+ * @throws PfModelException on errors getting the control loop
+ */
+ public ControlLoop getControlLoop(final ToscaConceptIdentifier controlLoopId) throws PfModelException {
+ JpaControlLoop jpaControlLoop = getPfDao().get(JpaControlLoop.class, controlLoopId.asConceptKey());
+
+ return jpaControlLoop == null ? null : jpaControlLoop.toAuthorative();
+ }
+
+ /**
+ * Update Control Loop.
+ *
+ * @param controlLoop the control loop to update
+ * @return the updated control loop
+ * @throws PfModelException on errors updating the control loop
+ */
+ public ControlLoop updateControlLoop(final ControlLoop controlLoop) throws PfModelException {
+ return updateControlLoops(Collections.singletonList(controlLoop)).get(0);
+ }
+
+ /**
+ * Get Control Loops.
+ *
+ * @param name the name of the control loop to get, null to get all control loops
+ * @param version the version of the control loop to get, null to get all control loops
+ * @return the control loops found
+ * @throws PfModelException on errors getting control loops
+ */
+ public List<ControlLoop> getControlLoops(final String name, final String version) throws PfModelException {
+
+ return asEntityList(getPfDao().getFiltered(JpaControlLoop.class, name, version));
+ }
+
+ /**
+ * Get filtered control loops.
+ *
+ * @param filter the filter for the control loops to get
+ * @return the control loops found
+ * @throws PfModelException on errors getting control loops
+ */
+ public List<ControlLoop> getFilteredControlLoops(@NonNull final ToscaTypedEntityFilter<ControlLoop> filter) {
+
+ return filter.filter(
+ asEntityList(getPfDao().getFiltered(JpaControlLoop.class, filter.getName(), PfKey.NULL_KEY_VERSION)));
+ }
+
+ /**
+ * Creates control loops.
+ *
+ * @param controlLoops a specification of the control loops to create
+ * @return the control loops created
+ * @throws PfModelException on errors creating control loops
+ */
+ public List<ControlLoop> createControlLoops(@NonNull final List<ControlLoop> controlLoops) throws PfModelException {
+
+ BeanValidationResult validationResult = new BeanValidationResult("control loops", controlLoops);
+
+ for (ControlLoop controlLoop : controlLoops) {
+ JpaControlLoop jpaControlLoop = new JpaControlLoop();
+ jpaControlLoop.fromAuthorative(controlLoop);
+
+ validationResult.addResult(jpaControlLoop.validate("control loop"));
+ }
+
+ if (!validationResult.isValid()) {
+ throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult());
+ }
+
+ for (ControlLoop controlLoop : controlLoops) {
+ JpaControlLoop jpaControlLoop = new JpaControlLoop();
+ jpaControlLoop.fromAuthorative(controlLoop);
+
+ getPfDao().create(jpaControlLoop);
+ }
+
+ // Return the created control loops
+ List<ControlLoop> returnControlLoops = new ArrayList<>(controlLoops.size());
+
+ for (ControlLoop controlLoop : controlLoops) {
+ JpaControlLoop jpaControlLoop = getPfDao().get(JpaControlLoop.class,
+ new PfConceptKey(controlLoop.getName(), controlLoop.getVersion()));
+ returnControlLoops.add(jpaControlLoop.toAuthorative());
+ }
+
+ return returnControlLoops;
+ }
+
+ /**
+ * Updates control loops.
+ *
+ * @param controlLoops a specification of the control loops to update
+ * @return the control loops updated
+ * @throws PfModelException on errors updating control loops
+ */
+ public List<ControlLoop> updateControlLoops(@NonNull final List<ControlLoop> controlLoops) throws PfModelException {
+
+ BeanValidationResult validationResult = new BeanValidationResult("control loops", controlLoops);
+
+ for (ControlLoop controlLoop : controlLoops) {
+ JpaControlLoop jpaControlLoop = new JpaControlLoop();
+ jpaControlLoop.fromAuthorative(controlLoop);
+
+ validationResult.addResult(jpaControlLoop.validate("control loop"));
+ }
+
+ if (!validationResult.isValid()) {
+ throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult());
+ }
+
+ // Return the created control loops
+ List<ControlLoop> returnControlLoops = new ArrayList<>(controlLoops.size());
+
+ for (ControlLoop controlLoop : controlLoops) {
+ JpaControlLoop jpaControlLoop = new JpaControlLoop();
+ jpaControlLoop.fromAuthorative(controlLoop);
+
+ JpaControlLoop returnJpaControlLoop = getPfDao().update(jpaControlLoop);
+ returnControlLoops.add(returnJpaControlLoop.toAuthorative());
+ }
+
+ return returnControlLoops;
+ }
+
+ /**
+ * Delete a control loop.
+ *
+ * @param name the name of the control loop to delete
+ * @param version the version of the control loop to delete
+ * @return the control loop deleted
+ * @throws PfModelException on errors deleting the control loop
+ */
+ public ControlLoop deleteControlLoop(@NonNull final String name, @NonNull final String version) {
+
+ PfConceptKey controlLoopKey = new PfConceptKey(name, version);
+
+ JpaControlLoop jpaDeleteControlLoop = getPfDao().get(JpaControlLoop.class, controlLoopKey);
+
+ if (jpaDeleteControlLoop == null) {
+ String errorMessage =
+ "delete of control loop \"" + controlLoopKey.getId() + "\" failed, control loop does not exist";
+ throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+ }
+
+ getPfDao().delete(jpaDeleteControlLoop);
+
+ return jpaDeleteControlLoop.toAuthorative();
+ }
+
+ /**
+ * Get Node Templates.
+ *
+ * @param name the name of the node template to get, null to get all node templates
+ * @param version the version of the node template to get, null to get all node templates
+ * @return the node templates found
+ * @throws PfModelException on errors getting node templates
+ */
+ public List<ToscaNodeTemplate> getNodeTemplates(final String name, final String version) {
+ return asEntityList(getPfDao().getFiltered(JpaToscaNodeTemplate.class, name, version));
+ }
+
+ /**
+ * Get filtered node templates.
+ *
+ * @param filter the filter for the node templates to get
+ * @return the node templates found
+ * @throws PfModelException on errors getting node templates
+ */
+ public List<ToscaNodeTemplate> getFilteredNodeTemplates(
+ @NonNull final ToscaTypedEntityFilter<ToscaNodeTemplate> filter) {
+
+ return filter.filter(asEntityList(
+ getPfDao().getFiltered(JpaToscaNodeTemplate.class, filter.getName(), filter.getVersion())));
+ }
+
+ /**
+ * Convert JPA control loop list to an authorative control loop list.
+ *
+ * @param jpaEntityList the list to convert
+ * @return the authorative list
+ */
+ private <T extends ToscaEntity, J extends PfAuthorative<T>> List<T> asEntityList(List<J> jpaEntityList) {
+ return jpaEntityList.stream().map(J::toAuthorative).collect(Collectors.toList());
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantProvider.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantProvider.java
new file mode 100644
index 000000000..e82956f93
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantProvider.java
@@ -0,0 +1,195 @@
+/*-
+ * ============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.persistence.provider;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import javax.ws.rs.core.Response;
+import lombok.NonNull;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipant;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.provider.impl.AbstractModelsProvider;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
+
+/**
+ * This class provides information on participant concepts in the database to callers.
+ */
+public class ParticipantProvider extends AbstractModelsProvider {
+ /**
+ * Create a provider for participants.
+ *
+ * @param parameters the parameters for database access
+ * @throws PfModelException on initiation errors
+ */
+ public ParticipantProvider(@NonNull PolicyModelsProviderParameters parameters) throws PfModelException {
+ super(parameters);
+ this.init();
+ }
+
+ /**
+ * Get participants.
+ *
+ * @param name the name of the participant to get, null to get all participants
+ * @param version the version of the participant to get, null to get all participants
+ * @return the participants found
+ * @throws PfModelException on errors getting participants
+ */
+ public List<Participant> getParticipants(final String name, final String version) throws PfModelException {
+
+ return asParticipantList(getPfDao().getFiltered(JpaParticipant.class, name, version));
+ }
+
+ /**
+ * Get filtered participants.
+ *
+ * @param filter the filter for the participants to get
+ * @return the participants found
+ * @throws PfModelException on errors getting policies
+ */
+ public List<Participant> getFilteredParticipants(@NonNull final ToscaTypedEntityFilter<Participant> filter) {
+
+ return filter.filter(asParticipantList(
+ getPfDao().getFiltered(JpaParticipant.class, filter.getName(), filter.getVersion())));
+ }
+
+ /**
+ * Creates participants.
+ *
+ * @param participants a specification of the participants to create
+ * @return the participants created
+ * @throws PfModelException on errors creating participants
+ */
+ public List<Participant> createParticipants(@NonNull final List<Participant> participants) throws PfModelException {
+
+ BeanValidationResult validationResult = new BeanValidationResult("participants", participants);
+
+ for (Participant participant : participants) {
+ JpaParticipant jpaParticipant = new JpaParticipant();
+ jpaParticipant.fromAuthorative(participant);
+
+ validationResult.addResult(jpaParticipant.validate("participant"));
+ }
+
+ if (!validationResult.isValid()) {
+ throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult());
+ }
+
+ for (Participant participant : participants) {
+ JpaParticipant jpaParticipant = new JpaParticipant();
+ jpaParticipant.fromAuthorative(participant);
+
+ getPfDao().create(jpaParticipant);
+ }
+
+ // Return the created participants
+ List<Participant> returnParticipants = new ArrayList<>(participants.size());
+
+ for (Participant participant : participants) {
+ JpaParticipant jpaParticipant = getPfDao().get(JpaParticipant.class,
+ new PfConceptKey(participant.getName(), participant.getVersion()));
+ returnParticipants.add(jpaParticipant.toAuthorative());
+ }
+
+ return returnParticipants;
+ }
+
+ /**
+ * Updates participants.
+ *
+ * @param participants a specification of the participants to update
+ * @return the participants updated
+ * @throws PfModelException on errors updating participants
+ */
+ public List<Participant> updateParticipants(@NonNull final List<Participant> participants) throws PfModelException {
+
+ BeanValidationResult validationResult = new BeanValidationResult("participants", participants);
+
+ for (Participant participant : participants) {
+ JpaParticipant jpaParticipant = new JpaParticipant();
+ jpaParticipant.fromAuthorative(participant);
+
+ validationResult.addResult(jpaParticipant.validate("participant"));
+ }
+
+ if (!validationResult.isValid()) {
+ throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult());
+ }
+
+ for (Participant participant : participants) {
+ JpaParticipant jpaParticipant = new JpaParticipant();
+ jpaParticipant.fromAuthorative(participant);
+
+ getPfDao().update(jpaParticipant);
+ }
+
+ // Return the created participants
+ List<Participant> returnParticipants = new ArrayList<>(participants.size());
+
+ for (Participant participant : participants) {
+ JpaParticipant jpaParticipant = getPfDao().get(JpaParticipant.class,
+ new PfConceptKey(participant.getName(), participant.getVersion()));
+ returnParticipants.add(jpaParticipant.toAuthorative());
+ }
+
+ return returnParticipants;
+ }
+
+ /**
+ * Delete a participant.
+ *
+ * @param name the name of the participant to delete
+ * @param version the version of the participant to get
+ * @return the participant deleted
+ * @throws PfModelException on errors deleting participants
+ */
+ public Participant deleteParticipant(@NonNull final String name, @NonNull final String version) {
+
+ PfConceptKey participantKey = new PfConceptKey(name, version);
+
+ JpaParticipant jpaDeleteParticipant = getPfDao().get(JpaParticipant.class, participantKey);
+
+ if (jpaDeleteParticipant == null) {
+ String errorMessage =
+ "delete of participant \"" + participantKey.getId() + "\" failed, participant does not exist";
+ throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+ }
+
+ getPfDao().delete(jpaDeleteParticipant);
+
+ return jpaDeleteParticipant.toAuthorative();
+ }
+
+ /**
+ * Convert JPA participant list to an authorative participant list.
+ *
+ * @param foundParticipants the list to convert
+ * @return the authorative list
+ */
+ private List<Participant> asParticipantList(List<JpaParticipant> jpaParticipantList) {
+ return jpaParticipantList.stream().map(JpaParticipant::toAuthorative).collect(Collectors.toList());
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProvider.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProvider.java
new file mode 100644
index 000000000..6b075278c
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProvider.java
@@ -0,0 +1,159 @@
+/*-
+ * ============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.persistence.provider;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import javax.ws.rs.core.Response;
+import lombok.NonNull;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.base.PfTimestampKey;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.provider.impl.AbstractModelsProvider;
+
+/**
+ * This class provides the provision of information on participant statistics in the database to callers.
+ *
+ * @author Ramesh Murugan Iyer (ramesh.murugan.iyer@est.tech)
+ */
+public class ParticipantStatisticsProvider extends AbstractModelsProvider {
+
+ /**
+ * Create a provider for control loops statistics.
+ *
+ * @param parameters the parameters for database access
+ * @throws PfModelException on initiation errors
+ */
+ public ParticipantStatisticsProvider(@NonNull PolicyModelsProviderParameters parameters) throws PfModelException {
+ super(parameters);
+ this.init();
+ }
+
+ /**
+ * Get Participant statistics.
+ *
+ * @param name the name of the participant statistics to get, null to get all stats
+ * @return the participant statistics found
+ * @throws PfModelException on errors getting participant statistics
+ */
+ public List<ParticipantStatistics> getParticipantStatistics(final String name, final String version,
+ final Instant timestamp) throws PfModelException {
+
+ if (name != null && version != null && timestamp != null) {
+ List<ParticipantStatistics> participantStatistics = new ArrayList<>(1);
+ participantStatistics.add(getPfDao()
+ .get(JpaParticipantStatistics.class, new PfTimestampKey(name, version, timestamp)).toAuthorative());
+ return participantStatistics;
+ } else if (name != null) {
+ return getFilteredParticipantStatistics(name, version, timestamp, null, null,
+ "DESC", 0);
+ } else {
+ return asParticipantStatisticsList(getPfDao().getAll(JpaParticipantStatistics.class));
+ }
+ }
+
+
+ /**
+ * Get filtered participant statistics.
+ *
+ * @param name the participant name for the statistics to get
+ * @param startTimeStamp startTimeStamp to filter statistics
+ * @param endTimeStamp endTimeStamp to filter statistics
+ * @param sortOrder sortOrder to query database
+ * @param getRecordNum Total query count from database
+ * @return the participant statistics found
+ * @throws PfModelException on errors getting policies
+ */
+ public List<ParticipantStatistics> getFilteredParticipantStatistics(final String name, final String version,
+ final Instant startTimeStamp, final Instant endTimeStamp, Map<String, Object> filterMap,
+ final String sortOrder, final int getRecordNum) {
+
+ return asParticipantStatisticsList(getPfDao().getFiltered(JpaParticipantStatistics.class, name, version,
+ startTimeStamp, endTimeStamp, filterMap, sortOrder, getRecordNum));
+ }
+
+
+ /**
+ * Creates Participant statistics.
+ *
+ * @param participantStatisticsList a specification of the CL statistics to create
+ * @return the participant statistics created
+ * @throws PfModelException on errors creating participant statistics
+ */
+ public List<ParticipantStatistics> createParticipantStatistics(
+ @NonNull final List<ParticipantStatistics> participantStatisticsList) throws PfModelException {
+
+ BeanValidationResult validationResult =
+ new BeanValidationResult("participant statistics List", participantStatisticsList);
+
+ for (ParticipantStatistics participantStatistics : participantStatisticsList) {
+ JpaParticipantStatistics jpaParticipantStatistics = new JpaParticipantStatistics();
+ jpaParticipantStatistics.fromAuthorative(participantStatistics);
+
+ validationResult.addResult(jpaParticipantStatistics.validate("participant statistics"));
+ }
+
+ if (!validationResult.isValid()) {
+ throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, validationResult.getResult());
+ }
+
+ for (ParticipantStatistics participantStatistics : participantStatisticsList) {
+ JpaParticipantStatistics jpaParticipantStatistics = new JpaParticipantStatistics();
+ jpaParticipantStatistics.fromAuthorative(participantStatistics);
+
+ getPfDao().create(jpaParticipantStatistics);
+ }
+
+ // Return the created participant statistics
+ List<ParticipantStatistics> participantStatistics = new ArrayList<>(participantStatisticsList.size());
+
+ for (ParticipantStatistics participantStatisticsItem : participantStatisticsList) {
+ JpaParticipantStatistics jpaParticipantStatistics = getPfDao().get(JpaParticipantStatistics.class,
+ new PfTimestampKey(participantStatisticsItem.getParticipantId().getName(),
+ participantStatisticsItem.getParticipantId().getVersion(),
+ participantStatisticsItem.getTimeStamp()));
+ participantStatistics.add(jpaParticipantStatistics.toAuthorative());
+ }
+
+ return participantStatistics;
+ }
+
+
+ /**
+ * Convert JPA participant statistics list to participant statistics list.
+ *
+ * @param jpaParticipantStatisticsList the list to convert
+ * @return the participant statistics list
+ */
+ private List<ParticipantStatistics> asParticipantStatisticsList(
+ List<JpaParticipantStatistics> jpaParticipantStatisticsList) {
+
+ return jpaParticipantStatisticsList.stream().map(JpaParticipantStatistics::toAuthorative)
+ .collect(Collectors.toList());
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopNotification.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopNotification.java
new file mode 100644
index 000000000..c6bbd81d6
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopNotification.java
@@ -0,0 +1,56 @@
+/*-
+ * ============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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.models.messages.dmaap.notification;
+
+import com.google.gson.annotations.SerializedName;
+import java.util.ArrayList;
+import java.util.List;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.collections4.CollectionUtils;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ControlLoopNotification {
+
+ /**
+ * Status of control loops that are being added to participants.
+ */
+ @SerializedName("deployed-control-loops")
+ private List<ControlLoopStatus> added = new ArrayList<>();
+
+ /**
+ * Status of policies that are being deleted from PDPs.
+ */
+ @SerializedName("undeployed-control-loops")
+ private List<ControlLoopStatus> deleted = new ArrayList<>();
+
+
+ /**
+ * Determines if the notification is empty (i.e., has no added or delete control loop
+ * notifications).
+ *
+ * @return {@code true} if the notification is empty, {@code false} otherwise
+ */
+ public boolean isEmpty() {
+ return (CollectionUtils.isEmpty(added) && CollectionUtils.isEmpty(deleted));
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopStatus.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopStatus.java
new file mode 100644
index 000000000..033843e75
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopStatus.java
@@ -0,0 +1,36 @@
+/*-
+ * ============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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.models.messages.dmaap.notification;
+
+import com.google.gson.annotations.SerializedName;
+import java.util.UUID;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ControlLoopStatus {
+ @SerializedName("control-loop-id")
+ private UUID id;
+
+ private ToscaConceptIdentifier definition;
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChange.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChange.java
new file mode 100644
index 000000000..1a9a891f6
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChange.java
@@ -0,0 +1,56 @@
+/*-
+ * ============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 lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+
+/**
+ * Class to represent the PARTICIPANT_CONTROL_LOOP_STATE_CHANGE message that the control loop runtime will send to
+ * participants to change the state of a control loop they are running.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class ParticipantControlLoopStateChange extends ParticipantMessage {
+ private ControlLoopOrderedState orderedState;
+
+ /**
+ * Constructor for instantiating ParticipantControlLoopStateChange class with message name.
+ *
+ */
+ public ParticipantControlLoopStateChange() {
+ super(ParticipantMessageType.PARTICIPANT_CONTROL_LOOP_STATE_CHANGE);
+ }
+
+ /**
+ * Constructs the object, making a deep copy.
+ *
+ * @param source source from which to copy
+ */
+ public ParticipantControlLoopStateChange(ParticipantControlLoopStateChange source) {
+ super(source);
+
+ this.orderedState = source.orderedState;
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdate.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdate.java
new file mode 100644
index 000000000..ed729a64b
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdate.java
@@ -0,0 +1,63 @@
+/*-
+ * ============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 lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+
+/**
+ * Class to represent the PARTICIPANT_CONTROL_LOOP_UPDATE message that the control loop runtime sends to a participant.
+ * When a participant receives this message, it creates the control loop elements contained in the message and sets them
+ * to state PASSIVE. subsequent PARTICIPANT_CONTROL_LOOP_STATE_CHANGE messages are used to activate the control loops.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class ParticipantControlLoopUpdate extends ParticipantMessage {
+ // The control loop
+ private ControlLoop controlLoop;
+
+ // A service template containing a complete definition of the control loop
+ private ToscaServiceTemplate controlLoopDefinition;
+
+ /**
+ * Constructor for instantiating ParticipantControlLoopUpdate class with message name.
+ *
+ */
+ public ParticipantControlLoopUpdate() {
+ super(ParticipantMessageType.PARTICIPANT_CONTROL_LOOP_UPDATE);
+ }
+
+ /**
+ * Constructs the object, making a deep copy.
+ *
+ * @param source source from which to copy
+ */
+ public ParticipantControlLoopUpdate(ParticipantControlLoopUpdate source) {
+ super(source);
+
+ this.controlLoop = new ControlLoop(source.controlLoop);
+ this.controlLoopDefinition = new ToscaServiceTemplate(source.controlLoopDefinition);
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheck.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheck.java
new file mode 100644
index 000000000..e472e15fe
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheck.java
@@ -0,0 +1,56 @@
+/*-
+ * ============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 lombok.Getter;
+import lombok.Setter;
+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.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class ParticipantHealthCheck extends ParticipantMessage {
+ private ParticipantState state;
+
+ /**
+ * Constructor for instantiating ParticipantHealthCheck class with message name.
+ *
+ */
+ public ParticipantHealthCheck() {
+ super(ParticipantMessageType.PARTICIPANT_HEALTH_CHECK);
+ }
+
+ /**
+ * Constructs the object, making a deep copy.
+ *
+ * @param source source from which to copy
+ */
+ public ParticipantHealthCheck(ParticipantHealthCheck source) {
+ super(source);
+
+ this.state = source.state;
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessage.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessage.java
new file mode 100644
index 000000000..3ca4d3d34
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessage.java
@@ -0,0 +1,113 @@
+/*-
+ * ============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.time.Instant;
+import java.util.UUID;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.NonNull;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to represent the base class for various messages that will be exchanged between the control loop runtime and
+ * participants.
+ */
+@Getter
+@Setter
+@ToString
+public class ParticipantMessage {
+ @Setter(AccessLevel.NONE)
+ private ParticipantMessageType messageType;
+
+ private UUID messageId = UUID.randomUUID();
+
+ /**
+ * Time-stamp, in milliseconds, when the message was created. Defaults to the current time.
+ */
+ private Instant timestamp = Instant.now();
+
+ /**
+ * Participant Type, or {@code null} for messages from participants.
+ */
+ private ToscaConceptIdentifier participantType;
+
+ /**
+ * Participant ID, or {@code null} for messages from participants.
+ */
+ private ToscaConceptIdentifier participantId;
+
+ /**
+ * Control loop ID, or {@code null} for messages to participants.
+ */
+ private ToscaConceptIdentifier controlLoopId;
+
+ /**
+ * Constructor for instantiating a participant message class.
+ *
+ * @param messageType the message type
+ */
+ public ParticipantMessage(final ParticipantMessageType messageType) {
+ this.messageType = messageType;
+ }
+
+ /**
+ * Constructs the object, making a deep copy. Does <i>not</i> copy the request id or the time stamp.
+ *
+ * @param source source from which to copy
+ */
+ public ParticipantMessage(final ParticipantMessage source) {
+ this.messageType = source.messageType;
+ this.participantType = source.participantType;
+ this.participantId = source.participantId;
+ this.controlLoopId = source.controlLoopId;
+ }
+
+ /**
+ * Determines if this message applies to this participant type.
+ *
+ * @param participantType type of the participant to match against
+ * @param participantId id of the participant to match against
+ * @return {@code true} if this message applies to this participant, {@code false} otherwise
+ */
+ public boolean appliesTo(@NonNull final ToscaConceptIdentifier participantType,
+ @NonNull final ToscaConceptIdentifier participantId) {
+ // Broadcast message to all participants
+ if (this.participantType == null) {
+ return true;
+ }
+
+ // Broadcast message to all control loop elements on this participant
+ if (participantType.equals(this.participantType) && this.participantId == null) {
+ return true;
+ }
+
+ // Targeted message at this specific participant
+ if (participantType.equals(this.participantType) && participantId.equals(this.participantId)) {
+ return true;
+ }
+
+ // Message is not for this participant
+ return false;
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageType.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageType.java
new file mode 100644
index 000000000..77a50bd36
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageType.java
@@ -0,0 +1,56 @@
+/*-
+ * ============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;
+
+/**
+ * Class to hold the possible values for the type of participant messages.
+ */
+public enum ParticipantMessageType {
+
+ /**
+ * Used by participants to report status to the control loop runtime.
+ */
+ PARTICIPANT_STATUS,
+
+ /**
+ * Used by the control loop runtime to change the state of participants, triggers a PARTICIPANT_STATUS message with
+ * the result of the PARTICIPANT_STATE_CHANGE operation.
+ */
+ PARTICIPANT_STATE_CHANGE,
+
+ /**
+ * Used by the control loop runtime to update the control loops running on participants, triggers a
+ * PARTICIPANT_STATUS message with the result of the PARTICIPANT_CONTROL_LOOP_UPDATE operation.
+ */
+ PARTICIPANT_CONTROL_LOOP_UPDATE,
+
+ /**
+ * Used by the control loop runtime to change the state of control loops in participants, triggers a
+ * PARTICIPANT_STATUS message with the result of the PARTICIPANT_CONTROL_LOOP_STATE_CHANGE operation.
+ */
+ PARTICIPANT_CONTROL_LOOP_STATE_CHANGE,
+
+ /**
+ * Used by the control loop 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
+}
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
new file mode 100644
index 000000000..4c771b405
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseDetails.java
@@ -0,0 +1,64 @@
+/*-
+ * ============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;
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseStatus.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseStatus.java
new file mode 100644
index 000000000..f014529b3
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantResponseStatus.java
@@ -0,0 +1,42 @@
+/*-
+ * ============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;
+
+/**
+ * Class to hold the possible values for participant response status.
+ */
+public enum ParticipantResponseStatus {
+
+ /**
+ * participant operation was successful.
+ */
+ SUCCESS,
+
+ /**
+ * participant operation failed.
+ */
+ FAIL,
+
+ /**
+ * periodic response.
+ */
+ PERIODIC
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChange.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChange.java
new file mode 100644
index 000000000..5f5150077
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChange.java
@@ -0,0 +1,56 @@
+/*-
+ * ============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 lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+
+/**
+ * Class to represent the PARTICIPANT_STATE_CHANGE message that the control loop runtime will send to participants
+ * to change their state.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class ParticipantStateChange extends ParticipantMessage {
+ private ParticipantState state;
+
+ /**
+ * Constructor for instantiating ParticipantStateChange class with message name.
+ *
+ */
+ public ParticipantStateChange() {
+ super(ParticipantMessageType.PARTICIPANT_STATE_CHANGE);
+ }
+
+ /**
+ * Constructs the object, making a deep copy.
+ *
+ * @param source source from which to copy
+ */
+ public ParticipantStateChange(ParticipantStateChange source) {
+ super(source);
+
+ this.state = source.state;
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatus.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatus.java
new file mode 100644
index 000000000..5b9284243
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatus.java
@@ -0,0 +1,76 @@
+/*-
+ * ============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 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.ParticipantHealthStatus;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+
+/**
+ * Class to represent the PARTICIPANT_STATUS message that all the participants send to the control loop runtime.
+ */
+@Getter
+@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;
+
+ /**
+ * Constructor for instantiating ParticipantStatus class with message name.
+ *
+ */
+ public ParticipantStatus() {
+ super(ParticipantMessageType.PARTICIPANT_STATUS);
+ }
+
+ /**
+ * Constructs the object, making a deep copy.
+ *
+ * @param source source from which to copy
+ */
+ public ParticipantStatus(final ParticipantStatus source) {
+ super(source);
+
+ 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));
+ }
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/SimpleResponse.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/SimpleResponse.java
new file mode 100644
index 000000000..2bd09c632
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/SimpleResponse.java
@@ -0,0 +1,37 @@
+/*
+ * ============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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.models.messages.rest;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * Response returned when no extra output fields are needed.
+ */
+@Getter
+@Setter
+@ToString
+public class SimpleResponse {
+
+ /**
+ * Optional detailed message in error cases.
+ */
+ private String errorDetails;
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/TypedSimpleResponse.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/TypedSimpleResponse.java
new file mode 100644
index 000000000..199ac8ee1
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/TypedSimpleResponse.java
@@ -0,0 +1,35 @@
+/*-
+ * ============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.rest;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * Response returned when no extra output fields are needed.
+ */
+@Getter
+@Setter
+@ToString
+public class TypedSimpleResponse<T> extends SimpleResponse {
+ private T response;
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/commissioning/CommissioningResponse.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/commissioning/CommissioningResponse.java
new file mode 100644
index 000000000..6363db8d2
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/commissioning/CommissioningResponse.java
@@ -0,0 +1,38 @@
+/*-
+ * ============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.rest.commissioning;
+
+import java.util.List;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.clamp.controlloop.models.messages.rest.SimpleResponse;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Response to Commissioning requests that affect a change.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class CommissioningResponse extends SimpleResponse {
+ private List<ToscaConceptIdentifier> affectedControlLoopDefinitions;
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationCommand.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationCommand.java
new file mode 100644
index 000000000..71b7ab92c
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationCommand.java
@@ -0,0 +1,35 @@
+/*-
+ * ============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.rest.instantiation;
+
+import java.util.List;
+import lombok.Data;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+@Data
+public class InstantiationCommand {
+ // The state to which the control loops are to be set
+ private ControlLoopOrderedState orderedState;
+
+ // The list of control loops on which the command is to be issued
+ private List<ToscaConceptIdentifier> controlLoopIdentifierList;
+}
diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationResponse.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationResponse.java
new file mode 100644
index 000000000..d932f29ac
--- /dev/null
+++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationResponse.java
@@ -0,0 +1,38 @@
+/*-
+ * ============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.rest.instantiation;
+
+import java.util.List;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.onap.policy.clamp.controlloop.models.messages.rest.SimpleResponse;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Response to Commissioning requests that affect a change.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class InstantiationResponse extends SimpleResponse {
+ private List<ToscaConceptIdentifier> affectedControlLoops;
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatisticsTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatisticsTest.java
new file mode 100644
index 000000000..0addc25ad
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ClElementStatisticsTest.java
@@ -0,0 +1,67 @@
+/*-
+ * ============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 static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.time.Instant;
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ClElementStatisticsTest {
+ @Test
+ public void testClElementStatisticsLombok() {
+ assertNotNull(new ClElementStatistics());
+ ClElementStatistics cles0 = new ClElementStatistics();
+
+ assertThat(cles0.toString()).contains("ClElementStatistics(");
+ assertThat(cles0.hashCode()).isNotZero();
+ assertEquals(true, cles0.equals(cles0));
+ assertEquals(false, cles0.equals(null));
+
+
+ ClElementStatistics cles1 = new ClElementStatistics();
+ cles1.setParticipantId(new ToscaConceptIdentifier("defName", "0.0.1"));
+ cles1.setTimeStamp(Instant.now());
+
+ assertThat(cles1.toString()).contains("ClElementStatistics(");
+ assertEquals(false, cles1.hashCode() == 0);
+ assertEquals(false, cles1.equals(cles0));
+ assertEquals(false, cles1.equals(null));
+
+ assertNotEquals(cles1, cles0);
+
+ ClElementStatistics cles2 = new ClElementStatistics();
+ cles2.setId(UUID.randomUUID());
+
+ // @formatter:off
+ assertThatThrownBy(() -> cles2.setParticipantId(null)).isInstanceOf(NullPointerException.class);
+ assertThatThrownBy(() -> cles2.setTimeStamp(null)).isInstanceOf(NullPointerException.class);
+ // @formatter:on
+
+ assertNotEquals(cles2, cles0);
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopConceptPojosTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopConceptPojosTest.java
new file mode 100644
index 000000000..908c91417
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopConceptPojosTest.java
@@ -0,0 +1,62 @@
+/*-
+ * ============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 com.openpojo.reflection.PojoClass;
+import com.openpojo.reflection.impl.PojoClassFactory;
+import com.openpojo.validation.Validator;
+import com.openpojo.validation.ValidatorBuilder;
+import com.openpojo.validation.rule.impl.EqualsAndHashCodeMatchRule;
+import com.openpojo.validation.rule.impl.GetterMustExistRule;
+import com.openpojo.validation.rule.impl.NoPublicFieldsExceptStaticFinalRule;
+import com.openpojo.validation.rule.impl.SetterMustExistRule;
+import com.openpojo.validation.test.impl.GetterTester;
+import com.openpojo.validation.test.impl.SetterTester;
+import java.util.List;
+import org.junit.Test;
+import org.onap.policy.common.utils.test.ToStringTester;
+
+/**
+ * Class to perform unit tests of all pojos.
+ */
+public class ControlLoopConceptPojosTest {
+
+ @Test
+ public void testPojos() {
+ List<PojoClass> pojoClasses =
+ PojoClassFactory.getPojoClasses(ControlLoopConceptPojosTest.class.getPackageName());
+
+ // @formatter:off
+ final Validator validator = ValidatorBuilder
+ .create()
+ .with(new SetterMustExistRule())
+ .with(new GetterMustExistRule())
+ .with(new EqualsAndHashCodeMatchRule())
+ .with(new NoPublicFieldsExceptStaticFinalRule())
+ .with(new SetterTester())
+ .with(new GetterTester())
+ .with(new ToStringTester())
+ .build();
+
+ validator.validate(pojoClasses);
+ // @formatter:on
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElementTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElementTest.java
new file mode 100644
index 000000000..2264f6dc2
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopElementTest.java
@@ -0,0 +1,81 @@
+/*-
+ * ============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 static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ControlLoopElementTest {
+ @Test
+ public void testControlLoopElement() {
+
+ ControlLoopElement cle0 = new ControlLoopElement();
+
+ ControlLoopElement cle1 = new ControlLoopElement(cle0);
+ assertEquals(cle0, cle1);
+ }
+
+ @Test
+ public void testControlLoopElementLombok() {
+ assertNotNull(new ControlLoopElement());
+ ControlLoopElement cle0 = new ControlLoopElement();
+
+ assertThat(cle0.toString()).contains("ControlLoopElement(");
+ assertThat(cle0.hashCode()).isNotZero();
+ assertEquals(true, cle0.equals(cle0));
+ assertEquals(false, cle0.equals(null));
+
+ ControlLoopElement cle1 = new ControlLoopElement();
+
+ cle1.setDefinition(new ToscaConceptIdentifier("defName", "0.0.1"));
+ cle1.setDescription("Description");
+ cle1.setId(UUID.randomUUID());
+ cle1.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+ cle1.setParticipantId(new ToscaConceptIdentifier("id", "1.2.3"));
+ cle1.setState(ControlLoopState.UNINITIALISED);
+
+ assertThat(cle1.toString()).contains("ControlLoopElement(");
+ assertEquals(false, cle1.hashCode() == 0);
+ assertEquals(false, cle1.equals(cle0));
+ assertEquals(false, cle1.equals(null));
+
+ assertNotEquals(cle1, cle0);
+
+ ControlLoopElement cle2 = new ControlLoopElement();
+
+ // @formatter:off
+ assertThatThrownBy(() -> cle2.setDefinition(null)). isInstanceOf(NullPointerException.class);
+ assertThatThrownBy(() -> cle2.setId(null)). isInstanceOf(NullPointerException.class);
+ assertThatThrownBy(() -> cle2.setOrderedState(null)). isInstanceOf(NullPointerException.class);
+ assertThatThrownBy(() -> cle2.setParticipantId(null)).isInstanceOf(NullPointerException.class);
+ assertThatThrownBy(() -> cle2.setState(null)). isInstanceOf(NullPointerException.class);
+ // @formatter:on
+
+ assertNotEquals(cle2, cle0);
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopTest.java
new file mode 100644
index 000000000..c865b76ab
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ControlLoopTest.java
@@ -0,0 +1,102 @@
+/*-
+ * ============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 static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.util.LinkedHashMap;
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ControlLoopTest {
+ @Test
+ public void testControlLoop() {
+ ControlLoop cl0 = new ControlLoop();
+ cl0.setDefinition(new ToscaConceptIdentifier("dfName", "1.2.3"));
+ assertEquals("dfName", cl0.getType());
+ assertEquals("1.2.3", cl0.getTypeVersion());
+
+ ControlLoop cl1 = new ControlLoop(cl0);
+ assertEquals(cl0, cl1);
+
+ assertEquals(0, cl0.compareTo(cl1));
+ }
+
+ @Test
+ public void testControlLoopLombok() {
+ assertNotNull(new ControlLoop());
+ ControlLoop cl0 = new ControlLoop();
+ cl0.setElements(new LinkedHashMap<>());
+
+ assertThat(cl0.toString()).contains("ControlLoop(");
+ assertThat(cl0.hashCode()).isNotZero();
+ assertEquals(true, cl0.equals(cl0));
+ assertEquals(false, cl0.equals(null));
+
+ ControlLoop cl1 = new ControlLoop();
+
+ cl1.setDefinition(new ToscaConceptIdentifier("defName", "0.0.1"));
+ cl1.setDescription("Description");
+ cl1.setElements(new LinkedHashMap<>());
+ cl1.setName("Name");
+ cl1.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+ cl1.setState(ControlLoopState.UNINITIALISED);
+ cl1.setVersion("0.0.1");
+
+ assertThat(cl1.toString()).contains("ControlLoop(");
+ assertEquals(false, cl1.hashCode() == 0);
+ assertEquals(false, cl1.equals(cl0));
+ assertEquals(false, cl1.equals(null));
+
+ assertNotEquals(cl1, cl0);
+
+ ControlLoop cl2 = new ControlLoop();
+ cl2.setElements(new LinkedHashMap<>());
+
+ // @formatter:off
+ assertThatThrownBy(() -> cl2.setDefinition(null)). isInstanceOf(NullPointerException.class);
+ assertThatThrownBy(() -> cl2.setOrderedState(null)).isInstanceOf(NullPointerException.class);
+ assertThatThrownBy(() -> cl2.setState(null)). isInstanceOf(NullPointerException.class);
+ // @formatter:on
+
+ assertEquals(cl2, cl0);
+
+ cl1.setCascadedOrderedState(ControlLoopOrderedState.PASSIVE);
+ assertEquals(ControlLoopOrderedState.PASSIVE, cl1.getOrderedState());
+
+ cl1.getElements().put(UUID.randomUUID(), new ControlLoopElement());
+ cl1.setCascadedOrderedState(ControlLoopOrderedState.RUNNING);
+ assertEquals(ControlLoopOrderedState.RUNNING, cl1.getOrderedState());
+ assertEquals(ControlLoopOrderedState.RUNNING, cl1.getElements().values().iterator().next().getOrderedState());
+
+ assertNull(cl0.getElements().get(UUID.randomUUID()));
+ assertNull(cl1.getElements().get(UUID.randomUUID()));
+
+ assertEquals(PfKey.NULL_KEY_NAME, cl0.getDefinition().getName());
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatisticsTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatisticsTest.java
new file mode 100644
index 000000000..54eaca00e
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantStatisticsTest.java
@@ -0,0 +1,65 @@
+/*-
+ * ============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 static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.time.Instant;
+import org.junit.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ParticipantStatisticsTest {
+ @Test
+ public void testParticipantStatisticsLombok() {
+ assertNotNull(new ParticipantStatistics());
+ ParticipantStatistics ps0 = new ParticipantStatistics();
+
+ assertThat(ps0.toString()).contains("ParticipantStatistics(");
+ assertThat(ps0.hashCode()).isNotZero();
+ assertEquals(true, ps0.equals(ps0));
+ assertEquals(false, ps0.equals(null));
+
+
+ ParticipantStatistics ps1 = new ParticipantStatistics();
+ ps1.setParticipantId(new ToscaConceptIdentifier("defName", "0.0.1"));
+ ps1.setTimeStamp(Instant.now());
+
+ assertThat(ps1.toString()).contains("ParticipantStatistics(");
+ assertEquals(false, ps1.hashCode() == 0);
+ assertEquals(false, ps1.equals(ps0));
+ assertEquals(false, ps1.equals(null));
+
+ assertNotEquals(ps1, ps0);
+
+ ParticipantStatistics ps2 = new ParticipantStatistics();
+
+ // @formatter:off
+ assertThatThrownBy(() -> ps2.setParticipantId(null)).isInstanceOf(NullPointerException.class);
+ assertThatThrownBy(() -> ps2.setTimeStamp(null)). isInstanceOf(NullPointerException.class);
+ // @formatter:on
+
+ assertEquals(ps2, ps0);
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantTest.java
new file mode 100644
index 000000000..1eb80db09
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/concepts/ParticipantTest.java
@@ -0,0 +1,84 @@
+/*-
+ * ============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 static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ParticipantTest {
+ @Test
+ public void testParticipant() {
+
+ Participant p0 = new Participant();
+ p0.setDefinition(new ToscaConceptIdentifier("dfName", "1.2.3"));
+ assertEquals("dfName", p0.getType());
+ assertEquals("1.2.3", p0.getTypeVersion());
+
+ Participant p1 = new Participant(p0);
+ assertEquals(p0, p1);
+
+ assertEquals(0, p0.compareTo(p1));
+ }
+
+ @Test
+ public void testParticipantLombok() {
+ assertNotNull(new Participant());
+ Participant p0 = new Participant();
+
+ assertThat(p0.toString()).contains("Participant(");
+ assertThat(p0.hashCode()).isNotZero();
+ assertEquals(true, p0.equals(p0));
+ assertEquals(false, p0.equals(null));
+
+
+ Participant p1 = new Participant();
+
+ p1.setDefinition(new ToscaConceptIdentifier("defName", "0.0.1"));
+ p1.setDescription("Description");
+ p1.setHealthStatus(ParticipantHealthStatus.HEALTHY);
+ p1.setName("Name");
+ p1.setParticipantState(ParticipantState.ACTIVE);
+ p1.setVersion("0.0.1");
+
+ assertThat(p1.toString()).contains("Participant(");
+ assertEquals(false, p1.hashCode() == 0);
+ assertEquals(false, p1.equals(p0));
+ assertEquals(false, p1.equals(null));
+
+ assertNotEquals(p1, p0);
+
+ Participant p2 = new Participant();
+
+ // @formatter:off
+ assertThatThrownBy(() -> p2.setDefinition(null)). isInstanceOf(NullPointerException.class);
+ assertThatThrownBy(() -> p2.setHealthStatus(null)). isInstanceOf(NullPointerException.class);
+ assertThatThrownBy(() -> p2.setParticipantState(null)).isInstanceOf(NullPointerException.class);
+ // @formatter:on
+
+ assertEquals(p2, p0);
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaClElementStatisticsChild.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaClElementStatisticsChild.java
new file mode 100644
index 000000000..b90ccba5b
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaClElementStatisticsChild.java
@@ -0,0 +1,28 @@
+/*-
+ * ============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.persistence.concepts;
+
+/**
+ * Test class for {@link JpaClElementStatistics} comparisons.
+ */
+public class DummyJpaClElementStatisticsChild extends JpaClElementStatistics {
+ private static final long serialVersionUID = -5101743610779424064L;
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaControlLoopChild.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaControlLoopChild.java
new file mode 100644
index 000000000..c4eb364d3
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaControlLoopChild.java
@@ -0,0 +1,28 @@
+/*-
+ * ============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.persistence.concepts;
+
+/**
+ * Test class for {@link JpaControlLoop} comparisons.
+ */
+public class DummyJpaControlLoopChild extends JpaControlLoop {
+ private static final long serialVersionUID = -5101743610779424064L;
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaControlLoopElementChild.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaControlLoopElementChild.java
new file mode 100644
index 000000000..2082ff41c
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaControlLoopElementChild.java
@@ -0,0 +1,28 @@
+/*-
+ * ============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.persistence.concepts;
+
+/**
+ * Test class for {@link JpaControlLoopElement} comparisons.
+ */
+public class DummyJpaControlLoopElementChild extends JpaControlLoopElement {
+ private static final long serialVersionUID = -5101743610779424064L;
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaParticipantChild.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaParticipantChild.java
new file mode 100644
index 000000000..e6bc92efb
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaParticipantChild.java
@@ -0,0 +1,28 @@
+/*-
+ * ============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.persistence.concepts;
+
+/**
+ * Test class for {@link JpaParticipant} comparisons.
+ */
+public class DummyJpaParticipantChild extends JpaParticipant {
+ private static final long serialVersionUID = -5101743610779424064L;
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaParticipantStatisticsChild.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaParticipantStatisticsChild.java
new file mode 100644
index 000000000..74dd40034
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/DummyJpaParticipantStatisticsChild.java
@@ -0,0 +1,28 @@
+/*-
+ * ============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.persistence.concepts;
+
+/**
+ * Test class for {@link JpaParticipantStatistics} comparisons.
+ */
+public class DummyJpaParticipantStatisticsChild extends JpaParticipantStatistics {
+ private static final long serialVersionUID = -5101743610779424064L;
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaClElementStatisticsTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaClElementStatisticsTest.java
new file mode 100644
index 000000000..16c302f94
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaClElementStatisticsTest.java
@@ -0,0 +1,189 @@
+/*-
+ * ============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.persistence.concepts;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.time.Instant;
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfReferenceTimestampKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Test the {@link JpaClElementStatistics} class.
+ */
+public class JpaClElementStatisticsTest {
+
+ private static final String NULL_KEY_ERROR = "key is marked .*ull but is null";
+
+ @Test
+ public void testJpaClElementStatisticsConstructor() {
+ assertThatThrownBy(() -> {
+ new JpaClElementStatistics((JpaClElementStatistics) null);
+ }).hasMessageMatching("copyConcept is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaClElementStatistics((PfReferenceTimestampKey) null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaClElementStatistics(null, null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaClElementStatistics(null, new PfConceptKey());
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaClElementStatistics(new PfReferenceTimestampKey(), null);
+ }).hasMessageMatching("participantId is marked .*ull but is null");
+
+ assertNotNull(new JpaClElementStatistics());
+ assertNotNull(new JpaClElementStatistics((new PfReferenceTimestampKey())));
+ assertNotNull(new JpaClElementStatistics(new PfReferenceTimestampKey(), new PfConceptKey()));
+ }
+
+ @Test
+ public void testJpaClElementStatistics() {
+ JpaClElementStatistics testJpaClElementStatistics = createJpaClElementStatisticsInstance();
+
+ ClElementStatistics cles = createClElementStatisticsInstance();
+ assertEquals(cles, testJpaClElementStatistics.toAuthorative());
+
+ assertThatThrownBy(() -> {
+ testJpaClElementStatistics.fromAuthorative(null);
+ }).hasMessageMatching("clElementStatistics is marked .*ull but is null");
+
+ assertThatThrownBy(() -> new JpaClElementStatistics((JpaClElementStatistics) null))
+ .isInstanceOf(NullPointerException.class);
+
+ JpaClElementStatistics testJpaClElementStatisticsFa = new JpaClElementStatistics();
+ testJpaClElementStatisticsFa.setKey(null);
+ testJpaClElementStatisticsFa.fromAuthorative(cles);
+ assertEquals(testJpaClElementStatistics, testJpaClElementStatisticsFa);
+ testJpaClElementStatisticsFa.setKey(PfReferenceTimestampKey.getNullKey());
+ testJpaClElementStatisticsFa.fromAuthorative(cles);
+ assertEquals(testJpaClElementStatistics, testJpaClElementStatisticsFa);
+ testJpaClElementStatisticsFa.setKey(new PfReferenceTimestampKey("elementName", "0.0.1",
+ "a95757ba-b34a-4049-a2a8-46773abcbe5e", Instant.ofEpochSecond(123456L)));
+ testJpaClElementStatisticsFa.fromAuthorative(cles);
+ assertEquals(testJpaClElementStatistics, testJpaClElementStatisticsFa);
+
+ testJpaClElementStatisticsFa = new JpaClElementStatistics(cles);
+ assertEquals(testJpaClElementStatistics, testJpaClElementStatisticsFa);
+
+ assertEquals(1, testJpaClElementStatistics.getKeys().size());
+
+ assertEquals("elementName", testJpaClElementStatistics.getKey().getReferenceKey().getParentKeyName());
+
+ testJpaClElementStatistics.clean();
+ assertEquals("elementName", testJpaClElementStatistics.getKey().getReferenceKey().getParentKeyName());
+
+ JpaClElementStatistics testJpaClElementStatistics2 = new JpaClElementStatistics(testJpaClElementStatistics);
+ assertEquals(testJpaClElementStatistics, testJpaClElementStatistics2);
+ }
+
+ @Test
+ public void testJpaClElementStatisticsValidation() {
+ JpaClElementStatistics testJpaClElementStatistics = createJpaClElementStatisticsInstance();
+
+ assertThatThrownBy(() -> {
+ testJpaClElementStatistics.validate(null);
+ }).hasMessageMatching("fieldName is marked .*ull but is null");
+
+ assertTrue(testJpaClElementStatistics.validate("").isValid());
+ }
+
+ @Test
+ public void testJpaClElementStatisticsCompareTo() {
+ JpaClElementStatistics testJpaClElementStatistics = createJpaClElementStatisticsInstance();
+
+ JpaClElementStatistics otherJpaClElementStatistics = new JpaClElementStatistics(testJpaClElementStatistics);
+ assertEquals(0, testJpaClElementStatistics.compareTo(otherJpaClElementStatistics));
+ assertEquals(-1, testJpaClElementStatistics.compareTo(null));
+ assertEquals(0, testJpaClElementStatistics.compareTo(testJpaClElementStatistics));
+ assertNotEquals(0, testJpaClElementStatistics.compareTo(new DummyJpaClElementStatisticsChild()));
+
+ testJpaClElementStatistics.setState(ControlLoopState.PASSIVE);
+ assertNotEquals(0, testJpaClElementStatistics.compareTo(otherJpaClElementStatistics));
+ testJpaClElementStatistics.setState(ControlLoopState.UNINITIALISED);
+ assertEquals(0, testJpaClElementStatistics.compareTo(otherJpaClElementStatistics));
+
+ assertEquals(testJpaClElementStatistics, new JpaClElementStatistics(testJpaClElementStatistics));
+ }
+
+ @Test
+ public void testJpaClElementStatisticsLombok() {
+ assertNotNull(new Participant());
+ JpaClElementStatistics cles0 = new JpaClElementStatistics();
+
+ assertThat(cles0.toString()).contains("JpaClElementStatistics(");
+ assertThat(cles0.hashCode()).isNotZero();
+ assertEquals(true, cles0.equals(cles0));
+ assertEquals(false, cles0.equals(null));
+
+
+ JpaClElementStatistics cles11 = new JpaClElementStatistics();
+
+ cles11.setState(ControlLoopState.UNINITIALISED);
+
+ assertThat(cles11.toString()).contains("JpaClElementStatistics(");
+ assertEquals(false, cles11.hashCode() == 0);
+ assertEquals(false, cles11.equals(cles0));
+ assertEquals(false, cles11.equals(null));
+
+ assertNotEquals(cles11, cles0);
+
+ JpaClElementStatistics cles2 = new JpaClElementStatistics();
+ assertEquals(cles2, cles0);
+ }
+
+ private JpaClElementStatistics createJpaClElementStatisticsInstance() {
+ ClElementStatistics testCles = createClElementStatisticsInstance();
+ JpaClElementStatistics testJpaClElementStatistics = new JpaClElementStatistics();
+ testJpaClElementStatistics.setKey(null);
+ testJpaClElementStatistics.fromAuthorative(testCles);
+ testJpaClElementStatistics.setKey(PfReferenceTimestampKey.getNullKey());
+ testJpaClElementStatistics.fromAuthorative(testCles);
+
+ return testJpaClElementStatistics;
+ }
+
+ private ClElementStatistics createClElementStatisticsInstance() {
+ ClElementStatistics clElementStatistics = new ClElementStatistics();
+ clElementStatistics.setParticipantId(new ToscaConceptIdentifier("elementName", "0.0.1"));
+ clElementStatistics.setId(UUID.fromString("a95757ba-b34a-4049-a2a8-46773abcbe5e"));
+ clElementStatistics.setTimeStamp(Instant.ofEpochSecond(123456L));
+ clElementStatistics.setControlLoopState(ControlLoopState.UNINITIALISED);
+
+ return clElementStatistics;
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopElementTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopElementTest.java
new file mode 100644
index 000000000..032d655e3
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopElementTest.java
@@ -0,0 +1,300 @@
+/*-
+ * ============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.persistence.concepts;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+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.Participant;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.PfReferenceKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Test the {@link JpaControlLoopElement} class.
+ */
+public class JpaControlLoopElementTest {
+
+ private static final String NULL_KEY_ERROR = "key is marked .*ull but is null";
+
+ @Test
+ public void testJpaControlLoopElementConstructor() {
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement((JpaControlLoopElement) null);
+ }).hasMessageMatching("copyConcept is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement((PfReferenceKey) null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement(null, null, null, null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement(null, null, null, ControlLoopState.UNINITIALISED);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement(null, null, new PfConceptKey("participant", "0.0.1"), null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement(null, null, new PfConceptKey("participant", "0.0.1"),
+ ControlLoopState.UNINITIALISED);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement(null, new PfConceptKey(), null, null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement(null, new PfConceptKey(), null, ControlLoopState.UNINITIALISED);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement(null, new PfConceptKey(), new PfConceptKey("participant", "0.0.1"), null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement(null, new PfConceptKey(), new PfConceptKey("participant", "0.0.1"),
+ ControlLoopState.UNINITIALISED);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement(new PfReferenceKey(), null, null, null);
+ }).hasMessageMatching("definition is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement(new PfReferenceKey(), null, null, ControlLoopState.UNINITIALISED);
+ }).hasMessageMatching("definition is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement(new PfReferenceKey(), null, new PfConceptKey("participant", "0.0.1"), null);
+ }).hasMessageMatching("definition is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement(new PfReferenceKey(), null, new PfConceptKey("participant", "0.0.1"),
+ ControlLoopState.UNINITIALISED);
+ }).hasMessageMatching("definition is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement(new PfReferenceKey(), new PfConceptKey(), null, null);
+ }).hasMessageMatching("participantType is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement(new PfReferenceKey(), new PfConceptKey(), null, ControlLoopState.UNINITIALISED);
+ }).hasMessageMatching("participantType is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoopElement(new PfReferenceKey(), new PfConceptKey(),
+ new PfConceptKey("participant", "0.0.1"), null);
+ }).hasMessageMatching("state is marked .*ull but is null");
+
+ assertNotNull(new JpaControlLoopElement());
+ assertNotNull(new JpaControlLoopElement((new PfReferenceKey())));
+ assertNotNull(new JpaControlLoopElement(new PfReferenceKey(), new PfConceptKey(),
+ new PfConceptKey("participant", "0.0.1"), ControlLoopState.UNINITIALISED));
+ }
+
+ @Test
+ public void testJpaControlLoopElement() {
+ JpaControlLoopElement testJpaControlLoopElement = createJpaControlLoopElementInstance();
+
+ ControlLoopElement cle = createControlLoopElementInstance();
+ assertEquals(cle, testJpaControlLoopElement.toAuthorative());
+
+ assertThatThrownBy(() -> {
+ testJpaControlLoopElement.fromAuthorative(null);
+ }).hasMessageMatching("element is marked .*ull but is null");
+
+ assertThatThrownBy(() -> new JpaControlLoopElement((JpaControlLoopElement) null))
+ .isInstanceOf(NullPointerException.class);
+
+ JpaControlLoopElement testJpaControlLoopElementFa = new JpaControlLoopElement();
+ testJpaControlLoopElementFa.setKey(null);
+ testJpaControlLoopElementFa.fromAuthorative(cle);
+ assertEquals(testJpaControlLoopElement, testJpaControlLoopElementFa);
+ testJpaControlLoopElementFa.setKey(PfReferenceKey.getNullKey());
+ testJpaControlLoopElementFa.fromAuthorative(cle);
+ assertEquals(testJpaControlLoopElement, testJpaControlLoopElementFa);
+ testJpaControlLoopElementFa.setKey(new PfReferenceKey(PfKey.NULL_KEY_NAME, PfKey.NULL_KEY_VERSION,
+ "a95757ba-b34a-4049-a2a8-46773abcbe5e"));
+ testJpaControlLoopElementFa.fromAuthorative(cle);
+ assertEquals(testJpaControlLoopElement, testJpaControlLoopElementFa);
+
+ assertEquals("a95757ba-b34a-4049-a2a8-46773abcbe5e", testJpaControlLoopElement.getKey().getLocalName());
+ assertEquals("a95757ba-b34a-4049-a2a8-46773abcbe5e",
+ new JpaControlLoopElement(createControlLoopElementInstance()).getKey().getLocalName());
+ assertEquals("a95757ba-b34a-4049-a2a8-46773abcbe5e",
+ ((PfReferenceKey) new JpaControlLoopElement(createControlLoopElementInstance()).getKeys().get(0))
+ .getLocalName());
+
+ testJpaControlLoopElement.clean();
+ assertEquals("a95757ba-b34a-4049-a2a8-46773abcbe5e", testJpaControlLoopElement.getKey().getLocalName());
+
+ testJpaControlLoopElement.setDescription(" A Message ");
+ testJpaControlLoopElement.clean();
+ assertEquals("A Message", testJpaControlLoopElement.getDescription());
+
+ JpaControlLoopElement testJpaControlLoopElement2 = new JpaControlLoopElement(testJpaControlLoopElement);
+ assertEquals(testJpaControlLoopElement, testJpaControlLoopElement2);
+ }
+
+ @Test
+ public void testJpaControlLoopElementOrderedState() throws CoderException {
+ ControlLoopElement testControlLoopElement = createControlLoopElementInstance();
+ JpaControlLoopElement testJpaControlLoopElement = createJpaControlLoopElementInstance();
+
+ testJpaControlLoopElement.setOrderedState(null);
+ assertEquals(testControlLoopElement, testJpaControlLoopElement.toAuthorative());
+ testJpaControlLoopElement.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+
+ ControlLoopElement noOrderedStateCle = new StandardCoder().decode(
+ new File("src/test/resources/json/ControlLoopElementNoOrderedState.json"), ControlLoopElement.class);
+
+ JpaControlLoopElement noOrderedStateJpaCle = new JpaControlLoopElement(noOrderedStateCle);
+ assertNull(noOrderedStateJpaCle.getOrderedState());
+ noOrderedStateCle.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+ noOrderedStateJpaCle = new JpaControlLoopElement(noOrderedStateCle);
+ assertEquals(testJpaControlLoopElement, noOrderedStateJpaCle);
+ }
+
+ @Test
+ public void testJpaControlLoopElementValidation() {
+ JpaControlLoopElement testJpaControlLoopElement = createJpaControlLoopElementInstance();
+
+ assertThatThrownBy(() -> {
+ testJpaControlLoopElement.validate(null);
+ }).hasMessageMatching("fieldName is marked .*ull but is null");
+
+ assertTrue(testJpaControlLoopElement.validate("").isValid());
+ }
+
+ @Test
+ public void testJpaControlLoopElementCompareTo() {
+ JpaControlLoopElement testJpaControlLoopElement = createJpaControlLoopElementInstance();
+
+ JpaControlLoopElement otherJpaControlLoopElement = new JpaControlLoopElement(testJpaControlLoopElement);
+ assertEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+ assertEquals(-1, testJpaControlLoopElement.compareTo(null));
+ assertEquals(0, testJpaControlLoopElement.compareTo(testJpaControlLoopElement));
+ assertNotEquals(0, testJpaControlLoopElement.compareTo(new DummyJpaControlLoopElementChild()));
+
+ testJpaControlLoopElement
+ .setKey(new PfReferenceKey("BadValue", "0.0.1", "a95757ba-b34a-4049-a2a8-46773abcbe5e"));
+ assertNotEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+ testJpaControlLoopElement.setKey(new PfReferenceKey(PfKey.NULL_KEY_NAME, PfKey.NULL_KEY_VERSION,
+ "a95757ba-b34a-4049-a2a8-46773abcbe5e"));
+ assertEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+
+ testJpaControlLoopElement.setDefinition(new PfConceptKey("BadValue", "0.0.1"));
+ assertNotEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+ testJpaControlLoopElement.setDefinition(new PfConceptKey("cleDef", "0.0.1"));
+ assertEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+
+ testJpaControlLoopElement.setDescription("Description");
+ assertNotEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+ testJpaControlLoopElement.setDescription(null);
+ assertEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+
+ testJpaControlLoopElement.setOrderedState(ControlLoopOrderedState.PASSIVE);
+ assertNotEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+ testJpaControlLoopElement.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+ assertEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+
+ testJpaControlLoopElement.setState(ControlLoopState.PASSIVE);
+ assertNotEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+ testJpaControlLoopElement.setState(ControlLoopState.UNINITIALISED);
+ assertEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+
+ testJpaControlLoopElement.setParticipantType(new PfConceptKey("dummy", "0.0.1"));
+ assertNotEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+ testJpaControlLoopElement.setParticipantType(new PfConceptKey("participantType", "0.0.1"));
+ assertEquals(0, testJpaControlLoopElement.compareTo(otherJpaControlLoopElement));
+
+ assertEquals(testJpaControlLoopElement, new JpaControlLoopElement(testJpaControlLoopElement));
+ }
+
+ @Test
+ public void testJpaControlLoopElementLombok() {
+ assertNotNull(new Participant());
+ JpaControlLoopElement cle0 = new JpaControlLoopElement();
+
+ assertThat(cle0.toString()).contains("JpaControlLoopElement(");
+ assertThat(cle0.hashCode()).isNotZero();
+ assertEquals(true, cle0.equals(cle0));
+ assertEquals(false, cle0.equals(null));
+
+
+ JpaControlLoopElement cle1 = new JpaControlLoopElement();
+
+ cle1.setDefinition(new PfConceptKey("defName", "0.0.1"));
+ cle1.setDescription("Description");
+ cle1.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+ cle1.setState(ControlLoopState.UNINITIALISED);
+ cle1.setParticipantId(new PfConceptKey("participant", "0.0.1"));
+
+ assertThat(cle1.toString()).contains("ControlLoopElement(");
+ assertEquals(false, cle1.hashCode() == 0);
+ assertEquals(false, cle1.equals(cle0));
+ assertEquals(false, cle1.equals(null));
+
+ assertNotEquals(cle1, cle0);
+
+ JpaControlLoopElement cle2 = new JpaControlLoopElement();
+ assertEquals(cle2, cle0);
+ }
+
+ private JpaControlLoopElement createJpaControlLoopElementInstance() {
+ ControlLoopElement testCle = createControlLoopElementInstance();
+ JpaControlLoopElement testJpaControlLoopElement = new JpaControlLoopElement();
+ testJpaControlLoopElement.setKey(null);
+ testJpaControlLoopElement.fromAuthorative(testCle);
+ testJpaControlLoopElement.setKey(PfReferenceKey.getNullKey());
+ testJpaControlLoopElement.fromAuthorative(testCle);
+
+ return testJpaControlLoopElement;
+ }
+
+ private ControlLoopElement createControlLoopElementInstance() {
+ ControlLoopElement controlLoopElement = new ControlLoopElement();
+ controlLoopElement.setId(UUID.fromString("a95757ba-b34a-4049-a2a8-46773abcbe5e"));
+ controlLoopElement.setDefinition(new ToscaConceptIdentifier("cleDef", "0.0.1"));
+ controlLoopElement.setParticipantType(new ToscaConceptIdentifier("participantType", "0.0.1"));
+
+ return controlLoopElement;
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopTest.java
new file mode 100644
index 000000000..01062b046
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaControlLoopTest.java
@@ -0,0 +1,296 @@
+/*-
+ * ============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.persistence.concepts;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.LinkedHashMap;
+import org.junit.Test;
+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.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Test the {@link JpaControlLoopTest} class.
+ */
+public class JpaControlLoopTest {
+
+ private static final String NULL_KEY_ERROR = "key is marked .*ull but is null";
+
+ @Test
+ public void testJpaControlLoopConstructor() {
+ assertThatThrownBy(() -> {
+ new JpaControlLoop((JpaControlLoop) null);
+ }).hasMessageMatching("copyConcept is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoop((PfConceptKey) null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoop(null, null, null, null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoop(null, null, null, new LinkedHashMap<>());
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoop(null, null, ControlLoopState.UNINITIALISED, null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoop(null, null, ControlLoopState.UNINITIALISED, new LinkedHashMap<>());
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoop(null, new PfConceptKey(), null, null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoop(null, new PfConceptKey(), null, new LinkedHashMap<>());
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoop(null, new PfConceptKey(), ControlLoopState.UNINITIALISED, null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoop(null, new PfConceptKey(), ControlLoopState.UNINITIALISED, new LinkedHashMap<>());
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoop(new PfConceptKey(), null, null, null);
+ }).hasMessageMatching("definition is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoop(new PfConceptKey(), null, null, new LinkedHashMap<>());
+ }).hasMessageMatching("definition is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoop(new PfConceptKey(), null, ControlLoopState.UNINITIALISED, null);
+ }).hasMessageMatching("definition is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoop(new PfConceptKey(), null, ControlLoopState.UNINITIALISED, new LinkedHashMap<>());
+ }).hasMessageMatching("definition is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoop(new PfConceptKey(), new PfConceptKey(), null, null);
+ }).hasMessageMatching("state is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoop(new PfConceptKey(), new PfConceptKey(), null, new LinkedHashMap<>());
+ }).hasMessageMatching("state is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaControlLoop(new PfConceptKey(), new PfConceptKey(), ControlLoopState.UNINITIALISED, null);
+ }).hasMessageMatching("elements is marked .*ull but is null");
+
+ assertNotNull(new JpaControlLoop());
+ assertNotNull(new JpaControlLoop((new PfConceptKey())));
+ assertNotNull(new JpaControlLoop(new PfConceptKey(), new PfConceptKey(), ControlLoopState.UNINITIALISED,
+ new LinkedHashMap<>()));
+ }
+
+ @Test
+ public void testJpaControlLoop() {
+ JpaControlLoop testJpaControlLoop = createJpaControlLoopInstance();
+
+ ControlLoop participant = createControlLoopInstance();
+ assertEquals(participant, testJpaControlLoop.toAuthorative());
+
+ assertThatThrownBy(() -> {
+ testJpaControlLoop.fromAuthorative(null);
+ }).hasMessageMatching("controlLoop is marked .*ull but is null");
+
+ assertThatThrownBy(() -> new JpaControlLoop((JpaControlLoop) null)).isInstanceOf(NullPointerException.class);
+
+ JpaControlLoop testJpaControlLoopFa = new JpaControlLoop();
+ testJpaControlLoopFa.setKey(null);
+ testJpaControlLoopFa.fromAuthorative(participant);
+ assertEquals(testJpaControlLoop, testJpaControlLoopFa);
+ testJpaControlLoopFa.setKey(PfConceptKey.getNullKey());
+ testJpaControlLoopFa.fromAuthorative(participant);
+ assertEquals(testJpaControlLoop, testJpaControlLoopFa);
+ testJpaControlLoopFa.setKey(new PfConceptKey("control-loop", "0.0.1"));
+ testJpaControlLoopFa.fromAuthorative(participant);
+ assertEquals(testJpaControlLoop, testJpaControlLoopFa);
+
+ assertEquals("control-loop", testJpaControlLoop.getKey().getName());
+ assertEquals("control-loop", new JpaControlLoop(createControlLoopInstance()).getKey().getName());
+ assertEquals("control-loop",
+ ((PfConceptKey) new JpaControlLoop(createControlLoopInstance()).getKeys().get(0)).getName());
+
+ testJpaControlLoop.clean();
+ assertEquals("control-loop", testJpaControlLoop.getKey().getName());
+
+ testJpaControlLoop.setDescription(" A Message ");
+ testJpaControlLoop.clean();
+ assertEquals("A Message", testJpaControlLoop.getDescription());
+
+ JpaControlLoop testJpaControlLoop2 = new JpaControlLoop(testJpaControlLoop);
+ assertEquals(testJpaControlLoop, testJpaControlLoop2);
+ }
+
+ @Test
+ public void testJpaControlLoopElementOrderedState() throws CoderException {
+ ControlLoop testControlLoop = createControlLoopInstance();
+ JpaControlLoop testJpaControlLoop = createJpaControlLoopInstance();
+
+ testJpaControlLoop.setOrderedState(null);
+ assertEquals(testControlLoop, testJpaControlLoop.toAuthorative());
+ testJpaControlLoop.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+
+ ControlLoop noOrderedStateCl = new StandardCoder()
+ .decode(new File("src/test/resources/json/ControlLoopNoOrderedState.json"), ControlLoop.class);
+
+ JpaControlLoop noOrderedStateJpaCl = new JpaControlLoop(noOrderedStateCl);
+ assertNull(noOrderedStateJpaCl.getOrderedState());
+ noOrderedStateCl.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+ noOrderedStateJpaCl = new JpaControlLoop(noOrderedStateCl);
+ assertEquals(testJpaControlLoop, noOrderedStateJpaCl);
+
+ ControlLoops controlLoopsWithElements = new StandardCoder()
+ .decode(new File("src/test/resources/providers/TestControlLoops.json"), ControlLoops.class);
+
+ JpaControlLoop jpaControlLoopWithElements =
+ new JpaControlLoop(controlLoopsWithElements.getControlLoopList().get(0));
+ assertEquals(4, jpaControlLoopWithElements.getElements().size());
+ assertEquals(18, jpaControlLoopWithElements.getKeys().size());
+ assertThatCode(() -> jpaControlLoopWithElements.clean()).doesNotThrowAnyException();
+
+ assertEquals(controlLoopsWithElements.getControlLoopList().get(0), jpaControlLoopWithElements.toAuthorative());
+ }
+
+ @Test
+ public void testJpaControlLoopValidation() {
+ JpaControlLoop testJpaControlLoop = createJpaControlLoopInstance();
+
+ assertThatThrownBy(() -> {
+ testJpaControlLoop.validate(null);
+ }).hasMessageMatching("fieldName is marked .*ull but is null");
+
+ assertTrue(testJpaControlLoop.validate("").isValid());
+ }
+
+ @Test
+ public void testJpaControlLoopCompareTo() {
+ JpaControlLoop testJpaControlLoop = createJpaControlLoopInstance();
+
+ JpaControlLoop otherJpaControlLoop = new JpaControlLoop(testJpaControlLoop);
+ assertEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+ assertEquals(-1, testJpaControlLoop.compareTo(null));
+ assertEquals(0, testJpaControlLoop.compareTo(testJpaControlLoop));
+ assertNotEquals(0, testJpaControlLoop.compareTo(new DummyJpaControlLoopChild()));
+
+ testJpaControlLoop.setKey(new PfConceptKey("BadValue", "0.0.1"));
+ assertNotEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+ testJpaControlLoop.setKey(new PfConceptKey("control-loop", "0.0.1"));
+ assertEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+
+ testJpaControlLoop.setDefinition(new PfConceptKey("BadValue", "0.0.1"));
+ assertNotEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+ testJpaControlLoop.setDefinition(new PfConceptKey("controlLoopDefinitionName", "0.0.1"));
+ assertEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+
+ testJpaControlLoop.setState(ControlLoopState.PASSIVE);
+ assertNotEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+ testJpaControlLoop.setState(ControlLoopState.UNINITIALISED);
+ assertEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+
+ testJpaControlLoop.setOrderedState(ControlLoopOrderedState.PASSIVE);
+ assertNotEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+ testJpaControlLoop.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+ assertEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+
+ testJpaControlLoop.setDescription("A description");
+ assertNotEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+ testJpaControlLoop.setDescription(null);
+ assertEquals(0, testJpaControlLoop.compareTo(otherJpaControlLoop));
+
+ assertEquals(testJpaControlLoop, new JpaControlLoop(testJpaControlLoop));
+ }
+
+ @Test
+ public void testJpaControlLoopLombok() {
+ assertNotNull(new ControlLoop());
+ JpaControlLoop cl0 = new JpaControlLoop();
+
+ assertThat(cl0.toString()).contains("JpaControlLoop(");
+ assertThat(cl0.hashCode()).isNotZero();
+ assertEquals(true, cl0.equals(cl0));
+ assertEquals(false, cl0.equals(null));
+
+
+ JpaControlLoop cl1 = new JpaControlLoop();
+
+ cl1.setDefinition(new PfConceptKey("defName", "0.0.1"));
+ cl1.setDescription("Description");
+ cl1.setElements(new LinkedHashMap<>());
+ cl1.setKey(new PfConceptKey("participant", "0.0.1"));
+ cl1.setState(ControlLoopState.UNINITIALISED);
+
+ assertThat(cl1.toString()).contains("ControlLoop(");
+ assertEquals(false, cl1.hashCode() == 0);
+ assertEquals(false, cl1.equals(cl0));
+ assertEquals(false, cl1.equals(null));
+
+ assertNotEquals(cl1, cl0);
+
+ JpaControlLoop cl2 = new JpaControlLoop();
+ assertEquals(cl2, cl0);
+ }
+
+ private JpaControlLoop createJpaControlLoopInstance() {
+ ControlLoop testControlLoop = createControlLoopInstance();
+ JpaControlLoop testJpaControlLoop = new JpaControlLoop();
+ testJpaControlLoop.setKey(null);
+ testJpaControlLoop.fromAuthorative(testControlLoop);
+ testJpaControlLoop.setKey(PfConceptKey.getNullKey());
+ testJpaControlLoop.fromAuthorative(testControlLoop);
+
+ return testJpaControlLoop;
+ }
+
+ private ControlLoop createControlLoopInstance() {
+ ControlLoop testControlLoop = new ControlLoop();
+ testControlLoop.setName("control-loop");
+ testControlLoop.setVersion("0.0.1");
+ testControlLoop.setDefinition(new ToscaConceptIdentifier("controlLoopDefinitionName", "0.0.1"));
+ testControlLoop.setElements(new LinkedHashMap<>());
+
+ return testControlLoop;
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantStatisticsTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantStatisticsTest.java
new file mode 100644
index 000000000..7eedd245b
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantStatisticsTest.java
@@ -0,0 +1,193 @@
+/*-
+ * ============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.persistence.concepts;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.time.Instant;
+import org.junit.Test;
+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.common.parameters.BeanValidationResult;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfTimestampKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Test the {@link JpaParticipantStatistics} class.
+ */
+public class JpaParticipantStatisticsTest {
+
+ private static final String NULL_KEY_ERROR = "key is marked .*ull but is null";
+
+ @Test
+ public void testJpaParticipantStatisticsConstructor() {
+ assertThatThrownBy(() -> {
+ new JpaParticipantStatistics((JpaParticipantStatistics) null);
+ }).hasMessageMatching("copyConcept is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaParticipantStatistics((PfTimestampKey) null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaParticipantStatistics(null, null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaParticipantStatistics(null, new PfConceptKey());
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaParticipantStatistics(new PfTimestampKey(), null);
+ }).hasMessageMatching("participantId is marked .*ull but is null");
+
+ assertNotNull(new JpaParticipantStatistics());
+ assertNotNull(new JpaParticipantStatistics((new PfTimestampKey())));
+ assertNotNull(new JpaParticipantStatistics(new PfTimestampKey(), new PfConceptKey()));
+ }
+
+ @Test
+ public void testJpaParticipantStatistics() {
+ JpaParticipantStatistics testJpaParticipantStatistics = createJpaParticipantStatisticsInstance();
+
+ ParticipantStatistics cles = createParticipantStatisticsInstance();
+ assertEquals(cles, testJpaParticipantStatistics.toAuthorative());
+
+ assertThatThrownBy(() -> {
+ testJpaParticipantStatistics.fromAuthorative(null);
+ }).hasMessageMatching("participantStatistics is marked .*ull but is null");
+
+ assertThatThrownBy(() -> new JpaParticipantStatistics((JpaParticipantStatistics) null))
+ .isInstanceOf(NullPointerException.class);
+
+ JpaParticipantStatistics testJpaParticipantStatisticsFa = new JpaParticipantStatistics();
+ testJpaParticipantStatisticsFa.setKey(null);
+ testJpaParticipantStatisticsFa.fromAuthorative(cles);
+ assertEquals(testJpaParticipantStatistics, testJpaParticipantStatisticsFa);
+ testJpaParticipantStatisticsFa.setKey(PfTimestampKey.getNullKey());
+ testJpaParticipantStatisticsFa.fromAuthorative(cles);
+ assertEquals(testJpaParticipantStatistics, testJpaParticipantStatisticsFa);
+ testJpaParticipantStatisticsFa
+ .setKey(new PfTimestampKey("participantName", "0.0.1", Instant.ofEpochMilli(123456L)));
+ testJpaParticipantStatisticsFa.fromAuthorative(cles);
+ assertEquals(testJpaParticipantStatistics, testJpaParticipantStatisticsFa);
+
+ testJpaParticipantStatisticsFa = new JpaParticipantStatistics(cles);
+ assertEquals(testJpaParticipantStatistics, testJpaParticipantStatisticsFa);
+
+ assertEquals(2, testJpaParticipantStatistics.getKeys().size());
+
+ assertEquals("participantName", testJpaParticipantStatistics.getKey().getName());
+
+ testJpaParticipantStatistics.clean();
+ assertEquals("participantName", testJpaParticipantStatistics.getKey().getName());
+
+ JpaParticipantStatistics testJpaParticipantStatistics2 =
+ new JpaParticipantStatistics(testJpaParticipantStatistics);
+ assertEquals(testJpaParticipantStatistics, testJpaParticipantStatistics2);
+ }
+
+ @Test
+ public void testJpaParticipantStatisticsValidation() {
+ JpaParticipantStatistics testJpaParticipantStatistics = createJpaParticipantStatisticsInstance();
+
+ assertThatThrownBy(() -> {
+ testJpaParticipantStatistics.validate(null);
+ }).hasMessageMatching("fieldName is marked .*ull but is null");
+
+ BeanValidationResult validationResult = testJpaParticipantStatistics.validate("");
+ assertTrue(validationResult.isValid());
+ }
+
+ @Test
+ public void testJpaParticipantStatisticsConmpareTo() {
+ JpaParticipantStatistics testJpaParticipantStatistics = createJpaParticipantStatisticsInstance();
+
+ JpaParticipantStatistics otherJpaParticipantStatistics =
+ new JpaParticipantStatistics(testJpaParticipantStatistics);
+ assertEquals(0, testJpaParticipantStatistics.compareTo(otherJpaParticipantStatistics));
+ assertEquals(-1, testJpaParticipantStatistics.compareTo(null));
+ assertEquals(0, testJpaParticipantStatistics.compareTo(testJpaParticipantStatistics));
+ assertNotEquals(0, testJpaParticipantStatistics.compareTo(new DummyJpaParticipantStatisticsChild()));
+
+ testJpaParticipantStatistics.setState(ParticipantState.UNKNOWN);
+ assertNotEquals(0, testJpaParticipantStatistics.compareTo(otherJpaParticipantStatistics));
+ testJpaParticipantStatistics.setState(ParticipantState.PASSIVE);
+ assertEquals(0, testJpaParticipantStatistics.compareTo(otherJpaParticipantStatistics));
+
+ assertEquals(testJpaParticipantStatistics, new JpaParticipantStatistics(testJpaParticipantStatistics));
+ }
+
+ @Test
+ public void testJpaParticipantStatisticsLombok() {
+ assertNotNull(new Participant());
+ JpaParticipantStatistics ps0 = new JpaParticipantStatistics();
+
+ assertThat(ps0.toString()).contains("JpaParticipantStatistics(");
+ assertThat(ps0.hashCode()).isNotZero();
+ assertEquals(true, ps0.equals(ps0));
+ assertEquals(false, ps0.equals(null));
+
+
+ JpaParticipantStatistics ps1 = new JpaParticipantStatistics();
+
+ ps1.setState(ParticipantState.UNKNOWN);
+
+ assertThat(ps1.toString()).contains("JpaParticipantStatistics(");
+ assertEquals(false, ps1.hashCode() == 0);
+ assertEquals(false, ps1.equals(ps0));
+ assertEquals(false, ps1.equals(null));
+
+ assertNotEquals(ps1, ps0);
+
+ JpaParticipantStatistics ps2 = new JpaParticipantStatistics();
+ assertEquals(ps2, ps0);
+ }
+
+ private JpaParticipantStatistics createJpaParticipantStatisticsInstance() {
+ ParticipantStatistics testCles = createParticipantStatisticsInstance();
+ JpaParticipantStatistics testJpaParticipantStatistics = new JpaParticipantStatistics();
+ testJpaParticipantStatistics.setKey(null);
+ testJpaParticipantStatistics.fromAuthorative(testCles);
+ testJpaParticipantStatistics.setKey(PfTimestampKey.getNullKey());
+ testJpaParticipantStatistics.fromAuthorative(testCles);
+
+ return testJpaParticipantStatistics;
+ }
+
+ private ParticipantStatistics createParticipantStatisticsInstance() {
+ ParticipantStatistics participantStatistics = new ParticipantStatistics();
+ participantStatistics.setParticipantId(new ToscaConceptIdentifier("participantName", "0.0.1"));
+ participantStatistics.setTimeStamp(Instant.ofEpochMilli(123456L));
+ participantStatistics.setState(ParticipantState.PASSIVE);
+ participantStatistics.setHealthStatus(ParticipantHealthStatus.HEALTHY);
+
+ return participantStatistics;
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantTest.java
new file mode 100644
index 000000000..5c96df6f1
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/JpaParticipantTest.java
@@ -0,0 +1,253 @@
+/*-
+ * ============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.persistence.concepts;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+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.models.base.PfConceptKey;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Test the {@link JpaParticiant} class.
+ */
+public class JpaParticipantTest {
+
+ private static final String NULL_KEY_ERROR = "key is marked .*ull but is null";
+
+ @Test
+ public void testJpaParticipantConstructor() {
+ assertThatThrownBy(() -> {
+ new JpaParticipant((JpaParticipant) null);
+ }).hasMessageMatching("copyConcept is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaParticipant((PfConceptKey) null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaParticipant(null, null, null, null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaParticipant(null, null, null, ParticipantHealthStatus.HEALTHY);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaParticipant(null, null, ParticipantState.ACTIVE, null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaParticipant(null, null, ParticipantState.ACTIVE, ParticipantHealthStatus.HEALTHY);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaParticipant(null, new PfConceptKey(), null, null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaParticipant(null, new PfConceptKey(), null, ParticipantHealthStatus.HEALTHY);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaParticipant(null, new PfConceptKey(), ParticipantState.ACTIVE, null);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaParticipant(null, new PfConceptKey(), ParticipantState.ACTIVE, ParticipantHealthStatus.HEALTHY);
+ }).hasMessageMatching(NULL_KEY_ERROR);
+
+ assertThatThrownBy(() -> {
+ new JpaParticipant(new PfConceptKey(), null, null, null);
+ }).hasMessageMatching("definition is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaParticipant(new PfConceptKey(), null, null, ParticipantHealthStatus.HEALTHY);
+ }).hasMessageMatching("definition is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaParticipant(new PfConceptKey(), null, ParticipantState.ACTIVE, null);
+ }).hasMessageMatching("definition is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaParticipant(new PfConceptKey(), null, ParticipantState.ACTIVE, ParticipantHealthStatus.HEALTHY);
+ }).hasMessageMatching("definition is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaParticipant(new PfConceptKey(), new PfConceptKey(), null, null);
+ }).hasMessageMatching("participantState is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaParticipant(new PfConceptKey(), new PfConceptKey(), null, ParticipantHealthStatus.HEALTHY);
+ }).hasMessageMatching("participantState is marked .*ull but is null");
+
+ assertThatThrownBy(() -> {
+ new JpaParticipant(new PfConceptKey(), new PfConceptKey(), ParticipantState.ACTIVE, null);
+ }).hasMessageMatching("healthStatus is marked .*ull but is null");
+
+ assertNotNull(new JpaParticipant());
+ assertNotNull(new JpaParticipant((new PfConceptKey())));
+ assertNotNull(new JpaParticipant(new PfConceptKey(), new PfConceptKey(), ParticipantState.ACTIVE,
+ ParticipantHealthStatus.HEALTHY));
+ }
+
+ @Test
+ public void testJpaParticipant() {
+ JpaParticipant testJpaParticipant = createJpaParticipantInstance();
+
+ Participant participant = createParticipantInstance();
+ assertEquals(participant, testJpaParticipant.toAuthorative());
+
+ assertThatThrownBy(() -> {
+ testJpaParticipant.fromAuthorative(null);
+ }).hasMessageMatching("participant is marked .*ull but is null");
+
+ assertThatThrownBy(() -> new JpaParticipant((JpaParticipant) null)).isInstanceOf(NullPointerException.class);
+
+ JpaParticipant testJpaParticipantFa = new JpaParticipant();
+ testJpaParticipantFa.setKey(null);
+ testJpaParticipantFa.fromAuthorative(participant);
+ assertEquals(testJpaParticipant, testJpaParticipantFa);
+ testJpaParticipantFa.setKey(PfConceptKey.getNullKey());
+ testJpaParticipantFa.fromAuthorative(participant);
+ assertEquals(testJpaParticipant, testJpaParticipantFa);
+ testJpaParticipantFa.setKey(new PfConceptKey("participant", "0.0.1"));
+ testJpaParticipantFa.fromAuthorative(participant);
+ assertEquals(testJpaParticipant, testJpaParticipantFa);
+
+ assertEquals("participant", testJpaParticipant.getKey().getName());
+ assertEquals("participant", new JpaParticipant(createParticipantInstance()).getKey().getName());
+ assertEquals("participant",
+ ((PfConceptKey) new JpaParticipant(createParticipantInstance()).getKeys().get(0)).getName());
+
+ testJpaParticipant.clean();
+ assertEquals("participant", testJpaParticipant.getKey().getName());
+
+ testJpaParticipant.setDescription(" A Message ");
+ testJpaParticipant.clean();
+ assertEquals("A Message", testJpaParticipant.getDescription());
+
+ JpaParticipant testJpaParticipant2 = new JpaParticipant(testJpaParticipant);
+ assertEquals(testJpaParticipant, testJpaParticipant2);
+ }
+
+ @Test
+ public void testJpaParticipantValidation() {
+ JpaParticipant testJpaParticipant = createJpaParticipantInstance();
+
+ assertThatThrownBy(() -> {
+ testJpaParticipant.validate(null);
+ }).hasMessageMatching("fieldName is marked .*ull but is null");
+
+ assertTrue(testJpaParticipant.validate("").isValid());
+ }
+
+ @Test
+ public void testJpaParticipantCompareTo() {
+ JpaParticipant testJpaParticipant = createJpaParticipantInstance();
+
+ JpaParticipant otherJpaParticipant = new JpaParticipant(testJpaParticipant);
+ assertEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+ assertEquals(-1, testJpaParticipant.compareTo(null));
+ assertEquals(0, testJpaParticipant.compareTo(testJpaParticipant));
+ assertNotEquals(0, testJpaParticipant.compareTo(new DummyJpaParticipantChild()));
+
+ testJpaParticipant.setKey(new PfConceptKey("BadValue", "0.0.1"));
+ assertNotEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+ testJpaParticipant.setKey(new PfConceptKey("participant", "0.0.1"));
+ assertEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+
+ testJpaParticipant.setDefinition(new PfConceptKey("BadValue", "0.0.1"));
+ assertNotEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+ testJpaParticipant.setDefinition(new PfConceptKey("participantDefinitionName", "0.0.1"));
+ assertEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+
+ testJpaParticipant.setParticipantState(ParticipantState.PASSIVE);
+ assertNotEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+ testJpaParticipant.setParticipantState(ParticipantState.UNKNOWN);
+ assertEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+
+ testJpaParticipant.setHealthStatus(ParticipantHealthStatus.NOT_HEALTHY);
+ assertNotEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+ testJpaParticipant.setHealthStatus(ParticipantHealthStatus.UNKNOWN);
+ assertEquals(0, testJpaParticipant.compareTo(otherJpaParticipant));
+
+ assertEquals(testJpaParticipant, new JpaParticipant(testJpaParticipant));
+ }
+
+ @Test
+ public void testJpaParticipantLombok() {
+ assertNotNull(new Participant());
+ JpaParticipant p0 = new JpaParticipant();
+
+ assertThat(p0.toString()).contains("JpaParticipant(");
+ assertThat(p0.hashCode()).isNotZero();
+ assertEquals(true, p0.equals(p0));
+ assertEquals(false, p0.equals(null));
+
+
+ JpaParticipant p1 = new JpaParticipant();
+
+ p1.setDefinition(new PfConceptKey("defName", "0.0.1"));
+ p1.setDescription("Description");
+ p1.setHealthStatus(ParticipantHealthStatus.HEALTHY);
+ p1.setKey(new PfConceptKey("participant", "0.0.1"));
+ p1.setParticipantState(ParticipantState.ACTIVE);
+
+ assertThat(p1.toString()).contains("Participant(");
+ assertEquals(false, p1.hashCode() == 0);
+ assertEquals(false, p1.equals(p0));
+ assertEquals(false, p1.equals(null));
+
+ assertNotEquals(p1, p0);
+
+ JpaParticipant p2 = new JpaParticipant();
+ assertEquals(p2, p0);
+ }
+
+ private JpaParticipant createJpaParticipantInstance() {
+ Participant testParticipant = createParticipantInstance();
+ JpaParticipant testJpaParticipant = new JpaParticipant();
+ testJpaParticipant.setKey(null);
+ testJpaParticipant.fromAuthorative(testParticipant);
+ testJpaParticipant.setKey(PfConceptKey.getNullKey());
+ testJpaParticipant.fromAuthorative(testParticipant);
+
+ return testJpaParticipant;
+ }
+
+ private Participant createParticipantInstance() {
+ Participant testParticipant = new Participant();
+ testParticipant.setName("participant");
+ testParticipant.setVersion("0.0.1");
+ testParticipant.setDefinition(new ToscaConceptIdentifier("participantDefinitionName", "0.0.1"));
+
+ return testParticipant;
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/PojosTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/PojosTest.java
new file mode 100644
index 000000000..9e21b216b
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/concepts/PojosTest.java
@@ -0,0 +1,62 @@
+/*-
+ * ============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.persistence.concepts;
+
+import com.openpojo.reflection.PojoClass;
+import com.openpojo.reflection.impl.PojoClassFactory;
+import com.openpojo.validation.Validator;
+import com.openpojo.validation.ValidatorBuilder;
+import com.openpojo.validation.rule.impl.EqualsAndHashCodeMatchRule;
+import com.openpojo.validation.rule.impl.GetterMustExistRule;
+import com.openpojo.validation.rule.impl.NoPublicFieldsExceptStaticFinalRule;
+import com.openpojo.validation.rule.impl.SetterMustExistRule;
+import com.openpojo.validation.test.impl.GetterTester;
+import com.openpojo.validation.test.impl.SetterTester;
+import java.util.List;
+import org.junit.Test;
+import org.onap.policy.common.utils.test.ToStringTester;
+
+/**
+ * Class to perform unit tests of all pojos.
+ */
+public class PojosTest {
+
+ @Test
+ public void testPojos() {
+ List<PojoClass> pojoClasses =
+ PojoClassFactory.getPojoClasses(PojosTest.class.getPackageName());
+
+ // @formatter:off
+ final Validator validator = ValidatorBuilder
+ .create()
+ .with(new SetterMustExistRule())
+ .with(new GetterMustExistRule())
+ .with(new EqualsAndHashCodeMatchRule())
+ .with(new NoPublicFieldsExceptStaticFinalRule())
+ .with(new SetterTester())
+ .with(new GetterTester())
+ .with(new ToStringTester())
+ .build();
+
+ validator.validate(pojoClasses);
+ // @formatter:on
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProviderTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProviderTest.java
new file mode 100644
index 000000000..f5d094f9e
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProviderTest.java
@@ -0,0 +1,115 @@
+/*-
+ * ============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.persistence.provider;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.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.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ClElementStatisticsProviderTest {
+ private static final String LIST_IS_NULL = ".*. is marked .*ull but is null";
+ private static final Coder CODER = new StandardCoder();
+ private static final String CL_ELEMENT_STATS_JSON =
+ "src/test/resources/providers/TestClElementStatistics.json";
+
+ private static AtomicInteger dbNameCounter = new AtomicInteger();
+
+ private PolicyModelsProviderParameters parameters;
+ private ClElementStatisticsProvider clElementStatisticsProvider;
+ private ClElementStatisticsList inputClElementStats;
+ private String originalJson = ResourceUtils.getResourceAsString(CL_ELEMENT_STATS_JSON);
+
+ /**
+ * Set up test ClElement statistics provider.
+ */
+ @Before
+ public void setupDao() throws Exception {
+
+ parameters = new PolicyModelsProviderParameters();
+ parameters.setDatabaseDriver("org.h2.Driver");
+ parameters.setName("PolicyProviderParameterGroup");
+ parameters.setImplementation("org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl");
+ parameters.setDatabaseUrl("jdbc:h2:mem:clElementTestDb" + dbNameCounter.getAndIncrement());
+ parameters.setDatabaseUser("policy");
+ parameters.setDatabasePassword("P01icY");
+ parameters.setPersistenceUnit("ToscaConceptTest");
+
+ clElementStatisticsProvider = new ClElementStatisticsProvider(parameters);
+ inputClElementStats = CODER.decode(originalJson, ClElementStatisticsList.class);
+ }
+
+ @After
+ public void teardown() {
+ clElementStatisticsProvider.close();
+ }
+
+ @Test
+ public void testClElementStatisticsCreate() throws Exception {
+ assertThatThrownBy(() -> {
+ clElementStatisticsProvider.createClElementStatistics(null);
+ }).hasMessageMatching(LIST_IS_NULL);
+
+ ClElementStatisticsList createdClElementStats = new ClElementStatisticsList();
+ createdClElementStats.setClElementStatistics(clElementStatisticsProvider
+ .createClElementStatistics(inputClElementStats.getClElementStatistics()));
+
+ assertEquals(inputClElementStats.toString().replaceAll("\\s+", ""),
+ createdClElementStats.toString().replaceAll("\\s+", ""));
+ }
+
+ @Test
+ public void testGetClElementStatistics() throws Exception {
+
+ List<ClElementStatistics> getResponse;
+
+ //Return empty list when no data present in db
+ getResponse = clElementStatisticsProvider.getClElementStatistics(null, null, null,
+ null);
+ assertThat(getResponse).isEmpty();
+
+ clElementStatisticsProvider.createClElementStatistics(inputClElementStats
+ .getClElementStatistics());
+ ToscaConceptIdentifier identifier = inputClElementStats.getClElementStatistics().get(0)
+ .getParticipantId();
+ Instant instant = inputClElementStats.getClElementStatistics().get(0).getTimeStamp();
+ String id = inputClElementStats.getClElementStatistics().get(0).getId().toString();
+ assertEquals(1, clElementStatisticsProvider.getClElementStatistics(identifier.getName(),
+ identifier.getVersion(), id, instant).size());
+
+ assertEquals(1, clElementStatisticsProvider.getFilteredClElementStatistics("name2",
+ "1.0.1", null, null, null,
+ "DESC", 1).size());
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProviderTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProviderTest.java
new file mode 100644
index 000000000..96b63a23d
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ControlLoopProviderTest.java
@@ -0,0 +1,160 @@
+/*-
+ * ============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.persistence.provider;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+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.ControlLoops;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
+
+public class ControlLoopProviderTest {
+
+ private static final String LIST_IS_NULL = "controlLoops is marked .*ull but is null";
+ private static final Coder CODER = new StandardCoder();
+ private static final String CONTROL_LOOP_JSON = "src/test/resources/providers/TestControlLoops.json";
+ private static final String UPDATE_CL_JSON = "src/test/resources/providers/UpdateControlLoops.json";
+
+ private static AtomicInteger dbNameCounter = new AtomicInteger();
+
+ private PolicyModelsProviderParameters parameters;
+ private ControlLoopProvider controlLoopProvider;
+ private ControlLoops inputControlLoops;
+ private ControlLoops updateControlLoops;
+ private String originalJson = ResourceUtils.getResourceAsString(CONTROL_LOOP_JSON);
+ private String updateClJson = ResourceUtils.getResourceAsString(UPDATE_CL_JSON);
+
+ /**
+ * Set up test control loop provider.
+ */
+ @Before
+ public void setupDao() throws Exception {
+
+ parameters = new PolicyModelsProviderParameters();
+ parameters.setDatabaseDriver("org.h2.Driver");
+ parameters.setName("PolicyProviderParameterGroup");
+ parameters.setImplementation("org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl");
+ parameters.setDatabaseUrl("jdbc:h2:mem:controlLoopProviderTestDb" + dbNameCounter.getAndDecrement());
+ parameters.setDatabaseUser("policy");
+ parameters.setDatabasePassword("P01icY");
+ parameters.setPersistenceUnit("ToscaConceptTest");
+
+ controlLoopProvider = new ControlLoopProvider(parameters);
+
+ inputControlLoops = CODER.decode(originalJson, ControlLoops.class);
+ updateControlLoops = CODER.decode(updateClJson, ControlLoops.class);
+ }
+
+ @After
+ public void teardown() {
+ controlLoopProvider.close();
+ }
+
+ @Test
+ public void testControlLoopCreate() throws Exception {
+ assertThatThrownBy(() -> {
+ controlLoopProvider.createControlLoops(null);
+ }).hasMessageMatching(LIST_IS_NULL);
+
+ ControlLoops createdControlLoops = new ControlLoops();
+ createdControlLoops
+ .setControlLoopList(controlLoopProvider.createControlLoops(inputControlLoops.getControlLoopList()));
+
+ assertEquals(inputControlLoops, createdControlLoops);
+ }
+
+ @Test
+ public void testGetControlLoops() throws Exception {
+
+ List<ControlLoop> getResponse;
+
+ // Return empty list when no data present in db
+ getResponse = controlLoopProvider.getControlLoops(null, null);
+ assertThat(getResponse).isEmpty();
+
+ controlLoopProvider.createControlLoops(inputControlLoops.getControlLoopList());
+ String name = inputControlLoops.getControlLoopList().get(0).getName();
+ String version = inputControlLoops.getControlLoopList().get(0).getVersion();
+ assertEquals(1, controlLoopProvider.getControlLoops(name, version).size());
+
+ ControlLoop cl = new ControlLoop();
+ cl = controlLoopProvider.getControlLoop(new ToscaConceptIdentifier("PMSHInstance1", "1.0.1"));
+ assertEquals(inputControlLoops.getControlLoopList().get(1), cl);
+
+ assertNull(controlLoopProvider.getControlLoop(new ToscaConceptIdentifier("invalid_name", "1.0.1")));
+
+ assertThatThrownBy(() -> {
+ controlLoopProvider.getFilteredControlLoops(null);
+ }).hasMessageMatching("filter is marked .*ull but is null");
+
+ final ToscaTypedEntityFilter<ControlLoop> filter = ToscaTypedEntityFilter.<ControlLoop>builder()
+ .type("org.onap.domain.pmsh.PMSHControlLoopDefinition").build();
+ assertEquals(2, controlLoopProvider.getFilteredControlLoops(filter).size());
+ }
+
+
+ @Test
+ public void testUpdateControlLoops() throws Exception {
+ assertThatThrownBy(() -> {
+ controlLoopProvider.updateControlLoops(null);
+ }).hasMessageMatching("controlLoops is marked .*ull but is null");
+
+ ControlLoops existingControlLoops = new ControlLoops();
+ existingControlLoops
+ .setControlLoopList(controlLoopProvider.createControlLoops(inputControlLoops.getControlLoopList()));
+ ControlLoop updateResponse = new ControlLoop();
+ updateResponse = controlLoopProvider.updateControlLoop(updateControlLoops.getControlLoopList().get(0));
+
+ assertEquals(ControlLoopOrderedState.RUNNING, updateResponse.getOrderedState());
+ }
+
+ @Test
+ public void testDeleteControlLoop() throws Exception {
+ assertThatThrownBy(() -> {
+ controlLoopProvider.deleteControlLoop("Invalid_name", "1.0.1");
+ }).hasMessageMatching(".*.failed, control loop does not exist");
+
+ ControlLoop deletedCl;
+ List<ControlLoop> clList = controlLoopProvider.createControlLoops(inputControlLoops.getControlLoopList());
+ String name = inputControlLoops.getControlLoopList().get(0).getName();
+ String version = inputControlLoops.getControlLoopList().get(0).getVersion();
+
+ deletedCl = controlLoopProvider.deleteControlLoop(name, version);
+ assertEquals(clList.get(0), deletedCl);
+
+ }
+}
+
+
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantProviderTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantProviderTest.java
new file mode 100644
index 000000000..7a86a49dc
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantProviderTest.java
@@ -0,0 +1,154 @@
+/*-
+ * ============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.persistence.provider;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter;
+
+public class ParticipantProviderTest {
+
+ private static final Coder CODER = new StandardCoder();
+ private static final String PARTICIPANT_JSON =
+ "src/test/resources/providers/TestParticipant.json";
+ private static final String LIST_IS_NULL = ".*. is marked .*ull but is null";
+
+ private static AtomicInteger dbNameCounter = new AtomicInteger();
+
+ private PolicyModelsProviderParameters parameters;
+ private ParticipantProvider participantProvider;
+ private List<Participant> inputParticipants = new ArrayList<>();
+ private Participant updateParticipants;
+ private String originalJson = ResourceUtils.getResourceAsString(PARTICIPANT_JSON);
+
+ /**
+ * Set up test Participant provider.
+ */
+ @Before
+ public void setupDao() throws Exception {
+
+ parameters = new PolicyModelsProviderParameters();
+ parameters.setDatabaseDriver("org.h2.Driver");
+ parameters.setName("PolicyProviderParameterGroup");
+ parameters.setImplementation("org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl");
+ parameters.setDatabaseUrl("jdbc:h2:mem:participantProviderTestDb" + dbNameCounter.getAndIncrement());
+ parameters.setDatabaseUser("policy");
+ parameters.setDatabasePassword("P01icY");
+ parameters.setPersistenceUnit("ToscaConceptTest");
+
+ participantProvider = new ParticipantProvider(parameters);
+ inputParticipants.add(CODER.decode(originalJson, Participant.class));
+
+ }
+
+ @After
+ public void teardown() {
+ participantProvider.close();
+ }
+
+ @Test
+ public void testParticipantCreate() throws Exception {
+ assertThatThrownBy(() -> {
+ participantProvider.createParticipants(null);
+ }).hasMessageMatching(LIST_IS_NULL);
+
+ List<Participant> createdParticipants = new ArrayList<>();
+ createdParticipants.addAll(participantProvider
+ .createParticipants(inputParticipants));
+
+ assertEquals(createdParticipants.get(0),
+ inputParticipants.get(0));
+ }
+
+
+ @Test
+ public void testGetControlLoops() throws Exception {
+
+ List<Participant> getResponse;
+
+ //Return empty list when no data present in db
+ getResponse = participantProvider.getParticipants(null, null);
+ assertThat(getResponse).isEmpty();
+
+ participantProvider.createParticipants(inputParticipants);
+ String name = inputParticipants.get(0).getName();
+ String version = inputParticipants.get(0).getVersion();
+ assertEquals(1, participantProvider.getParticipants(name, version).size());
+
+ assertThat(participantProvider.getParticipants("invalid_name",
+ "1.0.1")).isEmpty();
+
+ assertThatThrownBy(() -> {
+ participantProvider.getFilteredParticipants(null);
+ }).hasMessageMatching("filter is marked .*ull but is null");
+
+ final ToscaTypedEntityFilter<Participant> filter = ToscaTypedEntityFilter.<Participant>builder()
+ .type("org.onap.domain.pmsh.PMSHControlLoopDefinition").build();
+ assertEquals(1, participantProvider.getFilteredParticipants(filter).size());
+ }
+
+ @Test
+ public void testUpdateParticipant() throws Exception {
+ assertThatThrownBy(() -> {
+ participantProvider.updateParticipants(null);
+ }).hasMessageMatching("participants is marked .*ull but is null");
+
+ participantProvider.createParticipants(inputParticipants);
+ updateParticipants = inputParticipants.get(0);
+ updateParticipants.setParticipantState(ParticipantState.ACTIVE);
+ List<Participant> participantList = new ArrayList<>();
+ participantList.add(updateParticipants);
+ List<Participant> updateResponse = new ArrayList<>();
+ updateResponse = participantProvider.updateParticipants(participantList);
+
+ assertEquals(ParticipantState.ACTIVE, updateResponse.get(0).getParticipantState());
+ }
+
+ @Test
+ public void testDeleteParticipant() throws Exception {
+ assertThatThrownBy(() -> {
+ participantProvider.deleteParticipant("Invalid_name", "1.0.1");
+ }).hasMessageMatching(".*.failed, participant does not exist");
+
+ Participant deletedParticipant;
+ List<Participant> participantList = participantProvider.createParticipants(inputParticipants);
+ String name = inputParticipants.get(0).getName();
+ String version = inputParticipants.get(0).getVersion();
+
+ deletedParticipant = participantProvider.deleteParticipant(name, version);
+ assertEquals(participantList.get(0), deletedParticipant);
+
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProviderTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProviderTest.java
new file mode 100644
index 000000000..d4bc9777a
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProviderTest.java
@@ -0,0 +1,109 @@
+/*-
+ * ============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.persistence.provider;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatisticsList;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ParticipantStatisticsProviderTest {
+
+ private static final String LIST_IS_NULL = ".*. is marked .*ull but is null";
+ private static final Coder CODER = new StandardCoder();
+ private static final String PARTICIPANT_STATS_JSON = "src/test/resources/providers/TestParticipantStatistics.json";
+
+ private static AtomicInteger dbNameCounter = new AtomicInteger();
+
+ private PolicyModelsProviderParameters parameters;
+ private ParticipantStatisticsProvider participantStatisticsProvider;
+ private ParticipantStatisticsList inputParticipantStatistics;
+ private String originalJson = ResourceUtils.getResourceAsString(PARTICIPANT_STATS_JSON);
+
+ /**
+ * Set up test Participant statistics provider.
+ */
+ @Before
+ public void setupDao() throws Exception {
+
+ parameters = new PolicyModelsProviderParameters();
+ parameters.setDatabaseDriver("org.h2.Driver");
+ parameters.setName("PolicyProviderParameterGroup");
+ parameters.setImplementation("org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl");
+ parameters.setDatabaseUrl("jdbc:h2:mem:participantStatisticsProviderTestDb" + dbNameCounter.getAndIncrement());
+ parameters.setDatabaseUser("policy");
+ parameters.setDatabasePassword("P01icY");
+ parameters.setPersistenceUnit("ToscaConceptTest");
+
+ participantStatisticsProvider = new ParticipantStatisticsProvider(parameters);
+ inputParticipantStatistics = CODER.decode(originalJson, ParticipantStatisticsList.class);
+ }
+
+ @After
+ public void teardown() {
+ participantStatisticsProvider.close();
+ }
+
+ @Test
+ public void testParticipantStatisticsCreate() throws Exception {
+ assertThatThrownBy(() -> {
+ participantStatisticsProvider.createParticipantStatistics(null);
+ }).hasMessageMatching(LIST_IS_NULL);
+
+ ParticipantStatisticsList createdStatsList = new ParticipantStatisticsList();
+ createdStatsList.setStatisticsList(participantStatisticsProvider
+ .createParticipantStatistics(inputParticipantStatistics.getStatisticsList()));
+
+ assertEquals(inputParticipantStatistics.toString().replaceAll("\\s+", ""),
+ createdStatsList.toString().replaceAll("\\s+", ""));
+ }
+
+ @Test
+ public void testGetControlLoops() throws Exception {
+ List<ParticipantStatistics> getResponse;
+
+ // Return empty list when no data present in db
+ getResponse = participantStatisticsProvider.getParticipantStatistics(null, null, null);
+ assertThat(getResponse).isEmpty();
+
+ participantStatisticsProvider.createParticipantStatistics(inputParticipantStatistics.getStatisticsList());
+ ToscaConceptIdentifier identifier = inputParticipantStatistics.getStatisticsList().get(0).getParticipantId();
+ Instant instant = inputParticipantStatistics.getStatisticsList().get(0).getTimeStamp();
+ assertEquals(1, participantStatisticsProvider
+ .getParticipantStatistics(identifier.getName(), identifier.getVersion(), instant).size());
+
+ assertEquals(1, participantStatisticsProvider
+ .getFilteredParticipantStatistics("name2", "1.0.1", null, null, null, "DESC", 1).size());
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopNotificationTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopNotificationTest.java
new file mode 100644
index 000000000..d1e3dcfcc
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopNotificationTest.java
@@ -0,0 +1,83 @@
+/*-
+ * ============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.notification;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+
+public class ControlLoopNotificationTest {
+
+ @Test
+ public void testControlLoopNotification() {
+ ControlLoopNotification cln0 = new ControlLoopNotification();
+
+ List<ControlLoopStatus> addedList = new ArrayList<>();
+ addedList.add(new ControlLoopStatus());
+
+ List<ControlLoopStatus> deletedList = new ArrayList<>();
+ deletedList.add(new ControlLoopStatus());
+
+ assertEquals(true, cln0.isEmpty());
+
+ cln0.setAdded(addedList);
+ assertEquals(false, cln0.isEmpty());
+ cln0.setAdded(null);
+ assertEquals(true, cln0.isEmpty());
+
+ cln0.setDeleted(deletedList);
+ assertEquals(false, cln0.isEmpty());
+ cln0.setDeleted(null);
+ assertEquals(true, cln0.isEmpty());
+
+ cln0.setAdded(addedList);
+ cln0.setDeleted(deletedList);
+ assertEquals(false, cln0.isEmpty());
+ cln0.setAdded(null);
+ cln0.setDeleted(null);
+ assertEquals(true, cln0.isEmpty());
+ }
+
+ @Test
+ public void testControlLoopNotificationLombok() {
+ assertNotNull(new ControlLoopNotification());
+ assertNotNull(new ControlLoopNotification(new ArrayList<>(), new ArrayList<>()));
+
+ ControlLoopNotification cln0 = new ControlLoopNotification();
+
+ assertThat(cln0.toString()).contains("ControlLoopNotification(");
+ assertEquals(false, cln0.hashCode() == 0);
+ assertEquals(true, cln0.equals(cln0));
+ assertEquals(false, cln0.equals(null));
+
+
+ ControlLoopNotification cln1 = new ControlLoopNotification();
+
+ assertThat(cln1.toString()).contains("ControlLoopNotification(");
+ assertEquals(false, cln1.hashCode() == 0);
+ assertEquals(true, cln1.equals(cln0));
+ assertEquals(false, cln1.equals(null));
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopStatusTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopStatusTest.java
new file mode 100644
index 000000000..d1ddbf4e6
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/ControlLoopStatusTest.java
@@ -0,0 +1,48 @@
+/*-
+ * ============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.notification;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ControlLoopStatusTest {
+
+ @Test
+ public void testControlLoopStatusLombok() {
+ assertNotNull(new ControlLoopStatus());
+ assertNotNull(new ControlLoopStatus(UUID.randomUUID(), new ToscaConceptIdentifier()));
+
+ ControlLoopStatus cln0 = new ControlLoopStatus();
+
+ assertThat(cln0.toString()).contains("ControlLoopStatus(");
+ assertEquals(false, cln0.hashCode() == 0);
+ assertEquals(true, cln0.equals(cln0));
+ assertEquals(false, cln0.equals(null));
+
+ ControlLoopStatus cln1 = new ControlLoopStatus();
+ assertEquals(true, cln1.equals(cln0));
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/NotificationPojosTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/NotificationPojosTest.java
new file mode 100644
index 000000000..6ea07be76
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/notification/NotificationPojosTest.java
@@ -0,0 +1,58 @@
+/*-
+ * ============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.notification;
+
+import com.openpojo.reflection.PojoClass;
+import com.openpojo.reflection.impl.PojoClassFactory;
+import com.openpojo.validation.Validator;
+import com.openpojo.validation.ValidatorBuilder;
+import com.openpojo.validation.rule.impl.GetterMustExistRule;
+import com.openpojo.validation.rule.impl.SetterMustExistRule;
+import com.openpojo.validation.test.impl.GetterTester;
+import com.openpojo.validation.test.impl.SetterTester;
+import java.util.List;
+import org.junit.Test;
+import org.onap.policy.common.utils.test.ToStringTester;
+
+/**
+ * Class to perform unit tests of all pojos.
+ */
+public class NotificationPojosTest {
+
+ @Test
+ public void testPojos() {
+ List<PojoClass> pojoClasses =
+ PojoClassFactory.getPojoClasses(NotificationPojosTest.class.getPackageName());
+
+ // @formatter:off
+ final Validator validator = ValidatorBuilder
+ .create()
+ .with(new ToStringTester())
+ .with(new SetterMustExistRule())
+ .with(new GetterMustExistRule())
+ .with(new SetterTester())
+ .with(new GetterTester())
+ .build();
+
+ validator.validate(pojoClasses);
+ // @formatter:on
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChangeTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChangeTest.java
new file mode 100644
index 000000000..06d6ecf77
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopStateChangeTest.java
@@ -0,0 +1,61 @@
+/*-
+ * ============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.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Test the copy constructor and other methods.
+ */
+public class ParticipantControlLoopStateChangeTest {
+
+ @Test
+ public void testCopyConstructor() {
+ assertThatThrownBy(() -> new ParticipantStateChange(null)).isInstanceOf(NullPointerException.class);
+
+ ParticipantControlLoopStateChange orig = new ParticipantControlLoopStateChange();
+
+ // verify with null values
+ assertEquals(removeVariableFields(orig.toString()),
+ removeVariableFields(new ParticipantControlLoopStateChange(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.setOrderedState(ControlLoopOrderedState.RUNNING);
+ orig.setTimestamp(Instant.ofEpochMilli(3000));
+
+ assertEquals(removeVariableFields(orig.toString()),
+ removeVariableFields(new ParticipantControlLoopStateChange(orig).toString()));
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdateTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdateTest.java
new file mode 100644
index 000000000..4397bf158
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantControlLoopUpdateTest.java
@@ -0,0 +1,71 @@
+/*-
+ * ============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.junit.Assert.assertNotSame;
+import static org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantMessageUtils.removeVariableFields;
+
+import java.time.Instant;
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+
+/**
+ * Test the copy constructor.
+ */
+public class ParticipantControlLoopUpdateTest {
+ @Test
+ public void testCopyConstructor() {
+ assertThatThrownBy(() -> new ParticipantControlLoopUpdate(null)).isInstanceOf(NullPointerException.class);
+
+ ParticipantControlLoopUpdate orig = new ParticipantControlLoopUpdate();
+ // 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.setTimestamp(Instant.ofEpochMilli(3000));
+
+ ControlLoop controlLoop = new ControlLoop();
+ controlLoop.setName("controlLoop");
+ ToscaServiceTemplate toscaServiceTemplate = new ToscaServiceTemplate();
+ toscaServiceTemplate.setName("serviceTemplate");
+ toscaServiceTemplate.setDerivedFrom("parentServiceTemplate");
+ toscaServiceTemplate.setDescription("Description of serviceTemplate");
+ toscaServiceTemplate.setVersion("1.2.3");
+ orig.setControlLoopDefinition(toscaServiceTemplate);
+ orig.setControlLoop(controlLoop);
+
+ ParticipantControlLoopUpdate other = new ParticipantControlLoopUpdate(orig);
+
+ assertEquals(removeVariableFields(orig.toString()), removeVariableFields(other.toString()));
+
+ // ensure list and items are not the same object
+ assertNotSame(other.getControlLoop(), controlLoop);
+ assertNotSame(other.getControlLoopDefinition(), toscaServiceTemplate);
+ }
+}
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
new file mode 100644
index 000000000..1cc356627
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantHealthCheckTest.java
@@ -0,0 +1,61 @@
+/*-
+ * ============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.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.
+ */
+public class ParticipantHealthCheckTest {
+
+ @Test
+ public void testCopyConstructor() {
+ assertThatThrownBy(() -> new ParticipantStateChange(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()));
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageTest.java
new file mode 100644
index 000000000..d27d3a22c
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageTest.java
@@ -0,0 +1,103 @@
+/*-
+ * ============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.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.time.Instant;
+import java.util.UUID;
+import org.junit.Test;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ParticipantMessageTest {
+ private ParticipantMessage message;
+
+ @Test
+ public void testCopyConstructor() {
+ assertThatThrownBy(() -> new ParticipantMessage((ParticipantMessage) null))
+ .isInstanceOf(NullPointerException.class);
+
+ // verify with null values
+ message = new ParticipantMessage(ParticipantMessageType.PARTICIPANT_STATE_CHANGE);
+ ParticipantMessage newmsg = new ParticipantMessage(message);
+ newmsg.setMessageId(message.getMessageId());
+ newmsg.setTimestamp(message.getTimestamp());
+ assertEquals(message.toString(), newmsg.toString());
+
+ // verify with all values
+ message = makeMessage();
+ newmsg = new ParticipantMessage(message);
+ newmsg.setMessageId(message.getMessageId());
+ newmsg.setTimestamp(message.getTimestamp());
+ assertEquals(message.toString(), newmsg.toString());
+ }
+
+ @Test
+ public void testAppliesTo_NullParticipantId() {
+ message = makeMessage();
+
+ assertThatThrownBy(() -> message.appliesTo(null, null)).isInstanceOf(NullPointerException.class);
+ assertThatThrownBy(() -> message.appliesTo(new ToscaConceptIdentifier("PType", "4.5.6"), null))
+ .isInstanceOf(NullPointerException.class);
+ assertThatThrownBy(() -> message.appliesTo(null, new ToscaConceptIdentifier("id", "1.2.3")))
+ .isInstanceOf(NullPointerException.class);
+ }
+
+ @Test
+ public void testAppliesTo_ParticipantIdMatches() {
+ message = makeMessage();
+
+ // ParticipantId matches
+ assertTrue(message.appliesTo(new ToscaConceptIdentifier("PType", "4.5.6"),
+ new ToscaConceptIdentifier("id", "1.2.3")));
+ assertFalse(message.appliesTo(new ToscaConceptIdentifier("PType", "4.5.6"),
+ new ToscaConceptIdentifier("id", "1.2.4")));
+ assertFalse(message.appliesTo(new ToscaConceptIdentifier("PType", "4.5.7"),
+ new ToscaConceptIdentifier("id", "1.2.3")));
+ }
+
+ @Test
+ public void testAppliesTo_ParticipantIdNoMatch() {
+ message = makeMessage();
+
+ // ParticipantId does not match
+ ToscaConceptIdentifier id = new ToscaConceptIdentifier();
+ id.setName("id1111");
+ id.setVersion("3.2.1");
+ assertFalse(message.appliesTo(id, id));
+ message.setParticipantType(null);
+ assertTrue(message.appliesTo(id, id));
+ }
+
+ private ParticipantMessage makeMessage() {
+ ParticipantMessage msg = new ParticipantMessage(ParticipantMessageType.PARTICIPANT_STATE_CHANGE);
+
+ msg.setParticipantType(new ToscaConceptIdentifier("PType", "4.5.6"));
+ msg.setParticipantId(new ToscaConceptIdentifier("id", "1.2.3"));
+ msg.setMessageId(UUID.randomUUID());
+ msg.setTimestamp(Instant.ofEpochMilli(3000));
+
+ return msg;
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageUtils.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageUtils.java
new file mode 100644
index 000000000..dfbc25d1b
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantMessageUtils.java
@@ -0,0 +1,35 @@
+/*-
+ * ============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;
+
+/**
+ * Utility class for tests of ParticipantMessage subclasses.
+ */
+public class ParticipantMessageUtils {
+
+ private ParticipantMessageUtils() {
+
+ }
+
+ public static String removeVariableFields(String text) {
+ return text.replaceAll("messageId=[^,]*", "messageId=xxx").replaceAll("timestamp=[^,]*", "timestamp=nnn");
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantPojosTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantPojosTest.java
new file mode 100644
index 000000000..301f9acc0
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantPojosTest.java
@@ -0,0 +1,61 @@
+/*-
+ * ============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 com.openpojo.reflection.PojoClass;
+import com.openpojo.reflection.impl.PojoClassFactory;
+import com.openpojo.validation.Validator;
+import com.openpojo.validation.ValidatorBuilder;
+import com.openpojo.validation.rule.impl.GetterMustExistRule;
+import com.openpojo.validation.rule.impl.SetterMustExistRule;
+import com.openpojo.validation.test.impl.GetterTester;
+import com.openpojo.validation.test.impl.SetterTester;
+import java.util.List;
+import org.junit.Test;
+import org.onap.policy.common.utils.test.ToStringTester;
+
+/**
+ * Class to perform unit tests of all pojos.
+ */
+public class ParticipantPojosTest {
+
+ @Test
+ public void testPojos() {
+ List<PojoClass> pojoClasses =
+ PojoClassFactory.getPojoClasses(ParticipantPojosTest.class.getPackageName());
+
+ pojoClasses.remove(PojoClassFactory.getPojoClass(ParticipantMessage.class));
+ pojoClasses.remove(PojoClassFactory.getPojoClass(ParticipantMessageTest.class));
+
+ // @formatter:off
+ final Validator validator = ValidatorBuilder
+ .create()
+ .with(new ToStringTester())
+ .with(new SetterMustExistRule())
+ .with(new GetterMustExistRule())
+ .with(new SetterTester())
+ .with(new GetterTester())
+ .build();
+
+ validator.validate(pojoClasses);
+ // @formatter:on
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChangeTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChangeTest.java
new file mode 100644
index 000000000..235532681
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStateChangeTest.java
@@ -0,0 +1,61 @@
+/*-
+ * ============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.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 the other methods.
+ */
+public class ParticipantStateChangeTest {
+
+ @Test
+ public void testCopyConstructor() {
+ assertThatThrownBy(() -> new ParticipantStateChange(null)).isInstanceOf(NullPointerException.class);
+
+ ParticipantStateChange orig = new ParticipantStateChange();
+
+ // verify with null values
+ assertEquals(removeVariableFields(orig.toString()),
+ removeVariableFields(new ParticipantStateChange(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 ParticipantStateChange(orig).toString()));
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatusTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatusTest.java
new file mode 100644
index 000000000..9b5722bce
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/dmaap/participant/ParticipantStatusTest.java
@@ -0,0 +1,62 @@
+/*-
+ * ============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.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class ParticipantStatusTest {
+
+ @Test
+ public void testCopyConstructor() {
+ assertThatThrownBy(() -> new ParticipantStatus(null)).isInstanceOf(NullPointerException.class);
+
+ final ParticipantStatus orig = new ParticipantStatus();
+
+ // verify with null values
+ assertEquals(removeVariableFields(orig.toString()),
+ removeVariableFields(new ParticipantStatus(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));
+
+ final ParticipantResponseDetails resp = new ParticipantResponseDetails();
+ resp.setResponseMessage("my-response");
+ orig.setResponse(resp);
+
+ assertEquals(removeVariableFields(orig.toString()),
+ removeVariableFields(new ParticipantStatus(orig).toString()));
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/rest/MessagesRestPojosTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/rest/MessagesRestPojosTest.java
new file mode 100644
index 000000000..299a580d3
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/rest/MessagesRestPojosTest.java
@@ -0,0 +1,59 @@
+/*-
+ * ============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.rest;
+
+import com.openpojo.reflection.PojoClass;
+import com.openpojo.reflection.impl.PojoClassFactory;
+import com.openpojo.validation.Validator;
+import com.openpojo.validation.ValidatorBuilder;
+import com.openpojo.validation.rule.impl.GetterMustExistRule;
+import com.openpojo.validation.rule.impl.SetterMustExistRule;
+import com.openpojo.validation.test.impl.GetterTester;
+import com.openpojo.validation.test.impl.SetterTester;
+import java.util.List;
+import org.junit.Test;
+import org.onap.policy.common.utils.test.ToStringTester;
+
+/**
+ * Class to perform unit tests of all pojos.
+ */
+public class MessagesRestPojosTest {
+
+ @Test
+ public void testPojos() {
+ List<PojoClass> pojoClasses =
+ PojoClassFactory.getPojoClassesRecursively(MessagesRestPojosTest.class.getPackageName(), null);
+
+
+ // @formatter:off
+ final Validator validator = ValidatorBuilder
+ .create()
+ .with(new ToStringTester())
+ .with(new SetterMustExistRule())
+ .with(new GetterMustExistRule())
+ .with(new SetterTester())
+ .with(new GetterTester())
+ .build();
+
+ validator.validate(pojoClasses);
+ // @formatter:on
+ }
+}
diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationCommandTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationCommandTest.java
new file mode 100644
index 000000000..6bda3b736
--- /dev/null
+++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/messages/rest/instantiation/InstantiationCommandTest.java
@@ -0,0 +1,60 @@
+/*-
+ * ============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.rest.instantiation;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.ArrayList;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+
+public class InstantiationCommandTest {
+ @Test
+ public void testInstantiationCommandLombok() {
+ assertNotNull(new InstantiationCommand());
+ InstantiationCommand ic0 = new InstantiationCommand();
+
+ assertThat(ic0.toString()).contains("InstantiationCommand(");
+ assertEquals(false, ic0.hashCode() == 0);
+ assertEquals(true, ic0.equals(ic0));
+ assertEquals(false, ic0.equals(null));
+
+
+ InstantiationCommand ic1 = new InstantiationCommand();
+
+ ic1.setControlLoopIdentifierList(new ArrayList<>());
+ ic1.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+
+ assertThat(ic1.toString()).contains("InstantiationCommand(");
+ assertEquals(false, ic1.hashCode() == 0);
+ assertEquals(false, ic1.equals(ic0));
+ assertEquals(false, ic1.equals(null));
+
+ assertNotEquals(ic1, ic0);
+
+ InstantiationCommand ic2 = new InstantiationCommand();
+
+ assertEquals(ic2, ic0);
+ }
+}
diff --git a/models/src/test/resources/META-INF/persistence.xml b/models/src/test/resources/META-INF/persistence.xml
new file mode 100644
index 000000000..078d534be
--- /dev/null
+++ b/models/src/test/resources/META-INF/persistence.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============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=========================================================
+-->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
+ <persistence-unit name="CommissioningMariaDb" transaction-type="RESOURCE_LOCAL">
+ <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+
+ <class>org.onap.policy.models.base.PfConceptKey</class>
+ <class>org.onap.policy.models.dao.converters.CDataConditioner</class>
+ <class>org.onap.policy.models.dao.converters.Uuid2String</class>
+ <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdp</class>
+ <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpGroup</class>
+ <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpStatistics</class>
+ <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpSubGroup</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignment</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignments</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityType</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityTypes</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataType</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataTypes</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplates</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeType</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTypes</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaParameter</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyTypes</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaProperty</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipType</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipTypes</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirement</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirements</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTopologyTemplate</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTrigger</class>
+ <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoop</class>
+ <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoopElement</class>
+ <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipant</class>
+ <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics</class>
+ <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics</class>
+
+ <properties>
+ <property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
+ <property name="eclipselink.ddl-generation.output-mode" value="database" />
+ <property name="eclipselink.logging.level" value="INFO" />
+
+ <!-- property name="eclipselink.logging.level" value="ALL" />
+ <property name="eclipselink.logging.level.jpa" value="ALL" />
+ <property name="eclipselink.logging.level.ddl" value="ALL" />
+ <property name="eclipselink.logging.level.connection" value="ALL" />
+ <property name="eclipselink.logging.level.sql" value="ALL" />
+ <property name="eclipselink.logging.level.transaction" value="ALL" />
+ <property name="eclipselink.logging.level.sequencing" value="ALL" />
+ <property name="eclipselink.logging.level.server" value="ALL" />
+ <property name="eclipselink.logging.level.query" value="ALL" />
+ <property name="eclipselink.logging.level.properties" value="ALL" /-->
+ </properties>
+ <shared-cache-mode>NONE</shared-cache-mode>
+ </persistence-unit>
+
+ <persistence-unit name="ToscaConceptTest" transaction-type="RESOURCE_LOCAL">
+ <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+
+ <class>org.onap.policy.models.base.PfConceptKey</class>
+ <class>org.onap.policy.models.dao.converters.CDataConditioner</class>
+ <class>org.onap.policy.models.dao.converters.Uuid2String</class>
+ <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdp</class>
+ <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpGroup</class>
+ <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpStatistics</class>
+ <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpSubGroup</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignment</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignments</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityType</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityTypes</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataType</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataTypes</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplates</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeType</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTypes</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaParameter</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyTypes</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaProperty</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipType</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipTypes</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirement</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirements</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTopologyTemplate</class>
+ <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTrigger</class>
+ <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoop</class>
+ <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoopElement</class>
+ <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipant</class>
+ <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics</class>
+ <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics</class>
+
+ <properties>
+ <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
+ <property name="eclipselink.ddl-generation.output-mode" value="database" />
+ <property name="eclipselink.logging.level" value="INFO" />
+
+ <!-- <property name="eclipselink.logging.level" value="ALL" />
+ <property name="eclipselink.logging.level.jpa" value="ALL" />
+ <property name="eclipselink.logging.level.ddl" value="ALL" />
+ <property name="eclipselink.logging.level.connection" value="ALL" />
+ <property name="eclipselink.logging.level.sql" value="ALL" />
+ <property name="eclipselink.logging.level.transaction" value="ALL" />
+ <property name="eclipselink.logging.level.sequencing" value="ALL" />
+ <property name="eclipselink.logging.level.server" value="ALL" />
+ <property name="eclipselink.logging.level.query" value="ALL" />
+ <property name="eclipselink.logging.level.properties" value="ALL"/> -->
+ </properties>
+ <shared-cache-mode>NONE</shared-cache-mode>
+ </persistence-unit>
+</persistence>
+
diff --git a/models/src/test/resources/json/ControlLoopElementNoOrderedState.json b/models/src/test/resources/json/ControlLoopElementNoOrderedState.json
new file mode 100644
index 000000000..33a63e604
--- /dev/null
+++ b/models/src/test/resources/json/ControlLoopElementNoOrderedState.json
@@ -0,0 +1,13 @@
+{
+ "id": "a95757ba-b34a-4049-a2a8-46773abcbe5e",
+ "definition": {
+ "name": "cleDef",
+ "version": "0.0.1"
+ },
+ "participantType": {
+ "name": "participantType",
+ "version": "0.0.1"
+ },
+ "state": "UNINITIALISED",
+ "orderedState": null
+}
diff --git a/models/src/test/resources/json/ControlLoopNoOrderedState.json b/models/src/test/resources/json/ControlLoopNoOrderedState.json
new file mode 100644
index 000000000..6bff97580
--- /dev/null
+++ b/models/src/test/resources/json/ControlLoopNoOrderedState.json
@@ -0,0 +1,12 @@
+{
+ "definition": {
+ "name": "controlLoopDefinitionName",
+ "version": "0.0.1"
+ },
+ "state": "UNINITIALISED",
+ "orderedState": null,
+ "elements": [
+ ],
+ "name": "control-loop",
+ "version": "0.0.1"
+}
diff --git a/models/src/test/resources/providers/TestClElementStatistics.json b/models/src/test/resources/providers/TestClElementStatistics.json
new file mode 100644
index 000000000..ae19e560d
--- /dev/null
+++ b/models/src/test/resources/providers/TestClElementStatistics.json
@@ -0,0 +1,24 @@
+{
+ "clElementStatistics":[
+ {
+ "participantId":{
+ "name":"name1",
+ "version":"1.001"
+ },
+ "id": "709c62b3-8918-41b9-a747-d21eb79c6c20",
+ "timeStamp": "2021-01-10T13:45:00.000Z",
+ "controlLoopState": "UNINITIALISED",
+ "clElementUptime":250
+ },
+ {
+ "participantId":{
+ "name":"name2",
+ "version":"1.001"
+ },
+ "id": "709c62b3-8918-41b9-a747-d21eb79c6c21",
+ "timeStamp": "2021-01-10T14:25:00.000Z",
+ "controlLoopState": "UNINITIALISED",
+ "clElementUptime":330
+ }
+ ]
+}
diff --git a/models/src/test/resources/providers/TestControlLoops.json b/models/src/test/resources/providers/TestControlLoops.json
new file mode 100644
index 000000000..fedda9600
--- /dev/null
+++ b/models/src/test/resources/providers/TestControlLoops.json
@@ -0,0 +1,142 @@
+{
+ "controlLoopList": [
+ {
+ "definition": {
+ "name": "org.onap.domain.pmsh.PMSHControlLoopDefinition",
+ "version": "1.0.0"
+ },
+ "state": "UNINITIALISED",
+ "orderedState": "UNINITIALISED",
+ "elements": {
+ "709c62b3-8918-41b9-a747-e21eb79c6c20": {
+ "id": "709c62b3-8918-41b9-a747-d21eb79c6c20",
+ "definition": {
+ "name": "org.onap.domain.pmsh.PMSH_DCAEMicroservice",
+ "version": "1.2.3"
+ },
+ "participantType": {
+ "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+ "version": "2.3.4"
+ },
+ "state": "UNINITIALISED",
+ "orderedState": "UNINITIALISED",
+ "description": "DCAE Control Loop Element for the PMSH instance 0 control loop"
+ },
+ "709c62b3-8918-41b9-a747-e21eb79c6c21": {
+ "id": "709c62b3-8918-41b9-a747-d21eb79c6c21",
+ "definition": {
+ "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+ "version": "1.2.3"
+ },
+ "participantType": {
+ "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+ "version": "2.3.1"
+ },
+ "state": "UNINITIALISED",
+ "orderedState": "UNINITIALISED",
+ "description": "Monitoring Policy Control Loop Element for the PMSH instance 0 control loop"
+ },
+ "709c62b3-8918-41b9-a747-e21eb79c6c22": {
+ "id": "709c62b3-8918-41b9-a747-d21eb79c6c22",
+ "definition": {
+ "name": "org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement",
+ "version": "1.2.3"
+ },
+ "participantType": {
+ "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+ "version": "2.3.1"
+ },
+ "state": "UNINITIALISED",
+ "orderedState": "UNINITIALISED",
+ "description": "Operational Policy Control Loop Element for the PMSH instance 0 control loop"
+ },
+ "709c62b3-8918-41b9-a747-e21eb79c6c23": {
+ "id": "709c62b3-8918-41b9-a747-d21eb79c6c23",
+ "definition": {
+ "name": "org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement",
+ "version": "1.2.3"
+ },
+ "participantType": {
+ "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+ "version": "2.2.1"
+ },
+ "state": "UNINITIALISED",
+ "orderedState": "UNINITIALISED",
+ "description": "CDS Control Loop Element for the PMSH instance 0 control loop"
+ }
+ },
+ "name": "PMSHInstance0",
+ "version": "1.0.1",
+ "description": "PMSH control loop instance 0"
+ },
+ {
+ "definition": {
+ "name": "org.onap.domain.pmsh.PMSHControlLoopDefinition",
+ "version": "1.0.0"
+ },
+ "state": "UNINITIALISED",
+ "orderedState": "UNINITIALISED",
+ "elements": {
+ "709c62b3-8918-41b9-a747-e21eb79c6c24": {
+ "id": "709c62b3-8918-41b9-a747-e21eb79c6c24",
+ "definition": {
+ "name": "org.onap.domain.pmsh.PMSH_DCAEMicroservice",
+ "version": "1.2.3"
+ },
+ "participantType": {
+ "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+ "version": "2.3.4"
+ },
+ "state": "UNINITIALISED",
+ "orderedState": "UNINITIALISED",
+ "description": "DCAE Control Loop Element for the PMSH instance 1 control loop"
+ },
+ "709c62b3-8918-41b9-a747-e21eb79c6c25": {
+ "id": "709c62b3-8918-41b9-a747-e21eb79c6c25",
+ "definition": {
+ "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+ "version": "1.2.3"
+ },
+ "participantType": {
+ "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+ "version": "2.3.1"
+ },
+ "state": "UNINITIALISED",
+ "orderedState": "UNINITIALISED",
+ "description": "Monitoring Policy Control Loop Element for the PMSH instance 1 control loop"
+ },
+ "709c62b3-8918-41b9-a747-e21eb79c6c26": {
+ "id": "709c62b3-8918-41b9-a747-e21eb79c6c26",
+ "definition": {
+ "name": "org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement",
+ "version": "1.2.3"
+ },
+ "participantType": {
+ "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+ "version": "2.3.1"
+ },
+ "state": "UNINITIALISED",
+ "orderedState": "UNINITIALISED",
+ "description": "Operational Policy Control Loop Element for the PMSH instance 1 control loop"
+ },
+ "709c62b3-8918-41b9-a747-e21eb79c6c27": {
+ "id": "709c62b3-8918-41b9-a747-e21eb79c6c27",
+ "definition": {
+ "name": "org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement",
+ "version": "1.2.3"
+ },
+ "participantType": {
+ "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+ "version": "2.2.1"
+ },
+ "state": "UNINITIALISED",
+ "orderedState": "UNINITIALISED",
+ "description": "CDS Control Loop Element for the PMSH instance 1 control loop"
+ }
+ },
+ "name": "PMSHInstance1",
+ "version": "1.0.1",
+ "description": "PMSH control loop instance 1"
+ }
+ ]
+}
diff --git a/models/src/test/resources/providers/TestParticipant.json b/models/src/test/resources/providers/TestParticipant.json
new file mode 100644
index 000000000..c6965ce62
--- /dev/null
+++ b/models/src/test/resources/providers/TestParticipant.json
@@ -0,0 +1,11 @@
+{
+ "name": "dummy_participant1",
+ "version": "1.0.1",
+ "definition":{
+ "name": "org.onap.domain.pmsh.PMSHControlLoopDefinition",
+ "version": "1.0.0"
+ },
+ "participantState": "PASSIVE",
+ "healthStatus": "HEALTHY",
+ "description": "A dummy PMSH participant1"
+}
diff --git a/models/src/test/resources/providers/TestParticipantStatistics.json b/models/src/test/resources/providers/TestParticipantStatistics.json
new file mode 100644
index 000000000..5cf626816
--- /dev/null
+++ b/models/src/test/resources/providers/TestParticipantStatistics.json
@@ -0,0 +1,32 @@
+{
+ "statisticsList":[
+ {
+ "participantId":{
+ "name":"name1",
+ "version":"1.001"
+ },
+ "timeStamp": "2021-01-10T13:45:00.000Z",
+ "state": "PASSIVE",
+ "healthStatus": "HEALTHY",
+ "eventCount":250,
+ "lastExecutionTime":100,
+ "averageExecutionTime":90,
+ "upTime":1000,
+ "lastStart":3000
+ },
+ {
+ "participantId":{
+ "name":"name2",
+ "version":"1.001"
+ },
+ "timeStamp": "2021-01-27T14:25:00.000Z",
+ "state": "PASSIVE",
+ "healthStatus": "HEALTHY",
+ "eventCount":245,
+ "lastExecutionTime":1020,
+ "averageExecutionTime":85,
+ "upTime":1050,
+ "lastStart":3100
+ }
+ ]
+}
diff --git a/models/src/test/resources/providers/UpdateControlLoops.json b/models/src/test/resources/providers/UpdateControlLoops.json
new file mode 100644
index 000000000..2d6bd0753
--- /dev/null
+++ b/models/src/test/resources/providers/UpdateControlLoops.json
@@ -0,0 +1,73 @@
+{
+ "controlLoopList": [
+ {
+ "name": "PMSHInstance0",
+ "version": "1.0.1",
+ "definition": {
+ "name": "org.onap.domain.pmsh.PMSHControlLoopDefinition",
+ "version": "1.0.0"
+ },
+ "state": "RUNNING",
+ "orderedState": "RUNNING",
+ "description": "PMSH control loop instance 0",
+ "elements": {
+ "709c62b3-8918-41b9-a747-d21eb79c6c20": {
+ "id": "709c62b3-8918-41b9-a747-d21eb79c6c20",
+ "definition": {
+ "name": "org.onap.domain.pmsh.PMSH_DCAEMicroservice",
+ "version": "1.2.3"
+ },
+ "participantType": {
+ "name": "org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant",
+ "version": "2.3.4"
+ },
+ "state": "RUNNING",
+ "orderedState": "RUNNING",
+ "description": "DCAE Control Loop Element for the PMSH instance 0 control loop"
+ },
+ "709c62b3-8918-41b9-a747-d21eb79c6c21": {
+ "id": "709c62b3-8918-41b9-a747-d21eb79c6c21",
+ "definition": {
+ "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement",
+ "version": "1.2.3"
+ },
+ "participantType": {
+ "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+ "version": "2.3.1"
+ },
+ "state": "RUNNING",
+ "orderedState": "RUNNING",
+ "description": "Monitoring Policy Control Loop Element for the PMSH instance 0 control loop"
+ },
+ "709c62b3-8918-41b9-a747-d21eb79c6c22": {
+ "id": "709c62b3-8918-41b9-a747-d21eb79c6c22",
+ "definition": {
+ "name": "org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement",
+ "version": "2.3.1"
+ },
+ "participantType": {
+ "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+ "version": "1.0.0"
+ },
+ "state": "RUNNING",
+ "orderedState": "RUNNING",
+ "description": "Operational Policy Control Loop Element for the PMSH instance 0 control loop"
+ },
+ "709c62b3-8918-41b9-a747-d21eb79c6c23": {
+ "id": "709c62b3-8918-41b9-a747-d21eb79c6c23",
+ "definition": {
+ "name": "org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement",
+ "version": "1.2.3"
+ },
+ "participantType": {
+ "name": "org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant",
+ "version": "2.2.1"
+ },
+ "state": "RUNNING",
+ "orderedState": "RUNNING",
+ "description": "CDS Control Loop Element for the PMSH instance 0 control loop"
+ }
+ }
+ }
+ ]
+}