summaryrefslogtreecommitdiffstats
path: root/models-pap/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'models-pap/src/main/java')
-rw-r--r--models-pap/src/main/java/org/onap/policy/models/pap/concepts/PolicyAudit.java50
-rw-r--r--models-pap/src/main/java/org/onap/policy/models/pap/persistence/concepts/JpaPolicyAudit.java191
-rw-r--r--models-pap/src/main/java/org/onap/policy/models/pap/persistence/provider/PolicyAuditProvider.java137
3 files changed, 378 insertions, 0 deletions
diff --git a/models-pap/src/main/java/org/onap/policy/models/pap/concepts/PolicyAudit.java b/models-pap/src/main/java/org/onap/policy/models/pap/concepts/PolicyAudit.java
new file mode 100644
index 000000000..765d246a6
--- /dev/null
+++ b/models-pap/src/main/java/org/onap/policy/models/pap/concepts/PolicyAudit.java
@@ -0,0 +1,50 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.pap.concepts;
+
+import java.time.Instant;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Audit info on policy actions.
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PolicyAudit {
+
+ public enum AuditAction {
+ DEPLOYMENT, UNDEPLOYMENT
+ }
+
+ private Long auditId;
+ private String pdpGroup;
+ private String pdpType;
+ private ToscaConceptIdentifier policy;
+ private AuditAction action;
+ private Instant timestamp;
+ private String user;
+}
diff --git a/models-pap/src/main/java/org/onap/policy/models/pap/persistence/concepts/JpaPolicyAudit.java b/models-pap/src/main/java/org/onap/policy/models/pap/persistence/concepts/JpaPolicyAudit.java
new file mode 100644
index 000000000..b31af8ea0
--- /dev/null
+++ b/models-pap/src/main/java/org/onap/policy/models/pap/persistence/concepts/JpaPolicyAudit.java
@@ -0,0 +1,191 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.pap.persistence.concepts;
+
+import java.time.Instant;
+import java.util.Date;
+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 javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.CompareToBuilder;
+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.PfGeneratedIdKey;
+import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.PfReferenceKey;
+import org.onap.policy.models.base.validation.annotations.VerifyKey;
+import org.onap.policy.models.pap.concepts.PolicyAudit;
+import org.onap.policy.models.pap.concepts.PolicyAudit.AuditAction;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Entity to keep the records on policy actions for audit.
+ *
+ * @author Adheli Tavares (adheli.tavares@est.tech)
+ *
+ */
+@Entity
+@Table(name = "JpaPolicyAudit", indexes = {@Index(name = "JpaPolicyAuditIndex_timestamp", columnList = "timeStamp")})
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class JpaPolicyAudit extends PfConcept implements PfAuthorative<PolicyAudit> {
+ private static final long serialVersionUID = -2935734300607322191L;
+
+ @EmbeddedId
+ @Column
+ @NotNull
+ @VerifyKey(versionNotNull = true)
+ private PfGeneratedIdKey key;
+
+ @Column
+ private String pdpGroup;
+
+ @Column
+ private String pdpType;
+
+ @Column
+ @NotNull
+ private AuditAction action;
+
+ @Column
+ @Temporal(TemporalType.TIMESTAMP)
+ @NotNull
+ private Date timeStamp;
+
+ @Column
+ private String user;
+
+ /**
+ * Default constructor.
+ */
+ public JpaPolicyAudit() {
+ key = new PfGeneratedIdKey();
+ }
+
+ /**
+ * Constructor from an authorative.
+ *
+ * @param audit authorative model
+ */
+ public JpaPolicyAudit(PolicyAudit audit) {
+ fromAuthorative(audit);
+ }
+
+ /**
+ * Constructor as a copy.
+ *
+ * @param copyConcept original entity to be copied
+ */
+ public JpaPolicyAudit(JpaPolicyAudit copyConcept) {
+ this.key = new PfGeneratedIdKey(copyConcept.getKey());
+ this.pdpGroup = copyConcept.getPdpGroup();
+ this.pdpType = copyConcept.getPdpType();
+ this.action = copyConcept.getAction();
+ this.timeStamp = copyConcept.getTimeStamp();
+ this.user = copyConcept.getUser();
+ }
+
+ @Override
+ public int compareTo(PfConcept o) {
+ if (o == null) {
+ return -1;
+ }
+ if (this == o) {
+ return 0;
+ }
+ if (getClass() != o.getClass()) {
+ return getClass().getName().compareTo(o.getClass().getName());
+ }
+
+ final JpaPolicyAudit other = (JpaPolicyAudit) o;
+
+ // @formatter:off
+ return new CompareToBuilder()
+ .append(key, other.key)
+ .append(pdpGroup, other.pdpGroup)
+ .append(pdpType, other.pdpType)
+ .append(action, other.action)
+ .append(timeStamp, other.timeStamp)
+ .append(user, other.user)
+ .toComparison();
+ // @formatter:on
+ }
+
+ @Override
+ public PolicyAudit toAuthorative() {
+ ToscaConceptIdentifier policyIdent = new ToscaConceptIdentifier(key.getName(), key.getVersion());
+
+ // @formatter:off
+ return PolicyAudit.builder()
+ .auditId(key.getGeneratedId())
+ .pdpGroup(pdpGroup)
+ .pdpType(pdpType)
+ .policy(policyIdent)
+ .action(action)
+ .timestamp(timeStamp == null ? null : timeStamp.toInstant())
+ .user(user)
+ .build();
+ // @formatter:on
+ }
+
+ @Override
+ public void fromAuthorative(PolicyAudit authorativeConcept) {
+ if (authorativeConcept.getPolicy() != null) {
+ final ToscaConceptIdentifier policy = authorativeConcept.getPolicy();
+ key = new PfGeneratedIdKey(policy.getName(), policy.getVersion(), authorativeConcept.getAuditId());
+ } else {
+ key = new PfGeneratedIdKey();
+ }
+
+ pdpGroup = authorativeConcept.getPdpGroup();
+ pdpType = authorativeConcept.getPdpType();
+ action = authorativeConcept.getAction();
+ timeStamp = authorativeConcept.getTimestamp() == null ? Date.from(Instant.now())
+ : Date.from(authorativeConcept.getTimestamp());
+ user = authorativeConcept.getUser();
+ }
+
+ @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);
+ user = Assertions.validateStringParameter("user", user, PfReferenceKey.LOCAL_NAME_REGEXP);
+ }
+}
diff --git a/models-pap/src/main/java/org/onap/policy/models/pap/persistence/provider/PolicyAuditProvider.java b/models-pap/src/main/java/org/onap/policy/models/pap/persistence/provider/PolicyAuditProvider.java
new file mode 100644
index 000000000..c117beefa
--- /dev/null
+++ b/models-pap/src/main/java/org/onap/policy/models/pap/persistence/provider/PolicyAuditProvider.java
@@ -0,0 +1,137 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.pap.persistence.provider;
+
+import java.time.Instant;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import javax.ws.rs.core.Response;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NonNull;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.dao.PfDao;
+import org.onap.policy.models.pap.concepts.PolicyAudit;
+import org.onap.policy.models.pap.concepts.PolicyAudit.AuditAction;
+import org.onap.policy.models.pap.persistence.concepts.JpaPolicyAudit;
+
+/**
+ * Provider for Policy Audit.
+ *
+ * @author Adheli Tavares (adheli.tavares@est.tech)
+ *
+ */
+public class PolicyAuditProvider {
+
+ private static final Integer DEFAULT_MAX_RECORDS = 100;
+ private static final String DESCENDING_ORDER = "DESC";
+
+ /**
+ * Create audit records.
+ *
+ * @param audits list of policy audit
+ */
+ public void createAuditRecords(@NonNull PfDao dao, @NonNull final List<PolicyAudit> audits) {
+ List<JpaPolicyAudit> jpaAudits = audits.stream().map(JpaPolicyAudit::new).collect(Collectors.toList());
+
+ BeanValidationResult result = new BeanValidationResult("createAuditRecords", jpaAudits);
+
+ int count = 0;
+ for (JpaPolicyAudit jpaAudit: jpaAudits) {
+ result.addResult(jpaAudit.validate(String.valueOf(count++)));
+ }
+
+ if (!result.isValid()) {
+ throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, result.getResult());
+ }
+
+ dao.createCollection(jpaAudits);
+ }
+
+ /**
+ * Collect all audit records.
+ *
+ * @param numRecords number of records to be collected
+ * @return list of {@link PolicyAudit} records
+ */
+ public List<PolicyAudit> getAuditRecords(@NonNull PfDao dao, @NonNull Integer numRecords) {
+ numRecords = numRecords > DEFAULT_MAX_RECORDS ? DEFAULT_MAX_RECORDS : numRecords;
+
+ // @formatter:off
+ return dao.getAll(JpaPolicyAudit.class, "timeStamp DESC", numRecords)
+ .stream()
+ .map(JpaPolicyAudit::toAuthorative)
+ .collect(Collectors.toList());
+ // @formatter:on
+ }
+
+ /**
+ * Collect audit records based on filters at {@link AuditFilter}.
+ *
+ * @param auditFilter {@link AuditFilter} object with filters for search
+ * @param numRecords number of records to be collected
+ * @return list of {@link PolicyAudit} records
+ */
+ public List<PolicyAudit> getAuditRecords(@NonNull PfDao dao, @NonNull AuditFilter auditFilter,
+ @NonNull Integer numRecords) {
+ numRecords = numRecords > DEFAULT_MAX_RECORDS ? DEFAULT_MAX_RECORDS : numRecords;
+
+ Map<String, Object> filter = new HashMap<>();
+ if (StringUtils.isNotBlank(auditFilter.getPdpGroup())) {
+ filter.put("pdpGroup", auditFilter.getPdpGroup());
+ }
+
+ if (auditFilter.getAction() != null) {
+ filter.put("action", auditFilter.getAction());
+ }
+
+ // @formatter:off
+ return dao.getFiltered(JpaPolicyAudit.class,
+ auditFilter.getName(), auditFilter.getVersion(),
+ auditFilter.getFromDate(), auditFilter.getToDate(),
+ filter, DESCENDING_ORDER, numRecords)
+ .stream().map(JpaPolicyAudit::toAuthorative).collect(Collectors.toList());
+ // @formatter:on
+ }
+
+ /**
+ * Create a filter for looking for audit records.
+ * name - policy name
+ * version - policy version
+ * pdpGroup - PDP group that policy might be related
+ * action - type of action/operation realized on policy
+ * fromDate - start of period in case of time interval search
+ */
+ @Data
+ @Builder
+ protected static class AuditFilter {
+ private String name;
+ private String version;
+ private AuditAction action;
+ private String pdpGroup;
+ private Instant fromDate;
+ private Instant toDate;
+ }
+}