Skip to content

Commit fb5d525

Browse files
authored
add missing ctx variables (#710)
Signed-off-by: Joanne Wang <[email protected]>
1 parent 41a042b commit fb5d525

19 files changed

+403
-22
lines changed

src/main/kotlin/org/opensearch/commons/alerting/model/BucketLevelTrigger.kt

+9-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,12 @@ data class BucketLevelTrigger(
7070
SEVERITY_FIELD to severity,
7171
ACTIONS_FIELD to actions.map { it.asTemplateArg() },
7272
PARENT_BUCKET_PATH to getParentBucketPath(),
73-
CONDITION_FIELD to getCondition()
73+
CONDITION_FIELD to mapOf(
74+
SCRIPT_FIELD to mapOf(
75+
SOURCE_FIELD to bucketSelector.script.idOrCode,
76+
LANG_FIELD to bucketSelector.script.lang
77+
)
78+
)
7479
)
7580
}
7681

@@ -86,6 +91,9 @@ data class BucketLevelTrigger(
8691
const val BUCKET_LEVEL_TRIGGER_FIELD = "bucket_level_trigger"
8792
const val CONDITION_FIELD = "condition"
8893
const val PARENT_BUCKET_PATH = "parentBucketPath"
94+
const val SCRIPT_FIELD = "script"
95+
const val SOURCE_FIELD = "source"
96+
const val LANG_FIELD = "lang"
8997

9098
val XCONTENT_REGISTRY = NamedXContentRegistry.Entry(
9199
Trigger::class.java,

src/main/kotlin/org/opensearch/commons/alerting/model/DocLevelMonitorInput.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ data class DocLevelMonitorInput(
2424
sin.readList(::DocLevelQuery) // docLevelQueries
2525
)
2626

27-
fun asTemplateArg(): Map<String, Any?> {
27+
override fun asTemplateArg(): Map<String, Any> {
2828
return mapOf(
2929
DESCRIPTION_FIELD to description,
3030
INDICES_FIELD to indices,

src/main/kotlin/org/opensearch/commons/alerting/model/DocumentLevelTrigger.kt

+9-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,13 @@ data class DocumentLevelTrigger(
6060
ID_FIELD to id,
6161
NAME_FIELD to name,
6262
SEVERITY_FIELD to severity,
63-
ACTIONS_FIELD to actions.map { it.asTemplateArg() }
63+
ACTIONS_FIELD to actions.map { it.asTemplateArg() },
64+
CONDITION_FIELD to mapOf(
65+
SCRIPT_FIELD to mapOf(
66+
SOURCE_FIELD to condition.idOrCode,
67+
LANG_FIELD to condition.lang
68+
)
69+
)
6470
)
6571
}
6672

@@ -78,6 +84,8 @@ data class DocumentLevelTrigger(
7884
const val CONDITION_FIELD = "condition"
7985
const val SCRIPT_FIELD = "script"
8086
const val QUERY_IDS_FIELD = "query_ids"
87+
const val SOURCE_FIELD = "source"
88+
const val LANG_FIELD = "lang"
8189

8290
val XCONTENT_REGISTRY = NamedXContentRegistry.Entry(
8391
Trigger::class.java,

src/main/kotlin/org/opensearch/commons/alerting/model/Input.kt

+3
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,7 @@ interface Input : BaseModel {
6666
}
6767

6868
fun name(): String
69+
70+
/** Returns a representation of the schedule suitable for passing into painless and mustache scripts. */
71+
fun asTemplateArg(): Map<String, Any> = emptyMap()
6972
}

src/main/kotlin/org/opensearch/commons/alerting/model/Monitor.kt

+12-2
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,18 @@ data class Monitor(
127127
}
128128

129129
/** Returns a representation of the monitor suitable for passing into painless and mustache scripts. */
130-
fun asTemplateArg(): Map<String, Any> {
131-
return mapOf(_ID to id, _VERSION to version, NAME_FIELD to name, ENABLED_FIELD to enabled)
130+
fun asTemplateArg(): Map<String, Any?> {
131+
return mapOf(
132+
_ID to id,
133+
_VERSION to version,
134+
NAME_FIELD to name,
135+
ENABLED_FIELD to enabled,
136+
MONITOR_TYPE_FIELD to monitorType.toString(),
137+
ENABLED_TIME_FIELD to enabledTime?.toEpochMilli(),
138+
LAST_UPDATE_TIME_FIELD to lastUpdateTime.toEpochMilli(),
139+
SCHEDULE_FIELD to schedule.asTemplateArg(),
140+
INPUTS_FIELD to inputs.map { it.asTemplateArg() }
141+
)
132142
}
133143

134144
fun toXContentWithUser(builder: XContentBuilder, params: ToXContent.Params): XContentBuilder {

src/main/kotlin/org/opensearch/commons/alerting/model/QueryLevelTrigger.kt

+9-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,13 @@ data class QueryLevelTrigger(
6060
ID_FIELD to id,
6161
NAME_FIELD to name,
6262
SEVERITY_FIELD to severity,
63-
ACTIONS_FIELD to actions.map { it.asTemplateArg() }
63+
ACTIONS_FIELD to actions.map { it.asTemplateArg() },
64+
CONDITION_FIELD to mapOf(
65+
SCRIPT_FIELD to mapOf(
66+
SOURCE_FIELD to condition.idOrCode,
67+
LANG_FIELD to condition.lang
68+
)
69+
)
6470
)
6571
}
6672

@@ -77,6 +83,8 @@ data class QueryLevelTrigger(
7783
const val QUERY_LEVEL_TRIGGER_FIELD = "query_level_trigger"
7884
const val CONDITION_FIELD = "condition"
7985
const val SCRIPT_FIELD = "script"
86+
const val SOURCE_FIELD = "source"
87+
const val LANG_FIELD = "lang"
8088

8189
val XCONTENT_REGISTRY = NamedXContentRegistry.Entry(
8290
Trigger::class.java,

src/main/kotlin/org/opensearch/commons/alerting/model/Schedule.kt

+19
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,9 @@ sealed class Schedule : BaseModel {
146146
abstract fun getPeriodEndingAt(endTime: Instant?): Pair<Instant, Instant>
147147

148148
abstract fun runningOnTime(lastExecutionTime: Instant?): Boolean
149+
150+
/** Returns a representation of the schedule suitable for passing into painless and mustache scripts. */
151+
abstract fun asTemplateArg(): Map<String, Any>
149152
}
150153

151154
/**
@@ -257,6 +260,14 @@ data class CronSchedule(
257260
out.writeString(expression)
258261
out.writeZoneId(timezone)
259262
}
263+
264+
override fun asTemplateArg(): Map<String, Any> =
265+
mapOf(
266+
CRON_FIELD to mapOf(
267+
EXPRESSION_FIELD to expression,
268+
TIMEZONE_FIELD to timezone.toString()
269+
)
270+
)
260271
}
261272

262273
data class IntervalSchedule(
@@ -354,4 +365,12 @@ data class IntervalSchedule(
354365
out.writeInt(interval)
355366
out.writeEnum(unit)
356367
}
368+
369+
override fun asTemplateArg(): Map<String, Any> =
370+
mapOf(
371+
PERIOD_FIELD to mapOf(
372+
INTERVAL_FIELD to interval,
373+
UNIT_FIELD to unit.toString()
374+
)
375+
)
357376
}

src/main/kotlin/org/opensearch/commons/alerting/model/SearchInput.kt

+8
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,12 @@ data class SearchInput(val indices: List<String>, val query: SearchSourceBuilder
8585
return SearchInput(sin)
8686
}
8787
}
88+
89+
override fun asTemplateArg(): Map<String, Any> =
90+
mapOf(
91+
SEARCH_FIELD to mapOf(
92+
INDICES_FIELD to indices,
93+
QUERY_FIELD to query.toString()
94+
)
95+
)
8896
}

src/main/kotlin/org/opensearch/commons/alerting/model/action/Action.kt

+6-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,12 @@ data class Action(
6565
}
6666

6767
fun asTemplateArg(): Map<String, Any> {
68-
return mapOf(NAME_FIELD to name)
68+
return mapOf(
69+
ID_FIELD to id,
70+
NAME_FIELD to name,
71+
DESTINATION_ID_FIELD to destinationId,
72+
THROTTLE_ENABLED_FIELD to throttleEnabled
73+
)
6974
}
7075

7176
@Throws(IOException::class)

src/main/kotlin/org/opensearch/commons/alerting/model/remote/monitors/RemoteDocLevelMonitorInput.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ data class RemoteDocLevelMonitorInput(val input: BytesReference, val docLevelMon
2121
DocLevelMonitorInput.readFrom(sin)
2222
)
2323

24-
fun asTemplateArg(): Map<String, Any?> {
24+
override fun asTemplateArg(): Map<String, Any> {
2525
val bytes = input.toBytesRef().bytes
2626
return mapOf(
2727
RemoteDocLevelMonitorInput.INPUT_SIZE to bytes.size,

src/main/kotlin/org/opensearch/commons/alerting/model/remote/monitors/RemoteMonitorInput.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ data class RemoteMonitorInput(val input: BytesReference) : Input {
1818
sin.readBytesReference()
1919
)
2020

21-
fun asTemplateArg(): Map<String, Any?> {
21+
override fun asTemplateArg(): Map<String, Any> {
2222
val bytes = input.toBytesRef().bytes
2323
return mapOf(
2424
INPUT_SIZE to bytes.size,

src/test/kotlin/org/opensearch/commons/alerting/TestHelpers.kt

+7
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,13 @@ fun randomDocLevelMonitorInput(
408408
return DocLevelMonitorInput(description = description, indices = indices, queries = queries)
409409
}
410410

411+
fun randomSearchInput(
412+
indices: List<String> = listOf(1..RandomNumbers.randomIntBetween(Random(), 0, 10)).map { RandomStrings.randomAsciiLettersOfLength(Random(), 10) },
413+
query: SearchSourceBuilder = SearchSourceBuilder().query(QueryBuilders.matchAllQuery())
414+
): SearchInput {
415+
return SearchInput(indices, query)
416+
}
417+
411418
fun randomClusterMetricsInput(
412419
path: String = ClusterMetricsInput.ClusterMetricType.values()
413420
.filter { it.defaultPath.isNotBlank() && !it.requiresPathParams }
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,54 @@
11
package org.opensearch.commons.alerting.model
22

33
import org.junit.jupiter.api.Test
4+
import org.opensearch.commons.alerting.model.BucketLevelTrigger.Companion.CONDITION_FIELD
5+
import org.opensearch.commons.alerting.model.BucketLevelTrigger.Companion.LANG_FIELD
6+
import org.opensearch.commons.alerting.model.BucketLevelTrigger.Companion.PARENT_BUCKET_PATH
7+
import org.opensearch.commons.alerting.model.BucketLevelTrigger.Companion.SCRIPT_FIELD
8+
import org.opensearch.commons.alerting.model.BucketLevelTrigger.Companion.SOURCE_FIELD
9+
import org.opensearch.commons.alerting.model.Trigger.Companion.ACTIONS_FIELD
10+
import org.opensearch.commons.alerting.model.Trigger.Companion.ID_FIELD
11+
import org.opensearch.commons.alerting.model.Trigger.Companion.NAME_FIELD
12+
import org.opensearch.commons.alerting.model.Trigger.Companion.SEVERITY_FIELD
413
import org.opensearch.commons.alerting.randomBucketLevelTrigger
514
import kotlin.test.assertEquals
15+
import kotlin.test.assertNotNull
616

717
class BucketLevelTriggerTests {
818

919
@Test
10-
fun `test asTemplateArgs returns expected values`() {
11-
val bucketLevelTrigger = randomBucketLevelTrigger()
12-
val templateArg = bucketLevelTrigger.asTemplateArg()
20+
fun `test BucketLevelTrigger asTemplateArgs`() {
21+
val trigger = randomBucketLevelTrigger()
1322

14-
assertEquals(templateArg[Trigger.ID_FIELD], bucketLevelTrigger.id)
15-
assertEquals(templateArg[Trigger.NAME_FIELD], bucketLevelTrigger.name)
16-
assertEquals(templateArg[Trigger.SEVERITY_FIELD], bucketLevelTrigger.severity)
17-
assertEquals(templateArg[Trigger.ACTIONS_FIELD], bucketLevelTrigger.actions.map { it.asTemplateArg() })
18-
assertEquals(templateArg[BucketLevelTrigger.PARENT_BUCKET_PATH], bucketLevelTrigger.bucketSelector.parentBucketPath)
19-
assertEquals(templateArg[BucketLevelTrigger.CONDITION_FIELD], bucketLevelTrigger.bucketSelector.script.idOrCode)
23+
val templateArgs = trigger.asTemplateArg()
24+
25+
assertEquals(trigger.id, templateArgs[ID_FIELD], "Template arg field 'id' doesn't match")
26+
assertEquals(trigger.name, templateArgs[NAME_FIELD], "Template arg field 'name' doesn't match")
27+
assertEquals(trigger.severity, templateArgs[SEVERITY_FIELD], "Template arg field 'severity' doesn't match")
28+
val actions = templateArgs[ACTIONS_FIELD] as List<*>
29+
assertEquals(
30+
trigger.actions.size,
31+
actions.size,
32+
"Template arg field 'actions' doesn't match"
33+
)
34+
assertEquals(
35+
trigger.getParentBucketPath(),
36+
templateArgs[PARENT_BUCKET_PATH],
37+
"Template arg field 'parentBucketPath' doesn't match"
38+
)
39+
val condition = templateArgs[CONDITION_FIELD] as? Map<*, *>
40+
assertNotNull(condition, "Template arg field 'condition' is empty")
41+
val script = condition[SCRIPT_FIELD] as? Map<*, *>
42+
assertNotNull(script, "Template arg field 'condition.script' is empty")
43+
assertEquals(
44+
trigger.bucketSelector.script.idOrCode,
45+
script[SOURCE_FIELD],
46+
"Template arg field 'script.source' doesn't match"
47+
)
48+
assertEquals(
49+
trigger.bucketSelector.script.lang,
50+
script[LANG_FIELD],
51+
"Template arg field 'script.lang' doesn't match"
52+
)
2053
}
2154
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.opensearch.commons.alerting.model
2+
3+
import org.junit.jupiter.api.Test
4+
import org.opensearch.commons.alerting.model.DocumentLevelTrigger.Companion.CONDITION_FIELD
5+
import org.opensearch.commons.alerting.model.DocumentLevelTrigger.Companion.LANG_FIELD
6+
import org.opensearch.commons.alerting.model.DocumentLevelTrigger.Companion.SCRIPT_FIELD
7+
import org.opensearch.commons.alerting.model.DocumentLevelTrigger.Companion.SOURCE_FIELD
8+
import org.opensearch.commons.alerting.model.Trigger.Companion.ACTIONS_FIELD
9+
import org.opensearch.commons.alerting.model.Trigger.Companion.ID_FIELD
10+
import org.opensearch.commons.alerting.model.Trigger.Companion.NAME_FIELD
11+
import org.opensearch.commons.alerting.model.Trigger.Companion.SEVERITY_FIELD
12+
import org.opensearch.commons.alerting.randomDocumentLevelTrigger
13+
import kotlin.test.assertEquals
14+
import kotlin.test.assertNotNull
15+
16+
class DocumentLevelTriggerTests {
17+
18+
@Test
19+
fun `test DocumentLevelTrigger asTemplateArgs`() {
20+
val trigger = randomDocumentLevelTrigger()
21+
22+
val templateArgs = trigger.asTemplateArg()
23+
24+
assertEquals(trigger.id, templateArgs[ID_FIELD], "Template arg field 'id' doesn't match")
25+
assertEquals(trigger.name, templateArgs[NAME_FIELD], "Template arg field 'name' doesn't match")
26+
assertEquals(trigger.severity, templateArgs[SEVERITY_FIELD], "Template arg field 'severity' doesn't match")
27+
val actions = templateArgs[ACTIONS_FIELD] as List<*>
28+
assertEquals(
29+
trigger.actions.size,
30+
actions.size,
31+
"Template arg field 'actions' doesn't match"
32+
)
33+
val condition = templateArgs[CONDITION_FIELD] as? Map<*, *>
34+
assertNotNull(condition, "Template arg field 'condition' is empty")
35+
val script = condition[SCRIPT_FIELD] as? Map<*, *>
36+
assertNotNull(script, "Template arg field 'condition.script' is empty")
37+
assertEquals(
38+
trigger.condition.idOrCode,
39+
script[SOURCE_FIELD],
40+
"Template arg field 'script.source' doesn't match"
41+
)
42+
assertEquals(
43+
trigger.condition.lang,
44+
script[LANG_FIELD],
45+
"Template arg field 'script.lang' doesn't match"
46+
)
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.opensearch.commons.alerting.model
2+
3+
import org.junit.jupiter.api.Test
4+
import org.opensearch.commons.alerting.randomQueryLevelMonitor
5+
import org.opensearch.commons.alerting.util.IndexUtils
6+
import kotlin.test.assertEquals
7+
import kotlin.test.assertNotNull
8+
9+
class MonitorsTests {
10+
11+
@Test
12+
fun `test monitor asTemplateArgs`() {
13+
val monitor = randomQueryLevelMonitor(enabled = true)
14+
15+
val templateArgs = monitor.asTemplateArg()
16+
17+
assertEquals(monitor.id, templateArgs[IndexUtils._ID], "Template arg field 'id' doesn't match")
18+
assertEquals(
19+
monitor.version,
20+
templateArgs[IndexUtils._VERSION],
21+
"Template arg field 'version' doesn't match"
22+
)
23+
assertEquals(monitor.name, templateArgs[Monitor.NAME_FIELD], "Template arg field 'name' doesn't match")
24+
assertEquals(
25+
monitor.enabled,
26+
templateArgs[Monitor.ENABLED_FIELD],
27+
"Template arg field 'enabled' doesn't match"
28+
)
29+
assertEquals(
30+
monitor.monitorType.toString(),
31+
templateArgs[Monitor.MONITOR_TYPE_FIELD],
32+
"Template arg field 'monitoryType' doesn't match"
33+
)
34+
assertEquals(
35+
monitor.enabledTime?.toEpochMilli(),
36+
templateArgs[Monitor.ENABLED_TIME_FIELD],
37+
"Template arg field 'enabledTime' doesn't match"
38+
)
39+
assertEquals(
40+
monitor.lastUpdateTime.toEpochMilli(),
41+
templateArgs[Monitor.LAST_UPDATE_TIME_FIELD],
42+
"Template arg field 'lastUpdateTime' doesn't match"
43+
)
44+
assertNotNull(templateArgs[Monitor.SCHEDULE_FIELD], "Template arg field 'schedule' not set")
45+
val inputs = templateArgs[Monitor.INPUTS_FIELD] as? List<*>
46+
assertNotNull(inputs, "Template arg field 'inputs' not set")
47+
assertEquals(1, inputs.size, "Template arg field 'inputs' is not populated")
48+
}
49+
}

0 commit comments

Comments
 (0)