55
66package  org.opensearch.indexmanagement.indexstatemanagement.step.shrink 
77
8+ import  org.opensearch.action.admin.indices.alias.IndicesAliasesRequest 
9+ import  org.opensearch.action.admin.indices.alias.IndicesAliasesRequest.AliasActions 
810import  org.opensearch.action.admin.indices.stats.IndicesStatsRequest 
911import  org.opensearch.action.admin.indices.stats.IndicesStatsResponse 
1012import  org.opensearch.action.support.master.AcknowledgedResponse 
1113import  org.opensearch.client.Client 
1214import  org.opensearch.cluster.service.ClusterService 
1315import  org.opensearch.common.settings.Settings 
1416import  org.opensearch.indexmanagement.indexstatemanagement.action.ShrinkAction 
15- import  org.opensearch.indexmanagement.indexstatemanagement.util.resetReadOnlyAndRouting 
1617import  org.opensearch.indexmanagement.indexstatemanagement.util.deleteShrinkLock 
1718import  org.opensearch.indexmanagement.indexstatemanagement.util.getActionStartTime 
1819import  org.opensearch.indexmanagement.indexstatemanagement.util.issueUpdateSettingsRequest 
20+ import  org.opensearch.indexmanagement.indexstatemanagement.util.resetReadOnlyAndRouting 
1921import  org.opensearch.indexmanagement.opensearchapi.suspendUntil 
2022import  org.opensearch.indexmanagement.spi.indexstatemanagement.model.ActionProperties 
2123import  org.opensearch.indexmanagement.spi.indexstatemanagement.model.ManagedIndexMetaData 
24+ import  org.opensearch.indexmanagement.spi.indexstatemanagement.model.ShrinkActionProperties 
2225import  org.opensearch.indexmanagement.spi.indexstatemanagement.model.StepContext 
2326import  org.opensearch.indexmanagement.spi.indexstatemanagement.model.StepMetaData 
2427import  java.time.Duration 
@@ -45,8 +48,15 @@ class WaitForShrinkStep(private val action: ShrinkAction) : ShrinkStep(name, tru
4548        if  (! deleteShrinkLock(localShrinkActionProperties, context.lockService, logger)) {
4649            logger.error(" Failed to delete Shrink action lock on node [${localShrinkActionProperties.nodeName} ]"  )
4750        }
48-         stepStatus =  StepStatus .COMPLETED 
49-         info =  mapOf (" message"   to SUCCESS_MESSAGE )
51+ 
52+         if  (switchAliases(context, localShrinkActionProperties)) {
53+             stepStatus =  StepStatus .COMPLETED 
54+             info =  mapOf (" message"   to SUCCESS_MESSAGE )
55+         } else  {
56+             stepStatus =  StepStatus .FAILED 
57+             info =  mapOf (" message"   to " Shrink failed due to aliases switch failure."  )
58+         }
59+ 
5060        return  this 
5161    }
5262
@@ -91,6 +101,64 @@ class WaitForShrinkStep(private val action: ShrinkAction) : ShrinkStep(name, tru
91101        }
92102    }
93103
104+     private  suspend  fun  switchAliases (context :  StepContext , shrinkActionProperties :  ShrinkActionProperties ): Boolean  {
105+ 
106+         val  sourceIndexName =  context.metadata.index
107+         val  targetIndexName =  shrinkActionProperties.targetIndexName
108+ 
109+         if  (! action.switchAliases) {
110+             logger.info(" Switch aliases disabled from [$sourceIndexName ] to [$targetIndexName ]."  )
111+             return  true 
112+         }
113+ 
114+         logger.info(" Switching aliases from [$sourceIndexName ] to [$targetIndexName ]."  )
115+ 
116+         val  targetIndexAliasesNames =  context
117+             .clusterService
118+             .state()
119+             .metadata()
120+             .index(targetIndexName)
121+             .aliases
122+             .keys
123+         val  sourceIndexAliases =  context
124+             .clusterService
125+             .state()
126+             .metadata()
127+             .index(sourceIndexName)
128+             .aliases
129+             .values
130+ 
131+         val  req =  IndicesAliasesRequest ()
132+         sourceIndexAliases.map { it.alias }.forEach { req.addAliasAction(AliasActions (AliasActions .Type .REMOVE ).index(sourceIndexName).alias(it)) }
133+ 
134+         sourceIndexAliases
135+             .filterNot { targetIndexAliasesNames.contains(it.alias) }
136+             .map {
137+                 AliasActions (AliasActions .Type .ADD )
138+                     .index(targetIndexName)
139+                     .alias(it.alias)
140+                     .filter(it.filter?.string())
141+                     .indexRouting(it.indexRouting)
142+                     .searchRouting(it.searchRouting)
143+                     .isHidden(it.isHidden)
144+                     .writeIndex(it.writeIndex())
145+             }
146+             .forEach { req.addAliasAction(it) }
147+ 
148+         return  try  {
149+             val  response:  AcknowledgedResponse  =  context.client.admin().indices().suspendUntil { aliases(req, it) }
150+             if  (response.isAcknowledged) {
151+                 logger.info(" Aliases switched successfully from [$sourceIndexName ] to [$targetIndexName ]."  )
152+                 return  true 
153+             }
154+             logger.error(" Switching aliases from [$sourceIndexName ] to [$targetIndexName ] failed."  )
155+             return  false 
156+         } catch  (e:  Exception ) {
157+             logger.error(" Switching aliases from [$sourceIndexName ] to [$targetIndexName ] failed due to exception."  , e)
158+             false 
159+         }
160+     }
161+ 
94162    override  fun  getUpdatedManagedIndexMetadata (currentMetadata :  ManagedIndexMetaData ): ManagedIndexMetaData  {
95163        return  currentMetadata.copy(
96164            actionMetaData =  currentMetadata.actionMetaData?.copy(
0 commit comments