@@ -2,11 +2,15 @@ package org.opensearch.commons.alerting.action
22
33import org.junit.jupiter.api.Assertions
44import org.junit.jupiter.api.Test
5+ import org.opensearch.action.ActionRequestValidationException
56import org.opensearch.action.support.WriteRequest
67import org.opensearch.common.io.stream.BytesStreamOutput
78import org.opensearch.common.settings.Settings
9+ import org.opensearch.commons.alerting.model.DocLevelMonitorInput
10+ import org.opensearch.commons.alerting.model.Monitor
811import org.opensearch.commons.alerting.model.SearchInput
912import org.opensearch.commons.alerting.randomBucketLevelMonitor
13+ import org.opensearch.commons.alerting.randomDocumentLevelMonitor
1014import org.opensearch.commons.alerting.randomQueryLevelMonitor
1115import org.opensearch.commons.utils.recreateObject
1216import org.opensearch.core.common.io.stream.NamedWriteableAwareStreamInput
@@ -80,7 +84,10 @@ class IndexMonitorRequestTests {
8084 recreateObject(bucketLevelMonitorRequest) { IndexMonitorRequest (it) }
8185 }
8286
83- val recreatedObject = recreateObject(bucketLevelMonitorRequest, NamedWriteableRegistry (SearchModule (Settings .EMPTY , emptyList()).namedWriteables)) { IndexMonitorRequest (it) }
87+ val recreatedObject = recreateObject(
88+ bucketLevelMonitorRequest,
89+ NamedWriteableRegistry (SearchModule (Settings .EMPTY , emptyList()).namedWriteables)
90+ ) { IndexMonitorRequest (it) }
8491 Assertions .assertEquals(bucketLevelMonitorRequest.monitorId, recreatedObject.monitorId)
8592 Assertions .assertEquals(bucketLevelMonitorRequest.seqNo, recreatedObject.seqNo)
8693 Assertions .assertEquals(bucketLevelMonitorRequest.primaryTerm, recreatedObject.primaryTerm)
@@ -111,4 +118,111 @@ class IndexMonitorRequestTests {
111118 Assertions .assertEquals(RestRequest .Method .PUT , newReq.method)
112119 Assertions .assertNotNull(newReq.monitor)
113120 }
121+
122+ @Test
123+ fun `test doc level monitor with valid index name` () {
124+ val monitor = randomDocumentLevelMonitor().copy(
125+ inputs = listOf (DocLevelMonitorInput (indices = listOf (" valid-index" ), queries = emptyList())),
126+ triggers = emptyList()
127+ )
128+ val req = IndexMonitorRequest (
129+ " 1234" ,
130+ 1L ,
131+ 2L ,
132+ WriteRequest .RefreshPolicy .IMMEDIATE ,
133+ RestRequest .Method .POST ,
134+ monitor
135+ )
136+
137+ val validationException = req.validate()
138+ Assertions .assertNull(validationException)
139+ }
140+
141+ @Test
142+ fun `test doc level monitor with wildcard index pattern` () {
143+ val monitor = randomDocumentLevelMonitor().copy(
144+ inputs = listOf (DocLevelMonitorInput (indices = listOf (" valid, test*" , " test*" ), queries = emptyList()))
145+ )
146+ val req = IndexMonitorRequest (
147+ " 1234" ,
148+ 1L ,
149+ 2L ,
150+ WriteRequest .RefreshPolicy .IMMEDIATE ,
151+ RestRequest .Method .POST ,
152+ monitor
153+ )
154+
155+ val validationException = req.validate()
156+ Assertions .assertNotNull(validationException)
157+ Assertions .assertTrue(validationException is ActionRequestValidationException )
158+ Assertions .assertTrue(
159+ validationException!! .validationErrors().contains(" Index patterns are not supported for doc level monitors." )
160+ ? : false
161+ )
162+ }
163+
164+ @Test
165+ fun `test doc level monitor with regex index pattern` () {
166+ val monitor = randomDocumentLevelMonitor().copy(
167+ inputs = listOf (DocLevelMonitorInput (indices = listOf (" test[0-9]+" ), queries = emptyList())),
168+ triggers = emptyList()
169+ )
170+ val req = IndexMonitorRequest (
171+ " 1234" ,
172+ 1L ,
173+ 2L ,
174+ WriteRequest .RefreshPolicy .IMMEDIATE ,
175+ RestRequest .Method .POST ,
176+ monitor
177+ )
178+
179+ val validationException = req.validate()
180+ Assertions .assertNotNull(validationException)
181+ Assertions .assertTrue(validationException is ActionRequestValidationException )
182+ Assertions .assertTrue(
183+ validationException!! .validationErrors().contains(" Index patterns are not supported for doc level monitors." )
184+ )
185+ }
186+
187+ @Test
188+ fun `test doc level monitor with date math index pattern` () {
189+ val monitor = randomDocumentLevelMonitor().copy(
190+ inputs = listOf (DocLevelMonitorInput (indices = listOf (" <test-{now/d}>" ), queries = emptyList())),
191+ triggers = emptyList()
192+ )
193+ val req = IndexMonitorRequest (
194+ " 1234" ,
195+ 1L ,
196+ 2L ,
197+ WriteRequest .RefreshPolicy .IMMEDIATE ,
198+ RestRequest .Method .POST ,
199+ monitor
200+ )
201+
202+ val validationException = req.validate()
203+ Assertions .assertNotNull(validationException)
204+ Assertions .assertTrue(validationException is ActionRequestValidationException )
205+ Assertions .assertTrue(
206+ validationException!! .validationErrors().contains(" Index patterns are not supported for doc level monitors." )
207+ )
208+ }
209+
210+ @Test
211+ fun `test non-doc level monitor with index pattern` () {
212+ val monitor = randomQueryLevelMonitor().copy(
213+ inputs = listOf (SearchInput (listOf (" test*" ), SearchSourceBuilder ())),
214+ monitorType = Monitor .MonitorType .QUERY_LEVEL_MONITOR .name
215+ )
216+ val req = IndexMonitorRequest (
217+ " 1234" ,
218+ 1L ,
219+ 2L ,
220+ WriteRequest .RefreshPolicy .IMMEDIATE ,
221+ RestRequest .Method .POST ,
222+ monitor
223+ )
224+
225+ val validationException = req.validate()
226+ Assertions .assertNull(validationException)
227+ }
114228}
0 commit comments