Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Alerting Enhancements: Alerting Comments (Experimental) #663

Merged
merged 11 commits into from
Jun 7, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ object AlertingActions {
const val SUBSCRIBE_FINDINGS_ACTION_NAME = "cluster:admin/opensearch/alerting/findings/subscribe"
const val GET_MONITOR_ACTION_NAME = "cluster:admin/opendistro/alerting/monitor/get"
const val SEARCH_MONITORS_ACTION_NAME = "cluster:admin/opendistro/alerting/monitor/search"
const val INDEX_COMMENT_ACTION_NAME = "cluster:admin/opensearch/alerting/alerts/comments/write"
const val SEARCH_COMMENTS_ACTION_NAME = "cluster:admin/opensearch/alerting/alerts/comments/search"
const val DELETE_COMMENT_ACTION_NAME = "cluster:admin/opensearch/alerting/alerts/comments/delete"

@JvmField
val INDEX_MONITOR_ACTION_TYPE =
Expand Down Expand Up @@ -73,4 +76,16 @@ object AlertingActions {
@JvmField
val SEARCH_MONITORS_ACTION_TYPE =
ActionType(SEARCH_MONITORS_ACTION_NAME, ::SearchResponse)

@JvmField
val INDEX_COMMENT_ACTION_TYPE =
ActionType(INDEX_COMMENT_ACTION_NAME, ::IndexCommentResponse)

@JvmField
val SEARCH_COMMENTS_ACTION_TYPE =
ActionType(SEARCH_COMMENTS_ACTION_NAME, ::SearchResponse)

@JvmField
val DELETE_COMMENT_ACTION_TYPE =
ActionType(DELETE_COMMENT_ACTION_NAME, ::DeleteCommentResponse)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.opensearch.commons.alerting.action

import org.opensearch.action.ActionRequest
import org.opensearch.action.ActionRequestValidationException
import org.opensearch.core.common.io.stream.StreamInput
import org.opensearch.core.common.io.stream.StreamOutput
import java.io.IOException

class DeleteCommentRequest : ActionRequest {
val commentId: String

constructor(commentId: String) : super() {
this.commentId = commentId
AWSHurneyt marked this conversation as resolved.
Show resolved Hide resolved
}

@Throws(IOException::class)
constructor(sin: StreamInput) : this(
commentId = sin.readString()
)

override fun validate(): ActionRequestValidationException? {
if (commentId.isBlank()) {
val exception = ActionRequestValidationException()
exception.addValidationError("comment id must not be blank")
return exception
}
return null
}

@Throws(IOException::class)
override fun writeTo(out: StreamOutput) {
out.writeString(commentId)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.opensearch.commons.alerting.action

import org.opensearch.commons.alerting.util.IndexUtils
import org.opensearch.commons.notifications.action.BaseResponse
import org.opensearch.core.common.io.stream.StreamInput
import org.opensearch.core.common.io.stream.StreamOutput
import org.opensearch.core.xcontent.ToXContent
import org.opensearch.core.xcontent.XContentBuilder

class DeleteCommentResponse : BaseResponse {
AWSHurneyt marked this conversation as resolved.
Show resolved Hide resolved
toepkerd marked this conversation as resolved.
Show resolved Hide resolved
var commentId: String

constructor(
id: String
) : super() {
this.commentId = id
}

constructor(sin: StreamInput) : this(
sin.readString() // commentId
)

override fun writeTo(out: StreamOutput) {
out.writeString(commentId)
}

override fun toXContent(builder: XContentBuilder, params: ToXContent.Params): XContentBuilder {
return builder.startObject()
.field(IndexUtils._ID, commentId)
.endObject()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package org.opensearch.commons.alerting.action

import org.opensearch.action.ActionRequest
import org.opensearch.action.ActionRequestValidationException
import org.opensearch.core.common.io.stream.StreamInput
import org.opensearch.core.common.io.stream.StreamOutput
import org.opensearch.rest.RestRequest
import java.io.IOException

/**
* Request to index/create a Comment
*
* entityId: the entity that the Comment is attached to and therefore associated with (e.g. in Alerting,
* the entity is an Alert). This field is expected to be non-blank if the request is to create a new Comment.
*
* commentId: the ID of an existing Comment. This field is expected to be non-blank if the request is to
* update an existing Comment.
*/
class IndexCommentRequest : ActionRequest {
val entityId: String
toepkerd marked this conversation as resolved.
Show resolved Hide resolved
val commentId: String
val seqNo: Long
val primaryTerm: Long
val method: RestRequest.Method
var content: String

constructor(
entityId: String,
commentId: String,
seqNo: Long,
AWSHurneyt marked this conversation as resolved.
Show resolved Hide resolved
primaryTerm: Long,
method: RestRequest.Method,
content: String
) : super() {
this.entityId = entityId
this.commentId = commentId
this.seqNo = seqNo
this.primaryTerm = primaryTerm
this.method = method
this.content = content
}

@Throws(IOException::class)
constructor(sin: StreamInput) : this(
entityId = sin.readString(),
commentId = sin.readString(),
seqNo = sin.readLong(),
primaryTerm = sin.readLong(),
method = sin.readEnum(RestRequest.Method::class.java),
content = sin.readString()
)

override fun validate(): ActionRequestValidationException? {
if (method == RestRequest.Method.POST && entityId.isBlank() ||
method == RestRequest.Method.PUT && commentId.isBlank()
) {
val exception = ActionRequestValidationException()
exception.addValidationError("id must not be blank")
return exception
}
return null
AWSHurneyt marked this conversation as resolved.
Show resolved Hide resolved
}

@Throws(IOException::class)
override fun writeTo(out: StreamOutput) {
out.writeString(entityId)
out.writeString(commentId)
out.writeLong(seqNo)
out.writeLong(primaryTerm)
out.writeEnum(method)
out.writeString(content)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package org.opensearch.commons.alerting.action

import org.opensearch.commons.alerting.model.Comment
import org.opensearch.commons.alerting.util.IndexUtils.Companion._ID
import org.opensearch.commons.alerting.util.IndexUtils.Companion._PRIMARY_TERM
import org.opensearch.commons.alerting.util.IndexUtils.Companion._SEQ_NO
import org.opensearch.commons.notifications.action.BaseResponse
import org.opensearch.core.common.io.stream.StreamInput
import org.opensearch.core.common.io.stream.StreamOutput
import org.opensearch.core.xcontent.ToXContent
import org.opensearch.core.xcontent.XContentBuilder
import java.io.IOException

class IndexCommentResponse : BaseResponse {
AWSHurneyt marked this conversation as resolved.
Show resolved Hide resolved
var id: String
var seqNo: Long
var primaryTerm: Long
var comment: Comment

constructor(
id: String,
seqNo: Long,
primaryTerm: Long,
comment: Comment
) : super() {
this.id = id
this.seqNo = seqNo
this.primaryTerm = primaryTerm
this.comment = comment
}

@Throws(IOException::class)
constructor(sin: StreamInput) : this(
sin.readString(), // id
sin.readLong(), // seqNo
sin.readLong(), // primaryTerm
Comment.readFrom(sin) // comment
)

@Throws(IOException::class)
override fun writeTo(out: StreamOutput) {
out.writeString(id)
out.writeLong(seqNo)
out.writeLong(primaryTerm)
comment.writeTo(out)
}

@Throws(IOException::class)
override fun toXContent(builder: XContentBuilder, params: ToXContent.Params): XContentBuilder {
return builder.startObject()
.field(_ID, id)
.field(_SEQ_NO, seqNo)
.field(_PRIMARY_TERM, primaryTerm)
.field("comment", comment)
.endObject()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.opensearch.commons.alerting.action

import org.opensearch.action.ActionRequest
import org.opensearch.action.ActionRequestValidationException
import org.opensearch.action.search.SearchRequest
import org.opensearch.core.common.io.stream.StreamInput
import org.opensearch.core.common.io.stream.StreamOutput
import java.io.IOException

class SearchCommentRequest : ActionRequest {
toepkerd marked this conversation as resolved.
Show resolved Hide resolved

val searchRequest: SearchRequest

constructor(
searchRequest: SearchRequest
) : super() {
this.searchRequest = searchRequest
AWSHurneyt marked this conversation as resolved.
Show resolved Hide resolved
}

@Throws(IOException::class)
constructor(sin: StreamInput) : this(
searchRequest = SearchRequest(sin)
)

override fun validate(): ActionRequestValidationException? {
return null
}

@Throws(IOException::class)
override fun writeTo(out: StreamOutput) {
searchRequest.writeTo(out)
}
}
Loading
Loading