diff --git a/plugin/src/main/java/org/opensearch/ml/action/handler/MLSearchHandler.java b/plugin/src/main/java/org/opensearch/ml/action/handler/MLSearchHandler.java index 9873ee5fad..62da9fb773 100644 --- a/plugin/src/main/java/org/opensearch/ml/action/handler/MLSearchHandler.java +++ b/plugin/src/main/java/org/opensearch/ml/action/handler/MLSearchHandler.java @@ -155,7 +155,7 @@ public void search(SdkClient sdkClient, SearchRequest request, String tenantId, && hasModelGroupIndex) { // RSC fast-path: get accessible group IDs → gate models (IDs or missing) var rsc = ResourceSharingClientAccessor.getInstance().getResourceSharingClient(); - rsc.getAccessibleResourceIds(CommonValue.ML_MODEL_GROUP_INDEX, ActionListener.wrap(ids -> { + rsc.getAccessibleResourceIds(ML_MODEL_GROUP_RESOURCE_TYPE, ActionListener.wrap(ids -> { SearchSourceBuilder gated = Optional.ofNullable(request.source()).orElseGet(SearchSourceBuilder::new); gated.query(rewriteQueryBuilderRSC(gated.query(), ids)); // ids may be empty → "missing only" request.source(gated); diff --git a/plugin/src/main/java/org/opensearch/ml/action/model_group/SearchModelGroupTransportAction.java b/plugin/src/main/java/org/opensearch/ml/action/model_group/SearchModelGroupTransportAction.java index a9d31acf8c..1696f9fc4a 100644 --- a/plugin/src/main/java/org/opensearch/ml/action/model_group/SearchModelGroupTransportAction.java +++ b/plugin/src/main/java/org/opensearch/ml/action/model_group/SearchModelGroupTransportAction.java @@ -6,7 +6,6 @@ package org.opensearch.ml.action.model_group; import static org.opensearch.ml.action.handler.MLSearchHandler.wrapRestActionListener; -import static org.opensearch.ml.common.CommonValue.ML_MODEL_GROUP_INDEX; import static org.opensearch.ml.common.CommonValue.ML_MODEL_GROUP_RESOURCE_TYPE; import static org.opensearch.ml.helper.ModelAccessControlHelper.shouldUseResourceAuthz; import static org.opensearch.ml.utils.RestActionUtils.wrapListenerToHandleSearchIndexNotFound; @@ -116,7 +115,7 @@ private void addAccessibleModelGroupsFilterAndSearch( SearchSourceBuilder sourceBuilder = request.source() != null ? request.source() : new SearchSourceBuilder(); var rsc = ResourceSharingClientAccessor.getInstance().getResourceSharingClient(); // filter by accessible model-groups - rsc.getAccessibleResourceIds(ML_MODEL_GROUP_INDEX, ActionListener.wrap(ids -> { + rsc.getAccessibleResourceIds(ML_MODEL_GROUP_RESOURCE_TYPE, ActionListener.wrap(ids -> { sourceBuilder.query(modelAccessControlHelper.mergeWithAccessFilter(sourceBuilder.query(), ids)); request.source(sourceBuilder); search(tenantId, request, wrappedListener); diff --git a/plugin/src/main/java/org/opensearch/ml/helper/ModelAccessControlHelper.java b/plugin/src/main/java/org/opensearch/ml/helper/ModelAccessControlHelper.java index 91036e619d..5661c01fdc 100644 --- a/plugin/src/main/java/org/opensearch/ml/helper/ModelAccessControlHelper.java +++ b/plugin/src/main/java/org/opensearch/ml/helper/ModelAccessControlHelper.java @@ -100,7 +100,7 @@ public void validateModelGroupAccess(User user, String modelGroupId, String acti } if (shouldUseResourceAuthz(ML_MODEL_GROUP_RESOURCE_TYPE)) { var resourceSharingClient = ResourceSharingClientAccessor.getInstance().getResourceSharingClient(); - resourceSharingClient.verifyAccess(modelGroupId, ML_MODEL_GROUP_INDEX, action, ActionListener.wrap(isAuthorized -> { + resourceSharingClient.verifyAccess(modelGroupId, ML_MODEL_GROUP_RESOURCE_TYPE, action, ActionListener.wrap(isAuthorized -> { if (!isAuthorized) { listener .onFailure( @@ -175,7 +175,7 @@ public void validateModelGroupAccess( } if (shouldUseResourceAuthz(ML_MODEL_GROUP_RESOURCE_TYPE)) { var resourceSharingClient = ResourceSharingClientAccessor.getInstance().getResourceSharingClient(); - resourceSharingClient.verifyAccess(modelGroupId, ML_MODEL_GROUP_INDEX, action, ActionListener.wrap(isAuthorized -> { + resourceSharingClient.verifyAccess(modelGroupId, ML_MODEL_GROUP_RESOURCE_TYPE, action, ActionListener.wrap(isAuthorized -> { if (!isAuthorized) { listener .onFailure( diff --git a/plugin/src/main/java/org/opensearch/ml/resources/MLResourceSharingExtension.java b/plugin/src/main/java/org/opensearch/ml/resources/MLResourceSharingExtension.java index bb55f3fb21..731278f6e3 100644 --- a/plugin/src/main/java/org/opensearch/ml/resources/MLResourceSharingExtension.java +++ b/plugin/src/main/java/org/opensearch/ml/resources/MLResourceSharingExtension.java @@ -17,9 +17,22 @@ public class MLResourceSharingExtension implements ResourceSharingExtension { + private static final ResourceProvider MODEL_GROUP_PROVIDER = new ResourceProvider() { + + @Override + public String resourceType() { + return ML_MODEL_GROUP_RESOURCE_TYPE; + } + + @Override + public String resourceIndexName() { + return ML_MODEL_GROUP_INDEX; + } + }; + @Override public Set getResourceProviders() { - return Set.of(new ResourceProvider(ML_MODEL_GROUP_RESOURCE_TYPE, ML_MODEL_GROUP_INDEX)); + return Set.of(MODEL_GROUP_PROVIDER); } @Override diff --git a/plugin/src/test/java/org/opensearch/ml/action/model_group/SearchModelGroupTransportActionTests.java b/plugin/src/test/java/org/opensearch/ml/action/model_group/SearchModelGroupTransportActionTests.java index c5d3fa640c..3cbd56123f 100644 --- a/plugin/src/test/java/org/opensearch/ml/action/model_group/SearchModelGroupTransportActionTests.java +++ b/plugin/src/test/java/org/opensearch/ml/action/model_group/SearchModelGroupTransportActionTests.java @@ -12,6 +12,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.opensearch.ml.common.CommonValue.ML_MODEL_GROUP_RESOURCE_TYPE; import java.util.Collections; import java.util.Set; @@ -283,7 +284,7 @@ public void testResourceSharingEnabled_successPath_filtersByAccessibleIds_andCal searchModelGroupTransportAction.doExecute(null, req, actionListener); - verify(rsc).getAccessibleResourceIds(eq(CommonValue.ML_MODEL_GROUP_INDEX), rscListenerCaptor.capture()); + verify(rsc).getAccessibleResourceIds(eq(ML_MODEL_GROUP_RESOURCE_TYPE), rscListenerCaptor.capture()); rscListenerCaptor.getValue().onResponse(Set.of("idA", "idB")); future.complete(emptySearchDataObjectResponse()); @@ -317,7 +318,7 @@ public void testResourceSharingEnabled_failSafePath_usesEmptySet_andCallsSdkClie searchModelGroupTransportAction.doExecute(null, req, actionListener); // Simulate failure -> deny-all (empty set) - verify(rsc).getAccessibleResourceIds(eq(CommonValue.ML_MODEL_GROUP_INDEX), rscListenerCaptor.capture()); + verify(rsc).getAccessibleResourceIds(eq(ML_MODEL_GROUP_RESOURCE_TYPE), rscListenerCaptor.capture()); rscListenerCaptor.getValue().onFailure(new RuntimeException("boom")); future.complete(emptySearchDataObjectResponse()); diff --git a/plugin/src/test/java/org/opensearch/ml/action/models/SearchModelTransportActionTests.java b/plugin/src/test/java/org/opensearch/ml/action/models/SearchModelTransportActionTests.java index 036601395a..21f57f236d 100644 --- a/plugin/src/test/java/org/opensearch/ml/action/models/SearchModelTransportActionTests.java +++ b/plugin/src/test/java/org/opensearch/ml/action/models/SearchModelTransportActionTests.java @@ -370,7 +370,7 @@ public void test_RSC_featureEnabled_typeEnabled_callsGetAccessibleIds() throws E // Simulate async success with some accessible IDs l.onResponse(Set.of("model_group_IT")); return null; - }).when(rsc).getAccessibleResourceIds(eq(CommonValue.ML_MODEL_GROUP_INDEX), rscListenerCaptor.capture()); + }).when(rsc).getAccessibleResourceIds(eq(CommonValue.ML_MODEL_GROUP_RESOURCE_TYPE), rscListenerCaptor.capture()); // The final remote search goes through client.search(...); return a normal response doAnswer(inv -> { @@ -385,7 +385,7 @@ public void test_RSC_featureEnabled_typeEnabled_callsGetAccessibleIds() throws E searchModelTransportAction.doExecute(null, mlSearchActionRequest, actionListener); // Verify RSC path was taken - verify(rsc, times(1)).getAccessibleResourceIds(eq(CommonValue.ML_MODEL_GROUP_INDEX), any()); + verify(rsc, times(1)).getAccessibleResourceIds(eq(CommonValue.ML_MODEL_GROUP_RESOURCE_TYPE), any()); // Verify we executed the final search and returned verify(client, times(1)).search(any(), any()); diff --git a/plugin/src/test/java/org/opensearch/ml/resources/MLResourceSharingExtensionTests.java b/plugin/src/test/java/org/opensearch/ml/resources/MLResourceSharingExtensionTests.java index fc0ca4fbe2..5f9a677a4f 100644 --- a/plugin/src/test/java/org/opensearch/ml/resources/MLResourceSharingExtensionTests.java +++ b/plugin/src/test/java/org/opensearch/ml/resources/MLResourceSharingExtensionTests.java @@ -67,7 +67,17 @@ public void testGetResourceProviders_returnsUnmodifiableSet() { Set providers = ext.getResourceProviders(); // Attempt to modify — Set.of(...) should be unmodifiable and throw - providers.add(new ResourceProvider("some.Type", "some-index")); + providers.add(new ResourceProvider() { + @Override + public String resourceType() { + return "exampleType"; + } + + @Override + public String resourceIndexName() { + return "some-index"; + } + }); } @Test