Implement persistence

This commit is contained in:
TwinProduction
2021-02-02 23:06:34 -05:00
parent 9196f57487
commit 79bef8d391
26 changed files with 592 additions and 203 deletions

View File

@ -11,6 +11,8 @@ import (
"github.com/TwinProduction/gatus/core"
"github.com/TwinProduction/gatus/k8s"
"github.com/TwinProduction/gatus/security"
"github.com/TwinProduction/gatus/storage"
"github.com/TwinProduction/gatus/util"
"gopkg.in/yaml.v2"
)
@ -71,6 +73,9 @@ type Config struct {
// Kubernetes is the Kubernetes configuration
Kubernetes *k8s.Config `yaml:"kubernetes"`
// Storage is the configuration for how the data is stored
Storage *storage.Config `yaml:"storage"`
// Web is the configuration for the web listener
Web *WebConfig `yaml:"web"`
}
@ -144,10 +149,30 @@ func parseAndValidateConfigBytes(yamlBytes []byte) (config *Config, err error) {
validateServicesConfig(config)
validateKubernetesConfig(config)
validateWebConfig(config)
validateStorageConfig(config)
}
return
}
func validateStorageConfig(config *Config) {
if config.Storage == nil {
config.Storage = &storage.Config{}
}
err := storage.Initialize(config.Storage)
if err != nil {
panic(err)
}
// Remove all ServiceStatus that represent services which no longer exist in the configuration
var keys []string
for _, service := range config.Services {
keys = append(keys, util.ConvertGroupAndServiceToKey(service.Group, service.Name))
}
numberOfServiceStatusesDeleted := storage.Get().DeleteAllServiceStatusesNotInKeys(keys)
if numberOfServiceStatusesDeleted > 0 {
log.Printf("[config][validateStorageConfig] Deleted %d service statuses because their matching services no longer existed", numberOfServiceStatusesDeleted)
}
}
func validateWebConfig(config *Config) {
if config.Web == nil {
config.Web = &WebConfig{Address: DefaultAddress, Port: DefaultPort}

View File

@ -42,7 +42,10 @@ func TestLoadDefaultConfigurationFile(t *testing.T) {
}
func TestParseAndValidateConfigBytes(t *testing.T) {
config, err := parseAndValidateConfigBytes([]byte(`
file := t.TempDir() + "/test.db"
config, err := parseAndValidateConfigBytes([]byte(fmt.Sprintf(`
storage:
file: %s
services:
- name: twinnation
url: https://twinnation.org/health
@ -54,9 +57,9 @@ services:
conditions:
- "[STATUS] != 400"
- "[STATUS] != 500"
`))
`, file)))
if err != nil {
t.Error("No error should've been returned")
t.Error("expected no error, got", err.Error())
}
if config == nil {
t.Fatal("Config shouldn't have been nil")
@ -99,7 +102,7 @@ services:
- "[STATUS] == 200"
`))
if err != nil {
t.Error("No error should've been returned")
t.Error("expected no error, got", err.Error())
}
if config == nil {
t.Fatal("Config shouldn't have been nil")
@ -132,7 +135,7 @@ services:
- "[STATUS] == 200"
`))
if err != nil {
t.Error("No error should've been returned")
t.Error("expected no error, got", err.Error())
}
if config == nil {
t.Fatal("Config shouldn't have been nil")
@ -167,7 +170,7 @@ services:
- "[STATUS] == 200"
`))
if err != nil {
t.Error("No error should've been returned")
t.Error("expected no error, got", err.Error())
}
if config == nil {
t.Fatal("Config shouldn't have been nil")
@ -201,7 +204,7 @@ services:
- "[STATUS] == 200"
`))
if err != nil {
t.Error("No error should've been returned")
t.Error("expected no error, got", err.Error())
}
if config == nil {
t.Fatal("Config shouldn't have been nil")
@ -250,7 +253,7 @@ services:
- "[STATUS] == 200"
`))
if err != nil {
t.Error("No error should've been returned")
t.Error("expected no error, got", err.Error())
}
if config == nil {
t.Fatal("Config shouldn't have been nil")
@ -288,7 +291,7 @@ services:
- "[STATUS] == 200"
`))
if err != nil {
t.Error("No error should've been returned")
t.Error("expected no error, got", err.Error())
}
if config == nil {
t.Fatal("Config shouldn't have been nil")
@ -332,7 +335,6 @@ badconfig:
func TestParseAndValidateConfigBytesWithAlerting(t *testing.T) {
config, err := parseAndValidateConfigBytes([]byte(`
debug: true
alerting:
slack:
webhook-url: "http://example.com"
@ -359,7 +361,7 @@ services:
- "[STATUS] == 200"
`))
if err != nil {
t.Error("No error should've been returned")
t.Error("expected no error, got", err.Error())
}
if config == nil {
t.Fatal("Config shouldn't have been nil")
@ -452,7 +454,7 @@ services:
- "[STATUS] == 200"
`))
if err != nil {
t.Error("No error should've been returned")
t.Error("expected no error, got", err.Error())
}
if config == nil {
t.Fatal("Config shouldn't have been nil")
@ -486,7 +488,7 @@ services:
- "[STATUS] == 200"
`))
if err != nil {
t.Error("No error should've been returned")
t.Error("expected no error, got", err.Error())
}
if config == nil {
t.Fatal("Config shouldn't have been nil")
@ -525,7 +527,7 @@ services:
- "[STATUS] == 200"
`))
if err != nil {
t.Error("No error should've been returned")
t.Error("expected no error, got", err.Error())
}
if config == nil {
t.Fatal("Config shouldn't have been nil")
@ -578,7 +580,7 @@ services:
- "[STATUS] == 200"
`, expectedUsername, expectedPasswordHash)))
if err != nil {
t.Error("No error should've been returned")
t.Error("expected no error, got", err.Error())
}
if config == nil {
t.Fatal("Config shouldn't have been nil")
@ -645,7 +647,7 @@ kubernetes:
target-path: "/health"
`))
if err != nil {
t.Error("No error should've been returned")
t.Error("expected no error, got", err.Error())
}
if config == nil {
t.Fatal("Config shouldn't have been nil")