From d15791ba82da3c6ebbf43556be61f7efda031622 Mon Sep 17 00:00:00 2001 From: Anshul Singh Date: Wed, 9 Oct 2024 13:52:02 +0530 Subject: [PATCH] [server] Add recommend API to datasource resource (#1585) * [server] Add recommend API to datasource resource * Address feedback * Add final --------- Co-authored-by: Anshul Singh --- .../thirdeye/auth/AuthorizationManager.java | 4 ++++ .../thirdeye/resources/DataSourceResource.java | 9 +++++++++ .../thirdeye/service/DataSourceService.java | 14 ++++++++++++++ .../thirdeye/resources/DataSourceResourceTest.java | 8 ++++++++ 4 files changed, 35 insertions(+) diff --git a/thirdeye-server/src/main/java/ai/startree/thirdeye/auth/AuthorizationManager.java b/thirdeye-server/src/main/java/ai/startree/thirdeye/auth/AuthorizationManager.java index 6fe5eef88e..26a9162290 100644 --- a/thirdeye-server/src/main/java/ai/startree/thirdeye/auth/AuthorizationManager.java +++ b/thirdeye-server/src/main/java/ai/startree/thirdeye/auth/AuthorizationManager.java @@ -207,6 +207,10 @@ public void ensureCanDelete(final ThirdEyePrincipal prin relatedId -> ensureCanAccess(principal, relatedId, AccessType.READ)); } + public DataSourceApi generateDatasourceConnection(final ThirdEyePrincipal principal) { + return thirdEyeAuthorizer.generateDatasourceConnection(principal); + } + private void ensureCanAccess(final ThirdEyePrincipal principal, final ResourceIdentifier identifier, final AccessType accessType) { if (!canAccess(principal, identifier, accessType)) { diff --git a/thirdeye-server/src/main/java/ai/startree/thirdeye/resources/DataSourceResource.java b/thirdeye-server/src/main/java/ai/startree/thirdeye/resources/DataSourceResource.java index 69d7a602c0..8a09a83bd8 100644 --- a/thirdeye-server/src/main/java/ai/startree/thirdeye/resources/DataSourceResource.java +++ b/thirdeye-server/src/main/java/ai/startree/thirdeye/resources/DataSourceResource.java @@ -133,6 +133,15 @@ public Response onboardAll( return respondOk(onboarded); } + @POST + @Path("recommend") + @Timed(percentiles = {0.5, 0.75, 0.90, 0.95, 0.98, 0.99, 0.999}) + @Produces(MediaType.APPLICATION_JSON) + public Response recommendConfiguration( + @Parameter(hidden = true) @Auth ThirdEyeServerPrincipal principal) { + return respondOk(dataSourceService.recommend(principal)); + } + @DELETE @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Path("offboard-all") diff --git a/thirdeye-server/src/main/java/ai/startree/thirdeye/service/DataSourceService.java b/thirdeye-server/src/main/java/ai/startree/thirdeye/service/DataSourceService.java index 2d1441775c..aa50257655 100644 --- a/thirdeye-server/src/main/java/ai/startree/thirdeye/service/DataSourceService.java +++ b/thirdeye-server/src/main/java/ai/startree/thirdeye/service/DataSourceService.java @@ -33,6 +33,7 @@ import ai.startree.thirdeye.spi.datalayer.bao.DataSourceManager; import ai.startree.thirdeye.spi.datalayer.bao.DatasetConfigManager; import ai.startree.thirdeye.spi.datalayer.dto.AbstractDTO; +import ai.startree.thirdeye.spi.datalayer.dto.AuthorizationConfigurationDTO; import ai.startree.thirdeye.spi.datalayer.dto.DataSourceDTO; import ai.startree.thirdeye.spi.datalayer.dto.DatasetConfigDTO; import ai.startree.thirdeye.spi.datasource.ThirdEyeDataSource; @@ -49,6 +50,7 @@ public class DataSourceService extends CrudService private final DataSourceCache dataSourceCache; private final DataSourceOnboarder dataSourceOnboarder; private final DatasetConfigManager datasetConfigDAO; + private final AuthorizationManager authorizationManager; @Inject public DataSourceService( @@ -61,6 +63,7 @@ public DataSourceService( this.dataSourceCache = dataSourceCache; this.dataSourceOnboarder = dataSourceOnboarder; this.datasetConfigDAO = datasetConfigDAO; + this.authorizationManager = authorizationManager; } @Override @@ -175,4 +178,15 @@ public boolean validate(final ThirdEyePrincipal principal, final long id) { authorizationManager.ensureCanRead(principal, dataSourceDto); return dataSourceCache.getDataSource(dataSourceDto).validate(); } + + public DataSourceApi recommend(final ThirdEyePrincipal principal) { + final String namespace = authorizationManager.currentNamespace(principal); + + // verify that user has read access to data sources in given namespace + final DataSourceDTO sampleDataset = new DataSourceDTO(); + sampleDataset.setAuth(new AuthorizationConfigurationDTO().setNamespace(namespace)); + authorizationManager.ensureCanRead(principal, sampleDataset); + + return authorizationManager.generateDatasourceConnection(principal); + } } diff --git a/thirdeye-server/src/test/java/ai/startree/thirdeye/resources/DataSourceResourceTest.java b/thirdeye-server/src/test/java/ai/startree/thirdeye/resources/DataSourceResourceTest.java index a2249f3216..e560405ca8 100644 --- a/thirdeye-server/src/test/java/ai/startree/thirdeye/resources/DataSourceResourceTest.java +++ b/thirdeye-server/src/test/java/ai/startree/thirdeye/resources/DataSourceResourceTest.java @@ -25,6 +25,7 @@ import ai.startree.thirdeye.datasource.cache.DataSourceCache; import ai.startree.thirdeye.service.DataSourceService; import ai.startree.thirdeye.spi.ThirdEyeStatus; +import ai.startree.thirdeye.spi.api.DataSourceApi; import ai.startree.thirdeye.spi.api.StatusApi; import ai.startree.thirdeye.spi.api.StatusListApi; import ai.startree.thirdeye.spi.auth.AuthenticationType; @@ -107,4 +108,11 @@ public void testValidateFailure() { final StatusApi statusApi = entity.getList().get(0); assertThat(statusApi.getCode()).isEqualTo(ThirdEyeStatus.ERR_DATASOURCE_VALIDATION_FAILED); } + + @Test + public void testRecommend() { + final Response response = dataSourceResource.recommendConfiguration(principal); + assertThat(response.getStatus()).isEqualTo(200); + assertThat((DataSourceApi) response.getEntity()).isNull(); + } }