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:
Max Leonard Inden 2019-01-28 11:44:31 +01:00
parent f1bf34b234
commit 8e157b3af5
No known key found for this signature in database
GPG Key ID: 5403C5464810BC26
10 changed files with 51 additions and 69 deletions

View File

@ -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)

View File

@ -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,
}

View File

@ -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")
}
}

View File

@ -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++ {

View File

@ -233,9 +233,7 @@ definitions:
items:
$ref: '#/definitions/peerStatus'
required:
- name
- status
- peers
alertmanagerConfig:
type: object
properties:

View File

@ -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

View File

@ -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++ {

View File

@ -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) )
]

View File

@ -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 ""
]