From 2924fa7d806435a3bf9f2cb5abcdb01aa7295b00 Mon Sep 17 00:00:00 2001 From: Pamela Dragosh Date: Wed, 11 Mar 2020 14:06:42 -0400 Subject: Better error handling for decisions Throw exceptions when requests cannot be created and return error information back. Consolidated some code to avoid sonar duplication issues. Companion review to https://gerrit.onap.org/r/c/policy/models/+/103548 Issue-ID: POLICY-2242 Change-Id: Ic873af933dab82e3aeef6335f55939666be20385 Signed-off-by: Pamela Dragosh --- .../application/common/ToscaPolicyTranslator.java | 4 ++-- .../application/common/std/StdBaseTranslator.java | 7 ++++--- .../std/StdCombinedPolicyResultsTranslator.java | 8 ++------ .../common/std/StdMatchableTranslator.java | 8 ++------ .../std/StdXacmlApplicationServiceProvider.java | 11 ++++++++++- .../pdp/xacml/application/common/TestUtilsCommon.java | 6 ++++-- .../application/common/std/StdBaseTranslatorTest.java | 19 ++++++++----------- .../std/StdCombinedPolicyResultsTranslatorTest.java | 4 ++-- .../common/std/StdMatchableTranslatorTest.java | 2 +- .../std/StdXacmlApplicationServiceProviderTest.java | 4 ++-- 10 files changed, 37 insertions(+), 36 deletions(-) (limited to 'applications/common/src') diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/ToscaPolicyTranslator.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/ToscaPolicyTranslator.java index 47ff70f6..32b950b4 100644 --- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/ToscaPolicyTranslator.java +++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/ToscaPolicyTranslator.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2019-2020 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. @@ -49,7 +49,7 @@ public interface ToscaPolicyTranslator { * @param request Incoming DecisionRequest * @return Xacml Request object */ - Request convertRequest(DecisionRequest request); + Request convertRequest(DecisionRequest request) throws ToscaPolicyConversionException; /** * Implement this method to convert a Xacml Response diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdBaseTranslator.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdBaseTranslator.java index 34936b06..3ac57b7b 100644 --- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdBaseTranslator.java +++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdBaseTranslator.java @@ -69,7 +69,7 @@ public abstract class StdBaseTranslator implements ToscaPolicyTranslator { } @Override - public Request convertRequest(DecisionRequest request) { + public Request convertRequest(DecisionRequest request) throws ToscaPolicyConversionException { return null; } @@ -99,9 +99,10 @@ public abstract class StdBaseTranslator implements ToscaPolicyTranslator { scanAdvice(xacmlResult.getAssociatedAdvice(), decisionResponse); } else { // - // TODO we have to return an ErrorResponse object instead + // Return error information back // - decisionResponse.setStatus("A better error message"); + decisionResponse.setStatus("error"); + decisionResponse.setMessage(xacmlResult.getStatus().getStatusMessage()); } } diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdCombinedPolicyResultsTranslator.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdCombinedPolicyResultsTranslator.java index aba5e252..d9661829 100644 --- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdCombinedPolicyResultsTranslator.java +++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdCombinedPolicyResultsTranslator.java @@ -127,17 +127,13 @@ public class StdCombinedPolicyResultsTranslator extends StdBaseTranslator { } @Override - public Request convertRequest(DecisionRequest request) { + public Request convertRequest(DecisionRequest request) throws ToscaPolicyConversionException { LOGGER.info("Converting Request {}", request); try { return RequestParser.parseRequest(StdCombinedPolicyRequest.createInstance(request)); } catch (IllegalArgumentException | IllegalAccessException | DataTypeException e) { - LOGGER.error("Failed to convert DecisionRequest", e); + throw new ToscaPolicyConversionException("Failed to parse request", e); } - // - // TODO throw exception - // - return null; } /** diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslator.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslator.java index d5e2a395..7ca995e0 100644 --- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslator.java +++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslator.java @@ -100,17 +100,13 @@ public class StdMatchableTranslator extends StdBaseTranslator { } @Override - public Request convertRequest(DecisionRequest request) { + public Request convertRequest(DecisionRequest request) throws ToscaPolicyConversionException { LOGGER.info("Converting Request {}", request); try { return StdMatchablePolicyRequest.createInstance(request); } catch (XacmlApplicationException e) { - LOGGER.error("Failed to convert DecisionRequest", e); + throw new ToscaPolicyConversionException("Failed to convert DecisionRequest", e); } - // - // TODO throw exception - // - return null; } /** diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProvider.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProvider.java index 11271651..0fdd3a96 100644 --- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProvider.java +++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProvider.java @@ -232,7 +232,16 @@ public abstract class StdXacmlApplicationServiceProvider implements XacmlApplica // // Convert to a XacmlRequest // - Request xacmlRequest = this.getTranslator().convertRequest(request); + Request xacmlRequest; + try { + xacmlRequest = this.getTranslator().convertRequest(request); + } catch (ToscaPolicyConversionException e) { + LOGGER.error("Failed to convert request", e); + DecisionResponse response = new DecisionResponse(); + response.setStatus("error"); + response.setMessage(e.getLocalizedMessage()); + return Pair.of(response, null); + } // // Now get a decision // diff --git a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/TestUtilsCommon.java b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/TestUtilsCommon.java index ab5dde27..026bea9e 100644 --- a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/TestUtilsCommon.java +++ b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/TestUtilsCommon.java @@ -112,9 +112,11 @@ public class TestUtilsCommon { * @param policyIds Collection of IdReference objects * @return Response object */ - public static Response createXacmlResponse(StatusCode code, Decision decision, Collection obligations, + public static Response createXacmlResponse(StatusCode code, String message, Decision decision, + Collection obligations, Collection policyIds) { - StdStatus status = new StdStatus(code); + + StdStatus status = new StdStatus(code, message); StdMutableResult result = new StdMutableResult(decision, status); result.addObligations(obligations); diff --git a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdBaseTranslatorTest.java b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdBaseTranslatorTest.java index 8039a9cf..8e692583 100644 --- a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdBaseTranslatorTest.java +++ b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdBaseTranslatorTest.java @@ -120,7 +120,7 @@ public class StdBaseTranslatorTest { } @Test - public void test() throws ParseException { + public void testTranslatorNormalFlow() throws Exception { StdBaseTranslator translator = new MyStdBaseTranslator(); assertNotNull(translator); assertThatThrownBy(() -> translator.convertPolicy(null)).isInstanceOf(ToscaPolicyConversionException.class); @@ -176,7 +176,7 @@ public class StdBaseTranslatorTest { ids.put("onap.policies.Test", "1.0.0"); Collection policyIds = TestUtilsCommon.createPolicyIdList(ids); - Response xacmlResponse = TestUtilsCommon.createXacmlResponse(StdStatusCode.STATUS_CODE_OK, + Response xacmlResponse = TestUtilsCommon.createXacmlResponse(StdStatusCode.STATUS_CODE_OK, null, Decision.PERMIT, Arrays.asList(obligation), policyIds); DecisionResponse decision = translator.convertResponse(xacmlResponse); @@ -210,7 +210,7 @@ public class StdBaseTranslatorTest { ids.put("onap.policies.Test", "1.0.0"); Collection policyIds = TestUtilsCommon.createPolicyIdList(ids); - Response xacmlResponse = TestUtilsCommon.createXacmlResponse(StdStatusCode.STATUS_CODE_OK, + Response xacmlResponse = TestUtilsCommon.createXacmlResponse(StdStatusCode.STATUS_CODE_OK, null, Decision.PERMIT, Arrays.asList(obligation), policyIds); DecisionResponse decision = translator.convertResponse(xacmlResponse); @@ -220,28 +220,25 @@ public class StdBaseTranslatorTest { assertThat(decision.getPolicies()).isNotNull(); assertThat(decision.getPolicies().size()).isEqualTo(0); - // - // This will need more work when I fix - // the convertResponse - // - Obligation badObligation = TestUtilsCommon.createXacmlObligation( ToscaDictionary.ID_OBLIGATION_REST_BODY.stringValue(), Arrays.asList(assignmentBadPolicy, assignmentUnknown)); - xacmlResponse = TestUtilsCommon.createXacmlResponse(StdStatusCode.STATUS_CODE_MISSING_ATTRIBUTE, + xacmlResponse = TestUtilsCommon.createXacmlResponse(StdStatusCode.STATUS_CODE_MISSING_ATTRIBUTE, null, Decision.PERMIT, Arrays.asList(badObligation), policyIds); decision = translator.convertResponse(xacmlResponse); assertNotNull(decision); - xacmlResponse = TestUtilsCommon.createXacmlResponse(StdStatusCode.STATUS_CODE_OK, - Decision.DENY, Arrays.asList(badObligation), policyIds); + xacmlResponse = TestUtilsCommon.createXacmlResponse(StdStatusCode.STATUS_CODE_PROCESSING_ERROR, + "Bad obligation", Decision.DENY, Arrays.asList(badObligation), policyIds); decision = translator.convertResponse(xacmlResponse); assertNotNull(decision); + assertThat(decision.getStatus()).isEqualTo("error"); + assertThat(decision.getMessage()).isEqualTo("Bad obligation"); } private class MyStdBaseTranslator extends StdBaseTranslator { diff --git a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdCombinedPolicyResultsTranslatorTest.java b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdCombinedPolicyResultsTranslatorTest.java index 6ff7a7f1..42c13d9e 100644 --- a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdCombinedPolicyResultsTranslatorTest.java +++ b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdCombinedPolicyResultsTranslatorTest.java @@ -108,7 +108,7 @@ public class StdCombinedPolicyResultsTranslatorTest { ids.put("onap.policies.Test", "1.0.0"); Collection policyIds = TestUtilsCommon.createPolicyIdList(ids); - Response xacmlResponse = TestUtilsCommon.createXacmlResponse(StdStatusCode.STATUS_CODE_OK, + Response xacmlResponse = TestUtilsCommon.createXacmlResponse(StdStatusCode.STATUS_CODE_OK, null, Decision.PERMIT, Arrays.asList(obligation), policyIds); DecisionResponse decision = translator.convertResponse(xacmlResponse); @@ -148,7 +148,7 @@ public class StdCombinedPolicyResultsTranslatorTest { } @Test - public void testDecision() { + public void testDecision() throws ToscaPolicyConversionException { StdCombinedPolicyResultsTranslator translator = new StdCombinedPolicyResultsTranslator(); DecisionRequest decision = new DecisionRequest(); diff --git a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslatorTest.java b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslatorTest.java index aeb4cf88..e191a08a 100644 --- a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslatorTest.java +++ b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslatorTest.java @@ -237,7 +237,7 @@ public class StdMatchableTranslatorTest { Collection policyIds = TestUtilsCommon.createPolicyIdList(ids); com.att.research.xacml.api.Response xacmlResponse = TestUtilsCommon.createXacmlResponse( - StdStatusCode.STATUS_CODE_OK, Decision.PERMIT, + StdStatusCode.STATUS_CODE_OK, null, Decision.PERMIT, Arrays.asList(obligation1, obligation2, obligation3), policyIds); // // Test the response diff --git a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProviderTest.java b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProviderTest.java index e7ea049a..c95d3ca5 100644 --- a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProviderTest.java +++ b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProviderTest.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2019-2020 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. @@ -255,7 +255,7 @@ public class StdXacmlApplicationServiceProviderTest { } @Test - public void testMakeDecision() { + public void testMakeDecision() throws ToscaPolicyConversionException { prov.createEngine(null); DecisionRequest decreq = mock(DecisionRequest.class); -- cgit 1.2.3-korg