From e8f153d5a7f94fab85f8bab5d3c7aa3d42ad1bf6 Mon Sep 17 00:00:00 2001 From: mishprs <134436274+mishprs@users.noreply.github.com> Date: Wed, 30 Aug 2023 15:32:13 -0700 Subject: [PATCH] Catching AccessDeniedException for Personalize calls (#196) * Catching AccessDeniedException for Personalize calls Signed-off-by: Prashant Mishra * Using status code in place of status message * Using generic error message in place of custom error message --------- Signed-off-by: Prashant Mishra --- .../impl/AmazonPersonalizedRankerImpl.java | 13 ++++++- .../utils/ValidationUtil.java | 7 ++++ .../AmazonPersonalizeRankerImplTests.java | 37 +++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/amazon-personalize-ranking/src/main/java/org/opensearch/search/relevance/transformer/personalizeintelligentranking/reranker/impl/AmazonPersonalizedRankerImpl.java b/amazon-personalize-ranking/src/main/java/org/opensearch/search/relevance/transformer/personalizeintelligentranking/reranker/impl/AmazonPersonalizedRankerImpl.java index cb8cac1..142dceb 100644 --- a/amazon-personalize-ranking/src/main/java/org/opensearch/search/relevance/transformer/personalizeintelligentranking/reranker/impl/AmazonPersonalizedRankerImpl.java +++ b/amazon-personalize-ranking/src/main/java/org/opensearch/search/relevance/transformer/personalizeintelligentranking/reranker/impl/AmazonPersonalizedRankerImpl.java @@ -7,6 +7,7 @@ */ package org.opensearch.search.relevance.transformer.personalizeintelligentranking.reranker.impl; +import com.amazonaws.AmazonServiceException; import com.amazonaws.services.personalizeruntime.model.GetPersonalizedRankingRequest; import com.amazonaws.services.personalizeruntime.model.GetPersonalizedRankingResult; import com.amazonaws.services.personalizeruntime.model.PredictedItem; @@ -20,6 +21,7 @@ import org.opensearch.search.relevance.transformer.personalizeintelligentranking.configuration.PersonalizeIntelligentRankerConfiguration; import org.opensearch.search.relevance.transformer.personalizeintelligentranking.requestparameter.PersonalizeRequestParameters; import org.opensearch.search.relevance.transformer.personalizeintelligentranking.reranker.PersonalizedRanker; +import org.opensearch.search.relevance.transformer.personalizeintelligentranking.utils.ValidationUtil; import java.util.ArrayList; import java.util.Arrays; @@ -36,6 +38,7 @@ public class AmazonPersonalizedRankerImpl implements PersonalizedRanker { private static final Logger logger = LogManager.getLogger(AmazonPersonalizedRankerImpl.class); private final PersonalizeIntelligentRankerConfiguration rankerConfig; private final PersonalizeClient personalizeClient; + public AmazonPersonalizedRankerImpl(PersonalizeIntelligentRankerConfiguration config, PersonalizeClient client) { this.rankerConfig = config; @@ -96,7 +99,15 @@ public SearchHits rerank(SearchHits hits, PersonalizeRequestParameters requestPa SearchHits personalizedHits = combineScores(hits, result); return personalizedHits; - } catch (Exception ex) { + } catch (AmazonServiceException e) { + logger.error("Exception while calling personalize campaign: {}", e.getMessage()); + int statusCode = e.getStatusCode(); + if (ValidationUtil.is4xxError(statusCode)) { + throw new IllegalArgumentException(e); + } + throw e; + } + catch (Exception ex) { logger.error("Failed to re rank with Personalize.", ex); throw ex; } diff --git a/amazon-personalize-ranking/src/main/java/org/opensearch/search/relevance/transformer/personalizeintelligentranking/utils/ValidationUtil.java b/amazon-personalize-ranking/src/main/java/org/opensearch/search/relevance/transformer/personalizeintelligentranking/utils/ValidationUtil.java index c318d46..d92a974 100644 --- a/amazon-personalize-ranking/src/main/java/org/opensearch/search/relevance/transformer/personalizeintelligentranking/utils/ValidationUtil.java +++ b/amazon-personalize-ranking/src/main/java/org/opensearch/search/relevance/transformer/personalizeintelligentranking/utils/ValidationUtil.java @@ -57,4 +57,11 @@ private static boolean isValidCampaignOrRoleArn(String arn, String expectedServi return false; } } + + public static boolean is4xxError(int statusCode){ + if (statusCode >= 400 && statusCode < 500) { + return true; + } + return false; + } } diff --git a/amazon-personalize-ranking/src/test/java/org/opensearch/search/relevance/transformer/personalizeintelligentranking/ranker/impl/AmazonPersonalizeRankerImplTests.java b/amazon-personalize-ranking/src/test/java/org/opensearch/search/relevance/transformer/personalizeintelligentranking/ranker/impl/AmazonPersonalizeRankerImplTests.java index 32b4a61..1eec5cc 100644 --- a/amazon-personalize-ranking/src/test/java/org/opensearch/search/relevance/transformer/personalizeintelligentranking/ranker/impl/AmazonPersonalizeRankerImplTests.java +++ b/amazon-personalize-ranking/src/test/java/org/opensearch/search/relevance/transformer/personalizeintelligentranking/ranker/impl/AmazonPersonalizeRankerImplTests.java @@ -8,6 +8,8 @@ package org.opensearch.search.relevance.transformer.personalizeintelligentranking.ranker.impl; +import com.amazonaws.AmazonServiceException; +import org.junit.Assert; import org.mockito.Mockito; import org.opensearch.OpenSearchParseException; import org.opensearch.search.SearchHit; @@ -303,4 +305,39 @@ public void testReRankWithWeightAsNeitherZeroOrOneWithNullItemIdField() throws I assertNotEquals(rerankedDocumentIdsWhenWeightIsOne, rerankedDocumentIds); assertNotEquals(rerankedDocumentIdsWhenWeightIsZero, rerankedDocumentIds); } + + public void testReRankWithaccessDeniedExceptionWithStatusCode400() throws IOException { + + PersonalizeIntelligentRankerConfiguration rankerConfig = + new PersonalizeIntelligentRankerConfiguration(personalizeCampaign, iamRoleArn, recipe, itemIdField, region, weight); + PersonalizeClient client = Mockito.mock(PersonalizeClient.class); + Mockito.when(client.getPersonalizedRanking(any())).thenThrow(buildErrorWithStatusCode(400)); + + PersonalizeRequestParameters requestParameters = new PersonalizeRequestParameters(); + requestParameters.setUserId("28"); + SearchHits responseHits = SearchTestUtil.getSampleSearchHitsForPersonalize(numOfHits); + AmazonPersonalizedRankerImpl ranker = new AmazonPersonalizedRankerImpl(rankerConfig, client); + Assert.assertThrows(IllegalArgumentException.class, () -> ranker.rerank(responseHits, requestParameters)); + } + + public void testReRankWithaccessDeniedExceptionWithStatusCode500() throws IOException { + + PersonalizeIntelligentRankerConfiguration rankerConfig = + new PersonalizeIntelligentRankerConfiguration(personalizeCampaign, iamRoleArn, recipe, itemIdField, region, weight); + PersonalizeClient client = Mockito.mock(PersonalizeClient.class); + Mockito.when(client.getPersonalizedRanking(any())).thenThrow(buildErrorWithStatusCode(500)); + + PersonalizeRequestParameters requestParameters = new PersonalizeRequestParameters(); + requestParameters.setUserId("28"); + SearchHits responseHits = SearchTestUtil.getSampleSearchHitsForPersonalize(numOfHits); + AmazonPersonalizedRankerImpl ranker = new AmazonPersonalizedRankerImpl(rankerConfig, client); + Assert.assertThrows(AmazonServiceException.class, () -> ranker.rerank(responseHits, requestParameters)); + } + + + private AmazonServiceException buildErrorWithStatusCode(int statusCode) { + AmazonServiceException amazonServiceException = new AmazonServiceException("Error"); + amazonServiceException.setStatusCode(statusCode); + return amazonServiceException; + } }