Skip to content

Commit 4dfa593

Browse files
opensearch-trigger-bot[bot]pyek-botdhrubo-os
authored
fix: version mismatch (#4220) (#4228)
(cherry picked from commit 72312d6) Signed-off-by: Pavan Yekbote <pybot@amazon.com> Co-authored-by: Pavan Yekbote <pybot@amazon.com> Co-authored-by: Dhrubo Saha <dhrubo@amazon.com>
1 parent 96778c0 commit 4dfa593

File tree

2 files changed

+150
-1
lines changed

2 files changed

+150
-1
lines changed

plugin/src/main/java/org/opensearch/ml/cluster/MLCommonsClusterEventListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public void clusterChanged(ClusterChangedEvent event) {
8989
* The following logic implements this behavior.
9090
*/
9191
for (DiscoveryNode node : state.nodes()) {
92-
if (node.isDataNode() && Version.V_3_1_0.onOrAfter(node.getVersion())) {
92+
if (node.isDataNode() && node.getVersion().onOrAfter(Version.V_3_1_0)) {
9393
if (mlFeatureEnabledSetting.isMetricCollectionEnabled() && mlFeatureEnabledSetting.isStaticMetricCollectionEnabled()) {
9494
mlTaskManager.indexStatsCollectorJob(true);
9595
}
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package org.opensearch.ml.cluster;
7+
8+
import static org.mockito.ArgumentMatchers.anyBoolean;
9+
import static org.mockito.Mockito.mock;
10+
import static org.mockito.Mockito.never;
11+
import static org.mockito.Mockito.verify;
12+
import static org.mockito.Mockito.when;
13+
import static org.opensearch.ml.common.CommonValue.TASK_POLLING_JOB_INDEX;
14+
15+
import java.util.Collections;
16+
17+
import org.junit.Before;
18+
import org.mockito.Mock;
19+
import org.mockito.MockitoAnnotations;
20+
import org.opensearch.Version;
21+
import org.opensearch.cluster.ClusterChangedEvent;
22+
import org.opensearch.cluster.ClusterState;
23+
import org.opensearch.cluster.metadata.Metadata;
24+
import org.opensearch.cluster.node.DiscoveryNode;
25+
import org.opensearch.cluster.node.DiscoveryNodeRole;
26+
import org.opensearch.cluster.node.DiscoveryNodes;
27+
import org.opensearch.cluster.service.ClusterService;
28+
import org.opensearch.ml.autoredeploy.MLModelAutoReDeployer;
29+
import org.opensearch.ml.common.settings.MLFeatureEnabledSetting;
30+
import org.opensearch.ml.model.MLModelCacheHelper;
31+
import org.opensearch.ml.model.MLModelManager;
32+
import org.opensearch.ml.task.MLTaskManager;
33+
import org.opensearch.test.OpenSearchTestCase;
34+
import org.opensearch.transport.client.Client;
35+
36+
public class MLCommonsClusterEventListenerTests extends OpenSearchTestCase {
37+
38+
@Mock
39+
private ClusterService clusterService;
40+
@Mock
41+
private MLModelManager mlModelManager;
42+
@Mock
43+
private MLTaskManager mlTaskManager;
44+
@Mock
45+
private MLModelCacheHelper modelCacheHelper;
46+
@Mock
47+
private MLModelAutoReDeployer mlModelAutoReDeployer;
48+
@Mock
49+
private Client client;
50+
@Mock
51+
private MLFeatureEnabledSetting mlFeatureEnabledSetting;
52+
@Mock
53+
private ClusterChangedEvent event;
54+
@Mock
55+
private ClusterState clusterState;
56+
@Mock
57+
private Metadata metadata;
58+
59+
private MLCommonsClusterEventListener listener;
60+
61+
@Before
62+
public void setup() {
63+
MockitoAnnotations.openMocks(this);
64+
listener = new MLCommonsClusterEventListener(
65+
clusterService,
66+
mlModelManager,
67+
mlTaskManager,
68+
modelCacheHelper,
69+
mlModelAutoReDeployer,
70+
client,
71+
mlFeatureEnabledSetting
72+
);
73+
}
74+
75+
public void testClusterChanged_WithV31DataNode_MetricCollectionEnabled() {
76+
DiscoveryNode dataNode = createDataNode(Version.V_3_1_0);
77+
setupClusterState(dataNode, false);
78+
79+
when(mlFeatureEnabledSetting.isMetricCollectionEnabled()).thenReturn(true);
80+
when(mlFeatureEnabledSetting.isStaticMetricCollectionEnabled()).thenReturn(true);
81+
82+
listener.clusterChanged(event);
83+
84+
verify(mlTaskManager).indexStatsCollectorJob(true);
85+
verify(mlTaskManager, never()).startTaskPollingJob();
86+
}
87+
88+
public void testClusterChanged_WithV31DataNode_TaskPollingIndexExists() {
89+
DiscoveryNode dataNode = createDataNode(Version.V_3_1_0);
90+
setupClusterState(dataNode, true);
91+
92+
when(mlFeatureEnabledSetting.isMetricCollectionEnabled()).thenReturn(false);
93+
94+
listener.clusterChanged(event);
95+
96+
verify(mlTaskManager, never()).indexStatsCollectorJob(anyBoolean());
97+
verify(mlTaskManager).startTaskPollingJob();
98+
}
99+
100+
public void testClusterChanged_WithPreV31DataNode_NoJobsStarted() {
101+
DiscoveryNode dataNode = createDataNode(Version.V_3_0_0);
102+
setupClusterState(dataNode, true);
103+
104+
when(mlFeatureEnabledSetting.isMetricCollectionEnabled()).thenReturn(true);
105+
when(mlFeatureEnabledSetting.isStaticMetricCollectionEnabled()).thenReturn(true);
106+
107+
listener.clusterChanged(event);
108+
109+
verify(mlTaskManager, never()).indexStatsCollectorJob(anyBoolean());
110+
verify(mlTaskManager, never()).startTaskPollingJob();
111+
}
112+
113+
public void testClusterChanged_WithPostV31DataNode_JobsStarted() {
114+
DiscoveryNode dataNode = createDataNode(Version.V_3_2_0);
115+
setupClusterState(dataNode, true);
116+
117+
when(mlFeatureEnabledSetting.isMetricCollectionEnabled()).thenReturn(true);
118+
when(mlFeatureEnabledSetting.isStaticMetricCollectionEnabled()).thenReturn(true);
119+
120+
listener.clusterChanged(event);
121+
122+
verify(mlTaskManager).indexStatsCollectorJob(true);
123+
verify(mlTaskManager).startTaskPollingJob();
124+
}
125+
126+
private DiscoveryNode createDataNode(Version version) {
127+
return new DiscoveryNode(
128+
"dataNode",
129+
"dataNodeId",
130+
buildNewFakeTransportAddress(),
131+
Collections.emptyMap(),
132+
Collections.singleton(DiscoveryNodeRole.DATA_ROLE),
133+
version
134+
);
135+
}
136+
137+
private void setupClusterState(DiscoveryNode node, boolean hasTaskPollingIndex) {
138+
DiscoveryNodes nodes = DiscoveryNodes.builder().add(node).build();
139+
140+
when(event.state()).thenReturn(clusterState);
141+
when(event.previousState()).thenReturn(clusterState);
142+
when(event.nodesDelta()).thenReturn(mock(DiscoveryNodes.Delta.class));
143+
when(clusterState.nodes()).thenReturn(nodes);
144+
when(clusterState.getMetadata()).thenReturn(metadata);
145+
when(clusterService.state()).thenReturn(clusterState);
146+
when(metadata.hasIndex(TASK_POLLING_JOB_INDEX)).thenReturn(hasTaskPollingIndex);
147+
when(metadata.settings()).thenReturn(org.opensearch.common.settings.Settings.EMPTY);
148+
}
149+
}

0 commit comments

Comments
 (0)