diff --git a/config/config.go b/config/config.go index fe6b8242..1864f1be 100644 --- a/config/config.go +++ b/config/config.go @@ -2,10 +2,8 @@ package config import ( "errors" - "fmt" "io/ioutil" "log" - "math" "os" "github.com/TwinProduction/gatus/alerting" @@ -257,26 +255,3 @@ func GetAlertingProviderByAlertType(config *Config, alertType core.AlertType) pr } return nil } - -// webConfig is the structure which supports the configuration of the endpoint -// which provides access to the web frontend -type webConfig struct { - // Address to listen on (defaults to 0.0.0.0 specified by DefaultAddress) - Address string `yaml:"address"` - - // Port to listen on (default to 8080 specified by DefaultPort) - Port int `yaml:"port"` -} - -// validateAndSetDefaults checks and sets missing values based on the defaults -// in given in DefaultAddress and DefaultPort if necessary -func (web *webConfig) validateAndSetDefaults() { - if len(web.Address) == 0 { - web.Address = DefaultAddress - } - if web.Port == 0 { - web.Port = DefaultPort - } else if web.Port < 0 || web.Port > math.MaxUint16 { - panic(fmt.Sprintf("port has an invalid: value should be between %d and %d", 0, math.MaxUint16)) - } -} diff --git a/config/config_test.go b/config/config_test.go index ab980a06..ef9602bc 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -103,11 +103,9 @@ services: if config.Services[0].Interval != 60*time.Second { t.Errorf("Interval should have been %s, because it is the default value", 60*time.Second) } - if config.Web.Address != DefaultAddress { t.Errorf("Bind address should have been %s, because it is the default value", DefaultAddress) } - if config.Web.Port != DefaultPort { t.Errorf("Port should have been %d, because it is the default value", DefaultPort) } @@ -190,7 +188,7 @@ web: address: 127.0.0.1 services: - name: twinnation - url: https://twinnation.org/actuator/health + url: https://twinnation.org/health conditions: - "[STATUS] == 200" `)) @@ -203,17 +201,15 @@ services: if config.Metrics { t.Error("Metrics should've been false by default") } - if config.Services[0].URL != "https://twinnation.org/actuator/health" { - t.Errorf("URL should have been %s", "https://twinnation.org/actuator/health") + if config.Services[0].URL != "https://twinnation.org/health" { + t.Errorf("URL should have been %s", "https://twinnation.org/health") } if config.Services[0].Interval != 60*time.Second { t.Errorf("Interval should have been %s, because it is the default value", 60*time.Second) } - if config.Web.Address != "127.0.0.1" { t.Errorf("Bind address should have been %s, because it is specified in config", "127.0.0.1") } - if config.Web.Port != 12345 { t.Errorf("Port should have been %d, because it is specified in config", 12345) } @@ -221,18 +217,16 @@ services: func TestParseAndValidateConfigBytesWithInvalidPort(t *testing.T) { defer func() { recover() }() - - parseAndValidateConfigBytes([]byte(` + _, _ = parseAndValidateConfigBytes([]byte(` web: port: 65536 address: 127.0.0.1 services: - name: twinnation - url: https://twinnation.org/actuator/health + url: https://twinnation.org/health conditions: - "[STATUS] == 200" `)) - t.Fatal("Should've panicked because the configuration specifies an invalid port value") } @@ -260,11 +254,9 @@ services: if config.Services[0].Interval != 60*time.Second { t.Errorf("Interval should have been %s, because it is the default value", 60*time.Second) } - if config.Web.Address != DefaultAddress { t.Errorf("Bind address should have been %s, because it is the default value", DefaultAddress) } - if config.Web.Port != DefaultPort { t.Errorf("Port should have been %d, because it is the default value", DefaultPort) } @@ -275,7 +267,7 @@ func TestParseAndValidateConfigBytesWithMetricsAndHostAndPort(t *testing.T) { metrics: true services: - name: twinnation - url: https://twinnation.org/actuator/health + url: https://twinnation.org/health conditions: - "[STATUS] == 200" web: @@ -291,17 +283,15 @@ web: if !config.Metrics { t.Error("Metrics should have been true") } - if config.Services[0].URL != "https://twinnation.org/actuator/health" { - t.Errorf("URL should have been %s", "https://twinnation.org/actuator/health") + if config.Services[0].URL != "https://twinnation.org/health" { + t.Errorf("URL should have been %s", "https://twinnation.org/health") } if config.Services[0].Interval != 60*time.Second { t.Errorf("Interval should have been %s, because it is the default value", 60*time.Second) } - if config.Web.Address != "192.168.0.1" { t.Errorf("Bind address should have been %s, because it is the default value", "192.168.0.1") } - if config.Web.Port != 9090 { t.Errorf("Port should have been %d, because it is specified in config", 9090) } diff --git a/config/web.go b/config/web.go new file mode 100644 index 00000000..2a1077eb --- /dev/null +++ b/config/web.go @@ -0,0 +1,34 @@ +package config + +import ( + "fmt" + "math" +) + +// webConfig is the structure which supports the configuration of the endpoint +// which provides access to the web frontend +type webConfig struct { + // Address to listen on (defaults to 0.0.0.0 specified by DefaultAddress) + Address string `yaml:"address"` + + // Port to listen on (default to 8080 specified by DefaultPort) + Port int `yaml:"port"` +} + +// validateAndSetDefaults checks and sets missing values based on the defaults +// in given in DefaultAddress and DefaultPort if necessary +func (web *webConfig) validateAndSetDefaults() { + if len(web.Address) == 0 { + web.Address = DefaultAddress + } + if web.Port == 0 { + web.Port = DefaultPort + } else if web.Port < 0 || web.Port > math.MaxUint16 { + panic(fmt.Sprintf("port has an invalid: value should be between %d and %d", 0, math.MaxUint16)) + } +} + +// SocketAddress returns the combination of the Address and the Port +func (web *webConfig) SocketAddress() string { + return fmt.Sprintf("%s:%d", web.Address, web.Port) +} diff --git a/main.go b/main.go index e7378f97..4d96ef5b 100644 --- a/main.go +++ b/main.go @@ -3,7 +3,6 @@ package main import ( "bytes" "compress/gzip" - "fmt" "log" "net/http" "os" @@ -36,10 +35,9 @@ func main() { if cfg.Metrics { http.Handle("/metrics", promhttp.Handler()) } - - log.Printf("[main][main] Listening on %s:%d\r\n", cfg.Web.Address, cfg.Web.Port) + log.Printf("[main][main] Listening on %s\n", cfg.Web.SocketAddress()) go watchdog.Monitor(cfg) - log.Fatal(http.ListenAndServe(fmt.Sprintf("%s:%d", cfg.Web.Address, cfg.Web.Port), nil)) + log.Fatal(http.ListenAndServe(cfg.Web.SocketAddress(), nil)) } func loadConfiguration() *config.Config {