diff --git a/controller/controller_test.go b/controller/controller_test.go index d147e143..d18a871f 100644 --- a/controller/controller_test.go +++ b/controller/controller_test.go @@ -388,33 +388,33 @@ func TestServiceStatusesHandler(t *testing.T) { scenarios := []Scenario{ { Name: "no-pagination", - Path: "/api/v1/statuses", + Path: "/api/v1/services/statuses", ExpectedCode: http.StatusOK, - ExpectedBody: `{"group_name":{"name":"name","group":"group","key":"group_name","results":[{"status":200,"hostname":"example.org","duration":150000000,"errors":null,"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":true},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":true}],"success":true,"timestamp":"0001-01-01T00:00:00Z"},{"status":200,"hostname":"example.org","duration":750000000,"errors":["error-1","error-2"],"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":false},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":false}],"success":false,"timestamp":"0001-01-01T00:00:00Z"}]}}`, + ExpectedBody: `[{"name":"name","group":"group","key":"group_name","results":[{"status":200,"hostname":"example.org","duration":150000000,"errors":null,"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":true},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":true}],"success":true,"timestamp":"0001-01-01T00:00:00Z"},{"status":200,"hostname":"example.org","duration":750000000,"errors":["error-1","error-2"],"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":false},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":false}],"success":false,"timestamp":"0001-01-01T00:00:00Z"}]}]`, }, { Name: "pagination-first-result", - Path: "/api/v1/statuses?page=1&pageSize=1", + Path: "/api/v1/services/statuses?page=1&pageSize=1", ExpectedCode: http.StatusOK, - ExpectedBody: `{"group_name":{"name":"name","group":"group","key":"group_name","results":[{"status":200,"hostname":"example.org","duration":750000000,"errors":["error-1","error-2"],"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":false},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":false}],"success":false,"timestamp":"0001-01-01T00:00:00Z"}]}}`, + ExpectedBody: `[{"name":"name","group":"group","key":"group_name","results":[{"status":200,"hostname":"example.org","duration":750000000,"errors":["error-1","error-2"],"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":false},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":false}],"success":false,"timestamp":"0001-01-01T00:00:00Z"}]}]`, }, { Name: "pagination-second-result", - Path: "/api/v1/statuses?page=2&pageSize=1", + Path: "/api/v1/services/statuses?page=2&pageSize=1", ExpectedCode: http.StatusOK, - ExpectedBody: `{"group_name":{"name":"name","group":"group","key":"group_name","results":[{"status":200,"hostname":"example.org","duration":150000000,"errors":null,"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":true},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":true}],"success":true,"timestamp":"0001-01-01T00:00:00Z"}]}}`, + ExpectedBody: `[{"name":"name","group":"group","key":"group_name","results":[{"status":200,"hostname":"example.org","duration":150000000,"errors":null,"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":true},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":true}],"success":true,"timestamp":"0001-01-01T00:00:00Z"}]}]`, }, { Name: "pagination-no-results", - Path: "/api/v1/statuses?page=5&pageSize=20", + Path: "/api/v1/services/statuses?page=5&pageSize=20", ExpectedCode: http.StatusOK, - ExpectedBody: `{"group_name":{"name":"name","group":"group","key":"group_name","results":[]}}`, + ExpectedBody: `[{"name":"name","group":"group","key":"group_name","results":[]}]`, }, { Name: "invalid-pagination-should-fall-back-to-default", - Path: "/api/v1/statuses?page=INVALID&pageSize=INVALID", + Path: "/api/v1/services/statuses?page=INVALID&pageSize=INVALID", ExpectedCode: http.StatusOK, - ExpectedBody: `{"group_name":{"name":"name","group":"group","key":"group_name","results":[{"status":200,"hostname":"example.org","duration":150000000,"errors":null,"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":true},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":true}],"success":true,"timestamp":"0001-01-01T00:00:00Z"},{"status":200,"hostname":"example.org","duration":750000000,"errors":["error-1","error-2"],"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":false},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":false}],"success":false,"timestamp":"0001-01-01T00:00:00Z"}]}}`, + ExpectedBody: `[{"name":"name","group":"group","key":"group_name","results":[{"status":200,"hostname":"example.org","duration":150000000,"errors":null,"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":true},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":true}],"success":true,"timestamp":"0001-01-01T00:00:00Z"},{"status":200,"hostname":"example.org","duration":750000000,"errors":["error-1","error-2"],"conditionResults":[{"condition":"[STATUS] == 200","success":true},{"condition":"[RESPONSE_TIME] \u003c 500","success":false},{"condition":"[CERTIFICATE_EXPIRATION] \u003c 72h","success":false}],"success":false,"timestamp":"0001-01-01T00:00:00Z"}]}]`, }, } diff --git a/storage/store/memory/memory.go b/storage/store/memory/memory.go index 44f0304d..ee226b95 100644 --- a/storage/store/memory/memory.go +++ b/storage/store/memory/memory.go @@ -47,11 +47,11 @@ func NewStore(file string) (*Store, error) { // GetAllServiceStatuses returns all monitored core.ServiceStatus // with a subset of core.Result defined by the page and pageSize parameters -func (s *Store) GetAllServiceStatuses(params *paging.ServiceStatusParams) map[string]*core.ServiceStatus { +func (s *Store) GetAllServiceStatuses(params *paging.ServiceStatusParams) []*core.ServiceStatus { serviceStatuses := s.cache.GetAll() - pagedServiceStatuses := make(map[string]*core.ServiceStatus, len(serviceStatuses)) - for k, v := range serviceStatuses { - pagedServiceStatuses[k] = ShallowCopyServiceStatus(v.(*core.ServiceStatus), params) + pagedServiceStatuses := make([]*core.ServiceStatus, 0, len(serviceStatuses)) + for _, v := range serviceStatuses { + pagedServiceStatuses = append(pagedServiceStatuses, ShallowCopyServiceStatus(v.(*core.ServiceStatus), params)) } return pagedServiceStatuses } diff --git a/storage/store/sqlite/sqlite.go b/storage/store/sqlite/sqlite.go index 5471ad1b..9e2c6376 100644 --- a/storage/store/sqlite/sqlite.go +++ b/storage/store/sqlite/sqlite.go @@ -148,7 +148,7 @@ func (s *Store) createSchema() error { // GetAllServiceStatuses returns all monitored core.ServiceStatus // with a subset of core.Result defined by the page and pageSize parameters -func (s *Store) GetAllServiceStatuses(params *paging.ServiceStatusParams) map[string]*core.ServiceStatus { +func (s *Store) GetAllServiceStatuses(params *paging.ServiceStatusParams) []*core.ServiceStatus { tx, err := s.db.Begin() if err != nil { return nil @@ -158,13 +158,13 @@ func (s *Store) GetAllServiceStatuses(params *paging.ServiceStatusParams) map[st _ = tx.Rollback() return nil } - serviceStatuses := make(map[string]*core.ServiceStatus, len(keys)) + serviceStatuses := make([]*core.ServiceStatus, 0, len(keys)) for _, key := range keys { serviceStatus, err := s.getServiceStatusByKey(tx, key, params) if err != nil { continue } - serviceStatuses[key] = serviceStatus + serviceStatuses = append(serviceStatuses, serviceStatus) } if err = tx.Commit(); err != nil { _ = tx.Rollback() diff --git a/storage/store/store.go b/storage/store/store.go index a9af6b97..54fab298 100644 --- a/storage/store/store.go +++ b/storage/store/store.go @@ -13,7 +13,7 @@ import ( type Store interface { // GetAllServiceStatuses returns the JSON encoding of all monitored core.ServiceStatus // with a subset of core.Result defined by the page and pageSize parameters - GetAllServiceStatuses(params *paging.ServiceStatusParams) map[string]*core.ServiceStatus + GetAllServiceStatuses(params *paging.ServiceStatusParams) []*core.ServiceStatus // GetServiceStatus returns the service status for a given service name in the given group GetServiceStatus(groupName, serviceName string, params *paging.ServiceStatusParams) *core.ServiceStatus diff --git a/storage/store/store_test.go b/storage/store/store_test.go index deb576cd..622ce7c2 100644 --- a/storage/store/store_test.go +++ b/storage/store/store_test.go @@ -184,8 +184,8 @@ func TestStore_GetAllServiceStatuses(t *testing.T) { if len(serviceStatuses) != 1 { t.Fatal("expected 1 service status") } - actual, exists := serviceStatuses[testService.Key()] - if !exists { + actual := serviceStatuses[0] + if actual == nil { t.Fatal("expected service status to exist") } if len(actual.Results) != 2 { @@ -213,8 +213,8 @@ func TestStore_GetAllServiceStatusesWithResultsAndEvents(t *testing.T) { if len(serviceStatuses) != 1 { t.Fatal("expected 1 service status") } - actual, exists := serviceStatuses[testService.Key()] - if !exists { + actual := serviceStatuses[0] + if actual == nil { t.Fatal("expected service status to exist") } if len(actual.Results) != 2 { diff --git a/web/app/src/views/Home.vue b/web/app/src/views/Home.vue index ebde9083..71713ddf 100644 --- a/web/app/src/views/Home.vue +++ b/web/app/src/views/Home.vue @@ -47,7 +47,7 @@ export default { }, data() { return { - serviceStatuses: {}, + serviceStatuses: [], currentPage: 1, showAverageResponseTime: true }