Skip to content

Commit b737142

Browse files
authored
fix security-analytics to alerting integration (opensearch-project#294)
Signed-off-by: Subhobrata Dey <sbcd90@gmail.com>
1 parent d86f413 commit b737142

File tree

4 files changed

+93
-26
lines changed

4 files changed

+93
-26
lines changed

src/main/kotlin/org/opensearch/commons/alerting/action/GetFindingsResponse.kt

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.opensearch.rest.RestStatus
1010
import java.io.IOException
1111

1212
class GetFindingsResponse : BaseResponse {
13+
private var status: RestStatus
1314
var totalFindings: Int?
1415
var findings: List<FindingWithDocs>
1516

@@ -18,29 +19,43 @@ class GetFindingsResponse : BaseResponse {
1819
totalFindings: Int?,
1920
findings: List<FindingWithDocs>
2021
) : super() {
22+
this.status = status
2123
this.totalFindings = totalFindings
2224
this.findings = findings
2325
}
2426

2527
@Throws(IOException::class)
26-
constructor(sin: StreamInput) : this(
27-
status = RestStatus.OK,
28-
totalFindings = sin.readOptionalInt(),
29-
findings = sin.readList((FindingWithDocs)::readFrom)
30-
)
28+
constructor(sin: StreamInput) {
29+
this.status = sin.readEnum(RestStatus::class.java)
30+
val findings = mutableListOf<FindingWithDocs>()
31+
this.totalFindings = sin.readOptionalInt()
32+
var currentSize = sin.readInt()
33+
for (i in 0 until currentSize) {
34+
findings.add(FindingWithDocs.readFrom(sin))
35+
}
36+
this.findings = findings
37+
}
3138

3239
@Throws(IOException::class)
3340
override fun writeTo(out: StreamOutput) {
41+
out.writeEnum(status)
3442
out.writeOptionalInt(totalFindings)
35-
out.writeCollection(findings)
43+
out.writeInt(findings.size)
44+
for (finding in findings) {
45+
finding.writeTo(out)
46+
}
3647
}
3748

3849
@Throws(IOException::class)
3950
override fun toXContent(builder: XContentBuilder, params: ToXContent.Params): XContentBuilder {
4051
builder.startObject()
4152
.field("total_findings", totalFindings)
42-
.field("findings", findings.toTypedArray())
53+
.field("findings", findings)
4354

4455
return builder.endObject()
4556
}
57+
58+
override fun getStatus(): RestStatus {
59+
return this.status
60+
}
4661
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,21 @@ package org.opensearch.commons.alerting.model
33
import org.apache.logging.log4j.LogManager
44
import org.opensearch.common.io.stream.StreamInput
55
import org.opensearch.common.io.stream.StreamOutput
6+
import org.opensearch.common.io.stream.Writeable
67
import org.opensearch.common.xcontent.ToXContent
78
import org.opensearch.common.xcontent.XContentBuilder
89
import org.opensearch.common.xcontent.XContentParser
910
import org.opensearch.common.xcontent.XContentParserUtils
10-
import org.opensearch.commons.notifications.model.BaseModel
1111
import java.io.IOException
1212

1313
private val log = LogManager.getLogger(FindingDocument::class.java)
1414

15-
data class FindingDocument(
15+
class FindingDocument(
1616
val index: String,
1717
val id: String,
1818
val found: Boolean,
1919
val document: String
20-
) : BaseModel {
20+
) : Writeable, ToXContent {
2121

2222
@Throws(IOException::class)
2323
constructor(sin: StreamInput) : this(
@@ -52,7 +52,7 @@ data class FindingDocument(
5252
const val NO_ID = ""
5353
const val NO_INDEX = ""
5454

55-
@JvmStatic
55+
@JvmStatic @JvmOverloads
5656
@Throws(IOException::class)
5757
fun parse(xcp: XContentParser, id: String = NO_ID, index: String = NO_INDEX): FindingDocument {
5858
var found = false

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

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,19 @@ package org.opensearch.commons.alerting.model
33
import org.apache.logging.log4j.LogManager
44
import org.opensearch.common.io.stream.StreamInput
55
import org.opensearch.common.io.stream.StreamOutput
6+
import org.opensearch.common.io.stream.Writeable
67
import org.opensearch.common.xcontent.ToXContent
78
import org.opensearch.common.xcontent.XContentBuilder
89
import org.opensearch.common.xcontent.XContentParser
910
import org.opensearch.common.xcontent.XContentParserUtils
10-
import org.opensearch.commons.notifications.model.BaseModel
1111
import java.io.IOException
1212

1313
private val log = LogManager.getLogger(Finding::class.java)
1414

15-
class FindingWithDocs : BaseModel {
16-
var finding: Finding
17-
var documents: List<FindingDocument>
18-
19-
constructor(
20-
finding: Finding,
21-
documents: List<FindingDocument>
22-
) : super() {
23-
this.finding = finding
24-
this.documents = documents
25-
}
15+
class FindingWithDocs(
16+
val finding: Finding,
17+
val documents: List<FindingDocument>
18+
) : Writeable, ToXContent {
2619

2720
@Throws(IOException::class)
2821
constructor(sin: StreamInput) : this(
@@ -38,10 +31,8 @@ class FindingWithDocs : BaseModel {
3831

3932
override fun toXContent(builder: XContentBuilder, params: ToXContent.Params): XContentBuilder {
4033
builder.startObject()
41-
.startObject("finding_with_docs")
4234
.field(FINDING_FIELD, finding)
43-
.field(DOCUMENTS_FIELD, documents.toTypedArray())
44-
.endObject()
35+
.field(DOCUMENTS_FIELD, documents)
4536
builder.endObject()
4637
return builder
4738
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package org.opensearch.commons.alerting.action
2+
3+
import org.junit.jupiter.api.Assertions
4+
import org.junit.jupiter.api.Test
5+
import org.opensearch.common.io.stream.BytesStreamOutput
6+
import org.opensearch.common.io.stream.StreamInput
7+
import org.opensearch.commons.alerting.model.DocLevelQuery
8+
import org.opensearch.commons.alerting.model.Finding
9+
import org.opensearch.commons.alerting.model.FindingDocument
10+
import org.opensearch.commons.alerting.model.FindingWithDocs
11+
import org.opensearch.rest.RestStatus
12+
import java.time.Instant
13+
import java.util.List
14+
15+
internal class GetFindingsResponseTests {
16+
17+
@Test
18+
fun `test get findings response`() {
19+
20+
// Alerting GetFindingsResponse mock #1
21+
val finding1 = Finding(
22+
"1",
23+
listOf("doc1", "doc2", "doc3"),
24+
"monitor_id1",
25+
"monitor_name1",
26+
"test_index1",
27+
listOf(DocLevelQuery("1", "myQuery", "fieldA:valABC", List.of())),
28+
Instant.now()
29+
)
30+
val findingDocument1 = FindingDocument("test_index1", "doc1", true, "document 1 payload")
31+
val findingDocument2 = FindingDocument("test_index1", "doc2", true, "document 2 payload")
32+
val findingDocument3 = FindingDocument("test_index1", "doc3", true, "document 3 payload")
33+
34+
val findingWithDocs1 = FindingWithDocs(finding1, listOf(findingDocument1, findingDocument2, findingDocument3))
35+
36+
// Alerting GetFindingsResponse mock #2
37+
38+
// Alerting GetFindingsResponse mock #2
39+
val finding2 = Finding(
40+
"1",
41+
listOf("doc21", "doc22"),
42+
"monitor_id2",
43+
"monitor_name2",
44+
"test_index2",
45+
listOf(DocLevelQuery("1", "myQuery", "fieldA:valABC", List.of())),
46+
Instant.now()
47+
)
48+
val findingDocument21 = FindingDocument("test_index2", "doc21", true, "document 21 payload")
49+
val findingDocument22 = FindingDocument("test_index2", "doc22", true, "document 22 payload")
50+
51+
val findingWithDocs2 = FindingWithDocs(finding2, listOf(findingDocument21, findingDocument22))
52+
53+
val req = GetFindingsResponse(RestStatus.OK, 2, listOf(findingWithDocs1, findingWithDocs2))
54+
Assertions.assertNotNull(req)
55+
56+
val out = BytesStreamOutput()
57+
req.writeTo(out)
58+
val sin = StreamInput.wrap(out.bytes().toBytesRef().bytes)
59+
val newReq = GetFindingsResponse(sin)
60+
}
61+
}

0 commit comments

Comments
 (0)