From f144c7386aff063dc9f696cc2e1bbb393e9e3f93 Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Fri, 18 Jun 2021 16:03:04 -0400 Subject: [PATCH] Add timestamp to Pdp records To support the case where multiple PAPs are running, added a timestamp to the PDP records so the PAPs can all be kept in sync as far as when a PDP was last responsive. Issue-ID: POLICY-2898 Change-Id: Ia7e0fd17363ff5827564cbc1537e516156b7f53a Signed-off-by: Jim Hahn --- .../org/onap/policy/models/pdp/concepts/Pdp.java | 11 +++++- .../models/pdp/persistence/concepts/JpaPdp.java | 43 ++++++++++++++-------- .../pdp/persistence/concepts/JpaPdpTest.java | 19 +++++++--- .../src/test/resources/testdata/PdpGroups0.json | 5 ++- .../test/resources/testdata/PdpGroups0Update.json | 14 ++++--- .../resources/testdata/PdpGroupsForFiltering.json | 33 +++++++++++------ .../test/resources/testdata/PdpGroupsNoPDPs.json | 2 +- 7 files changed, 85 insertions(+), 42 deletions(-) diff --git a/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/Pdp.java b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/Pdp.java index 034374c29..978dd7cc8 100644 --- a/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/Pdp.java +++ b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/Pdp.java @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2019 Nordix Foundation. - * Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ package org.onap.policy.models.pdp.concepts; +import java.time.Instant; import lombok.Data; import lombok.NoArgsConstructor; import lombok.NonNull; @@ -47,6 +48,13 @@ public class Pdp { private PdpHealthStatus healthy; private String message; + /** + * Time when the record was last updated as a result of receiving a message from the + * PDP. + */ + private Instant lastUpdate; + + /** * Constructs the object, creating a deep copy of the fields from the source. * @@ -57,5 +65,6 @@ public class Pdp { this.pdpState = source.pdpState; this.healthy = source.healthy; this.message = source.message; + this.lastUpdate = source.lastUpdate; } } diff --git a/models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdp.java b/models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdp.java index daa327d9f..7c584f3e6 100644 --- a/models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdp.java +++ b/models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdp.java @@ -24,6 +24,7 @@ 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.EmbeddedId; @@ -31,10 +32,12 @@ import javax.persistence.Entity; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NonNull; -import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.builder.CompareToBuilder; import org.onap.policy.common.parameters.BeanValidationResult; import org.onap.policy.common.parameters.annotations.NotBlank; import org.onap.policy.common.parameters.annotations.NotNull; @@ -77,6 +80,10 @@ public class JpaPdp extends PfConcept implements PfAuthorative, Serializabl @NotBlank private String message; + @Column(precision = 0) + @Temporal(TemporalType.TIMESTAMP) + private Date lastUpdate; + /** * The Default Constructor creates a {@link JpaPdp} object with a null key. */ @@ -101,10 +108,11 @@ public class JpaPdp extends PfConcept implements PfAuthorative, Serializabl * @param healthy the health state of the PDP */ public JpaPdp(@NonNull final PfReferenceKey key, @NonNull final PdpState pdpState, - @NonNull PdpHealthStatus healthy) { + @NonNull PdpHealthStatus healthy) { this.key = key; this.pdpState = pdpState; this.healthy = healthy; + this.lastUpdate = new Date(); } /** @@ -118,6 +126,7 @@ public class JpaPdp extends PfConcept implements PfAuthorative, Serializabl this.pdpState = copyConcept.pdpState; this.healthy = copyConcept.healthy; this.message = copyConcept.message; + this.lastUpdate = copyConcept.lastUpdate; } /** @@ -137,6 +146,7 @@ public class JpaPdp extends PfConcept implements PfAuthorative, Serializabl pdp.setPdpState(pdpState); pdp.setHealthy(healthy); pdp.setMessage(message); + pdp.setLastUpdate(lastUpdate.toInstant()); return pdp; } @@ -151,6 +161,12 @@ public class JpaPdp extends PfConcept implements PfAuthorative, Serializabl this.setPdpState(pdp.getPdpState()); this.setHealthy(pdp.getHealthy()); this.setMessage(pdp.getMessage()); + + if (pdp.getLastUpdate() == null) { + this.setLastUpdate(new Date()); + } else { + this.setLastUpdate(Date.from(pdp.getLastUpdate())); + } } @Override @@ -193,20 +209,15 @@ public class JpaPdp extends PfConcept implements PfAuthorative, Serializabl } final JpaPdp other = (JpaPdp) otherConcept; - if (!key.equals(other.key)) { - return key.compareTo(other.key); - } - - int result = ObjectUtils.compare(pdpState, other.pdpState); - if (result != 0) { - return result; - } - - result = ObjectUtils.compare(healthy, other.healthy); - if (result != 0) { - return result; - } - return ObjectUtils.compare(message, other.message); + // @formatter:off + return new CompareToBuilder() + .append(this.key, other.key) + .append(this.pdpState, other.pdpState) + .append(this.healthy, other.healthy) + .append(this.message, other.message) + .append(this.lastUpdate, other.lastUpdate) + .toComparison(); + // @formatter:on } } diff --git a/models-pdp/src/test/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpTest.java b/models-pdp/src/test/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpTest.java index b5b29d30b..ab592f510 100644 --- a/models-pdp/src/test/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpTest.java +++ b/models-pdp/src/test/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpTest.java @@ -1,7 +1,7 @@ /*- * ============LICENSE_START======================================================= * Copyright (C) 2019-2021 Nordix Foundation. - * Modifications Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import java.util.Date; import org.junit.Test; import org.onap.policy.models.base.PfConceptKey; import org.onap.policy.models.base.PfReferenceKey; @@ -47,6 +48,7 @@ public class JpaPdpTest { private static final String NULL_KEY_ERROR = "key is marked .*ull but is null"; private static final String PDP1 = "ThePDP"; + private static final Date CURRENT_DATE = new Date(); @Test public void testJpaPdp() { @@ -78,10 +80,6 @@ public class JpaPdpTest { new JpaPdp(null, PdpState.ACTIVE, PdpHealthStatus.UNKNOWN); }).hasMessageMatching(NULL_KEY_ERROR); - assertThatThrownBy(() -> { - new JpaPdp(null, null, PdpHealthStatus.UNKNOWN); - }).hasMessageMatching(NULL_KEY_ERROR); - assertThatThrownBy(() -> { new JpaPdp((Pdp) null); }).hasMessageMatching("authorativeConcept is marked .*ull but is null"); @@ -175,7 +173,7 @@ public class JpaPdpTest { } @Test - public void testJpaPdpCompare() { + public void testJpaPdpCompare_testToAuthorative() { JpaPdp testJpaPdp = setUpJpaPdp(); JpaPdp otherJpaPdp = new JpaPdp(testJpaPdp); @@ -204,7 +202,15 @@ public class JpaPdpTest { testJpaPdp.setMessage("Valid Message"); assertEquals(0, testJpaPdp.compareTo(otherJpaPdp)); + testJpaPdp.setLastUpdate(new Date(0)); + assertEquals(-1, testJpaPdp.compareTo(otherJpaPdp)); + testJpaPdp.setLastUpdate(CURRENT_DATE); + assertEquals(0, testJpaPdp.compareTo(otherJpaPdp)); + assertEquals(testJpaPdp, new JpaPdp(testJpaPdp)); + + otherJpaPdp.fromAuthorative(testJpaPdp.toAuthorative()); + assertEquals(0, testJpaPdp.compareTo(otherJpaPdp)); } private JpaPdp setUpJpaPdp() { @@ -218,6 +224,7 @@ public class JpaPdpTest { testJpaPdp.setPdpState(PdpState.ACTIVE); testJpaPdp.setHealthy(PdpHealthStatus.HEALTHY); testJpaPdp.setMessage("Valid Message"); + testJpaPdp.setLastUpdate(CURRENT_DATE); return testJpaPdp; } } diff --git a/models-pdp/src/test/resources/testdata/PdpGroups0.json b/models-pdp/src/test/resources/testdata/PdpGroups0.json index 01e140cd8..be3d80086 100644 --- a/models-pdp/src/test/resources/testdata/PdpGroups0.json +++ b/models-pdp/src/test/resources/testdata/PdpGroups0.json @@ -32,11 +32,12 @@ "instanceId": "apex-0", "pdpState": "ACTIVE", "healthy": "NOT_HEALTHY", - "message": "message from PDP" + "message": "message from PDP", + "lastUpdate": "1970-01-01T00:00:00Z" } ] } ] } ] -} \ No newline at end of file +} diff --git a/models-pdp/src/test/resources/testdata/PdpGroups0Update.json b/models-pdp/src/test/resources/testdata/PdpGroups0Update.json index 05594fa47..06d0aeff0 100644 --- a/models-pdp/src/test/resources/testdata/PdpGroups0Update.json +++ b/models-pdp/src/test/resources/testdata/PdpGroups0Update.json @@ -32,19 +32,22 @@ "instanceId": "apex-0", "pdpState": "ACTIVE", "healthy": "NOT_HEALTHY", - "message": "message from PDP" + "message": "message from PDP", + "lastUpdate": "1970-01-01T00:00:00Z" }, { "instanceId": "apex-1", "pdpState": "ACTIVE", "healthy": "NOT_HEALTHY", - "message": "message from PDP" + "message": "message from PDP", + "lastUpdate": "1970-01-01T00:00:00Z" }, { "instanceId": "apex-2", "pdpState": "ACTIVE", "healthy": "NOT_HEALTHY", - "message": "message from PDP" + "message": "message from PDP", + "lastUpdate": "1970-01-01T00:00:00Z" } ] }, @@ -72,11 +75,12 @@ "instanceId": "drools-0", "pdpState": "ACTIVE", "healthy": "NOT_HEALTHY", - "message": "message from PDP" + "message": "message from PDP", + "lastUpdate": "1970-01-01T00:00:00Z" } ] } ] } ] -} \ No newline at end of file +} diff --git a/models-pdp/src/test/resources/testdata/PdpGroupsForFiltering.json b/models-pdp/src/test/resources/testdata/PdpGroupsForFiltering.json index f1d4378fd..dfc8308b3 100644 --- a/models-pdp/src/test/resources/testdata/PdpGroupsForFiltering.json +++ b/models-pdp/src/test/resources/testdata/PdpGroupsForFiltering.json @@ -44,25 +44,29 @@ "instanceId": "apex-0", "pdpState": "ACTIVE", "healthy": "NOT_HEALTHY", - "message": "message from PDP" + "message": "message from PDP", + "lastUpdate": "1970-01-01T00:00:00Z" }, { "instanceId": "apex-1", "pdpState": "PASSIVE", "healthy": "NOT_HEALTHY", - "message": "message from PDP" + "message": "message from PDP", + "lastUpdate": "1970-01-01T00:00:00Z" }, { "instanceId": "apex-2", "pdpState": "SAFE", "healthy": "NOT_HEALTHY", - "message": "message from PDP" + "message": "message from PDP", + "lastUpdate": "1970-01-01T00:00:00Z" }, { "instanceId": "apex-3", "pdpState": "TEST", "healthy": "NOT_HEALTHY", - "message": "message from PDP" + "message": "message from PDP", + "lastUpdate": "1970-01-01T00:00:00Z" } ] } @@ -108,7 +112,8 @@ "instanceId": "apex-0", "pdpState": "ACTIVE", "healthy": "NOT_HEALTHY", - "message": "message from PDP" + "message": "message from PDP", + "lastUpdate": "1970-01-01T00:00:00Z" } ] } @@ -154,7 +159,8 @@ "instanceId": "apex-0", "pdpState": "SAFE", "healthy": "NOT_HEALTHY", - "message": "message from PDP" + "message": "message from PDP", + "lastUpdate": "1970-01-01T00:00:00Z" } ] }, @@ -182,7 +188,8 @@ "instanceId": "apex-0", "pdpState": "SAFE", "healthy": "NOT_HEALTHY", - "message": "message from PDP" + "message": "message from PDP", + "lastUpdate": "1970-01-01T00:00:00Z" } ] } @@ -224,7 +231,8 @@ "instanceId": "apex-0", "pdpState": "PASSIVE", "healthy": "NOT_HEALTHY", - "message": "message from PDP" + "message": "message from PDP", + "lastUpdate": "1970-01-01T00:00:00Z" } ] } @@ -262,7 +270,8 @@ "instanceId": "apex-0", "pdpState": "TEST", "healthy": "NOT_HEALTHY", - "message": "message from PDP" + "message": "message from PDP", + "lastUpdate": "1970-01-01T00:00:00Z" } ] }, @@ -290,7 +299,8 @@ "instanceId": "apex-0", "pdpState": "PASSIVE", "healthy": "NOT_HEALTHY", - "message": "message from PDP" + "message": "message from PDP", + "lastUpdate": "1970-01-01T00:00:00Z" } ] }, @@ -318,7 +328,8 @@ "instanceId": "apex-0", "pdpState": "ACTIVE", "healthy": "NOT_HEALTHY", - "message": "message from PDP" + "message": "message from PDP", + "lastUpdate": "1970-01-01T00:00:00Z" } ] } diff --git a/models-pdp/src/test/resources/testdata/PdpGroupsNoPDPs.json b/models-pdp/src/test/resources/testdata/PdpGroupsNoPDPs.json index e37b6c5a6..eaeb30145 100644 --- a/models-pdp/src/test/resources/testdata/PdpGroupsNoPDPs.json +++ b/models-pdp/src/test/resources/testdata/PdpGroupsNoPDPs.json @@ -32,4 +32,4 @@ ] } ] -} \ No newline at end of file +} -- 2.16.6