Skip to content

Commit dc380a5

Browse files
committed
Enabling alias action on managed indices only
1 parent e0bb3ef commit dc380a5

File tree

5 files changed

+30
-37
lines changed

5 files changed

+30
-37
lines changed

src/main/kotlin/org/opensearch/indexmanagement/indexstatemanagement/action/AliasAction.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class AliasAction(
2121

2222
init {
2323
require(actions.isNotEmpty()) { "At least one alias action needs to be specified." }
24+
require(!actions.any { it.actionType() == IndicesAliasesRequest.AliasActions.Type.REMOVE_INDEX }) { "Remove_index is not allowed here." }
25+
require(actions.all { it.indices().isNullOrEmpty() }) { "Alias actions are only allowed on managed indices." }
2426
}
2527

2628
private val attemptAliasStep = AttemptAliasStep(this)

src/main/kotlin/org/opensearch/indexmanagement/indexstatemanagement/step/alias/AttemptAliasStep.kt

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,11 @@ package org.opensearch.indexmanagement.indexstatemanagement.step.alias
88
import org.apache.logging.log4j.LogManager
99
import org.opensearch.action.admin.indices.alias.IndicesAliasesRequest
1010
import org.opensearch.action.support.master.AcknowledgedResponse
11-
import org.opensearch.common.Strings
1211
import org.opensearch.indexmanagement.indexstatemanagement.action.AliasAction
13-
import org.opensearch.indexmanagement.opensearchapi.convertToMap
1412
import org.opensearch.indexmanagement.opensearchapi.suspendUntil
1513
import org.opensearch.indexmanagement.spi.indexstatemanagement.Step
1614
import org.opensearch.indexmanagement.spi.indexstatemanagement.model.ManagedIndexMetaData
1715
import org.opensearch.indexmanagement.spi.indexstatemanagement.model.StepMetaData
18-
import org.opensearch.script.Script
19-
import org.opensearch.script.ScriptService
20-
import org.opensearch.script.ScriptType
21-
import org.opensearch.script.TemplateScript
2216

2317
class AttemptAliasStep(private val action: AliasAction) : Step(name) {
2418

@@ -32,15 +26,8 @@ class AttemptAliasStep(private val action: AliasAction) : Step(name) {
3226
try {
3327
val request = IndicesAliasesRequest()
3428
action.actions.forEach {
35-
// Take the indices that were set to be updated on the alias action and join them into a single string
36-
// So we don't have to pass each one individually into the script service to be compiled
37-
val indices = it.indices().joinToString(",")
38-
// Compile them so the user can use the current dynamic index name in the name such as "{{ctx.index}}" in the static policy
39-
val indicesScript = Script(ScriptType.INLINE, Script.DEFAULT_TEMPLATE_LANG, indices, mapOf())
40-
val compiledIndices = compileTemplate(indicesScript, context.metadata, indices, context.scriptService)
41-
// Split them back into individual index names and set back on the AliasActions request
42-
val splitIndices = Strings.splitStringByCommaToArray(compiledIndices)
43-
it.indices(*splitIndices)
29+
// Applying the actions on the managed index.
30+
it.indices(indexName)
4431
request.addAliasAction(it)
4532
}
4633
val response: AcknowledgedResponse = context.client.admin().indices().suspendUntil { aliases(request, it) }
@@ -79,19 +66,6 @@ class AttemptAliasStep(private val action: AliasAction) : Step(name) {
7966
)
8067
}
8168

82-
private fun compileTemplate(
83-
template: Script,
84-
managedIndexMetaData: ManagedIndexMetaData,
85-
defaultValue: String,
86-
scriptService: ScriptService
87-
): String {
88-
val contextMap = managedIndexMetaData.convertToMap().filterKeys { key -> key in validTopContextFields }
89-
val compiledValue = scriptService.compile(template, TemplateScript.CONTEXT)
90-
.newInstance(template.params + mapOf("ctx" to contextMap))
91-
.execute()
92-
return compiledValue.ifBlank { defaultValue }
93-
}
94-
9569
override fun isIdempotent() = true
9670

9771
companion object {

src/test/kotlin/org/opensearch/indexmanagement/indexstatemanagement/TestHelpers.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,16 +208,22 @@ fun randomOpenActionConfig(): OpenAction {
208208
return OpenAction(index = 0)
209209
}
210210

211-
fun randomAliasAction(): AliasAction {
212-
val actions = List(OpenSearchRestTestCase.randomIntBetween(1, 10)) { randomAliasActions() }
211+
fun randomAliasAction(includeIndices: Boolean = false): AliasAction {
212+
val actions = List(OpenSearchRestTestCase.randomIntBetween(1, 10)) { if (includeIndices) randomAliasActionWithIndices() else randomAliasActions() }
213213
return AliasAction(actions = actions, index = 0)
214214
}
215215

216216
fun randomAliasActions(): IndicesAliasesRequest.AliasActions {
217217
val types = listOf(IndicesAliasesRequest.AliasActions.Type.ADD, IndicesAliasesRequest.AliasActions.Type.REMOVE)
218218
return IndicesAliasesRequest.AliasActions(OpenSearchRestTestCase.randomSubsetOf(1, types).first())
219219
.alias(OpenSearchRestTestCase.randomAlphaOfLength(10))
220-
.index(OpenSearchRestTestCase.randomAlphaOfLength(10))
220+
}
221+
222+
fun randomAliasActionWithIndices(): IndicesAliasesRequest.AliasActions {
223+
val types = listOf(IndicesAliasesRequest.AliasActions.Type.ADD, IndicesAliasesRequest.AliasActions.Type.REMOVE)
224+
return IndicesAliasesRequest.AliasActions(OpenSearchRestTestCase.randomSubsetOf(1, types).first())
225+
.alias(OpenSearchRestTestCase.randomAlphaOfLength(10))
226+
.indices(OpenSearchRestTestCase.randomAlphaOfLength(10))
221227
}
222228

223229
fun randomDestination(type: DestinationType = randomDestinationType()): Destination {

src/test/kotlin/org/opensearch/indexmanagement/indexstatemanagement/action/AliasActionIT.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ import java.time.temporal.ChronoUnit
1717
import java.util.Locale
1818

1919
class AliasActionIT : IndexStateManagementRestTestCase() {
20-
private val testIndexName = javaClass.simpleName.toLowerCase(Locale.ROOT)
20+
private val testIndexName = javaClass.simpleName.lowercase(Locale.ROOT)
2121

2222
fun `test adding alias to index`() {
2323
val indexName = "${testIndexName}_index_1"
2424
val policyID = "${testIndexName}_testPolicyName_1"
2525
val aliasName = "some_alias_to_add"
26-
val actions = listOf(IndicesAliasesRequest.AliasActions.add().alias(aliasName).index(indexName))
26+
val actions = listOf(IndicesAliasesRequest.AliasActions.add().alias(aliasName))
2727
val actionConfig = AliasAction(actions = actions, index = 0)
2828
val states = listOf(State("alias", listOf(actionConfig), listOf()))
2929

@@ -66,7 +66,7 @@ class AliasActionIT : IndexStateManagementRestTestCase() {
6666
val indexName = "${testIndexName}_index_2"
6767
val policyID = "${testIndexName}_testPolicyName_2"
6868
val aliasName = "some_alias_to_add"
69-
val actions = listOf(IndicesAliasesRequest.AliasActions.add().alias(aliasName).index("{{ctx.index}}"))
69+
val actions = listOf(IndicesAliasesRequest.AliasActions.add().alias(aliasName))
7070
val actionConfig = AliasAction(actions = actions, index = 0)
7171
val states = listOf(State("alias", listOf(actionConfig), listOf()))
7272

@@ -109,7 +109,7 @@ class AliasActionIT : IndexStateManagementRestTestCase() {
109109
val indexName = "${testIndexName}_index_3"
110110
val policyID = "${testIndexName}_testPolicyName_3"
111111
val aliasName = "some_alias_to_remove"
112-
val actions = listOf(IndicesAliasesRequest.AliasActions.remove().alias(aliasName).index(indexName))
112+
val actions = listOf(IndicesAliasesRequest.AliasActions.remove().alias(aliasName))
113113
val actionConfig = AliasAction(actions = actions, index = 0)
114114
val states = listOf(State("alias", listOf(actionConfig), listOf()))
115115

src/test/kotlin/org/opensearch/indexmanagement/indexstatemanagement/model/XContentTests.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import org.opensearch.indexmanagement.opensearchapi.convertToMap
4040
import org.opensearch.indexmanagement.opensearchapi.parseWithType
4141
import org.opensearch.indexmanagement.spi.indexstatemanagement.model.ManagedIndexMetaData
4242
import org.opensearch.test.OpenSearchTestCase
43+
import kotlin.test.assertFailsWith
4344

4445
class XContentTests : OpenSearchTestCase() {
4546

@@ -274,13 +275,23 @@ class XContentTests : OpenSearchTestCase() {
274275
}
275276

276277
fun `test alias action parsing`() {
277-
val aliasAction = randomAliasAction()
278-
278+
val aliasAction = randomAliasAction(false)
279279
val aliasActionString = aliasAction.toJsonString()
280280
val parsedAliasAction = ISMActionsParser.instance.parse(parser(aliasActionString), 0)
281281
assertEquals("Round tripping AliasAction doesn't work", aliasAction.convertToMap(), parsedAliasAction.convertToMap())
282282
}
283283

284+
fun `test alias action parsing with index`() {
285+
assertFailsWith<IllegalArgumentException>(
286+
message = "Alias actions are only allowed on managed indices.",
287+
block = {
288+
val aliasAction = randomAliasAction(true)
289+
val aliasActionString = aliasAction.toJsonString()
290+
ISMActionsParser.instance.parse(parser(aliasActionString), 0)
291+
}
292+
)
293+
}
294+
284295
private fun parser(xc: String): XContentParser {
285296
val parser = XContentType.JSON.xContent().createParser(xContentRegistry(), LoggingDeprecationHandler.INSTANCE, xc)
286297
parser.nextToken()

0 commit comments

Comments
 (0)