/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ package org.opensearch.indexmanagement.indexstatemanagement.step.delete import org.apache.logging.log4j.LogManager import org.opensearch.ExceptionsHelper import org.opensearch.action.admin.indices.delete.DeleteIndexRequest import org.opensearch.action.support.master.AcknowledgedResponse import org.opensearch.indexmanagement.opensearchapi.suspendUntil import org.opensearch.indexmanagement.spi.indexstatemanagement.Step import org.opensearch.indexmanagement.spi.indexstatemanagement.model.ManagedIndexMetaData import org.opensearch.indexmanagement.spi.indexstatemanagement.model.StepMetaData import org.opensearch.snapshots.SnapshotInProgressException import org.opensearch.transport.RemoteTransportException class AttemptDeleteStep : Step(name) { private val logger = LogManager.getLogger(javaClass) private var stepStatus = StepStatus.STARTING private var info: Map? = null override suspend fun execute(): Step { val context = this.context ?: return this val indexName = context.metadata.index try { val response: AcknowledgedResponse = context.client.admin().indices() .suspendUntil { delete(DeleteIndexRequest(indexName), it) } if (response.isAcknowledged) { stepStatus = StepStatus.COMPLETED info = mapOf("message" to getSuccessMessage(indexName)) } else { val message = getFailedMessage(indexName) logger.warn(message) stepStatus = StepStatus.FAILED info = mapOf("message" to message) } } catch (e: RemoteTransportException) { val cause = ExceptionsHelper.unwrapCause(e) if (cause is SnapshotInProgressException) { handleSnapshotException(indexName, cause) } else { handleException(indexName, cause as Exception) } } catch (e: SnapshotInProgressException) { handleSnapshotException(indexName, e) } catch (e: Exception) { handleException(indexName, e) } return this } private fun handleSnapshotException(indexName: String, e: SnapshotInProgressException) { val message = getSnapshotMessage(indexName) logger.warn(message, e) stepStatus = StepStatus.CONDITION_NOT_MET info = mapOf("message" to message) } private fun handleException(indexName: String, e: Exception) { val message = getFailedMessage(indexName) logger.error(message, e) stepStatus = StepStatus.FAILED val mutableInfo = mutableMapOf("message" to message) val errorMessage = e.message if (errorMessage != null) mutableInfo["cause"] = errorMessage info = mutableInfo.toMap() } override fun getUpdatedManagedIndexMetadata(currentMetadata: ManagedIndexMetaData): ManagedIndexMetaData { return currentMetadata.copy( stepMetaData = StepMetaData(name, getStepStartTime(currentMetadata).toEpochMilli(), stepStatus), transitionTo = null, info = info ) } override fun isIdempotent() = true companion object { const val name = "attempt_delete" fun getFailedMessage(indexName: String) = "Failed to delete index [index=$indexName]" fun getSuccessMessage(indexName: String) = "Successfully deleted index [index=$indexName]" fun getSnapshotMessage(indexName: String) = "Index had snapshot in progress, retrying deletion [index=$indexName]" } }