aboutsummaryrefslogtreecommitdiffstats
path: root/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/PushPolicyController.java
diff options
context:
space:
mode:
Diffstat (limited to 'ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/PushPolicyController.java')
-rw-r--r--ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/PushPolicyController.java253
1 files changed, 253 insertions, 0 deletions
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/PushPolicyController.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/PushPolicyController.java
new file mode 100644
index 000000000..046bb3cfb
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/PushPolicyController.java
@@ -0,0 +1,253 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 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.openecomp.policy.pap.xacml.rest.controller;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.net.URI;
+import java.util.List;
+import java.util.UUID;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.openecomp.policy.pap.xacml.rest.XACMLPapServlet;
+import org.openecomp.policy.rest.dao.CommonClassDao;
+import org.openecomp.policy.rest.jpa.PolicyEntity;
+import org.openecomp.policy.rest.jpa.PolicyVersion;
+import org.openecomp.policy.xacml.std.pap.StdPDPGroup;
+import org.openecomp.policy.xacml.std.pap.StdPDPPolicy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import com.att.research.xacml.api.pap.PAPException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Controller
+public class PushPolicyController {
+ private static final Logger LOGGER = FlexLogger.getLogger(PushPolicyController.class);
+
+ private static CommonClassDao commonClassDao;
+
+ @Autowired
+ public PushPolicyController(CommonClassDao commonClassDao){
+ PushPolicyController.commonClassDao = commonClassDao;
+ }
+
+ public PushPolicyController(){}
+
+ @RequestMapping(value="/pushPolicy", method=RequestMethod.POST)
+ public void pushPolicy(HttpServletRequest request, HttpServletResponse response){
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ try {
+ JsonNode root = mapper.readTree(request.getInputStream());
+ String policyScope = root.get("policyScope").asText();
+ String filePrefix = root.get("filePrefix").asText();
+ String policyName = root.get("policyName").asText();
+ String pdpGroup = root.get("pdpGroup").asText();
+ String requestID = request.getHeader("X-ECOMP-RequestID");
+ if(requestID==null){
+ requestID = UUID.randomUUID().toString();
+ LOGGER.info("No request ID provided, sending generated ID: " + requestID.toString());
+ }
+ LOGGER.info("Push policy Request : " + root.asText());
+ String policyVersionName = policyScope.replace(".", File.separator) + File.separator
+ + filePrefix + policyName;
+ List<?> policyVersionObject = commonClassDao.getDataById(PolicyVersion.class, "policyName", policyVersionName);
+ if(policyVersionObject!=null){
+ PolicyVersion policyVersion = (PolicyVersion) policyVersionObject.get(0);
+ String policyID = policyVersionName.replace(File.separator, "."); // This is before adding version.
+ policyVersionName += "." + policyVersion.getActiveVersion() + ".xml";
+ addPolicyToGroup(policyScope, policyID, policyVersionName.replace(File.separator, "."), pdpGroup, response);
+ }else{
+ String message = "Unknown Policy '" + policyName + "'";
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " " + message);
+ response.addHeader("error", "unknownPolicy");
+ response.addHeader("operation", "push");
+ response.addHeader("message", message);
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+ //safetyChecker(policyName);
+ } catch (NullPointerException | IOException e) {
+ LOGGER.error(e);
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ response.addHeader("error", "unknown");
+ response.addHeader("operation", "push");
+ return;
+ }
+ }
+
+ /*private void safetyChecker(String policyName) {
+ if (XACMLProperties.getProperty("xacml.rest.pap.safetychecker").equals("on")) {
+ if (policyName.contains("Config_MS_") || policyName.contains("BRMS_Param")) {
+ SafetyCheckerService service = new SafetyCheckerService();
+ PolicySafetyChecker safetyChecker = new PolicySafetyChecker();
+ boolean isEntered = false;
+ try {
+ JSONObject policyDataObj = service.getConfigByPolicyName(policyName, XACMLPapServlet.getConfigHome());
+ isEntered = safetyChecker.addItem(policyDataObj);
+ } catch (Exception e) {
+ PolicyLogger.warn(MessageCodes.ERROR_PROCESS_FLOW, "XACMLPapServlet", e, "Error while adding ClosedLoop in the database: "
+ + "This is a PolicySafetyChecker warning, the push execution may proceed normally.");
+ }
+ if (isEntered) {
+ LOGGER.info("SafetyChecker successfully added the closedLoop to the DB table.");
+ } else {
+ LOGGER.info("SafetyChecker failed to add the closedLoop to the DB table.");
+ }
+ }
+ } else {
+ LOGGER.info("PolicySafetyChecker is turned off.");
+ }
+ }*/
+
+ private void addPolicyToGroup(String policyScope, String policyID, String policyName, String pdpGroup, HttpServletResponse response) {
+ StdPDPGroup selectedPDPGroup = null;
+ StdPDPPolicy selectedPolicy = null;
+ //Get the current policies from the Group and Add the new one
+ //Set<PDPPolicy> currentPoliciesInGroup = null;
+ try {
+ selectedPDPGroup = (StdPDPGroup) XACMLPapServlet.getPAPEngine().getGroup(pdpGroup);
+ } catch (PAPException e1) {
+ PolicyLogger.error(e1);
+ }
+ if(selectedPDPGroup==null){
+ String message = "Unknown groupId '" + selectedPDPGroup + "'";
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " " + message);
+ response.addHeader("error", "unknownGroupId");
+ response.addHeader("operation", "push");
+ response.addHeader("message", message);
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+ //Get PolicyEntity from DB;
+ EntityManager em = XACMLPapServlet.getEmf().createEntityManager();
+ Query createPolicyQuery = em.createQuery("SELECT p FROM PolicyEntity p WHERE p.scope=:scope AND p.policyName=:policyName");
+ createPolicyQuery.setParameter("scope", policyScope);
+ createPolicyQuery.setParameter("policyName", policyName.substring(policyScope.length()+1));
+ List<?> createPolicyQueryList = createPolicyQuery.getResultList();
+ PolicyEntity policyEntity = null;
+ if(createPolicyQueryList.size()>0){
+ policyEntity = (PolicyEntity)createPolicyQueryList.get(0);
+ }else{
+ PolicyLogger.error("Somehow, more than one policy with the same scope, name, and deleted status were found in the database");
+ String message = "Unknown Policy '" + policyName + "'";
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " " + message);
+ response.addHeader("error", "unknownPolicy");
+ response.addHeader("operation", "push");
+ response.addHeader("message", message);
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+ File temp = new File(policyName);
+ try {
+ BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
+ bw.write(policyEntity.getPolicyData());
+ bw.close();
+ URI selectedURI = temp.toURI();
+ // Create the policy Object
+ selectedPolicy = new StdPDPPolicy(policyName, true, policyID, selectedURI);
+ } catch (IOException e) {
+ LOGGER.error("Unable to create policy '" + policyName + "': "+ e.getMessage());
+ }
+ try {
+ new ObjectOutputStream(response.getOutputStream()).writeObject(selectedPolicy);
+ } catch (IOException e) {
+ LOGGER.error(e);
+ response.addHeader("error", "policyCopyError");
+ response.addHeader("message", e.getMessage());
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ return;
+ }
+ response.addHeader("Content-Type","application/json");
+ response.setStatus(HttpServletResponse.SC_ACCEPTED);
+ response.addHeader("operation", "push");
+ response.addHeader("policyId", policyName);
+ return;
+ // TODO : Check point to push policies within PAP.
+ /*PolicyDBDaoTransaction addPolicyToGroupTransaction = XACMLPapServlet.getDbDaoTransaction();
+ try{
+ if (selectedPolicy != null) {
+ // Add Current policies from container
+ currentPoliciesInGroup = selectedPDPGroup.getPolicies();
+ // copy policy to PAP
+ addPolicyToGroupTransaction.addPolicyToGroup(selectedPDPGroup.getId(), policyName,"XACMLPapServlet.pushPolicyController");
+ ((StdPDPGroup) selectedPDPGroup).copyPolicyToFile(policyName, policyID, new FileInputStream(temp));
+ addPolicyToGroupTransaction.commitTransaction();
+ }
+ }catch (Exception e) {
+ addPolicyToGroupTransaction.rollbackTransaction();
+ String message = "Policy '" + policyName + "' not copied to group '" + pdpGroup +"': " + e;
+ PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW + " " + message);
+ PolicyLogger.audit("Transaction Failed - See Error.log");
+ response.addHeader("error", "policyCopyError");
+ response.addHeader("message", message);
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ return;
+ }
+ //If the selected policy is in the group we must remove it because the name is default
+ for (PDPPolicy existingPolicy : currentPoliciesInGroup) {
+ if (existingPolicy.getId().equals(selectedPolicy.getId())) {
+ selectedPDPGroup.removePolicyFromGroup(existingPolicy);
+ LOGGER.debug("Removing existing policy: " + existingPolicy);
+ break;
+ }
+ }
+ //Update the PDP Group after removing old version of policy
+ //Set<PDPPolicy> updatedPoliciesInGroup = selectedPDPGroup.getPolicies();
+ //need to remove the policy with default name from group
+ for (PDPPolicy updatedPolicy : currentPoliciesInGroup) {
+ if (updatedPolicy.getName().equalsIgnoreCase("default")) {
+ selectedPDPGroup.removePolicyFromGroup(updatedPolicy);
+ }
+ }
+ Set<PDPPolicy> policies = selectedPDPGroup.getPolicies();
+ policies.add(selectedPolicy);
+ selectedPDPGroup.setPolicies(policies);
+ // Update now.
+ try {
+ XACMLPapServlet.getPAPEngine().updateGroup(selectedPDPGroup);
+ } catch (PAPException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ // policy file copied ok and the Group was updated on the PDP
+ response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+ response.addHeader("operation", "push");
+ response.addHeader("policyId", policyName);
+ response.addHeader("groupId", pdpGroup);
+ return;*/
+ }
+}