summaryrefslogtreecommitdiffstats
path: root/ONAP-PAP-REST
diff options
context:
space:
mode:
authorrb7147 <rb7147@att.com>2018-02-06 09:07:12 -0500
committerrb7147 <rb7147@att.com>2018-02-06 10:33:49 -0500
commit695d88bd7a987a06173fc4fa13f4135916a79a86 (patch)
tree60ee9acba76fd3e4333e72bfde2e342313e62dd5 /ONAP-PAP-REST
parent6425d452d8507e9eeeb4da2f9f7051e602af541e (diff)
Policy Resiliency Code Fixes
Resolved the issue on updating the configuration files when rename/clone/export/move actions are done through GUI. Fixed the PolicyManagerServlet code. Added test cases for newly added files. Issue-ID: POLICY-609 Change-Id: I9d14f19fe20bbc0e3b3844f85d81f26e34bb26ec Signed-off-by: rb7147 <rb7147@att.com>
Diffstat (limited to 'ONAP-PAP-REST')
-rw-r--r--ONAP-PAP-REST/pom.xml16
-rw-r--r--ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/UpdateOthersPAPS.java240
-rw-r--r--ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/adapters/UpdateObjectData.java50
-rw-r--r--ONAP-PAP-REST/src/test/java/org/onap/policy/pap/test/UpdateOthersPAPSTest.java116
-rw-r--r--ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/adapters/UpdateObjectDataTest.java39
5 files changed, 459 insertions, 2 deletions
diff --git a/ONAP-PAP-REST/pom.xml b/ONAP-PAP-REST/pom.xml
index 760229448..f0e3f334f 100644
--- a/ONAP-PAP-REST/pom.xml
+++ b/ONAP-PAP-REST/pom.xml
@@ -3,7 +3,7 @@
============LICENSE_START=======================================================
ONAP Policy Engine
================================================================================
- Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ Copyright (C) 2017-2018 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.
@@ -332,7 +332,19 @@
<artifactId>tomcat-dbcp</artifactId>
<version>8.5.9</version>
</dependency>
-
+ <!-- https://mvnrepository.com/artifact/org.powermock/powermock-api-mockito -->
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-api-mockito</artifactId>
+ <version>1.7.3</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-module-junit4</artifactId>
+ <version>1.7.3</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<properties>
<springframework.version>4.2.0.RELEASE</springframework.version>
diff --git a/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/UpdateOthersPAPS.java b/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/UpdateOthersPAPS.java
new file mode 100644
index 000000000..c1891b352
--- /dev/null
+++ b/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/UpdateOthersPAPS.java
@@ -0,0 +1,240 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2018 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.pap.xacml.rest;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONObject;
+import org.onap.policy.common.logging.flexlogger.FlexLogger;
+import org.onap.policy.common.logging.flexlogger.Logger;
+import org.onap.policy.pap.xacml.rest.adapters.UpdateObjectData;
+import org.onap.policy.pap.xacml.rest.components.Policy;
+import org.onap.policy.pap.xacml.rest.util.JsonMessage;
+import org.onap.policy.rest.XACMLRestProperties;
+import org.onap.policy.rest.dao.CommonClassDao;
+import org.onap.policy.rest.jpa.ActionBodyEntity;
+import org.onap.policy.rest.jpa.ConfigurationDataEntity;
+import org.onap.policy.rest.jpa.PolicyDBDaoEntity;
+import org.onap.policy.utils.CryptoUtils;
+import org.onap.policy.xacml.api.XACMLErrorConstants;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.client.RestTemplate;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Controller
+public class UpdateOthersPAPS {
+
+ private static final Logger policyLogger = FlexLogger.getLogger(UpdateOthersPAPS.class);
+
+ private static CommonClassDao commonClassDao;
+
+ private static final String contentType = "application/json";
+ private static String configType =".Config_";
+ private static String actionType =".Action_";
+ private static String error ="error";
+ public static CommonClassDao getCommonClassDao() {
+ return commonClassDao;
+ }
+
+ public static void setCommonClassDao(CommonClassDao commonClassDao) {
+ UpdateOthersPAPS.commonClassDao = commonClassDao;
+ }
+
+ @Autowired
+ private UpdateOthersPAPS(CommonClassDao commonClassDao){
+ UpdateOthersPAPS.commonClassDao = commonClassDao;
+ }
+
+ public UpdateOthersPAPS() {
+ //Empty Constructor
+ }
+
+ @RequestMapping(value="/notifyOtherPAPs", method= RequestMethod.POST)
+ public void notifyOthersPAPsToUpdateConfigurations(HttpServletRequest request, HttpServletResponse response){
+ Map<String, Object> model = new HashMap<>();
+ ObjectMapper mapper = new ObjectMapper();
+ UpdateObjectData body = new UpdateObjectData();
+ body.setAction(request.getParameter("action"));
+ body.setNewPolicyName(request.getParameter("newPolicyName"));
+ body.setOldPolicyName(request.getParameter("oldPolicyName"));
+
+ String currentPap = XACMLRestProperties.getProperty("xacml.rest.pap.url");
+ List<Object> getPAPUrls = commonClassDao.getData(PolicyDBDaoEntity.class);
+ if(getPAPUrls != null && !getPAPUrls.isEmpty()){
+ for(int i = 0; i < getPAPUrls.size(); i++){
+ PolicyDBDaoEntity papId = (PolicyDBDaoEntity) getPAPUrls.get(i);
+ String papUrl = papId.getPolicyDBDaoUrl();
+ if(!papUrl.equals(currentPap)){
+ String userName = papId.getUsername();
+ String password = papId.getPassword();
+ Base64.Encoder encoder = Base64.getEncoder();
+ String txt;
+ try{
+ txt = new String(CryptoUtils.decryptTxt(password), StandardCharsets.UTF_8);
+ } catch(Exception e){
+ policyLogger.debug(e);
+ //if we can't decrypt, might as well try it anyway
+ txt = password;
+ }
+ String encoding = encoder.encodeToString((userName+":"+txt).getBytes(StandardCharsets.UTF_8));
+ HttpHeaders headers = new HttpHeaders();
+ headers.set("Authorization", "Basic " + encoding);
+ headers.set("Content-Type", contentType);
+
+ RestTemplate restTemplate = new RestTemplate();
+ HttpEntity<?> requestEntity = new HttpEntity<>(body, headers);
+ HttpClientErrorException exception = null;
+
+ try{
+ restTemplate.exchange(papUrl + "onap/updateConfiguration", HttpMethod.POST, requestEntity, String.class);
+ }catch(Exception e){
+ policyLogger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error while connecting to " + papUrl, e);
+ exception = new HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR, e.getMessage());
+ if("409 Conflict".equals(e.getMessage())){
+ policyLogger.error(e.getMessage());
+ response.addHeader(error, e.getMessage());
+ }
+ }
+ if(exception != null && exception.getStatusCode()!=null){
+ String message;
+ if(exception.getStatusCode().equals(HttpStatus.UNAUTHORIZED)){
+ message = XACMLErrorConstants.ERROR_PERMISSIONS +":"+exception.getStatusCode()+":" + "ERROR_AUTH_GET_PERM" ;
+ policyLogger.error(message);
+ }else if(exception.getStatusCode().equals(HttpStatus.BAD_REQUEST)){
+ message = XACMLErrorConstants.ERROR_DATA_ISSUE + ":"+exception.getStatusCode()+":" + exception.getResponseBodyAsString();
+ policyLogger.error(message);
+ }else if(exception.getStatusCode().equals(HttpStatus.NOT_FOUND)){
+ message = XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error while connecting to " + papUrl + exception;
+ policyLogger.error(message);
+ }else{
+ message = XACMLErrorConstants.ERROR_PROCESS_FLOW + ":"+exception.getStatusCode()+":" + exception.getResponseBodyAsString();
+ policyLogger.error(message);
+ }
+ model.put(papUrl, message);
+ }else{
+ model.put(papUrl, "Success");
+ }
+ }
+ }
+ JsonMessage msg;
+ try {
+ msg = new JsonMessage(mapper.writeValueAsString(model));
+ JSONObject j = new JSONObject(msg);
+ response.getWriter().write(j.toString());
+ } catch (Exception e) {
+ policyLogger.error("Exception Occured"+e);
+ }
+ }
+ }
+
+ @RequestMapping(value="/updateConfiguration", method= RequestMethod.POST)
+ @ResponseBody
+ public void updateConfiguration(@RequestBody UpdateObjectData data, HttpServletResponse response){
+ String action = data.getAction();
+ String newPolicyName = data.getNewPolicyName();
+ String oldPolicyName = data.getOldPolicyName();
+ try{
+ if("rename".equals(action)){
+ if(oldPolicyName.contains(configType) || oldPolicyName.contains(actionType)){
+ File file;
+ if(oldPolicyName.contains(configType)){
+ file = new File(Policy.getConfigHome() + File.separator + oldPolicyName);
+ }else{
+ file = new File(Policy.getActionHome() + File.separator + oldPolicyName);
+ }
+ if(file.exists()){
+ File renamefile;
+ if(oldPolicyName.contains(configType)){
+ renamefile = new File(Policy.getConfigHome() + File.separator + newPolicyName);
+ }else{
+ renamefile = new File(Policy.getActionHome() + File.separator + newPolicyName);
+ }
+ if(file.renameTo(renamefile)){
+ policyLogger.info("Policy has been renamed Successfully"+newPolicyName);
+ response.addHeader("rename", "Success");
+ }else{
+ response.addHeader("rename", "Failure");
+ }
+ }
+ }
+ }else if("delete".equals(action)){
+ if(oldPolicyName.contains(configType)){
+ Files.deleteIfExists(Paths.get(Policy.getConfigHome() + File.separator + oldPolicyName));
+ }else if(oldPolicyName.contains("Action_")){
+ Files.deleteIfExists(Paths.get(Policy.getActionHome() + File.separator + oldPolicyName));
+ }
+ }else if("clonePolicy".equals(action) || "exportPolicy".equals(action)){
+ if(newPolicyName.contains(configType)){
+ ConfigurationDataEntity configEntiy = (ConfigurationDataEntity) commonClassDao.getEntityItem(ConfigurationDataEntity.class, "configurationName", newPolicyName);
+ saveConfigurationData(configEntiy, newPolicyName);
+ }else if(newPolicyName.contains(actionType)){
+ ActionBodyEntity actionEntiy = (ActionBodyEntity) commonClassDao.getEntityItem(ActionBodyEntity.class, "actionBodyName", newPolicyName);
+ saveActionBodyData(actionEntiy, newPolicyName);
+ }
+ }
+ } catch (IOException e) {
+ policyLogger.error("Exception Occured While updating Configuration"+e);
+ }
+ }
+
+ private void saveConfigurationData(ConfigurationDataEntity configEntiy, String newPolicyName){
+ try(FileWriter fw = new FileWriter(Policy.getConfigHome() + File.separator + newPolicyName)){
+ BufferedWriter bw = new BufferedWriter(fw);
+ bw.write(configEntiy.getConfigBody());
+ bw.close();
+ }catch (IOException e) {
+ policyLogger.error("Exception Occured While closing the File input stream"+e);
+ }
+ }
+
+ private void saveActionBodyData(ActionBodyEntity actionEntiy , String newPolicyName){
+ try(FileWriter fw = new FileWriter(Policy.getActionHome() + File.separator + newPolicyName)){
+ BufferedWriter bw = new BufferedWriter(fw);
+ bw.write(actionEntiy.getActionBody());
+ bw.close();
+ }catch (IOException e) {
+ policyLogger.error("Exception Occured While closing the File input stream"+e);
+ }
+ }
+} \ No newline at end of file
diff --git a/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/adapters/UpdateObjectData.java b/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/adapters/UpdateObjectData.java
new file mode 100644
index 000000000..04006f320
--- /dev/null
+++ b/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/adapters/UpdateObjectData.java
@@ -0,0 +1,50 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2018 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.pap.xacml.rest.adapters;
+
+public class UpdateObjectData {
+ private String oldPolicyName;
+ private String newPolicyName;
+ private String action;
+
+ public String getOldPolicyName() {
+ return oldPolicyName;
+ }
+
+ public void setOldPolicyName(String oldPolicyName) {
+ this.oldPolicyName = oldPolicyName;
+ }
+
+ public String getNewPolicyName() {
+ return newPolicyName;
+ }
+
+ public void setNewPolicyName(String newPolicyName) {
+ this.newPolicyName = newPolicyName;
+ }
+
+ public String getAction() {
+ return action;
+ }
+
+ public void setAction(String action) {
+ this.action = action;
+ }
+}
diff --git a/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/test/UpdateOthersPAPSTest.java b/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/test/UpdateOthersPAPSTest.java
new file mode 100644
index 000000000..f9ed0ac70
--- /dev/null
+++ b/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/test/UpdateOthersPAPSTest.java
@@ -0,0 +1,116 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2018 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.pap.test;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.json.JSONObject;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Matchers;
+import org.mockito.Mockito;
+import org.onap.policy.common.logging.flexlogger.FlexLogger;
+import org.onap.policy.common.logging.flexlogger.Logger;
+import org.onap.policy.pap.xacml.rest.UpdateOthersPAPS;
+import org.onap.policy.pap.xacml.rest.adapters.UpdateObjectData;
+import org.onap.policy.pap.xacml.rest.components.Policy;
+import org.onap.policy.rest.dao.CommonClassDao;
+import org.onap.policy.rest.jpa.PolicyDBDaoEntity;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.mock.web.MockHttpServletResponse;
+
+@RunWith(PowerMockRunner.class)
+public class UpdateOthersPAPSTest {
+
+ private static Logger logger = FlexLogger.getLogger(UpdateOthersPAPSTest.class);
+ private static CommonClassDao commonClassDao;
+ private HttpServletRequest request;
+ private MockHttpServletResponse response;
+
+ @Before
+ public void setUp() throws Exception {
+ logger.info("setUp: Entering");
+ commonClassDao = mock(CommonClassDao.class);
+
+ request = mock(HttpServletRequest.class);
+ response = new MockHttpServletResponse();
+ List<Object> data = new ArrayList<>();
+ PolicyDBDaoEntity entity = new PolicyDBDaoEntity();
+ entity.setPolicyDBDaoUrl("http://localhost:8070/pap");
+ entity.setUsername("test");
+ entity.setPassword("test");
+
+ PolicyDBDaoEntity entity1 = new PolicyDBDaoEntity();
+ entity1.setPolicyDBDaoUrl("http://localhost:8071/pap");
+ entity1.setUsername("test");
+ entity1.setPassword("test");
+
+ data.add(entity);
+ data.add(entity1);
+ System.setProperty("xacml.rest.pap.url","http://localhost:8070/pap");
+ when(commonClassDao.getData(PolicyDBDaoEntity.class)).thenReturn(data);
+ }
+
+ @Test
+ public void testNotifyOthersPAPsToUpdateConfigurations(){
+ UpdateOthersPAPS updateOtherPaps = new UpdateOthersPAPS();
+ UpdateOthersPAPS.setCommonClassDao(commonClassDao);
+ when(request.getParameter("action")).thenReturn("rename");
+ when(request.getParameter("newPolicyName")).thenReturn("com.Config_newTest.1.json");
+ when(request.getParameter("oldPolicyName")).thenReturn("com.Config_Test.1.json");
+ updateOtherPaps.notifyOthersPAPsToUpdateConfigurations(request, response);
+ try {
+ JSONObject responseString = new JSONObject(response.getContentAsString());
+ assertTrue(responseString.get("data").toString().contains("http://localhost:8071/pap"));
+ } catch (Exception e) {
+ fail();
+ }
+ }
+
+ @PrepareForTest({Policy.class})
+ @Test
+ public void testUpdateConfiguration() throws Exception{
+ UpdateOthersPAPS updateOtherPaps = new UpdateOthersPAPS();
+ UpdateObjectData data = new UpdateObjectData();
+ PowerMockito.mockStatic(Policy.class);
+ data.setNewPolicyName("com.Config_newTest.1.json");
+ data.setOldPolicyName("com.Config_Test.1.json");
+ data.setAction("rename");
+ when(Policy.getConfigHome()).thenReturn("test");
+ when(Policy.getActionHome()).thenReturn("test");
+ File mockedFile = Mockito.mock(File.class);
+ Mockito.when(mockedFile.exists()).thenReturn(true);
+ PowerMockito.whenNew(File.class).withParameterTypes(String.class).withArguments(Matchers.anyString()).thenReturn(mockedFile);
+ updateOtherPaps.updateConfiguration(data, response);
+ assertTrue(response.getStatus() == 200);
+ }
+}
diff --git a/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/adapters/UpdateObjectDataTest.java b/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/adapters/UpdateObjectDataTest.java
new file mode 100644
index 000000000..2c1bc1c53
--- /dev/null
+++ b/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/adapters/UpdateObjectDataTest.java
@@ -0,0 +1,39 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2018 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.pap.xacml.rest.adapters;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class UpdateObjectDataTest {
+
+ @Test
+ public void testClosedLoopFaultTrapDatas(){
+ UpdateObjectData updateObject = new UpdateObjectData();
+ updateObject.setAction("Rename");
+ assertTrue("Rename".equals(updateObject.getAction()));
+ updateObject.setNewPolicyName("com.Config_test1.1.json");
+ assertTrue("com.Config_test1.1.json".equals(updateObject.getNewPolicyName()));
+ updateObject.setOldPolicyName("com.Config_test.1.json");
+ assertTrue("com.Config_test.1.json".equals(updateObject.getOldPolicyName()));
+ }
+
+}