From 91d04c64771832a0b8815ffbe1f0f9920320d94d Mon Sep 17 00:00:00 2001 From: Pamela Dragosh Date: Tue, 14 Feb 2017 19:41:00 -0500 Subject: Initial OpenECOMP policy/engine commit Change-Id: I7dbff37733b661643dd4d1caefa3d7dccc361b6e Signed-off-by: Pamela Dragosh --- .../policy/controller/AutoPushController.java | 433 +++++++++++++++++++++ 1 file changed, 433 insertions(+) create mode 100644 ecomp-sdk-app/src/main/java/org/openecomp/policy/controller/AutoPushController.java (limited to 'ecomp-sdk-app/src/main/java/org/openecomp/policy/controller/AutoPushController.java') diff --git a/ecomp-sdk-app/src/main/java/org/openecomp/policy/controller/AutoPushController.java b/ecomp-sdk-app/src/main/java/org/openecomp/policy/controller/AutoPushController.java new file mode 100644 index 000000000..699d8ed00 --- /dev/null +++ b/ecomp-sdk-app/src/main/java/org/openecomp/policy/controller/AutoPushController.java @@ -0,0 +1,433 @@ +/*- + * ============LICENSE_START======================================================= + * ECOMP Policy Engine + * ================================================================================ + * 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.controller; + + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.net.URI; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FilenameUtils; +import org.json.JSONArray; +import org.json.JSONObject; +import org.openecomp.policy.adapter.AutoPushTabAdapter; +import org.openecomp.policy.dao.PolicyVersionDao; +import org.openecomp.policy.model.PDPGroupContainer; +import org.openecomp.policy.model.PDPPolicyContainer; +import org.openecomp.policy.model.Roles; +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.openecomp.portalsdk.core.web.support.JsonMessage; +import org.openecomp.portalsdk.core.web.support.UserUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import org.openecomp.policy.xacml.api.XACMLErrorConstants; +import org.openecomp.policy.xacml.api.pap.EcompPDPGroup; + +import com.att.research.xacml.api.pap.PAPException; +//import com.att.research.xacml.api.pap.PDPGroup; +import com.att.research.xacml.api.pap.PDPPolicy; +import org.openecomp.policy.xacml.std.pap.StdPDPGroup; +import org.openecomp.policy.xacml.std.pap.StdPDPPolicy; +import org.openecomp.policy.xacml.util.XACMLPolicyScanner; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + + +import org.openecomp.policy.common.logging.flexlogger.FlexLogger; +import org.openecomp.policy.common.logging.flexlogger.Logger; + + +@Controller +@RequestMapping({"/"}) +public class AutoPushController extends RestrictedBaseController{ + + private static final Logger logger = FlexLogger.getLogger(AutoPushController.class); + + private PDPGroupContainer container; + protected List groups = Collections.synchronizedList(new ArrayList()); + + private static PDPPolicyContainer policyContainer; + Set selectedPolicies; + + @Autowired + PolicyVersionDao policyVersionDao; + + public synchronized void refreshGroups() { + synchronized(this.groups) { + this.groups.clear(); + try { + this.groups.addAll(PolicyController.getPapEngine().getEcompPDPGroups()); + } catch (PAPException e) { + String message = "Unable to retrieve Groups from server: " + e; + logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + message); + } + + } + } + + @RequestMapping(value={"/get_AutoPushPoliciesContainerData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE) + public void getPolicyGroupContainerData(HttpServletRequest request, HttpServletResponse response){ + try{ + Path gitPath = PolicyController.getGitPath().toAbsolutePath(); + PrintWriter out = response.getWriter(); + JSONObject j = new JSONObject("{data: " + readFileRepository(gitPath,0,0,request).toString() + "}"); + out.write(j.toString()); + } + catch (Exception e){ + e.printStackTrace(); + } + } + + @SuppressWarnings("rawtypes") + public JSONArray readFileRepository(Path path, int id, int parentid, HttpServletRequest request){ + Set scopes = null; + List roles = null; + String userId = null; + try { + userId = UserUtils.getUserIdFromCookie(request); + } catch (Exception e) { + logger.error("Exception Occured while reading userid from cookie" +e); + } + JSONArray fileJSONArray = new JSONArray(); + File root = new File(path.toString()); + if(parentid==0 ){ + parentid = 1; + } + List userRoles = PolicyController.getRoles(userId); + roles = new ArrayList(); + scopes = new HashSet(); + for(Roles userRole: userRoles){ + roles.add(userRole.getRole()); + scopes.add(userRole.getScope()); + } + + for ( File file : root.listFiles()){ + if (!(file.toString().contains(".git") || file.equals(".DS_Store"))) { + if(file.isDirectory()){ + JSONObject el = new JSONObject(); + String fileName = file.getName().toString(); + el.put("categoryId", id+1); + el.put("name", fileName); + el.put("dateModified", lastModified(file)); + el.put("filePath", file.getPath()); + el.put("parentCategoryId", parentid); + el.put("files",readFileRepository(file.toPath(),id+1, id+1, request)); + if (roles.contains("super-admin") || roles.contains("super-editor") || roles.contains("super-guest") ) { + fileJSONArray.put(el); + }else{ + String filePath = file.getPath().toString(); + int startIndex = filePath.indexOf("repository") + 11; + filePath = filePath.substring(startIndex, filePath.length()); + if (scopes.contains(filePath)) { + fileJSONArray.put(el); + } + } + }else{ + JSONObject el = new JSONObject(); + String policyName = ""; + String version = ""; + String fileName = file.getName().toString(); + if(fileName.endsWith(".xml")){ + fileName = fileName.substring(0, fileName.lastIndexOf('.')); + fileName = fileName.substring(0, fileName.lastIndexOf('.')); + //Query the database + String parent = file.toString().substring(file.toString().indexOf("repository")+ 11); + parent = FilenameUtils.removeExtension(parent); + version = parent.substring(parent.indexOf(".")+1); + policyName = parent.substring(0, parent.lastIndexOf(".")); + if(policyName.contains("\\")){ + String scope = policyName.substring(0, policyName.lastIndexOf("\\")); + policyName = scope + "\\" + policyName.substring(policyName.lastIndexOf("\\")); + } + } + el.put("categoryId", id+1); + el.put("name", fileName); + el.put("parentCategoryId", parentid); + el.put("dateModified", lastModified(file)); + el.put("version", version); + el.put("filePath", file.getPath()); + el.put("files",new ArrayList()); + String query = "from PolicyVersion where POLICY_NAME ='" +policyName+"' and ACTIVE_VERSION ='"+version+"'"; + Boolean active = PolicyController.getActivePolicy(query); + if(active){ + if (roles.contains("super-admin") || roles.contains("super-editor") || roles.contains("super-guest") ) { + fileJSONArray.put(el); + }else{ + String filePath = file.getPath().toString(); + int startIndex = filePath.indexOf("repository") + 11; + filePath = filePath.substring(startIndex, filePath.length()); + filePath = filePath.substring(0, filePath.lastIndexOf(File.separator)); + if (scopes.contains(filePath)) { + fileJSONArray.put(el); + } + } + } + } + } + } + return fileJSONArray; + } + + public Date lastModified(File file) { + return new Date(file.lastModified()); + } + + public String getVersion(File file) { + try { + return XACMLPolicyScanner.getVersion(Paths.get(file.getAbsolutePath())); + } catch (IOException e) { + return ""; + } + } + + public String getDomain(File file) { + String filePath = file.getAbsolutePath(); + int startIndex = filePath.indexOf("repository") + 11; + return filePath.substring(startIndex, filePath.length()); + } + + + @RequestMapping(value={"/auto_Push/PushPolicyToPDP.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST}) + public ModelAndView PushPolicyToPDPGroup(HttpServletRequest request, HttpServletResponse response) throws Exception { + try { + ArrayList selectedPDPS = new ArrayList(); + ArrayList selectedPoliciesInUI = new ArrayList(); + this.groups.addAll(PolicyController.getPapEngine().getEcompPDPGroups()); + ObjectMapper mapper = new ObjectMapper(); + this.container = new PDPGroupContainer(PolicyController.getPapEngine()); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + JsonNode root = mapper.readTree(request.getReader()); + AutoPushTabAdapter adapter = (AutoPushTabAdapter) mapper.readValue(root.get("pushTabData").toString(), AutoPushTabAdapter.class); + for (Object pdpGroupId : adapter.getPdpDatas()) { + LinkedHashMap selectedPDP = (LinkedHashMap)pdpGroupId; + for(EcompPDPGroup pdpGroup : this.groups){ + if(pdpGroup.getId().equals(selectedPDP.get("id"))){ + selectedPDPS.add(pdpGroup); + } + } + } + + for (Object policyId : adapter.getPolicyDatas()) { + LinkedHashMap selected = (LinkedHashMap)policyId; + Path file = Paths.get(selected.get("filePath").toString()); + selectedPoliciesInUI.add(file.toFile()); + } + + for (Object pdpDestinationGroupId : selectedPDPS) { + Set currentPoliciesInGroup = new HashSet(); + Set selectedPolicies = new HashSet(); + for (File policyId : selectedPoliciesInUI) { + logger.debug("Handlepolicies..." + pdpDestinationGroupId + policyId); + // + // Get the current selection + File selectedItem = policyId; + // + assert (selectedItem != null); + if (selectedItem.isDirectory()) { + //AdminNotification.warn("Select only the Policy"); + return null; + } + // create the id of the target file + // Our standard for file naming is: + // ...xml + // since the file name usually has a ".xml", we need to strip + // that + // before adding the other parts + String name = selectedItem.getName(); + if(name.endsWith(".xml")){ + name = name.substring(0, name.length() - 4); + name = name.substring(0, name.lastIndexOf(".")); + } + String id = name; + if (id.endsWith(".xml")) { + id = id.substring(0, id.length() - 4); + id = id.substring(0, id.lastIndexOf(".")); + } + // add on the version string + String version = getVersion(selectedItem); + id += "." + version; + // put the .xml on the end + id += ".xml"; + // track on the domain in front. Do this one level at a time + // until we + // reach one of the roots + String domain = getDomain(selectedItem); + String mainDomain = domain.substring(0, domain.lastIndexOf(File.separator) ); + logger.info("print the main domain value"+mainDomain); + String path = mainDomain.replace('\\', '.'); + if(path.contains("/")){ + path = mainDomain.replace('/', '.'); + logger.info("print the path:" +path); + } + id = path + "." + id; + // Default policy to be Root policy; user can change to deferred + // later + URI selectedURI = selectedItem.toURI(); + StdPDPPolicy selectedPolicy = null; + try { + // + // Create the policy + selectedPolicy = new StdPDPPolicy(id, true, name, selectedURI); + } catch (IOException e) { + logger.error("Unable to create policy '" + id + "': "+ e.getMessage()); + //AdminNotification.warn("Unable to create policy '" + id + "': " + e.getMessage()); + } + StdPDPGroup selectedGroup = (StdPDPGroup) pdpDestinationGroupId; + if (selectedPolicy != null) { + // Add Current policies from container + for (EcompPDPGroup group : container.getGroups()) { + if (group.getId().equals(selectedGroup.getId())) { + currentPoliciesInGroup.addAll(group.getPolicies()); + } + } + // copy policy to PAP + try { + PolicyController.getPapEngine().copyPolicy(selectedPolicy, (StdPDPGroup) pdpDestinationGroupId); + } catch (PAPException e) { + e.printStackTrace(); + return null; + } + selectedPolicies.add(selectedPolicy); + } + } + StdPDPGroup pdpGroup = (StdPDPGroup) pdpDestinationGroupId; + StdPDPGroup updatedGroupObject = new StdPDPGroup(pdpGroup.getId(), pdpGroup.isDefaultGroup(), pdpGroup.getName(), pdpGroup.getDescription(), pdpGroup.getDirectory()); + updatedGroupObject.setEcompPdps(pdpGroup.getEcompPdps()); + updatedGroupObject.setPipConfigs(pdpGroup.getPipConfigs()); + updatedGroupObject.setStatus(pdpGroup.getStatus()); + + // replace the original set of Policies with the set from the + // container (possibly modified by the user) + // do not allow multiple copies of same policy + Iterator policyIterator = currentPoliciesInGroup.iterator(); + logger.debug("policyIterator....." + selectedPolicies); + while (policyIterator.hasNext()) { + PDPPolicy existingPolicy = policyIterator.next(); + for (PDPPolicy selPolicy : selectedPolicies) { + if (selPolicy.getName().equals(existingPolicy.getName())) { + if (selPolicy.getVersion().equals(existingPolicy.getVersion())) { + if (selPolicy.getId().equals(existingPolicy.getId())) { + policyIterator.remove(); + logger.debug("Removing policy: " + selPolicy); + break; + } + } else { + policyIterator.remove(); + logger.debug("Removing Old Policy version: "+ selPolicy); + break; + } + } + } + } + + currentPoliciesInGroup.addAll(selectedPolicies); + updatedGroupObject.setPolicies(currentPoliciesInGroup); + this.container.updateGroup(updatedGroupObject); + + response.setCharacterEncoding("UTF-8"); + response.setContentType("application / json"); + request.setCharacterEncoding("UTF-8"); + + PrintWriter out = response.getWriter(); + refreshGroups(); + JsonMessage msg = new JsonMessage(mapper.writeValueAsString(groups)); + JSONObject j = new JSONObject(msg); + out.write(j.toString()); + return null; + } + } + catch (Exception e){ + response.setCharacterEncoding("UTF-8"); + request.setCharacterEncoding("UTF-8"); + PrintWriter out = response.getWriter(); + out.write(e.getMessage()); + } + return null; + } + + @RequestMapping(value={"/auto_Push/remove_GroupPolicies.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST}) + public ModelAndView removePDPGroup(HttpServletRequest request, HttpServletResponse response) throws Exception { + try { + this.container = new PDPGroupContainer(PolicyController.getPapEngine()); + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + JsonNode root = mapper.readTree(request.getReader()); + StdPDPGroup group = (StdPDPGroup)mapper.readValue(root.get("activePdpGroup").toString(), StdPDPGroup.class); + JsonNode removePolicyData = root.get("data"); + policyContainer = new PDPPolicyContainer(group); + if(removePolicyData.size() > 0){ + for(int i = 0 ; i < removePolicyData.size(); i++){ + String data = removePolicyData.get(i).toString(); + AutoPushController.policyContainer.removeItem(data); + } + Set changedPolicies = new HashSet(); + changedPolicies.addAll((Collection) AutoPushController.policyContainer.getItemIds()); + StdPDPGroup updatedGroupObject = new StdPDPGroup(group.getId(), group.isDefaultGroup(), group.getName(), group.getDescription(),null); + updatedGroupObject.setPolicies(changedPolicies); + updatedGroupObject.setEcompPdps(group.getEcompPdps()); + updatedGroupObject.setPipConfigs(group.getPipConfigs()); + updatedGroupObject.setStatus(group.getStatus()); + this.container.updateGroup(updatedGroupObject); + } + + response.setCharacterEncoding("UTF-8"); + response.setContentType("application / json"); + request.setCharacterEncoding("UTF-8"); + + PrintWriter out = response.getWriter(); + refreshGroups(); + JsonMessage msg = new JsonMessage(mapper.writeValueAsString(groups)); + JSONObject j = new JSONObject(msg); + + out.write(j.toString()); + + return null; + } + catch (Exception e){ + response.setCharacterEncoding("UTF-8"); + request.setCharacterEncoding("UTF-8"); + PrintWriter out = response.getWriter(); + out.write(e.getMessage()); + } + return null; + } + +} \ No newline at end of file -- cgit 1.2.3-korg