mirror of
https://github.com/prometheus/alertmanager
synced 2025-02-16 10:37:09 +00:00
api/v2: Make cluster status peers and name optional
If a users chooses to disable the Alertmanager cluster feature, there is no cluster name nor cluster peers. Hence these should be optional. Only cluster status is set to "disabled". Signed-off-by: Max Leonard Inden <IndenML@gmail.com>
This commit is contained in:
parent
f1bf34b234
commit
8e157b3af5
@ -1,3 +1,7 @@
|
||||
## Next release
|
||||
|
||||
* [CHANGE] Make api/v2/status.cluster.{name,peers} properties optional for Alertmanager with disabled clustering (#1728)
|
||||
|
||||
## 0.16.1 / 2019-01-31
|
||||
|
||||
* [BUGFIX] Do not populate cluster info if clustering is disabled in API v2 (#1726)
|
||||
|
@ -132,7 +132,6 @@ func (api *API) getStatusHandler(params general_ops.GetStatusParams) middleware.
|
||||
original := api.alertmanagerConfig.String()
|
||||
uptime := strfmt.DateTime(api.uptime)
|
||||
|
||||
name := ""
|
||||
status := open_api_models.ClusterStatusStatusDisabled
|
||||
|
||||
resp := open_api_models.AlertmanagerStatus{
|
||||
@ -149,15 +148,12 @@ func (api *API) getStatusHandler(params general_ops.GetStatusParams) middleware.
|
||||
Original: &original,
|
||||
},
|
||||
Cluster: &open_api_models.ClusterStatus{
|
||||
Name: &name,
|
||||
Status: &status,
|
||||
Peers: []*open_api_models.PeerStatus{},
|
||||
},
|
||||
}
|
||||
|
||||
// If alertmanager cluster feature is disabled, then api.peers == nil.
|
||||
if api.peer != nil {
|
||||
name := api.peer.Name()
|
||||
status := api.peer.Status()
|
||||
|
||||
peers := []*open_api_models.PeerStatus{}
|
||||
@ -170,7 +166,7 @@ func (api *API) getStatusHandler(params general_ops.GetStatusParams) middleware.
|
||||
}
|
||||
|
||||
resp.Cluster = &open_api_models.ClusterStatus{
|
||||
Name: &name,
|
||||
Name: api.peer.Name(),
|
||||
Status: &status,
|
||||
Peers: peers,
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ import (
|
||||
)
|
||||
|
||||
// If api.peers == nil, Alertmanager cluster feature is disabled. Make sure to
|
||||
// not try to access properties of peer, hence triggering a nil pointer
|
||||
// not try to access properties of peer, which would trigger a nil pointer
|
||||
// dereference.
|
||||
func TestGetStatusHandlerWithNilPeer(t *testing.T) {
|
||||
api := API{
|
||||
@ -36,7 +36,15 @@ func TestGetStatusHandlerWithNilPeer(t *testing.T) {
|
||||
|
||||
c := status.Payload.Cluster
|
||||
|
||||
if c == nil || c.Status == nil || c.Name == nil || c.Peers == nil {
|
||||
t.Fatal("expected cluster {status,name,peers} not to be nil, violating the openapi specification")
|
||||
if c == nil || c.Status == nil {
|
||||
t.Fatal("expected cluster status not to be nil, violating the openapi specification")
|
||||
}
|
||||
|
||||
if c.Peers != nil {
|
||||
t.Fatal("expected cluster peers to be nil when api.peer is nil, violating the openapi specification")
|
||||
}
|
||||
|
||||
if c.Name != "" {
|
||||
t.Fatal("expected cluster name to be empty, violating the openapi specification")
|
||||
}
|
||||
}
|
||||
|
@ -21,11 +21,9 @@ import (
|
||||
type ClusterStatus struct {
|
||||
|
||||
// name
|
||||
// Required: true
|
||||
Name *string `json:"name"`
|
||||
Name string `json:"name,omitempty"`
|
||||
|
||||
// peers
|
||||
// Required: true
|
||||
// Minimum: 0
|
||||
Peers []*PeerStatus `json:"peers"`
|
||||
|
||||
@ -39,10 +37,6 @@ type ClusterStatus struct {
|
||||
func (m *ClusterStatus) Validate(formats strfmt.Registry) error {
|
||||
var res []error
|
||||
|
||||
if err := m.validateName(formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
|
||||
if err := m.validatePeers(formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
@ -57,19 +51,10 @@ func (m *ClusterStatus) Validate(formats strfmt.Registry) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ClusterStatus) validateName(formats strfmt.Registry) error {
|
||||
|
||||
if err := validate.Required("name", "body", m.Name); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ClusterStatus) validatePeers(formats strfmt.Registry) error {
|
||||
|
||||
if err := validate.Required("peers", "body", m.Peers); err != nil {
|
||||
return err
|
||||
if swag.IsZero(m.Peers) { // not required
|
||||
return nil
|
||||
}
|
||||
|
||||
for i := 0; i < len(m.Peers); i++ {
|
||||
|
@ -233,9 +233,7 @@ definitions:
|
||||
items:
|
||||
$ref: '#/definitions/peerStatus'
|
||||
required:
|
||||
- name
|
||||
- status
|
||||
- peers
|
||||
alertmanagerConfig:
|
||||
type: object
|
||||
properties:
|
||||
|
@ -377,9 +377,7 @@ func init() {
|
||||
"clusterStatus": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"name",
|
||||
"status",
|
||||
"peers"
|
||||
"status"
|
||||
],
|
||||
"properties": {
|
||||
"name": {
|
||||
@ -1085,9 +1083,7 @@ func init() {
|
||||
"clusterStatus": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"name",
|
||||
"status",
|
||||
"peers"
|
||||
"status"
|
||||
],
|
||||
"properties": {
|
||||
"name": {
|
||||
|
File diff suppressed because one or more lines are too long
@ -21,11 +21,9 @@ import (
|
||||
type ClusterStatus struct {
|
||||
|
||||
// name
|
||||
// Required: true
|
||||
Name *string `json:"name"`
|
||||
Name string `json:"name,omitempty"`
|
||||
|
||||
// peers
|
||||
// Required: true
|
||||
// Minimum: 0
|
||||
Peers []*PeerStatus `json:"peers"`
|
||||
|
||||
@ -39,10 +37,6 @@ type ClusterStatus struct {
|
||||
func (m *ClusterStatus) Validate(formats strfmt.Registry) error {
|
||||
var res []error
|
||||
|
||||
if err := m.validateName(formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
|
||||
if err := m.validatePeers(formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
@ -57,19 +51,10 @@ func (m *ClusterStatus) Validate(formats strfmt.Registry) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ClusterStatus) validateName(formats strfmt.Registry) error {
|
||||
|
||||
if err := validate.Required("name", "body", m.Name); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ClusterStatus) validatePeers(formats strfmt.Registry) error {
|
||||
|
||||
if err := validate.Required("peers", "body", m.Peers); err != nil {
|
||||
return err
|
||||
if swag.IsZero(m.Peers) { // not required
|
||||
return nil
|
||||
}
|
||||
|
||||
for i := 0; i < len(m.Peers); i++ {
|
||||
|
@ -20,9 +20,9 @@ import Json.Encode as Encode
|
||||
|
||||
|
||||
type alias ClusterStatus =
|
||||
{ name : String
|
||||
{ name : Maybe String
|
||||
, status : Status
|
||||
, peers : List PeerStatus
|
||||
, peers : Maybe (List PeerStatus)
|
||||
}
|
||||
|
||||
|
||||
@ -35,17 +35,17 @@ type Status
|
||||
decoder : Decoder ClusterStatus
|
||||
decoder =
|
||||
Decode.succeed ClusterStatus
|
||||
|> required "name" Decode.string
|
||||
|> optional "name" (Decode.nullable Decode.string) Nothing
|
||||
|> required "status" statusDecoder
|
||||
|> required "peers" (Decode.list PeerStatus.decoder)
|
||||
|> optional "peers" (Decode.nullable (Decode.list PeerStatus.decoder)) Nothing
|
||||
|
||||
|
||||
encoder : ClusterStatus -> Encode.Value
|
||||
encoder model =
|
||||
Encode.object
|
||||
[ ( "name", Encode.string model.name )
|
||||
[ ( "name", Maybe.withDefault Encode.null (Maybe.map Encode.string model.name) )
|
||||
, ( "status", statusEncoder model.status )
|
||||
, ( "peers", Encode.list PeerStatus.encoder model.peers )
|
||||
, ( "peers", Maybe.withDefault Encode.null (Maybe.map (Encode.list PeerStatus.encoder) model.peers) )
|
||||
]
|
||||
|
||||
|
||||
|
@ -61,10 +61,15 @@ viewClusterStatus : ClusterStatus -> Html Types.Msg
|
||||
viewClusterStatus { name, status, peers } =
|
||||
span []
|
||||
[ h2 [] [ text "Cluster Status" ]
|
||||
, div [ class "form-group row" ]
|
||||
[ b [ class "col-sm-2" ] [ text "Name:" ]
|
||||
, div [ class "col-sm-10" ] [ text name ]
|
||||
]
|
||||
, case name of
|
||||
Just n ->
|
||||
div [ class "form-group row" ]
|
||||
[ b [ class "col-sm-2" ] [ text "Name:" ]
|
||||
, div [ class "col-sm-10" ] [ text n ]
|
||||
]
|
||||
|
||||
Nothing ->
|
||||
text ""
|
||||
, div [ class "form-group row" ]
|
||||
[ b [ class "col-sm-2" ] [ text "Status:" ]
|
||||
, div [ class "col-sm-10" ]
|
||||
@ -85,11 +90,16 @@ viewClusterStatus { name, status, peers } =
|
||||
[ text <| clusterStatusToString status ]
|
||||
]
|
||||
]
|
||||
, div [ class "form-group row" ]
|
||||
[ b [ class "col-sm-2" ] [ text "Peers:" ]
|
||||
, ul [ class "col-sm-10" ] <|
|
||||
List.map viewClusterPeer peers
|
||||
]
|
||||
, case peers of
|
||||
Just p ->
|
||||
div [ class "form-group row" ]
|
||||
[ b [ class "col-sm-2" ] [ text "Peers:" ]
|
||||
, ul [ class "col-sm-10" ] <|
|
||||
List.map viewClusterPeer p
|
||||
]
|
||||
|
||||
Nothing ->
|
||||
text ""
|
||||
]
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user