Add PDP-Policy deployment table to DB 90/116690/3
authorJim Hahn <jrh3@att.com>
Thu, 7 Jan 2021 14:07:05 +0000 (09:07 -0500)
committerJim Hahn <jrh3@att.com>
Fri, 8 Jan 2021 21:12:22 +0000 (16:12 -0500)
Added a table to record the PDP policy deployment status, which is
required for making PAP stateless.

Issue-ID: POLICY-2648
Change-Id: Ibe40ce00aca7a600051edcac49e55651c1c0164f
Signed-off-by: Jim Hahn <jrh3@att.com>
13 files changed:
models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpPolicyStatus.java [new file with mode: 0644]
models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpPolicyStatus.java [new file with mode: 0644]
models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/provider/PdpProvider.java
models-pdp/src/test/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpPolicyStatusTest.java [new file with mode: 0644]
models-pdp/src/test/java/org/onap/policy/models/pdp/persistence/provider/PdpProviderTest.java
models-pdp/src/test/resources/META-INF/persistence.xml
models-provider/src/main/java/org/onap/policy/models/provider/PolicyModelsProvider.java
models-provider/src/main/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderImpl.java
models-provider/src/main/java/org/onap/policy/models/provider/impl/DummyPolicyModelsProviderImpl.java
models-provider/src/test/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderTest.java
models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyBadProviderImpl.java
models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyPolicyModelsProviderTest.java
models-provider/src/test/resources/META-INF/persistence.xml

diff --git a/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpPolicyStatus.java b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpPolicyStatus.java
new file mode 100644 (file)
index 0000000..b52173a
--- /dev/null
@@ -0,0 +1,49 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 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.
+ * 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.models.pdp.concepts;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Policy deployment status for a PDP.
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PdpPolicyStatus {
+
+    public enum State {
+        WAITING, SUCCESS, FAILURE
+    }
+
+    private String pdpGroup;
+    private String pdpType;
+    private String pdpId;
+    private ToscaConceptIdentifier policy;
+    private ToscaConceptIdentifier policyType;
+    private boolean deploy;
+    private State state;
+}
diff --git a/models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpPolicyStatus.java b/models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpPolicyStatus.java
new file mode 100644 (file)
index 0000000..2da787b
--- /dev/null
@@ -0,0 +1,225 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 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.
+ * 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.models.pdp.persistence.concepts;
+
+import java.util.List;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Index;
+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.builder.CompareToBuilder;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.common.parameters.annotations.Pattern;
+import org.onap.policy.common.parameters.annotations.Valid;
+import org.onap.policy.common.utils.validation.Assertions;
+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.Validated;
+import org.onap.policy.models.base.validation.annotations.VerifyKey;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus.State;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to represent PDP-Policy deployment status in the database.
+ */
+@Entity
+@Table(name = "JpaPdpPolicyStatus", indexes = {@Index(name = "JpaPdpPolicyStatus_PdpGroup", columnList = "pdpGroup")})
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class JpaPdpPolicyStatus extends PfConcept implements PfAuthorative<PdpPolicyStatus> {
+    private static final long serialVersionUID = -357224425637789775L;
+
+    /**
+     * Parent key & version identifies the policy, while localName identifies the pdpId.
+     */
+    @EmbeddedId
+    @NotNull
+    @Valid
+    private PfReferenceKey key;
+
+    @Column
+    @NotNull
+    @Pattern(regexp = PfReferenceKey.LOCAL_NAME_REGEXP)
+    private String pdpGroup;
+
+    @Column
+    @NotNull
+    @Pattern(regexp = PfReferenceKey.LOCAL_NAME_REGEXP)
+    private String pdpType;
+
+    @Column
+    @NotNull
+    @VerifyKey(versionNotNull = true)
+    private PfConceptKey policyType;
+
+    @Column
+    private boolean deploy;
+
+    @Column
+    @NotNull
+    private State state;
+
+
+    /**
+     * Constructs an empty object.
+     */
+    public JpaPdpPolicyStatus() {
+        key = new PfReferenceKey();
+        pdpGroup = PfKey.NULL_KEY_NAME;
+        pdpType = PfKey.NULL_KEY_NAME;
+        policyType = new PfConceptKey();
+        deploy = false;
+        state = State.WAITING;
+    }
+
+    /**
+     * Copy constructor.
+     *
+     * @param source object from which to copy
+     */
+    public JpaPdpPolicyStatus(JpaPdpPolicyStatus source) {
+        key = new PfReferenceKey(source.getKey());
+        pdpGroup = source.getPdpGroup();
+        pdpType = source.getPdpType();
+        policyType = new PfConceptKey(source.getPolicyType());
+        deploy = source.isDeploy();
+        state = source.getState();
+    }
+
+    /**
+     * Authorative constructor.
+     *
+     * @param source authorative object from which to copy
+     */
+    public JpaPdpPolicyStatus(PdpPolicyStatus source) {
+        fromAuthorative(source);
+    }
+
+    @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 JpaPdpPolicyStatus other = (JpaPdpPolicyStatus) otherConcept;
+
+        // @formatter:off
+        return new CompareToBuilder()
+                        .append(key, other.key)
+                        .append(pdpGroup, other.pdpGroup)
+                        .append(pdpType, other.pdpType)
+                        .append(policyType, other.policyType)
+                        .append(deploy, other.deploy)
+                        .append(state, other.state)
+                        .toComparison();
+        // @formatter:on
+    }
+
+    @Override
+    public PdpPolicyStatus toAuthorative() {
+        PfConceptKey policyKey = key.getParentConceptKey();
+        ToscaConceptIdentifier policyIdent = new ToscaConceptIdentifier(policyKey.getName(), policyKey.getVersion());
+
+        ToscaConceptIdentifier policyTypeIdent =
+                        new ToscaConceptIdentifier(policyType.getName(), policyType.getVersion());
+
+        // @formatter:off
+        return PdpPolicyStatus.builder()
+                        .pdpGroup(pdpGroup)
+                        .pdpId(key.getLocalName())
+                        .pdpType(pdpType)
+                        .policyType(policyTypeIdent)
+                        .policy(policyIdent)
+                        .deploy(deploy)
+                        .state(state)
+                        .build();
+        // @formatter:on
+    }
+
+    @Override
+    public void fromAuthorative(PdpPolicyStatus source) {
+        final ToscaConceptIdentifier policyIdent = source.getPolicy();
+        final ToscaConceptIdentifier policyTypeIdent = source.getPolicyType();
+
+        key = new PfReferenceKey(policyIdent.getName(), policyIdent.getVersion(), source.getPdpId());
+        pdpGroup = source.getPdpGroup();
+        pdpType = source.getPdpType();
+        policyType = new PfConceptKey(policyTypeIdent.getName(), policyTypeIdent.getVersion());
+        deploy = source.isDeploy();
+        state = source.getState();
+    }
+
+    @Override
+    public List<PfKey> getKeys() {
+        return getKey().getKeys();
+    }
+
+    @Override
+    public void clean() {
+        key.clean();
+
+        pdpGroup = Assertions.validateStringParameter("pdpGroup", pdpGroup, PfReferenceKey.LOCAL_NAME_REGEXP);
+        pdpType = Assertions.validateStringParameter("pdpType", pdpType, PfReferenceKey.LOCAL_NAME_REGEXP);
+        policyType.clean();
+    }
+
+    @Override
+    public BeanValidationResult validate(@NonNull String fieldName) {
+        BeanValidationResult result = super.validate(fieldName);
+
+        if (PfKey.NULL_KEY_NAME.equals(key.getParentKeyName())) {
+            addResult(result, "policy name (parent key name of key)", key.getParentKeyName(), Validated.IS_NULL);
+        }
+
+        if (PfKey.NULL_KEY_VERSION.equals(key.getParentKeyVersion())) {
+            addResult(result, "policy version (parent key version of key)", key.getParentKeyVersion(),
+                            Validated.IS_NULL);
+        }
+
+        if (!PfKey.NULL_KEY_NAME.equals(key.getParentLocalName())) {
+            addResult(result, "parent local name of key", key.getParentLocalName(), "must be " + PfKey.NULL_KEY_NAME);
+        }
+
+        if (PfKey.NULL_KEY_NAME.equals(key.getLocalName())) {
+            addResult(result, "pdpId (local name of key)", key.getLocalName(), Validated.IS_NULL);
+        }
+
+        return result;
+    }
+}
index e496521..ed3551a 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019 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.
 package org.onap.policy.models.pdp.persistence.provider;
 
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 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.common.parameters.BeanValidationResult;
@@ -35,10 +39,12 @@ import org.onap.policy.models.dao.PfDao;
 import org.onap.policy.models.pdp.concepts.Pdp;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus;
 import org.onap.policy.models.pdp.concepts.PdpStatistics;
 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
 import org.onap.policy.models.pdp.persistence.concepts.JpaPdp;
 import org.onap.policy.models.pdp.persistence.concepts.JpaPdpGroup;
+import org.onap.policy.models.pdp.persistence.concepts.JpaPdpPolicyStatus;
 import org.onap.policy.models.pdp.persistence.concepts.JpaPdpSubGroup;
 
 /**
@@ -47,6 +53,7 @@ import org.onap.policy.models.pdp.persistence.concepts.JpaPdpSubGroup;
  * @author Liam Fallon (liam.fallon@est.tech)
  */
 public class PdpProvider {
+    private static final Object statusLock = new Object();
 
     /**
      * Get PDP groups.
@@ -247,6 +254,72 @@ public class PdpProvider {
         // Not implemented yet
     }
 
+    /**
+     * Gets the policy deployments for a PDP group.
+     *
+     * @param dao the DAO to use to access the database
+     * @param groupName the name of the PDP group of interest, null to get results for all
+     *        PDP groups
+     * @return the deployments found
+     * @throws PfModelException on errors getting PDP groups
+     */
+    public List<PdpPolicyStatus> getGroupPolicyStatus(@NonNull final PfDao dao, @NonNull final String groupName)
+                    throws PfModelException {
+
+        Map<String, Object> filter = Map.of("pdpGroup", groupName);
+
+        return dao.getFiltered(JpaPdpPolicyStatus.class, null, null, null, null, filter, null, 0).stream()
+                        .map(JpaPdpPolicyStatus::toAuthorative).collect(Collectors.toList());
+    }
+
+    /**
+     * Creates, updates, and deletes collections of policy status.
+     *
+     * @param dao the DAO to use to access the database
+     * @param createObjs the objects to create
+     * @param updateObjs the objects to update
+     * @param deleteObjs the objects to delete
+     */
+    public void cudPolicyStatus(@NonNull final PfDao dao, Collection<PdpPolicyStatus> createObjs,
+                    Collection<PdpPolicyStatus> updateObjs, Collection<PdpPolicyStatus> deleteObjs) {
+
+        synchronized (statusLock) {
+            dao.deleteCollection(fromAuthorativeStatus(deleteObjs, "deletePdpPolicyStatusList"));
+            dao.createCollection(fromAuthorativeStatus(createObjs, "createPdpPolicyStatusList"));
+            dao.createCollection(fromAuthorativeStatus(updateObjs, "updatePdpPolicyStatusList"));
+        }
+    }
+
+    /**
+     * Converts a collection of authorative policy status to a collection of JPA policy
+     * status.  Validates the resulting list.
+     *
+     * @param objs authorative policy status to convert
+     * @param fieldName name of the field containing the collection
+     * @return a collection of JPA policy status
+     */
+    private Collection<JpaPdpPolicyStatus> fromAuthorativeStatus(Collection<PdpPolicyStatus> objs, String fieldName) {
+        if (objs == null) {
+            return Collections.emptyList();
+        }
+
+        List<JpaPdpPolicyStatus> jpas = objs.stream().map(JpaPdpPolicyStatus::new).collect(Collectors.toList());
+
+        // validate the objects
+        BeanValidationResult result = new BeanValidationResult(fieldName, jpas);
+
+        int count = 0;
+        for (JpaPdpPolicyStatus jpa: jpas) {
+            result.addResult(jpa.validate(String.valueOf(count++)));
+        }
+
+        if (!result.isValid()) {
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, result.getResult());
+        }
+
+        return jpas;
+    }
+
     /**
      * Convert JPA PDP group list to an authorative PDP group list.
      *
diff --git a/models-pdp/src/test/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpPolicyStatusTest.java b/models-pdp/src/test/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpPolicyStatusTest.java
new file mode 100644 (file)
index 0000000..fdadae7
--- /dev/null
@@ -0,0 +1,196 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 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.
+ * 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.models.pdp.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 java.util.List;
+import java.util.function.Consumer;
+import java.util.function.UnaryOperator;
+import org.assertj.core.api.AbstractStringAssert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.PfReferenceKey;
+import org.onap.policy.models.base.Validated;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus.PdpPolicyStatusBuilder;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus.State;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+public class JpaPdpPolicyStatusTest {
+    private static final String MY_PDP = "MyPdp";
+    private static final String MY_GROUP = "MyGroup";
+    private static final String MY_PDP_TYPE = "MyPdpType";
+    private static final ToscaConceptIdentifier POLICY = new ToscaConceptIdentifier("MyPolicy", "1.2.3");
+    private static final ToscaConceptIdentifier POLICY_TYPE = new ToscaConceptIdentifier("MyPolicyType", "1.2.4");
+
+    private PdpPolicyStatusBuilder builder;
+
+
+    /**
+     * Set up Policy Status builder.
+     */
+    @Before
+    public void setup() {
+        // @formatter:off
+        builder = PdpPolicyStatus.builder()
+                        .deploy(true)
+                        .pdpGroup(MY_GROUP)
+                        .pdpId(MY_PDP)
+                        .pdpType(MY_PDP_TYPE)
+                        .policy(POLICY)
+                        .policyType(POLICY_TYPE)
+                        .state(State.SUCCESS);
+        // @formatter:on
+    }
+
+    @Test
+    public void testJpaPdpPolicyStatus() {
+        JpaPdpPolicyStatus jpa = new JpaPdpPolicyStatus();
+
+        assertThat(jpa.getKey()).isNotNull();
+        assertThat(jpa.getKey().isNullKey()).isTrue();
+        assertThat(jpa.getPdpGroup()).isEqualTo(PfKey.NULL_KEY_NAME);
+        assertThat(jpa.getPdpType()).isEqualTo(PfKey.NULL_KEY_NAME);
+        assertThat(jpa.getPolicyType()).isNotNull();
+        assertThat(jpa.getPolicyType().isNullKey()).isTrue();
+        assertThat(jpa.isDeploy()).isFalse();
+        assertThat(jpa.getState()).isEqualTo(State.WAITING);
+    }
+
+    @Test
+    public void testJpaPdpPolicyStatusJpaPdpPolicyStatus() {
+        JpaPdpPolicyStatus jpa = new JpaPdpPolicyStatus(builder.build());
+
+        assertThat(new JpaPdpPolicyStatus(jpa)).isEqualTo(jpa);
+    }
+
+    @Test
+    public void testJpaPdpPolicyStatusPdpPolicyStatus() {
+        JpaPdpPolicyStatus jpa = new JpaPdpPolicyStatus(builder.build());
+
+        assertThat(jpa.getKey()).isNotNull();
+        PfReferenceKey key = jpa.getKey();
+        assertThat(key.getParentKeyName()).isEqualTo(POLICY.getName());
+        assertThat(key.getParentKeyVersion()).isEqualTo(POLICY.getVersion());
+        assertThat(key.getParentLocalName()).isEqualTo(PfKey.NULL_KEY_NAME);
+        assertThat(key.getLocalName()).isEqualTo(MY_PDP);
+
+        assertThat(jpa.getPdpGroup()).isEqualTo(MY_GROUP);
+        assertThat(jpa.getPdpType()).isEqualTo(MY_PDP_TYPE);
+
+        assertThat(jpa.getPolicyType()).isNotNull();
+        assertThat(jpa.getPolicyType().getName()).isEqualTo(POLICY_TYPE.getName());
+        assertThat(jpa.getPolicyType().getVersion()).isEqualTo(POLICY_TYPE.getVersion());
+
+        assertThat(jpa.isDeploy()).isTrue();
+        assertThat(jpa.getState()).isEqualTo(State.SUCCESS);
+    }
+
+    @Test
+    public void testGetKeys() {
+        JpaPdpPolicyStatus jpa = new JpaPdpPolicyStatus(builder.build());
+
+        assertThat(jpa.getKeys()).isEqualTo(List.of(jpa.getKey()));
+    }
+
+    @Test
+    public void testClean() {
+        JpaPdpPolicyStatus jpa =
+                        new JpaPdpPolicyStatus(builder.pdpGroup(MY_GROUP + " ").pdpType(MY_PDP_TYPE + " ").build());
+
+        jpa.clean();
+
+        assertThat(jpa.getPdpGroup()).isEqualTo(MY_GROUP);
+        assertThat(jpa.getPdpType()).isEqualTo(MY_PDP_TYPE);
+    }
+
+    @Test
+    @SuppressWarnings("serial")
+    public void testCompareTo() {
+        JpaPdpPolicyStatus jpa = new JpaPdpPolicyStatus(builder.build());
+
+        assertNotEquals(0, jpa.compareTo(null));
+        assertEquals(0, jpa.compareTo(jpa));
+        assertNotEquals(0, jpa.compareTo(new JpaPdpPolicyStatus(builder.build()) {}));
+
+        assertNotEquals(0, checkCompareTo(bldr -> bldr.pdpId("AnotherPdp")));
+        assertNotEquals(0, checkCompareTo(bldr -> bldr.pdpGroup("AnotherGroup")));
+        assertNotEquals(0, checkCompareTo(bldr -> bldr.pdpType("AnotherType")));
+        assertNotEquals(0, checkCompareTo(
+            bldr -> bldr.policyType(new ToscaConceptIdentifier("AnotherPolicyType", "1.2.4"))));
+        assertNotEquals(0, checkCompareTo(bldr -> bldr.deploy(false)));
+        assertNotEquals(0, checkCompareTo(bldr -> bldr.state(State.FAILURE)));
+    }
+
+    private int checkCompareTo(UnaryOperator<PdpPolicyStatusBuilder> fieldModifier) {
+        JpaPdpPolicyStatus jpa1 = new JpaPdpPolicyStatus(builder.build());
+        JpaPdpPolicyStatus jpa2 = new JpaPdpPolicyStatus(fieldModifier.apply(builder).build());
+
+        return jpa1.compareTo(jpa2);
+    }
+
+    @Test
+    public void testToAuthorative() {
+        PdpPolicyStatus data = builder.build();
+
+        assertThat(new JpaPdpPolicyStatus(data).toAuthorative()).isEqualTo(data);
+    }
+
+    @Test
+    public void testFromAuthorative() {
+        PdpPolicyStatus data = builder.build();
+        JpaPdpPolicyStatus jpa = new JpaPdpPolicyStatus();
+
+        jpa.fromAuthorative(data);
+
+        assertThat(jpa).isEqualTo(new JpaPdpPolicyStatus(data));
+    }
+
+    @Test
+    public void testValidate() {
+        assertThat(new JpaPdpPolicyStatus(builder.build()).validate("").getResult()).isNull();
+
+        assertThatThrownBy(() -> new JpaPdpPolicyStatus(builder.build()).validate(null))
+                        .hasMessageContaining("fieldName").hasMessageContaining("is null");
+
+        checkValidate(jpa -> jpa.getKey().setParentKeyName(PfKey.NULL_KEY_NAME)).contains("policy name",
+                        Validated.IS_NULL);
+
+        checkValidate(jpa -> jpa.getKey().setParentKeyVersion(PfKey.NULL_KEY_VERSION)).contains("policy version",
+                        Validated.IS_NULL);
+
+        checkValidate(jpa -> jpa.getKey().setParentLocalName("SomeName")).contains("parent local name", "must be NULL");
+
+        checkValidate(jpa -> jpa.getKey().setLocalName(PfKey.NULL_KEY_NAME)).contains("pdpId", Validated.IS_NULL);
+    }
+
+    private AbstractStringAssert<?> checkValidate(Consumer<JpaPdpPolicyStatus> fieldModifier) {
+        JpaPdpPolicyStatus jpa = new JpaPdpPolicyStatus(builder.build());
+        fieldModifier.accept(jpa);
+
+        return assertThat(jpa.validate("").getResult());
+    }
+}
index d57204a..2bf942a 100644 (file)
@@ -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.
 
 package org.onap.policy.models.pdp.persistence.provider;
 
+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.assertTrue;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Properties;
 import org.eclipse.persistence.config.PersistenceUnitProperties;
@@ -36,6 +39,7 @@ import org.junit.Test;
 import org.onap.policy.common.utils.coder.StandardCoder;
 import org.onap.policy.common.utils.resources.ResourceUtils;
 import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.base.Validated;
 import org.onap.policy.models.dao.DaoParameters;
 import org.onap.policy.models.dao.PfDao;
@@ -45,6 +49,9 @@ import org.onap.policy.models.pdp.concepts.Pdp;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
 import org.onap.policy.models.pdp.concepts.PdpGroups;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus.PdpPolicyStatusBuilder;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus.State;
 import org.onap.policy.models.pdp.concepts.PdpStatistics;
 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
@@ -64,8 +71,11 @@ public class PdpProviderTest {
     private static final String GROUP_IS_NULL = "pdpGroupName is marked .*ull but is null";
     private static final String DAO_IS_NULL = "dao is marked .*ull but is null";
     private static final String PDP_GROUP0 = "PdpGroup0";
+    private static final String GROUP_A = "groupA";
+    private static final String GROUP_B = "groupB";
     private PfDao pfDao;
     private StandardCoder standardCoder;
+    private PdpPolicyStatusBuilder statusBuilder;
 
 
     /**
@@ -102,6 +112,18 @@ public class PdpProviderTest {
         standardCoder = new StandardCoder();
     }
 
+    /**
+     * Set up Policy Status builder.
+     */
+    @Before
+    public void setupBuilder() {
+        ToscaConceptIdentifier policy = new ToscaConceptIdentifier("MyPolicy", "1.2.3");
+        ToscaConceptIdentifier policyType = new ToscaConceptIdentifier("MyPolicyType", "1.2.4");
+
+        statusBuilder = PdpPolicyStatus.builder().deploy(true).pdpType("MyPdpType").policy(policy)
+                        .policyType(policyType).state(State.SUCCESS);
+    }
+
     @After
     public void teardown() {
         pfDao.close();
@@ -621,4 +643,130 @@ public class PdpProviderTest {
 
         new PdpProvider().updatePdpStatistics(pfDao, "name", "TYPE", "inst", new PdpStatistics());
     }
+
+    @Test
+    public void testGetGroupPolicyStatus() throws PfModelException {
+        assertThatThrownBy(() -> {
+            new PdpProvider().getGroupPolicyStatus(null, "someGroup");
+        }).hasMessageMatching(DAO_IS_NULL);
+
+        assertThatThrownBy(() -> {
+            new PdpProvider().getGroupPolicyStatus(pfDao, null);
+        }).hasMessageContaining("group").hasMessageContaining("null");
+
+        assertThat(new PdpProvider().getGroupPolicyStatus(pfDao, PDP_GROUP0)).isEmpty();
+    }
+
+    @Test
+    public void cudPolicyStatus() throws PfModelException {
+        PdpProvider prov = new PdpProvider();
+
+        assertThatThrownBy(() -> prov.cudPolicyStatus(null, List.of(), List.of(), List.of()))
+                        .hasMessageMatching(DAO_IS_NULL);
+
+        // null collections should be OK
+        assertThatCode(() -> prov.cudPolicyStatus(pfDao, null, null, null)).doesNotThrowAnyException();
+    }
+
+    @Test
+    public void cudPolicyStatus_Create() throws PfModelException {
+        PdpProvider prov = new PdpProvider();
+
+        PdpPolicyStatus idx = statusBuilder.pdpGroup(GROUP_A).pdpId("idX").build();
+        PdpPolicyStatus idy = statusBuilder.pdpGroup(GROUP_A).pdpId("idY").build();
+        PdpPolicyStatus idz = statusBuilder.pdpGroup(GROUP_B).pdpId("idZ").build();
+        prov.cudPolicyStatus(pfDao, List.of(idx, idy), null, null);
+        prov.cudPolicyStatus(pfDao, List.of(idz), null, null);
+
+        List<PdpPolicyStatus> records = prov.getGroupPolicyStatus(pfDao, GROUP_A);
+        assertThat(records).hasSize(2);
+
+        Collections.sort(records, (rec1, rec2) -> rec1.getPdpId().compareTo(rec2.getPdpId()));
+        assertThat(records.get(0)).isEqualTo(idx);
+        assertThat(records.get(1)).isEqualTo(idy);
+
+        records = prov.getGroupPolicyStatus(pfDao, GROUP_B);
+        assertThat(records).hasSize(1);
+        assertThat(records.get(0)).isEqualTo(idz);
+    }
+
+    @Test
+    public void cudPolicyStatus_Update() throws PfModelException {
+        PdpProvider prov = new PdpProvider();
+
+        PdpPolicyStatus idw = statusBuilder.pdpGroup(GROUP_A).pdpId("wId").build();
+        PdpPolicyStatus idx = statusBuilder.pdpGroup(GROUP_A).pdpId("xId").build();
+        PdpPolicyStatus idy = statusBuilder.pdpGroup(GROUP_A).pdpId("yId").build();
+        PdpPolicyStatus idz = statusBuilder.pdpGroup(GROUP_A).pdpId("zId").build();
+        prov.cudPolicyStatus(pfDao, List.of(idw, idx, idy, idz), null, null);
+
+        assertThat(prov.getGroupPolicyStatus(pfDao, GROUP_A)).hasSize(4);
+
+        /*
+         * Now update some records.
+         */
+        idx.setState(State.FAILURE);
+        idz.setState(State.WAITING);
+        prov.cudPolicyStatus(pfDao, null, List.of(idx, idz), null);
+        List<PdpPolicyStatus> records = prov.getGroupPolicyStatus(pfDao, GROUP_A);
+        assertThat(records).hasSize(4);
+
+        Collections.sort(records, (rec1, rec2) -> rec1.getPdpId().compareTo(rec2.getPdpId()));
+        assertThat(records.get(0)).isEqualTo(idw);
+        assertThat(records.get(1)).isEqualTo(idx);
+        assertThat(records.get(2)).isEqualTo(idy);
+        assertThat(records.get(3)).isEqualTo(idz);
+    }
+
+    @Test
+    public void cudPolicyStatus_Delete() throws PfModelException {
+        PdpProvider prov = new PdpProvider();
+
+        PdpPolicyStatus idw = statusBuilder.pdpGroup(GROUP_A).pdpId("idW").build();
+        PdpPolicyStatus idx = statusBuilder.pdpGroup(GROUP_A).pdpId("idX").build();
+        PdpPolicyStatus idy = statusBuilder.pdpGroup(GROUP_A).pdpId("idY").build();
+        PdpPolicyStatus idz = statusBuilder.pdpGroup(GROUP_A).pdpId("idZ").build();
+        prov.cudPolicyStatus(pfDao, List.of(idw, idx, idy, idz), null, null);
+
+        assertThat(prov.getGroupPolicyStatus(pfDao, GROUP_A)).hasSize(4);
+
+        /*
+         * Delete some records and then check again.
+         */
+        prov.cudPolicyStatus(pfDao, null, null, List.of(idw, idy));
+
+        List<PdpPolicyStatus> records = prov.getGroupPolicyStatus(pfDao, GROUP_A);
+        assertThat(records).hasSize(2);
+
+        Collections.sort(records, (rec1, rec2) -> rec1.getPdpId().compareTo(rec2.getPdpId()));
+        assertThat(records.get(0)).isEqualTo(idx);
+        assertThat(records.get(1)).isEqualTo(idz);
+    }
+
+    @Test
+    public void testFromAuthorativeStatus() throws PfModelException {
+        PdpProvider prov = new PdpProvider();
+
+        assertThatCode(() -> prov.cudPolicyStatus(pfDao, null, null, null)).doesNotThrowAnyException();
+
+        PdpPolicyStatus ida = statusBuilder.pdpGroup(GROUP_A).pdpId("idA").build();
+        PdpPolicyStatus idb = statusBuilder.pdpGroup(GROUP_A).pdpId("idB").build();
+        PdpPolicyStatus idc = statusBuilder.pdpGroup(GROUP_A).pdpId("idC").build();
+        PdpPolicyStatus idd = statusBuilder.pdpGroup(GROUP_A).pdpId("idD").build();
+
+        // make a couple invalid records
+        idb.setState(null);
+        idd.setState(null);
+
+        List<PdpPolicyStatus> list = List.of(ida, idb, idc, idd);
+
+        // @formatter:off
+        assertThatCode(() -> prov.cudPolicyStatus(pfDao, list, null, null))
+            .isInstanceOf(PfModelRuntimeException.class)
+            .hasMessageContaining("1").hasMessageContaining("3")
+            .hasMessageNotContaining("0").hasMessageNotContaining("2");
+        // @formatter:on
+
+        assertThat(prov.getGroupPolicyStatus(pfDao, GROUP_A)).isEmpty();
+    }
 }
index 5c7caae..8789984 100644 (file)
@@ -2,6 +2,7 @@
 <!--
   ============LICENSE_START=======================================================
    Copyright (C) 2019 Nordix Foundation.
+   Modifications Copyright (C) 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.
@@ -28,6 +29,7 @@
         <class>org.onap.policy.models.base.PfConceptKey</class>
         <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType</class>
         <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpPolicyStatus</class>
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpGroup</class>
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpSubGroup</class>
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdp</class>
index 1e8fd24..6587662 100644 (file)
@@ -2,6 +2,7 @@
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019-2020 Nordix Foundation.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
+ *  Modifications Copyright (C) 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 +22,7 @@
 
 package org.onap.policy.models.provider;
 
+import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import lombok.NonNull;
@@ -28,6 +30,7 @@ import org.onap.policy.models.base.PfModelException;
 import org.onap.policy.models.pdp.concepts.Pdp;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus;
 import org.onap.policy.models.pdp.concepts.PdpStatistics;
 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
@@ -367,4 +370,25 @@ public interface PolicyModelsProvider extends AutoCloseable {
      * @throws PfModelException on errors deleting PDP statistics
      */
     public List<PdpStatistics> deletePdpStatistics(@NonNull String name, Date timestamp) throws PfModelException;
+
+    /**
+     * Gets the policy deployments for a PDP group.
+     *
+     * @param groupName the name of the PDP group of interest, null to get results for all
+     *        PDP groups
+     * @return the deployments found
+     * @throws PfModelException on errors getting PDP groups
+     */
+    public List<PdpPolicyStatus> getGroupPolicyStatus(@NonNull final String groupName)
+                    throws PfModelException;
+
+    /**
+     * Creates, updates, and deletes collections of policy status.
+     *
+     * @param createObjs the objects to create
+     * @param updateObjs the objects to update
+     * @param deleteObjs the objects to delete
+     */
+    public void cudPolicyStatus(Collection<PdpPolicyStatus> createObjs,
+                    Collection<PdpPolicyStatus> updateObjs, Collection<PdpPolicyStatus> deleteObjs);
 }
index c80ca31..f7c58cf 100644 (file)
@@ -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.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,6 +22,7 @@
 
 package org.onap.policy.models.provider.impl;
 
+import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import java.util.Properties;
@@ -37,6 +38,7 @@ import org.onap.policy.models.dao.impl.DefaultPfDao;
 import org.onap.policy.models.pdp.concepts.Pdp;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus;
 import org.onap.policy.models.pdp.concepts.PdpStatistics;
 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
 import org.onap.policy.models.pdp.persistence.provider.PdpProvider;
@@ -345,6 +347,20 @@ public class DatabasePolicyModelsProviderImpl implements PolicyModelsProvider {
         return new PdpStatisticsProvider().deletePdpStatistics(pfDao, name, timestamp);
     }
 
+    @Override
+    public List<PdpPolicyStatus> getGroupPolicyStatus(@NonNull String groupName)
+                    throws PfModelException {
+        assertInitialized();
+        return new PdpProvider().getGroupPolicyStatus(pfDao, groupName);
+    }
+
+    @Override
+    public void cudPolicyStatus(Collection<PdpPolicyStatus> createObjs,
+                    Collection<PdpPolicyStatus> updateObjs, Collection<PdpPolicyStatus> deleteObjs) {
+        assertInitialized();
+        new PdpProvider().cudPolicyStatus(pfDao, createObjs, updateObjs, deleteObjs);
+    }
+
     /**
      * Check if the model provider is initialized.
      */
index 1d89227..f0b968c 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019-2020 Nordix Foundation.
- *  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ *  Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,7 @@
 package org.onap.policy.models.provider.impl;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import javax.ws.rs.core.Response;
@@ -34,6 +35,7 @@ import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.pdp.concepts.Pdp;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus;
 import org.onap.policy.models.pdp.concepts.PdpStatistics;
 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
 import org.onap.policy.models.provider.PolicyModelsProvider;
@@ -238,6 +240,18 @@ public class DummyPolicyModelsProviderImpl implements PolicyModelsProvider {
         return new ArrayList<>();
     }
 
+    @Override
+    public List<PdpPolicyStatus> getGroupPolicyStatus(String groupName) throws PfModelException {
+        // Not implemented
+        return new ArrayList<>();
+    }
+
+    @Override
+    public void cudPolicyStatus(Collection<PdpPolicyStatus> createObjs, Collection<PdpPolicyStatus> updateObjs,
+                    Collection<PdpPolicyStatus> deleteObjs) {
+        // Not implemented
+    }
+
     /**
      * Return a ToscaServicetemplate dummy response.
      *
index 3e1767f..cace062 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019-2021 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.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,6 +22,8 @@
 
 package org.onap.policy.models.provider.impl;
 
+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.assertNotNull;
@@ -423,6 +425,9 @@ public class DatabasePolicyModelsProviderTest {
         assertEquals(NAME, databaseProvider.deletePdpStatistics(NAME, null).get(0).getPdpInstanceId());
         assertEquals(0, databaseProvider.getPdpStatistics(null, null).size());
 
+        assertThat(databaseProvider.getGroupPolicyStatus(GROUP)).isEmpty();
+        assertThatCode(() -> databaseProvider.cudPolicyStatus(null, null, null)).doesNotThrowAnyException();
+
         databaseProvider.close();
     }
 
index 1158307..0a3acb0 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019-2020 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.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +23,7 @@
 package org.onap.policy.models.provider.impl;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
@@ -33,6 +34,7 @@ import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.pdp.concepts.Pdp;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus;
 import org.onap.policy.models.pdp.concepts.PdpStatistics;
 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
 import org.onap.policy.models.provider.PolicyModelsProvider;
@@ -229,6 +231,18 @@ public class DummyBadProviderImpl implements PolicyModelsProvider {
         return null;
     }
 
+    @Override
+    public List<PdpPolicyStatus> getGroupPolicyStatus(@NonNull String groupName) throws PfModelException {
+        // Not implemented
+        return null;
+    }
+
+    @Override
+    public void cudPolicyStatus(Collection<PdpPolicyStatus> createObjs, Collection<PdpPolicyStatus> updateObjs,
+                    Collection<PdpPolicyStatus> deleteObjs) {
+        // Not implemented
+    }
+
     @Override
     public List<ToscaServiceTemplate> getServiceTemplateList(String name, String version) throws PfModelException {
         // TODO Auto-generated method stub
index 7fc37af..06c95ef 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019-2020 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.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,6 +22,8 @@
 
 package org.onap.policy.models.provider.impl;
 
+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.assertNotNull;
@@ -111,6 +113,9 @@ public class DummyPolicyModelsProviderTest {
         assertTrue(dummyProvider.createPdpStatistics(null).isEmpty());
         assertTrue(dummyProvider.updatePdpStatistics(null).isEmpty());
         assertTrue(dummyProvider.deletePdpStatistics(null, new Date()).isEmpty());
+
+        assertThat(dummyProvider.getGroupPolicyStatus("name")).isEmpty();
+        assertThatCode(() -> dummyProvider.cudPolicyStatus(null, null, null)).doesNotThrowAnyException();
     }
 
     @Test
index b4506e5..d9e1b5f 100644 (file)
@@ -2,6 +2,7 @@
 <!--
   ============LICENSE_START=======================================================
    Copyright (C) 2019-2020 Nordix Foundation.
+   Modifications Copyright (C) 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.
@@ -27,6 +28,7 @@
         <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.JpaPdpPolicyStatus</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>