diff options
Diffstat (limited to 'ONAP-PAP-REST/src')
4 files changed, 445 insertions, 0 deletions
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())); + } + +} |