mirror of
https://github.com/prometheus/alertmanager
synced 2025-02-16 18:47:10 +00:00
The current Alertmanager API v1 is undocumented and written by hand. This patch introduces a new Alertmanager API - v2. The API is fully generated via an OpenAPI 2.0 [1] specification (see `api/v2/openapi.yaml`) with the exception of the http handlers itself. Pros: - Generated server code - Ability to generate clients in all major languages (Go, Java, JS, Python, Ruby, Haskell, *elm* [3] ...) - Strict contract (OpenAPI spec) between server and clients. - Instant feedback on frontend-breaking changes, due to strictly typed frontend language elm. - Generated documentation (See Alertmanager online Swagger UI [4]) Cons: - Dependency on open api ecosystem including go-swagger [2] In addition this patch includes the following changes. - README.md: Add API section - test: Duplicate acceptance test to API v1 & API v2 version The Alertmanager acceptance test framework has a decent test coverage on the Alertmanager API. Introducing the Alertmanager API v2 does not go hand in hand with deprecating API v1. They should live alongside each other for a couple of minor Alertmanager versions. Instead of porting the acceptance test framework to use the new API v2, this patch duplicates the acceptance tests, one using the API v1, the other API v2. Once API v1 is removed we can simply remove `test/with_api_v1` and bring `test/with_api_v2` to `test/`. [1] https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md [2] https://github.com/go-swagger/go-swagger/ [3] https://github.com/ahultgren/swagger-elm [4] http://petstore.swagger.io/?url=https://raw.githubusercontent.com/mxinden/alertmanager/apiv2/api/v2/openapi.yaml Signed-off-by: Max Leonard Inden <IndenML@gmail.com>
59 lines
1.9 KiB
Go
59 lines
1.9 KiB
Go
package govalidator
|
|
|
|
// Iterator is the function that accepts element of slice/array and its index
|
|
type Iterator func(interface{}, int)
|
|
|
|
// ResultIterator is the function that accepts element of slice/array and its index and returns any result
|
|
type ResultIterator func(interface{}, int) interface{}
|
|
|
|
// ConditionIterator is the function that accepts element of slice/array and its index and returns boolean
|
|
type ConditionIterator func(interface{}, int) bool
|
|
|
|
// Each iterates over the slice and apply Iterator to every item
|
|
func Each(array []interface{}, iterator Iterator) {
|
|
for index, data := range array {
|
|
iterator(data, index)
|
|
}
|
|
}
|
|
|
|
// Map iterates over the slice and apply ResultIterator to every item. Returns new slice as a result.
|
|
func Map(array []interface{}, iterator ResultIterator) []interface{} {
|
|
var result = make([]interface{}, len(array))
|
|
for index, data := range array {
|
|
result[index] = iterator(data, index)
|
|
}
|
|
return result
|
|
}
|
|
|
|
// Find iterates over the slice and apply ConditionIterator to every item. Returns first item that meet ConditionIterator or nil otherwise.
|
|
func Find(array []interface{}, iterator ConditionIterator) interface{} {
|
|
for index, data := range array {
|
|
if iterator(data, index) {
|
|
return data
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Filter iterates over the slice and apply ConditionIterator to every item. Returns new slice.
|
|
func Filter(array []interface{}, iterator ConditionIterator) []interface{} {
|
|
var result = make([]interface{}, 0)
|
|
for index, data := range array {
|
|
if iterator(data, index) {
|
|
result = append(result, data)
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
// Count iterates over the slice and apply ConditionIterator to every item. Returns count of items that meets ConditionIterator.
|
|
func Count(array []interface{}, iterator ConditionIterator) int {
|
|
count := 0
|
|
for index, data := range array {
|
|
if iterator(data, index) {
|
|
count = count + 1
|
|
}
|
|
}
|
|
return count
|
|
}
|