Skip to content

Commit 8611f25

Browse files
Adapts changes to make ResourceExtension consumed via @Inject
Signed-off-by: Darshit Chanpura <dchanp@amazon.com>
1 parent bc1046c commit 8611f25

File tree

11 files changed

+71
-101
lines changed

11 files changed

+71
-101
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ buildscript {
1111
ext {
1212
opensearch_group = "org.opensearch"
1313
isSnapshot = "true" == System.getProperty("build.snapshot", "true")
14-
opensearch_version = System.getProperty("opensearch.version", "3.2.0-SNAPSHOT")
14+
opensearch_version = System.getProperty("opensearch.version", "3.3.0-SNAPSHOT")
1515
buildVersionQualifier = System.getProperty("build.version_qualifier", "")
1616
asm_version = "9.7"
1717

common/src/main/java/org/opensearch/ml/common/ResourceSharingClientAccessor.java

Lines changed: 0 additions & 42 deletions
This file was deleted.

plugin/src/main/java/org/opensearch/ml/action/handler/MLSearchHandler.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.opensearch.action.search.SearchResponse;
2323
import org.opensearch.cluster.service.ClusterService;
2424
import org.opensearch.common.Nullable;
25+
import org.opensearch.common.inject.Inject;
2526
import org.opensearch.common.util.concurrent.ThreadContext;
2627
import org.opensearch.commons.authuser.User;
2728
import org.opensearch.core.action.ActionListener;
@@ -38,13 +39,13 @@
3839
import org.opensearch.ml.common.CommonValue;
3940
import org.opensearch.ml.common.MLModel;
4041
import org.opensearch.ml.common.MLModelGroup;
41-
import org.opensearch.ml.common.ResourceSharingClientAccessor;
4242
import org.opensearch.ml.common.connector.HttpConnector;
4343
import org.opensearch.ml.common.exception.MLException;
4444
import org.opensearch.ml.common.exception.MLResourceNotFoundException;
4545
import org.opensearch.ml.common.settings.MLFeatureEnabledSetting;
4646
import org.opensearch.ml.engine.indices.MLIndicesHandler;
4747
import org.opensearch.ml.helper.ModelAccessControlHelper;
48+
import org.opensearch.ml.resources.MLResourceSharingExtension;
4849
import org.opensearch.ml.utils.RestActionUtils;
4950
import org.opensearch.remote.metadata.client.SdkClient;
5051
import org.opensearch.remote.metadata.client.SearchDataObjectRequest;
@@ -71,6 +72,9 @@ public class MLSearchHandler {
7172
private ClusterService clusterService;
7273
private MLFeatureEnabledSetting mlFeatureEnabledSetting;
7374

75+
@Inject(optional = true)
76+
public MLResourceSharingExtension mlResourceSharingExtension;
77+
7478
public MLSearchHandler(
7579
Client client,
7680
NamedXContentRegistry xContentRegistry,
@@ -87,7 +91,8 @@ public MLSearchHandler(
8791

8892
/**
8993
* Fetch all the models from the model group index, and then create a combined query to model version index.
90-
* @param sdkClient sdkclient a wrapper of the client
94+
*
95+
* @param sdkClient sdkclient a wrapper of the client
9196
* @param request
9297
* @param actionListener
9398
*/
@@ -145,7 +150,7 @@ public void search(SdkClient sdkClient, SearchRequest request, String tenantId,
145150
mlFeatureEnabledSetting.isMultiTenancyEnabled(),
146151
CommonValue.ML_MODEL_GROUP_INDEX
147152
);
148-
boolean rsClientPresent = ResourceSharingClientAccessor.getInstance().getResourceSharingClient() != null;
153+
boolean rsClientPresent = mlResourceSharingExtension != null && mlResourceSharingExtension.getResourceSharingClient() != null;
149154

150155
if (skip || !hasIndex) {
151156
// No gating at all

plugin/src/main/java/org/opensearch/ml/action/model_group/DeleteModelGroupTransportAction.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@
2727
import org.opensearch.index.IndexNotFoundException;
2828
import org.opensearch.index.query.BoolQueryBuilder;
2929
import org.opensearch.index.query.TermQueryBuilder;
30-
import org.opensearch.ml.common.ResourceSharingClientAccessor;
3130
import org.opensearch.ml.common.exception.MLValidationException;
3231
import org.opensearch.ml.common.settings.MLFeatureEnabledSetting;
3332
import org.opensearch.ml.common.transport.model_group.MLModelGroupDeleteAction;
3433
import org.opensearch.ml.common.transport.model_group.MLModelGroupDeleteRequest;
3534
import org.opensearch.ml.helper.ModelAccessControlHelper;
35+
import org.opensearch.ml.resources.MLResourceSharingExtension;
3636
import org.opensearch.ml.utils.RestActionUtils;
3737
import org.opensearch.ml.utils.TenantAwareHelper;
3838
import org.opensearch.remote.metadata.client.DeleteDataObjectRequest;
@@ -62,6 +62,9 @@ public class DeleteModelGroupTransportAction extends HandledTransportAction<Acti
6262
final ModelAccessControlHelper modelAccessControlHelper;
6363
private final MLFeatureEnabledSetting mlFeatureEnabledSetting;
6464

65+
@Inject(optional = true)
66+
public MLResourceSharingExtension mlResourceSharingExtension;
67+
6568
@Inject
6669
public DeleteModelGroupTransportAction(
6770
TransportService transportService,
@@ -96,7 +99,7 @@ protected void doExecute(Task task, ActionRequest request, ActionListener<Delete
9699
ActionListener<DeleteResponse> wrappedListener = ActionListener.runBefore(actionListener, context::restore);
97100

98101
// if resource sharing feature is enabled, access will be automatically checked by security plugin, so no need to check again
99-
if (ResourceSharingClientAccessor.getInstance().getResourceSharingClient() != null) {
102+
if (mlResourceSharingExtension != null && mlResourceSharingExtension.getResourceSharingClient() != null) {
100103
checkForAssociatedModels(modelGroupId, tenantId, wrappedListener);
101104
} else {
102105
validateAndDeleteModelGroup(modelGroupId, tenantId, wrappedListener);

plugin/src/main/java/org/opensearch/ml/action/model_group/GetModelGroupTransportAction.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@
2727
import org.opensearch.core.xcontent.XContentParser;
2828
import org.opensearch.index.IndexNotFoundException;
2929
import org.opensearch.ml.common.MLModelGroup;
30-
import org.opensearch.ml.common.ResourceSharingClientAccessor;
3130
import org.opensearch.ml.common.settings.MLFeatureEnabledSetting;
3231
import org.opensearch.ml.common.transport.model_group.MLModelGroupGetAction;
3332
import org.opensearch.ml.common.transport.model_group.MLModelGroupGetRequest;
3433
import org.opensearch.ml.common.transport.model_group.MLModelGroupGetResponse;
3534
import org.opensearch.ml.helper.ModelAccessControlHelper;
35+
import org.opensearch.ml.resources.MLResourceSharingExtension;
3636
import org.opensearch.ml.utils.RestActionUtils;
3737
import org.opensearch.ml.utils.TenantAwareHelper;
3838
import org.opensearch.remote.metadata.client.GetDataObjectRequest;
@@ -59,6 +59,9 @@ public class GetModelGroupTransportAction extends HandledTransportAction<ActionR
5959
final ModelAccessControlHelper modelAccessControlHelper;
6060
private final MLFeatureEnabledSetting mlFeatureEnabledSetting;
6161

62+
@Inject(optional = true)
63+
public MLResourceSharingExtension mlResourceSharingExtension;
64+
6265
@Inject
6366
public GetModelGroupTransportAction(
6467
TransportService transportService,
@@ -186,7 +189,7 @@ private void validateModelGroupAccess(
186189
) {
187190
// if resource sharing feature is enabled, security plugin will have automatically evaluated access to this model group, hence no
188191
// need to validate again
189-
if (ResourceSharingClientAccessor.getInstance().getResourceSharingClient() != null) {
192+
if (mlResourceSharingExtension != null && mlResourceSharingExtension.getResourceSharingClient() != null) {
190193
wrappedListener.onResponse(MLModelGroupGetResponse.builder().mlModelGroup(mlModelGroup).build());
191194
return;
192195
}

plugin/src/main/java/org/opensearch/ml/action/model_group/SearchModelGroupTransportAction.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020
import org.opensearch.common.util.concurrent.ThreadContext;
2121
import org.opensearch.commons.authuser.User;
2222
import org.opensearch.core.action.ActionListener;
23-
import org.opensearch.ml.common.ResourceSharingClientAccessor;
2423
import org.opensearch.ml.common.settings.MLFeatureEnabledSetting;
2524
import org.opensearch.ml.common.transport.model_group.MLModelGroupSearchAction;
2625
import org.opensearch.ml.common.transport.search.MLSearchActionRequest;
2726
import org.opensearch.ml.helper.ModelAccessControlHelper;
27+
import org.opensearch.ml.resources.MLResourceSharingExtension;
2828
import org.opensearch.ml.utils.RestActionUtils;
2929
import org.opensearch.ml.utils.TenantAwareHelper;
3030
import org.opensearch.remote.metadata.client.SdkClient;
@@ -47,6 +47,9 @@ public class SearchModelGroupTransportAction extends HandledTransportAction<MLSe
4747

4848
ModelAccessControlHelper modelAccessControlHelper;
4949

50+
@Inject(optional = true)
51+
public MLResourceSharingExtension mlResourceSharingExtension;
52+
5053
@Inject
5154
public SearchModelGroupTransportAction(
5255
TransportService transportService,
@@ -89,7 +92,7 @@ private void preProcessRoleAndPerformSearch(
8992
.wrap(wrappedListener::onResponse, e -> wrapListenerToHandleSearchIndexNotFound(e, wrappedListener));
9093

9194
// If resource-sharing feature is enabled, we fetch accessible model-groups and restrict the search to those model-groups only.
92-
if (ResourceSharingClientAccessor.getInstance().getResourceSharingClient() != null) {
95+
if (mlResourceSharingExtension != null && mlResourceSharingExtension.getResourceSharingClient() != null) {
9396
// If a model-group is shared, then it will have been shared at-least at read access, hence the final result is guaranteed
9497
// to only contain model-groups that the user at-least has read access to.
9598
addAccessibleModelGroupsFilterAndSearch(tenantId, request, doubleWrappedListener);
@@ -113,7 +116,7 @@ private void addAccessibleModelGroupsFilterAndSearch(
113116
ActionListener<SearchResponse> wrappedListener
114117
) {
115118
SearchSourceBuilder sourceBuilder = request.source() != null ? request.source() : new SearchSourceBuilder();
116-
ResourceSharingClient rsc = ResourceSharingClientAccessor.getInstance().getResourceSharingClient();
119+
ResourceSharingClient rsc = mlResourceSharingExtension.getResourceSharingClient();
117120
// filter by accessible model-groups
118121
rsc.getAccessibleResourceIds(ML_MODEL_GROUP_INDEX, ActionListener.wrap(ids -> {
119122
sourceBuilder.query(modelAccessControlHelper.mergeWithAccessFilter(sourceBuilder.query(), ids));

plugin/src/main/java/org/opensearch/ml/action/model_group/TransportUpdateModelGroupAction.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import org.opensearch.index.IndexNotFoundException;
3636
import org.opensearch.ml.common.AccessMode;
3737
import org.opensearch.ml.common.MLModelGroup;
38-
import org.opensearch.ml.common.ResourceSharingClientAccessor;
3938
import org.opensearch.ml.common.exception.MLValidationException;
4039
import org.opensearch.ml.common.settings.MLFeatureEnabledSetting;
4140
import org.opensearch.ml.common.transport.model_group.MLUpdateModelGroupAction;
@@ -44,6 +43,7 @@
4443
import org.opensearch.ml.common.transport.model_group.MLUpdateModelGroupResponse;
4544
import org.opensearch.ml.helper.ModelAccessControlHelper;
4645
import org.opensearch.ml.model.MLModelGroupManager;
46+
import org.opensearch.ml.resources.MLResourceSharingExtension;
4747
import org.opensearch.ml.utils.RestActionUtils;
4848
import org.opensearch.ml.utils.TenantAwareHelper;
4949
import org.opensearch.remote.metadata.client.GetDataObjectRequest;
@@ -74,6 +74,9 @@ public class TransportUpdateModelGroupAction extends HandledTransportAction<Acti
7474
MLModelGroupManager mlModelGroupManager;
7575
private final MLFeatureEnabledSetting mlFeatureEnabledSetting;
7676

77+
@Inject(optional = true)
78+
public MLResourceSharingExtension mlResourceSharingExtension;
79+
7780
@Inject
7881
public TransportUpdateModelGroupAction(
7982
TransportService transportService,
@@ -149,7 +152,10 @@ protected void doExecute(Task task, ActionRequest request, ActionListener<MLUpda
149152
)) {
150153
// NOTE all sharing and revoking must happen through share API exposed by security plugin
151154
// client == null -> feature is disabled, follow old route
152-
if (ResourceSharingClientAccessor.getInstance().getResourceSharingClient() == null) {
155+
// client != null -> feature is enabled, evaluation already happened in security plugin, move to update
156+
// method
157+
if (mlResourceSharingExtension == null
158+
|| mlResourceSharingExtension.getResourceSharingClient() == null) {
153159
// TODO: At some point, this call must be replaced by the one above, (i.e. no user info to
154160
// be stored in model-group index)
155161
if (modelAccessControlHelper.isSecurityEnabledAndModelAccessControlEnabled(user)) {
@@ -160,8 +166,7 @@ protected void doExecute(Task task, ActionRequest request, ActionListener<MLUpda
160166

161167
}
162168
// For backwards compatibility we still allow storing backend_roles
163-
// data in ml_model_group
164-
// index
169+
// data in ml_model_group index
165170
updateModelGroup(modelGroupId, r.source(), updateModelGroupInput, wrappedListener, user);
166171

167172
}

plugin/src/main/java/org/opensearch/ml/helper/ModelAccessControlHelper.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.opensearch.action.search.SearchRequest;
2626
import org.opensearch.action.search.SearchResponse;
2727
import org.opensearch.cluster.service.ClusterService;
28+
import org.opensearch.common.inject.Inject;
2829
import org.opensearch.common.settings.Settings;
2930
import org.opensearch.common.util.concurrent.ThreadContext;
3031
import org.opensearch.common.xcontent.LoggingDeprecationHandler;
@@ -49,10 +50,10 @@
4950
import org.opensearch.index.query.TermsQueryBuilder;
5051
import org.opensearch.ml.common.AccessMode;
5152
import org.opensearch.ml.common.MLModelGroup;
52-
import org.opensearch.ml.common.ResourceSharingClientAccessor;
5353
import org.opensearch.ml.common.exception.MLResourceNotFoundException;
5454
import org.opensearch.ml.common.exception.MLValidationException;
5555
import org.opensearch.ml.common.settings.MLFeatureEnabledSetting;
56+
import org.opensearch.ml.resources.MLResourceSharingExtension;
5657
import org.opensearch.ml.utils.MLNodeUtils;
5758
import org.opensearch.ml.utils.TenantAwareHelper;
5859
import org.opensearch.remote.metadata.client.GetDataObjectRequest;
@@ -72,6 +73,9 @@ public class ModelAccessControlHelper {
7273

7374
private volatile Boolean modelAccessControlEnabled;
7475

76+
@Inject
77+
public MLResourceSharingExtension mlResourceSharingExtension;
78+
7579
public ModelAccessControlHelper(ClusterService clusterService, Settings settings) {
7680
modelAccessControlEnabled = ML_COMMONS_MODEL_ACCESS_CONTROL_ENABLED.get(settings);
7781
clusterService
@@ -97,8 +101,9 @@ public void validateModelGroupAccess(User user, String modelGroupId, String acti
97101
listener.onResponse(true);
98102
return;
99103
}
100-
if (ResourceSharingClientAccessor.getInstance().getResourceSharingClient() != null) {
101-
ResourceSharingClient resourceSharingClient = ResourceSharingClientAccessor.getInstance().getResourceSharingClient();
104+
105+
if (mlResourceSharingExtension != null && mlResourceSharingExtension.getResourceSharingClient() != null) {
106+
ResourceSharingClient resourceSharingClient = mlResourceSharingExtension.getResourceSharingClient();
102107
resourceSharingClient.verifyAccess(modelGroupId, ML_MODEL_GROUP_INDEX, action, ActionListener.wrap(isAuthorized -> {
103108
if (!isAuthorized) {
104109
listener
@@ -167,8 +172,8 @@ public void validateModelGroupAccess(
167172
listener.onResponse(true);
168173
return;
169174
}
170-
if (ResourceSharingClientAccessor.getInstance().getResourceSharingClient() != null) {
171-
ResourceSharingClient resourceSharingClient = ResourceSharingClientAccessor.getInstance().getResourceSharingClient();
175+
if (mlResourceSharingExtension != null && mlResourceSharingExtension.getResourceSharingClient() != null) {
176+
ResourceSharingClient resourceSharingClient = mlResourceSharingExtension.getResourceSharingClient();
172177
resourceSharingClient.verifyAccess(modelGroupId, ML_MODEL_GROUP_INDEX, action, ActionListener.wrap(isAuthorized -> {
173178
if (!isAuthorized) {
174179
listener
@@ -382,9 +387,9 @@ public void addAccessibleModelGroupsFilterAndSearch(
382387
Consumer<Set<String>> onSuccess,
383388
ActionListener<SearchResponse> wrappedListener
384389
) {
385-
ResourceSharingClient rsc = ResourceSharingClientAccessor.getInstance().getResourceSharingClient();
390+
ResourceSharingClient resourceSharingClient = mlResourceSharingExtension.getResourceSharingClient();
386391
// filter by accessible model-groups
387-
rsc.getAccessibleResourceIds(ML_MODEL_GROUP_INDEX, ActionListener.wrap(onSuccess::accept, e -> {
392+
resourceSharingClient.getAccessibleResourceIds(ML_MODEL_GROUP_INDEX, ActionListener.wrap(onSuccess::accept, e -> {
388393
// Fail-safe: deny-all and still return a response
389394
SearchSourceBuilder reqSrc = request.source() != null ? request.source() : new SearchSourceBuilder();
390395
reqSrc.query(mergeWithAccessFilter(reqSrc.query(), Collections.emptySet()));

plugin/src/main/java/org/opensearch/ml/resources/MLResourceSharingExtension.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,26 @@
1010
import java.util.Set;
1111

1212
import org.opensearch.ml.common.MLModelGroup;
13-
import org.opensearch.ml.common.ResourceSharingClientAccessor;
1413
import org.opensearch.security.spi.resources.ResourceProvider;
1514
import org.opensearch.security.spi.resources.ResourceSharingExtension;
1615
import org.opensearch.security.spi.resources.client.ResourceSharingClient;
1716

1817
public class MLResourceSharingExtension implements ResourceSharingExtension {
1918

19+
private ResourceSharingClient resourceSharingClient;
20+
2021
@Override
2122
public Set<ResourceProvider> getResourceProviders() {
2223
return Set.of(new ResourceProvider(MLModelGroup.class.getCanonicalName(), ML_MODEL_GROUP_INDEX));
2324
}
2425

2526
@Override
2627
public void assignResourceSharingClient(ResourceSharingClient resourceSharingClient) {
27-
ResourceSharingClientAccessor.getInstance().setResourceSharingClient(resourceSharingClient);
28+
this.resourceSharingClient = resourceSharingClient;
29+
}
30+
31+
@Override
32+
public ResourceSharingClient getResourceSharingClient() {
33+
return resourceSharingClient;
2834
}
2935
}

0 commit comments

Comments
 (0)