88
99package org .opensearch .plugin .wlm .action ;
1010
11+ import org .opensearch .ResourceNotFoundException ;
1112import org .opensearch .action .support .ActionFilters ;
1213import org .opensearch .action .support .clustermanager .AcknowledgedResponse ;
1314import org .opensearch .action .support .clustermanager .TransportClusterManagerNodeAction ;
1415import org .opensearch .cluster .ClusterState ;
1516import org .opensearch .cluster .block .ClusterBlockException ;
1617import org .opensearch .cluster .block .ClusterBlockLevel ;
1718import org .opensearch .cluster .metadata .IndexNameExpressionResolver ;
19+ import org .opensearch .cluster .metadata .WorkloadGroup ;
1820import org .opensearch .cluster .service .ClusterService ;
1921import org .opensearch .common .inject .Inject ;
2022import org .opensearch .core .action .ActionListener ;
2123import org .opensearch .core .common .io .stream .StreamInput ;
24+ import org .opensearch .plugin .wlm .rule .WorkloadGroupFeatureType ;
2225import org .opensearch .plugin .wlm .service .WorkloadGroupPersistenceService ;
26+ import org .opensearch .rule .RulePersistenceService ;
27+ import org .opensearch .rule .action .GetRuleRequest ;
28+ import org .opensearch .rule .action .GetRuleResponse ;
29+ import org .opensearch .rule .autotagging .FeatureType ;
30+ import org .opensearch .rule .autotagging .Rule ;
31+ import org .opensearch .rule .service .IndexStoredRulePersistenceService ;
2332import org .opensearch .threadpool .ThreadPool ;
2433import org .opensearch .transport .TransportService ;
2534
2635import java .io .IOException ;
36+ import java .util .Collection ;
37+ import java .util .Collections ;
38+ import java .util .List ;
2739
2840/**
2941 * Transport action for delete WorkloadGroup
@@ -35,6 +47,8 @@ public class TransportDeleteWorkloadGroupAction extends TransportClusterManagerN
3547 AcknowledgedResponse > {
3648
3749 private final WorkloadGroupPersistenceService workloadGroupPersistenceService ;
50+ private final RulePersistenceService rulePersistenceService ;
51+ private final FeatureType featureType ;
3852
3953 /**
4054 * Constructor for TransportDeleteWorkloadGroupAction
@@ -45,6 +59,8 @@ public class TransportDeleteWorkloadGroupAction extends TransportClusterManagerN
4559 * @param threadPool - a {@link ThreadPool} object
4660 * @param indexNameExpressionResolver - a {@link IndexNameExpressionResolver} object
4761 * @param workloadGroupPersistenceService - a {@link WorkloadGroupPersistenceService} object
62+ * @param persistenceService - a {@link IndexStoredRulePersistenceService} instance
63+ * @param featureType - workloadManagement feature type
4864 */
4965 @ Inject
5066 public TransportDeleteWorkloadGroupAction (
@@ -53,7 +69,9 @@ public TransportDeleteWorkloadGroupAction(
5369 ActionFilters actionFilters ,
5470 ThreadPool threadPool ,
5571 IndexNameExpressionResolver indexNameExpressionResolver ,
56- WorkloadGroupPersistenceService workloadGroupPersistenceService
72+ WorkloadGroupPersistenceService workloadGroupPersistenceService ,
73+ IndexStoredRulePersistenceService persistenceService ,
74+ WorkloadGroupFeatureType featureType
5775 ) {
5876 super (
5977 DeleteWorkloadGroupAction .NAME ,
@@ -65,6 +83,8 @@ public TransportDeleteWorkloadGroupAction(
6583 indexNameExpressionResolver
6684 );
6785 this .workloadGroupPersistenceService = workloadGroupPersistenceService ;
86+ this .rulePersistenceService = persistenceService ;
87+ this .featureType = featureType ;
6888 }
6989
7090 @ Override
@@ -73,12 +93,18 @@ protected void clusterManagerOperation(
7393 ClusterState state ,
7494 ActionListener <AcknowledgedResponse > listener
7595 ) throws Exception {
76- workloadGroupPersistenceService .deleteInClusterStateMetadata (request , listener );
96+ threadPool .executor (executor ()).submit (() -> {
97+ try {
98+ checkNoAssociatedRulesExist (request , listener , state );
99+ } catch (Exception e ) {
100+ listener .onFailure (e );
101+ }
102+ });
77103 }
78104
79105 @ Override
80106 protected String executor () {
81- return ThreadPool .Names .SAME ;
107+ return ThreadPool .Names .GET ;
82108 }
83109
84110 @ Override
@@ -90,4 +116,48 @@ protected AcknowledgedResponse read(StreamInput in) throws IOException {
90116 protected ClusterBlockException checkBlock (DeleteWorkloadGroupRequest request , ClusterState state ) {
91117 return state .blocks ().globalBlockedException (ClusterBlockLevel .METADATA_WRITE );
92118 }
119+
120+ private void checkNoAssociatedRulesExist (
121+ DeleteWorkloadGroupRequest request ,
122+ ActionListener <AcknowledgedResponse > listener ,
123+ ClusterState state
124+ ) {
125+ Collection <WorkloadGroup > workloadGroups = WorkloadGroupPersistenceService .getFromClusterStateMetadata (request .getName (), state );
126+ if (workloadGroups .isEmpty ()) {
127+ throw new ResourceNotFoundException ("No WorkloadGroup exists with the provided name: " + request .getName ());
128+ }
129+
130+ WorkloadGroup workloadGroup = workloadGroups .iterator ().next ();
131+ rulePersistenceService .getRule (
132+ new GetRuleRequest (null , Collections .emptyMap (), null , featureType ),
133+ new ActionListener <GetRuleResponse >() {
134+ @ Override
135+ public void onResponse (GetRuleResponse getRuleResponse ) {
136+ List <Rule > associatedRules = getRuleResponse .getRules ()
137+ .stream ()
138+ .filter (rule -> rule .getFeatureValue ().equals (workloadGroup .get_id ()))
139+ .toList ();
140+
141+ if (!associatedRules .isEmpty ()) {
142+ listener .onFailure (
143+ new IllegalStateException (
144+ workloadGroup .getName ()
145+ + " workload group has rules with ids: "
146+ + associatedRules
147+ + " ."
148+ + "Please delete them first otherwise system will be an inconsistent state."
149+ )
150+ );
151+ return ;
152+ }
153+ workloadGroupPersistenceService .deleteInClusterStateMetadata (request , listener );
154+ }
155+
156+ @ Override
157+ public void onFailure (Exception e ) {
158+ listener .onFailure (e );
159+ }
160+ }
161+ );
162+ }
93163}
0 commit comments