@@ -26,6 +26,8 @@ import org.opensearch.alerting.randomAnomalyDetector
26
26
import org.opensearch.alerting.randomAnomalyDetectorWithUser
27
27
import org.opensearch.alerting.randomBucketLevelMonitor
28
28
import org.opensearch.alerting.randomBucketLevelTrigger
29
+ import org.opensearch.alerting.randomDocLevelMonitorInput
30
+ import org.opensearch.alerting.randomDocLevelQuery
29
31
import org.opensearch.alerting.randomDocumentLevelMonitor
30
32
import org.opensearch.alerting.randomDocumentLevelTrigger
31
33
import org.opensearch.alerting.randomQueryLevelMonitor
@@ -48,6 +50,7 @@ import org.opensearch.commons.alerting.model.Monitor
48
50
import org.opensearch.commons.alerting.model.QueryLevelTrigger
49
51
import org.opensearch.commons.alerting.model.ScheduledJob
50
52
import org.opensearch.commons.alerting.model.SearchInput
53
+ import org.opensearch.commons.utils.getInvalidNameChars
51
54
import org.opensearch.core.common.bytes.BytesReference
52
55
import org.opensearch.core.rest.RestStatus
53
56
import org.opensearch.core.xcontent.ToXContent
@@ -1285,6 +1288,50 @@ class MonitorRestApiIT : AlertingRestTestCase() {
1285
1288
}
1286
1289
}
1287
1290
1291
+ fun `test creating and updating a document monitor with invalid query name` () {
1292
+ // creating a monitor with an invalid query name
1293
+ val invalidQueryName = " _Invalid .. query ! n>ame"
1294
+ val queries = listOf (randomDocLevelQuery(name = invalidQueryName))
1295
+ val randomDocLevelMonitorInput = randomDocLevelMonitorInput(queries = queries)
1296
+ val inputs = listOf (randomDocLevelMonitorInput)
1297
+ val trigger = randomDocumentLevelTrigger()
1298
+ var monitor = randomDocumentLevelMonitor(inputs = inputs, triggers = listOf (trigger))
1299
+
1300
+ try {
1301
+ client().makeRequest(" POST" , ALERTING_BASE_URI , emptyMap(), monitor.toHttpEntity())
1302
+ fail(" Doc level monitor with invalid query name should be rejected" )
1303
+ } catch (e: ResponseException ) {
1304
+ assertEquals(" Unexpected status" , RestStatus .BAD_REQUEST , e.response.restStatus())
1305
+ val expectedMessage = " Doc level query name may not start with [_, +, -], contain '..', or contain: " +
1306
+ getInvalidNameChars().replace(" \\ " , " " )
1307
+ e.message?.let { assertTrue(it.contains(expectedMessage)) }
1308
+ }
1309
+
1310
+ // successfully creating monitor with valid query name
1311
+ val testIndex = createTestIndex()
1312
+ val docQuery = DocLevelQuery (query = " test_field:\" us-west-2\" " , name = " valid (name)" , fields = listOf ())
1313
+ val docLevelInput = DocLevelMonitorInput (" description" , listOf (testIndex), listOf (docQuery))
1314
+
1315
+ monitor = createMonitor(randomDocumentLevelMonitor(inputs = listOf (docLevelInput), triggers = listOf (trigger)))
1316
+
1317
+ // updating monitor with invalid query name
1318
+ val updatedDocQuery = DocLevelQuery (query = " test_field:\" us-west-2\" " , name = invalidQueryName, fields = listOf ())
1319
+ val updatedDocLevelInput = DocLevelMonitorInput (" description" , listOf (testIndex), listOf (updatedDocQuery))
1320
+
1321
+ try {
1322
+ client().makeRequest(
1323
+ " PUT" , monitor.relativeUrl(),
1324
+ emptyMap(), monitor.copy(inputs = listOf (updatedDocLevelInput)).toHttpEntity()
1325
+ )
1326
+ fail(" Doc level monitor with invalid query name should be rejected" )
1327
+ } catch (e: ResponseException ) {
1328
+ assertEquals(" Unexpected status" , RestStatus .BAD_REQUEST , e.response.restStatus())
1329
+ val expectedMessage = " Doc level query name may not start with [_, +, -], contain '..', or contain: " +
1330
+ getInvalidNameChars().replace(" \\ " , " " )
1331
+ e.message?.let { assertTrue(it.contains(expectedMessage)) }
1332
+ }
1333
+ }
1334
+
1288
1335
/* *
1289
1336
* This use case is needed by the frontend plugin for displaying alert counts on the Monitors list page.
1290
1337
* https://github.com/opensearch-project/alerting-dashboards-plugin/blob/main/server/services/MonitorService.js#L235
0 commit comments