From 080d80ba9292bc61924c7a4f4ba73dcbbcea2d5a Mon Sep 17 00:00:00 2001 From: shaoqiu Date: Fri, 8 Nov 2019 11:09:08 +0800 Subject: Add JpaPdpStatistics entity Add JpaPdpStatistics entity which will be used in provider. Add Pdp Statistics entities Issue-ID: POLICY-1628 Signed-off-by: shaoqiu Change-Id: Iab12eb02e2e7f0e366aff64fa665b5d6674f2905 Signed-off-by: shaoqiu --- .../pdp/concepts/PdpEngineWorkerStatistics.java | 74 +++++++ .../policy/models/pdp/concepts/PdpStatistics.java | 12 ++ .../models/pdp/enums/PdpEngineWorkerState.java | 34 +++ .../pdp/persistence/concepts/JpaPdpStatistics.java | 230 +++++++++++++++++++++ .../persistence/concepts/JpaPdpStatisticsTest.java | 42 ++++ .../testconcepts/DummyJpaPdpStatisticsChild.java | 34 +++ .../src/test/resources/META-INF/persistence.xml | 1 + 7 files changed, 427 insertions(+) create mode 100644 models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpEngineWorkerStatistics.java create mode 100644 models-pdp/src/main/java/org/onap/policy/models/pdp/enums/PdpEngineWorkerState.java create mode 100644 models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpStatistics.java create mode 100644 models-pdp/src/test/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpStatisticsTest.java create mode 100644 models-pdp/src/test/java/org/onap/policy/models/pdp/testconcepts/DummyJpaPdpStatisticsChild.java (limited to 'models-pdp') diff --git a/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpEngineWorkerStatistics.java b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpEngineWorkerStatistics.java new file mode 100644 index 000000000..43fa6c072 --- /dev/null +++ b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpEngineWorkerStatistics.java @@ -0,0 +1,74 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 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.models.pdp.concepts; + +import java.io.Serializable; +import javax.persistence.Embeddable; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.onap.policy.models.pdp.enums.PdpEngineWorkerState; + +@Embeddable +@Getter +@Setter +@ToString +@NoArgsConstructor +public class PdpEngineWorkerStatistics implements Serializable { + private static final long serialVersionUID = 8262176849743624013L; + + private String engineId; + private PdpEngineWorkerState engineWorkerState; + private long engineTimeStamp; + private long eventCount; + private long lastExecutionTime; + private double averageExecutionTime; + private long upTime; + private long lastEnterTime; + private long lastStart; + + /** + * Constructs the object, making a deep copy. + * + * @param source source from which to copy + */ + public PdpEngineWorkerStatistics(PdpEngineWorkerStatistics source) { + this.engineId = source.engineId; + this.engineWorkerState = source.engineWorkerState; + this.engineTimeStamp = source.engineTimeStamp; + this.eventCount = source.eventCount; + this.lastExecutionTime = source.lastExecutionTime; + this.averageExecutionTime = source.averageExecutionTime; + this.upTime = source.upTime; + this.lastEnterTime = source.lastEnterTime; + this.lastStart = source.lastStart; + } + + /** + * Tidy up any superfluous information such as leading and trailing white space. + */ + public void clean() { + if (engineId != null) { + engineId = engineId.trim(); + } + } +} diff --git a/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpStatistics.java b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpStatistics.java index 1847eed77..ad5547ecf 100644 --- a/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpStatistics.java +++ b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpStatistics.java @@ -21,10 +21,13 @@ package org.onap.policy.models.pdp.concepts; +import java.util.Date; +import java.util.List; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +import org.onap.policy.models.base.PfUtils; /** * Class to represent statistics of a running PDP. @@ -38,12 +41,16 @@ import lombok.ToString; public class PdpStatistics { private String pdpInstanceId; + private Date timeStamp; + private String pdpGroupName; + private String pdpSubGroupName; private long policyDeployCount; private long policyDeploySuccessCount; private long policyDeployFailCount; private long policyExecutedCount; private long policyExecutedSuccessCount; private long policyExecutedFailCount; + private List engineStats; /** * Constructs the object, making a deep copy. @@ -52,11 +59,16 @@ public class PdpStatistics { */ public PdpStatistics(PdpStatistics source) { this.pdpInstanceId = source.pdpInstanceId; + this.timeStamp = source.timeStamp == null ? null : new Date(source.timeStamp.getTime()); + this.pdpGroupName = source.pdpGroupName; + this.pdpSubGroupName = source.pdpSubGroupName; this.policyDeployCount = source.policyDeployCount; this.policyDeployFailCount = source.policyDeployFailCount; this.policyDeploySuccessCount = source.policyDeploySuccessCount; this.policyExecutedCount = source.policyExecutedCount; this.policyExecutedFailCount = source.policyExecutedFailCount; this.policyExecutedSuccessCount = source.policyExecutedSuccessCount; + this.engineStats = PfUtils.mapList(source.engineStats, PdpEngineWorkerStatistics::new, null); } + } diff --git a/models-pdp/src/main/java/org/onap/policy/models/pdp/enums/PdpEngineWorkerState.java b/models-pdp/src/main/java/org/onap/policy/models/pdp/enums/PdpEngineWorkerState.java new file mode 100644 index 000000000..95b19471e --- /dev/null +++ b/models-pdp/src/main/java/org/onap/policy/models/pdp/enums/PdpEngineWorkerState.java @@ -0,0 +1,34 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 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.models.pdp.enums; + +public enum PdpEngineWorkerState { + /** The state of the engine is not known. */ + UNDEFINED, + /** The engine is stopped. */ + STOPPED, + /** The engine is running and is waiting to execute a policy. */ + READY, + /** The engine is running and is executing a policy. */ + EXECUTING, + /** The engine has been ordered to stop and is stoping. */ + STOPPING; +} diff --git a/models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpStatistics.java b/models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpStatistics.java new file mode 100644 index 000000000..d08a19a6a --- /dev/null +++ b/models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpStatistics.java @@ -0,0 +1,230 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP Policy Model + * ================================================================================ + * Copyright (C) 2019 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.models.pdp.persistence.concepts; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import javax.persistence.Column; +import javax.persistence.ElementCollection; +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.models.base.PfAuthorative; +import org.onap.policy.models.base.PfConcept; +import org.onap.policy.models.base.PfKey; +import org.onap.policy.models.base.PfTimestampKey; +import org.onap.policy.models.base.PfUtils; +import org.onap.policy.models.base.PfValidationMessage; +import org.onap.policy.models.base.PfValidationResult; +import org.onap.policy.models.base.PfValidationResult.ValidationResult; +import org.onap.policy.models.pdp.concepts.PdpEngineWorkerStatistics; +import org.onap.policy.models.pdp.concepts.PdpStatistics; + + +/** + * Class to represent a PDP statistics in the database. + * + */ +@Entity +@Table(name = "PdpStatistics") +@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class JpaPdpStatistics extends PfConcept implements PfAuthorative, Serializable { + private static final long serialVersionUID = -7312974966820980659L; + private static final String NULL_NAME = "NULL"; + + @EmbeddedId + private PfTimestampKey key; + + @Column(length = 120) + private String pdpGroupName; + + @Column(length = 120) + private String pdpSubGroupName; + + @Column + private long policyDeployCount; + + @Column + private long policyDeploySuccessCount; + + @Column + private long policyDeployFailCount; + + @Column + private long policyExecutedCount; + + @Column + private long policyExecutedSuccessCount; + + @Column + private long policyExecutedFailCount; + + @ElementCollection + private List engineStats; + + /** + * The Default Constructor creates a {@link JpaPdpStatistics} object with a null key. + */ + public JpaPdpStatistics() { + this(new PfTimestampKey()); + } + + /** + * The Key Constructor creates a {@link JpaPdpStatistics} object with the given concept key. + * + * @param key the key + */ + public JpaPdpStatistics(@NonNull final PfTimestampKey key) { + this(key, NULL_NAME, NULL_NAME, 0L, 0L, 0L, 0L, 0L, 0L, null); + } + + + /** + * Copy constructor. + * + * @param copyConcept the concept to copy from + */ + public JpaPdpStatistics(@NonNull final JpaPdpStatistics copyConcept) { + super(copyConcept); + this.key = new PfTimestampKey(copyConcept.key); + this.pdpGroupName = copyConcept.pdpGroupName; + this.pdpSubGroupName = copyConcept.pdpSubGroupName; + this.policyDeployCount = copyConcept.policyDeployCount; + this.policyDeploySuccessCount = copyConcept.policyDeploySuccessCount; + this.policyDeployFailCount = copyConcept.policyDeployFailCount; + this.policyExecutedCount = copyConcept.policyExecutedCount; + this.policyExecutedSuccessCount = copyConcept.policyExecutedSuccessCount; + this.policyExecutedFailCount = copyConcept.policyExecutedFailCount; + this.engineStats = PfUtils.mapList(copyConcept.engineStats, PdpEngineWorkerStatistics::new, null); + } + + /** + * Authorative constructor. + * + * @param authorativeConcept the authorative concept to copy from + */ + public JpaPdpStatistics(@NonNull final PdpStatistics 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 JpaPdpStatistics other = (JpaPdpStatistics) otherConcept; + return new CompareToBuilder().append(this.key, other.key).append(this.pdpGroupName, other.pdpGroupName) + .append(this.pdpSubGroupName, other.pdpSubGroupName) + .append(this.policyDeployCount, other.policyDeployCount) + .append(this.policyDeployFailCount, other.policyDeployFailCount) + .append(this.policyDeploySuccessCount, other.policyDeploySuccessCount) + .append(this.policyExecutedCount, other.policyExecutedCount) + .append(this.policyExecutedFailCount, other.policyExecutedFailCount) + .append(this.policyExecutedSuccessCount, other.policyExecutedSuccessCount).toComparison(); + } + + @Override + public PdpStatistics toAuthorative() { + PdpStatistics pdpStatistics = new PdpStatistics(); + pdpStatistics.setPdpInstanceId(key.getName()); + pdpStatistics.setTimeStamp(new Date(key.getTimeStamp().getTime())); + pdpStatistics.setPdpGroupName(pdpGroupName); + pdpStatistics.setPdpSubGroupName(pdpSubGroupName); + pdpStatistics.setPolicyDeployCount(policyDeployCount); + pdpStatistics.setPolicyDeployFailCount(policyDeployFailCount); + pdpStatistics.setPolicyDeploySuccessCount(policyDeploySuccessCount); + pdpStatistics.setPolicyExecutedCount(policyExecutedCount); + pdpStatistics.setPolicyExecutedFailCount(policyExecutedFailCount); + pdpStatistics.setPolicyExecutedSuccessCount(policyExecutedSuccessCount); + pdpStatistics.setEngineStats(PfUtils.mapList(engineStats, PdpEngineWorkerStatistics::new, null)); + + return pdpStatistics; + } + + @Override + public void fromAuthorative(@NonNull final PdpStatistics pdpStatistics) { + if (this.key == null || this.getKey().isNullKey()) { + this.setKey(new PfTimestampKey(pdpStatistics.getPdpInstanceId(), PfKey.NULL_KEY_VERSION, + new Date(pdpStatistics.getTimeStamp() == null ? 0 : pdpStatistics.getTimeStamp().getTime()))); + } + this.setPdpGroupName(pdpStatistics.getPdpGroupName()); + this.setPdpSubGroupName(pdpStatistics.getPdpSubGroupName()); + this.setPolicyDeployCount(pdpStatistics.getPolicyDeployCount()); + this.setPolicyDeployFailCount(pdpStatistics.getPolicyDeployFailCount()); + this.setPolicyDeploySuccessCount(pdpStatistics.getPolicyDeploySuccessCount()); + this.setPolicyExecutedCount(pdpStatistics.getPolicyExecutedCount()); + this.setPolicyExecutedFailCount(pdpStatistics.getPolicyExecutedFailCount()); + this.setPolicyExecutedSuccessCount(pdpStatistics.getPolicyExecutedSuccessCount()); + this.setEngineStats( + PfUtils.mapList(pdpStatistics.getEngineStats(), PdpEngineWorkerStatistics::new, null)); + } + + @Override + public List getKeys() { + return getKey().getKeys(); + } + + @Override + public PfValidationResult validate(@NonNull PfValidationResult resultIn) { + PfValidationResult result = resultIn; + + if (key.isNullKey()) { + result.addValidationMessage( + new PfValidationMessage(key, this.getClass(), ValidationResult.INVALID, "key is a null key")); + } + + result = key.validate(result); + + return result; + } + + @Override + public void clean() { + key.clean(); + pdpGroupName = pdpGroupName.trim(); + pdpSubGroupName = pdpSubGroupName.trim(); + if (engineStats != null) { + for (PdpEngineWorkerStatistics engineStat : engineStats) { + engineStat.clean(); + } + } + } +} diff --git a/models-pdp/src/test/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpStatisticsTest.java b/models-pdp/src/test/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpStatisticsTest.java new file mode 100644 index 000000000..62f0c5be0 --- /dev/null +++ b/models-pdp/src/test/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpStatisticsTest.java @@ -0,0 +1,42 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 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.models.pdp.persistence.concepts; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.Test; + +/** + * Test the {@link JpaPdpStatistics} class. + * + */ +public class JpaPdpStatisticsTest { + private static final String NULL_KEY_ERROR = "key is marked @NonNull but is null"; + private static final String PDP1 = "ThePDP"; + + // TODO More unit test cases will be added later. + @Test + public void testJpaPdpStatistics() { + assertThatThrownBy(() -> { + new JpaPdpStatistics((JpaPdpStatistics) null); + }).hasMessage("copyConcept is marked @NonNull but is null"); + } +} diff --git a/models-pdp/src/test/java/org/onap/policy/models/pdp/testconcepts/DummyJpaPdpStatisticsChild.java b/models-pdp/src/test/java/org/onap/policy/models/pdp/testconcepts/DummyJpaPdpStatisticsChild.java new file mode 100644 index 000000000..b428fc679 --- /dev/null +++ b/models-pdp/src/test/java/org/onap/policy/models/pdp/testconcepts/DummyJpaPdpStatisticsChild.java @@ -0,0 +1,34 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 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.models.pdp.testconcepts; + +import org.onap.policy.models.pdp.persistence.concepts.JpaPdpStatistics; + +/** + * Test class for JpaPdpStatistics comparisons. + * + */ + +public class DummyJpaPdpStatisticsChild extends JpaPdpStatistics { + + private static final long serialVersionUID = -5911806849612508805L; + +} diff --git a/models-pdp/src/test/resources/META-INF/persistence.xml b/models-pdp/src/test/resources/META-INF/persistence.xml index 9d78e3abd..b1a1795ea 100644 --- a/models-pdp/src/test/resources/META-INF/persistence.xml +++ b/models-pdp/src/test/resources/META-INF/persistence.xml @@ -31,6 +31,7 @@ org.onap.policy.models.pdp.persistence.concepts.JpaPdpGroup org.onap.policy.models.pdp.persistence.concepts.JpaPdpSubGroup org.onap.policy.models.pdp.persistence.concepts.JpaPdp + org.onap.policy.models.pdp.persistence.concepts.JpaPdpStatistics -- cgit 1.2.3-korg