Skip to content

Commit 145a19b

Browse files
committed
add check for WLM mode to control whether CRUD requests proceed
Signed-off-by: Ruirui Zhang <[email protected]>
1 parent c230f4e commit 145a19b

File tree

8 files changed

+197
-10
lines changed

8 files changed

+197
-10
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
1010
- Add NodeResourceUsageStats to ClusterInfo ([#18480](https://github.com/opensearch-project/OpenSearch/issues/18472))
1111
- Introduce SecureHttpTransportParameters experimental API (to complement SecureTransportParameters counterpart) ([#18572](https://github.com/opensearch-project/OpenSearch/issues/18572))
1212
- Create equivalents of JSM's AccessController in the java agent ([#18346](https://github.com/opensearch-project/OpenSearch/issues/18346))
13-
- Introduced a new cluster-level API to fetch remote store metadata (segments and translogs) for each shard of an index. ([#18257](https://github.com/opensearch-project/OpenSearch/pull/18257))
13+
- [WLM] Add WLM mode validation for workload group CRUD requests ([#18346](https://github.com/opensearch-project/OpenSearch/issues/18346))
14+
- Introduced a new cluster-level API to fetch remote store metadata (segments and translogs) for each shard of an index. ([#18652](https://github.com/opensearch-project/OpenSearch/pull/18652))
1415
- Add last index request timestamp columns to the `_cat/indices` API. ([10766](https://github.com/opensearch-project/OpenSearch/issues/10766))
1516
- Introduce a new pull-based ingestion plugin for file-based indexing (for local testing) ([#18591](https://github.com/opensearch-project/OpenSearch/pull/18591))
1617
- Add support for search pipeline in search and msearch template ([#18564](https://github.com/opensearch-project/OpenSearch/pull/18564))

plugins/workload-management/src/main/java/org/opensearch/plugin/wlm/WorkloadManagementPlugin.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import org.opensearch.transport.TransportService;
6969
import org.opensearch.transport.client.Client;
7070
import org.opensearch.watcher.ResourceWatcherService;
71+
import org.opensearch.wlm.WorkloadManagementSettings;
7172

7273
import java.util.Collection;
7374
import java.util.Collections;
@@ -91,6 +92,8 @@ public class WorkloadManagementPlugin extends Plugin implements ActionPlugin, Sy
9192
private static FeatureType featureType;
9293
private static RulePersistenceService rulePersistenceService;
9394
private static RuleRoutingService ruleRoutingService;
95+
private WorkloadManagementSettings workloadManagementSettings;
96+
9497
private AutoTaggingActionFilter autoTaggingActionFilter;
9598

9699
/**
@@ -112,6 +115,7 @@ public Collection<Object> createComponents(
112115
IndexNameExpressionResolver indexNameExpressionResolver,
113116
Supplier<RepositoriesService> repositoriesServiceSupplier
114117
) {
118+
workloadManagementSettings = new WorkloadManagementSettings(environment.settings(), clusterService.getClusterSettings());
115119
featureType = new WorkloadGroupFeatureType(new WorkloadGroupFeatureValueValidator(clusterService));
116120
RuleEntityParser parser = new XContentRuleParser(featureType);
117121
AttributeValueStoreFactory attributeValueStoreFactory = new AttributeValueStoreFactory(
@@ -141,7 +145,7 @@ public Collection<Object> createComponents(
141145
);
142146

143147
autoTaggingActionFilter = new AutoTaggingActionFilter(ruleProcessingService, threadPool);
144-
return List.of(refreshMechanism);
148+
return List.of(refreshMechanism, workloadManagementSettings);
145149
}
146150

147151
@Override
@@ -181,10 +185,10 @@ public List<RestHandler> getRestHandlers(
181185
Supplier<DiscoveryNodes> nodesInCluster
182186
) {
183187
return List.of(
184-
new RestCreateWorkloadGroupAction(),
188+
new RestCreateWorkloadGroupAction(workloadManagementSettings),
185189
new RestGetWorkloadGroupAction(),
186-
new RestDeleteWorkloadGroupAction(),
187-
new RestUpdateWorkloadGroupAction()
190+
new RestDeleteWorkloadGroupAction(workloadManagementSettings),
191+
new RestUpdateWorkloadGroupAction(workloadManagementSettings)
188192
);
189193
}
190194

plugins/workload-management/src/main/java/org/opensearch/plugin/wlm/rest/RestCreateWorkloadGroupAction.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import org.opensearch.rest.RestResponse;
2222
import org.opensearch.rest.action.RestResponseListener;
2323
import org.opensearch.transport.client.node.NodeClient;
24+
import org.opensearch.wlm.WlmMode;
25+
import org.opensearch.wlm.WorkloadManagementSettings;
2426

2527
import java.io.IOException;
2628
import java.util.List;
@@ -35,10 +37,15 @@
3537
*/
3638
public class RestCreateWorkloadGroupAction extends BaseRestHandler {
3739

40+
private final WorkloadManagementSettings workloadManagementSettings;
41+
3842
/**
3943
* Constructor for RestCreateWorkloadGroupAction
44+
* @param workloadManagementSettings the WorkloadManagementSettings instance to access the current WLM mode
4045
*/
41-
public RestCreateWorkloadGroupAction() {}
46+
public RestCreateWorkloadGroupAction(WorkloadManagementSettings workloadManagementSettings) {
47+
this.workloadManagementSettings = workloadManagementSettings;
48+
}
4249

4350
@Override
4451
public String getName() {
@@ -55,6 +62,9 @@ public List<Route> routes() {
5562

5663
@Override
5764
protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) throws IOException {
65+
if (workloadManagementSettings.getWlmMode() == WlmMode.DISABLED) {
66+
throw new IllegalStateException("Workload management mode is DISABLED. Cannot create workload group.");
67+
}
5868
try (XContentParser parser = request.contentParser()) {
5969
CreateWorkloadGroupRequest createWorkloadGroupRequest = CreateWorkloadGroupRequest.fromXContent(parser);
6070
return channel -> client.execute(

plugins/workload-management/src/main/java/org/opensearch/plugin/wlm/rest/RestDeleteWorkloadGroupAction.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import org.opensearch.rest.RestRequest;
1515
import org.opensearch.rest.action.RestToXContentListener;
1616
import org.opensearch.transport.client.node.NodeClient;
17+
import org.opensearch.wlm.WlmMode;
18+
import org.opensearch.wlm.WorkloadManagementSettings;
1719

1820
import java.io.IOException;
1921
import java.util.List;
@@ -27,10 +29,15 @@
2729
*/
2830
public class RestDeleteWorkloadGroupAction extends BaseRestHandler {
2931

32+
private final WorkloadManagementSettings workloadManagementSettings;
33+
3034
/**
3135
* Constructor for RestDeleteWorkloadGroupAction
36+
* @param workloadManagementSettings the WorkloadManagementSettings instance to access the current WLM mode
3237
*/
33-
public RestDeleteWorkloadGroupAction() {}
38+
public RestDeleteWorkloadGroupAction(WorkloadManagementSettings workloadManagementSettings) {
39+
this.workloadManagementSettings = workloadManagementSettings;
40+
}
3441

3542
@Override
3643
public String getName() {
@@ -47,6 +54,10 @@ public List<Route> routes() {
4754

4855
@Override
4956
protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) throws IOException {
57+
if (workloadManagementSettings.getWlmMode() == WlmMode.DISABLED) {
58+
throw new IllegalStateException("Workload management mode is DISABLED. Cannot delete workload group.");
59+
}
60+
5061
DeleteWorkloadGroupRequest deleteWorkloadGroupRequest = new DeleteWorkloadGroupRequest(request.param("name"));
5162
deleteWorkloadGroupRequest.clusterManagerNodeTimeout(
5263
request.paramAsTime("cluster_manager_timeout", deleteWorkloadGroupRequest.clusterManagerNodeTimeout())

plugins/workload-management/src/main/java/org/opensearch/plugin/wlm/rest/RestUpdateWorkloadGroupAction.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import org.opensearch.rest.RestResponse;
2222
import org.opensearch.rest.action.RestResponseListener;
2323
import org.opensearch.transport.client.node.NodeClient;
24+
import org.opensearch.wlm.WlmMode;
25+
import org.opensearch.wlm.WorkloadManagementSettings;
2426

2527
import java.io.IOException;
2628
import java.util.List;
@@ -35,10 +37,15 @@
3537
*/
3638
public class RestUpdateWorkloadGroupAction extends BaseRestHandler {
3739

40+
private final WorkloadManagementSettings workloadManagementSettings;
41+
3842
/**
3943
* Constructor for RestUpdateWorkloadGroupAction
44+
* @param workloadManagementSettings the WorkloadManagementSettings instance to access the current WLM mode
4045
*/
41-
public RestUpdateWorkloadGroupAction() {}
46+
public RestUpdateWorkloadGroupAction(WorkloadManagementSettings workloadManagementSettings) {
47+
this.workloadManagementSettings = workloadManagementSettings;
48+
}
4249

4350
@Override
4451
public String getName() {
@@ -55,6 +62,9 @@ public List<Route> routes() {
5562

5663
@Override
5764
protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) throws IOException {
65+
if (workloadManagementSettings.getWlmMode() == WlmMode.DISABLED) {
66+
throw new IllegalStateException("Workload management mode is DISABLED. Cannot update workload group.");
67+
}
5868
try (XContentParser parser = request.contentParser()) {
5969
UpdateWorkloadGroupRequest updateWorkloadGroupRequest = UpdateWorkloadGroupRequest.fromXContent(parser, request.param("name"));
6070
return channel -> client.execute(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*
4+
* The OpenSearch Contributors require contributions made to
5+
* this file be licensed under the Apache-2.0 license or a
6+
* compatible open source license.
7+
*/
8+
9+
package org.opensearch.plugin.wlm.rest;
10+
11+
import org.opensearch.rest.RestRequest;
12+
import org.opensearch.test.OpenSearchTestCase;
13+
import org.opensearch.transport.client.node.NodeClient;
14+
import org.opensearch.wlm.WlmMode;
15+
import org.opensearch.wlm.WorkloadManagementSettings;
16+
import org.junit.Before;
17+
18+
import java.io.IOException;
19+
20+
import static org.mockito.Mockito.mock;
21+
import static org.mockito.Mockito.when;
22+
23+
public class RestCreateWorkloadGroupActionTests extends OpenSearchTestCase {
24+
private WorkloadManagementSettings workloadManagementSettings;
25+
private RestCreateWorkloadGroupAction restAction;
26+
private NodeClient nodeClient;
27+
private RestRequest restRequest;
28+
29+
@Before
30+
public void setup() {
31+
workloadManagementSettings = mock(WorkloadManagementSettings.class);
32+
restAction = new RestCreateWorkloadGroupAction(workloadManagementSettings);
33+
nodeClient = mock(NodeClient.class);
34+
restRequest = mock(RestRequest.class);
35+
}
36+
37+
public void testPrepareRequestThrowsWhenWlmModeDisabled() throws IOException {
38+
when(workloadManagementSettings.getWlmMode()).thenReturn(WlmMode.DISABLED);
39+
try {
40+
restAction.prepareRequest(restRequest, nodeClient);
41+
fail("Expected OpenSearchException when WLM mode is DISABLED");
42+
} catch (Exception e) {
43+
assertTrue(e.getMessage().contains("Cannot create workload group."));
44+
}
45+
}
46+
47+
public void testPrepareRequestSucceedsWhenWlmModeEnabled() throws IOException {
48+
when(workloadManagementSettings.getWlmMode()).thenReturn(WlmMode.ENABLED);
49+
try {
50+
restAction.prepareRequest(restRequest, nodeClient);
51+
} catch (Exception e) {
52+
if (e.getMessage().contains("Cannot create workload group.")) {
53+
fail("Expected no exception when WLM mode is ENABLED");
54+
}
55+
}
56+
}
57+
58+
public void testPrepareRequestSucceedsWhenWlmModeMonitorOnly() throws IOException {
59+
when(workloadManagementSettings.getWlmMode()).thenReturn(WlmMode.MONITOR_ONLY);
60+
try {
61+
restAction.prepareRequest(restRequest, nodeClient);
62+
} catch (Exception e) {
63+
if (e.getMessage().contains("Cannot create workload group.")) {
64+
fail("Expected no exception when WLM mode is MONITOR_ONLY");
65+
}
66+
}
67+
}
68+
}

plugins/workload-management/src/test/java/org/opensearch/plugin/wlm/rest/RestDeleteWorkloadGroupActionTests.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import org.opensearch.test.OpenSearchTestCase;
2121
import org.opensearch.test.rest.FakeRestRequest;
2222
import org.opensearch.transport.client.node.NodeClient;
23+
import org.opensearch.wlm.WlmMode;
24+
import org.opensearch.wlm.WorkloadManagementSettings;
2325

2426
import java.util.List;
2527

@@ -34,13 +36,14 @@
3436
import static org.mockito.Mockito.mock;
3537
import static org.mockito.Mockito.spy;
3638
import static org.mockito.Mockito.verify;
39+
import static org.mockito.Mockito.when;
3740

3841
public class RestDeleteWorkloadGroupActionTests extends OpenSearchTestCase {
3942
/**
4043
* Test case to validate the construction for RestDeleteWorkloadGroupAction
4144
*/
4245
public void testConstruction() {
43-
RestDeleteWorkloadGroupAction action = new RestDeleteWorkloadGroupAction();
46+
RestDeleteWorkloadGroupAction action = new RestDeleteWorkloadGroupAction(mock(WorkloadManagementSettings.class));
4447
assertNotNull(action);
4548
assertEquals("delete_workload_group", action.getName());
4649
List<RestHandler.Route> routes = action.routes();
@@ -55,7 +58,9 @@ public void testConstruction() {
5558
*/
5659
@SuppressWarnings("unchecked")
5760
public void testPrepareRequest() throws Exception {
58-
RestDeleteWorkloadGroupAction restDeleteWorkloadGroupAction = new RestDeleteWorkloadGroupAction();
61+
RestDeleteWorkloadGroupAction restDeleteWorkloadGroupAction = new RestDeleteWorkloadGroupAction(
62+
mock(WorkloadManagementSettings.class)
63+
);
5964
NodeClient nodeClient = mock(NodeClient.class);
6065
RestRequest realRequest = new FakeRestRequest();
6166
realRequest.params().put("name", NAME_ONE);
@@ -82,4 +87,16 @@ public void testPrepareRequest() throws Exception {
8287
any(RestToXContentListener.class)
8388
);
8489
}
90+
91+
public void testPrepareRequestThrowsWhenWlmModeDisabled() {
92+
WorkloadManagementSettings workloadManagementSettings = mock(WorkloadManagementSettings.class);
93+
RestDeleteWorkloadGroupAction restAction = new RestDeleteWorkloadGroupAction(workloadManagementSettings);
94+
when(workloadManagementSettings.getWlmMode()).thenReturn(WlmMode.DISABLED);
95+
try {
96+
restAction.prepareRequest(mock(RestRequest.class), mock(NodeClient.class));
97+
fail("Expected OpenSearchException when WLM mode is DISABLED");
98+
} catch (Exception e) {
99+
assertTrue(e.getMessage().contains("Cannot delete workload group."));
100+
}
101+
}
85102
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*
4+
* The OpenSearch Contributors require contributions made to
5+
* this file be licensed under the Apache-2.0 license or a
6+
* compatible open source license.
7+
*/
8+
9+
package org.opensearch.plugin.wlm.rest;
10+
11+
import org.opensearch.rest.RestRequest;
12+
import org.opensearch.test.OpenSearchTestCase;
13+
import org.opensearch.transport.client.node.NodeClient;
14+
import org.opensearch.wlm.WlmMode;
15+
import org.opensearch.wlm.WorkloadManagementSettings;
16+
import org.junit.Before;
17+
18+
import static org.mockito.Mockito.mock;
19+
import static org.mockito.Mockito.when;
20+
21+
public class RestUpdateWorkloadGroupActionTests extends OpenSearchTestCase {
22+
private WorkloadManagementSettings workloadManagementSettings;
23+
private RestUpdateWorkloadGroupAction restAction;
24+
private NodeClient nodeClient;
25+
private RestRequest restRequest;
26+
27+
@Before
28+
public void setup() {
29+
workloadManagementSettings = mock(WorkloadManagementSettings.class);
30+
restAction = new RestUpdateWorkloadGroupAction(workloadManagementSettings);
31+
nodeClient = mock(NodeClient.class);
32+
restRequest = mock(RestRequest.class);
33+
}
34+
35+
public void testPrepareRequestThrowsWhenWlmModeDisabled() {
36+
when(workloadManagementSettings.getWlmMode()).thenReturn(WlmMode.DISABLED);
37+
try {
38+
restAction.prepareRequest(restRequest, nodeClient);
39+
fail("Expected OpenSearchException when WLM mode is DISABLED");
40+
} catch (Exception e) {
41+
assertTrue(e.getMessage().contains("Cannot update workload group."));
42+
}
43+
}
44+
45+
public void testPrepareRequestSucceedsWhenWlmModeEnabled() {
46+
when(workloadManagementSettings.getWlmMode()).thenReturn(WlmMode.ENABLED);
47+
try {
48+
restAction.prepareRequest(restRequest, nodeClient);
49+
} catch (Exception e) {
50+
if (e.getMessage().contains("Cannot update workload group.")) {
51+
fail("Expected no exception when WLM mode is ENABLED");
52+
}
53+
}
54+
}
55+
56+
public void testPrepareRequestSucceedsWhenWlmModeMonitorOnly() {
57+
when(workloadManagementSettings.getWlmMode()).thenReturn(WlmMode.MONITOR_ONLY);
58+
try {
59+
restAction.prepareRequest(restRequest, nodeClient);
60+
} catch (Exception e) {
61+
if (e.getMessage().contains("Cannot update workload group.")) {
62+
fail("Expected no exception when WLM mode is MONITOR_ONLY");
63+
}
64+
}
65+
}
66+
}

0 commit comments

Comments
 (0)