summaryrefslogtreecommitdiffstats
path: root/models-pdp/src/main
diff options
context:
space:
mode:
authorJim Hahn <jrh3@att.com>2021-01-07 09:07:05 -0500
committerJim Hahn <jrh3@att.com>2021-01-08 16:12:22 -0500
commite926efbc4d5dde8ade1a5521f5be1294079df057 (patch)
treee00047d50e27dc24a146b9f4fa10486a98dd3c86 /models-pdp/src/main
parente6bea18abd1a1b4ddf7203508832e6a3f9380598 (diff)
Add PDP-Policy deployment table to DB
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>
Diffstat (limited to 'models-pdp/src/main')
-rw-r--r--models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpPolicyStatus.java49
-rw-r--r--models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpPolicyStatus.java225
-rw-r--r--models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/provider/PdpProvider.java75
3 files changed, 348 insertions, 1 deletions
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
index 000000000..b52173a9d
--- /dev/null
+++ b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/PdpPolicyStatus.java
@@ -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
index 000000000..2da787b60
--- /dev/null
+++ b/models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/concepts/JpaPdpPolicyStatus.java
@@ -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;
+ }
+}
diff --git a/models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/provider/PdpProvider.java b/models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/provider/PdpProvider.java
index e496521b7..ed3551a9e 100644
--- a/models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/provider/PdpProvider.java
+++ b/models-pdp/src/main/java/org/onap/policy/models/pdp/persistence/provider/PdpProvider.java
@@ -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.
@@ -22,7 +22,11 @@
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.
@@ -248,6 +255,72 @@ public class PdpProvider {
}
/**
+ * 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.
*
* @param foundPdpGroups the list to convert