diff --git a/config/config.go b/config/config.go index 3b5a8b2..62f4da0 100644 --- a/config/config.go +++ b/config/config.go @@ -214,15 +214,13 @@ func New() (Reloadable, error) { cfg.BlocklistedIPs = strings.Split(util.ValueOr(blocklistedIPs, "BLOCKLISTED_IPS", ""), ",") cfg.ConfigVersion = util.ValueOr(configVersion, "CONFIG_VERSION", "dev-preview") //todo: placeholder for reloadable configs cfg.Group = util.ValueOr(groupID, "GROUP_ID", "") - - cfg.PingAddressInternal = util.ValueOr(pingAddressInternal, "PING_ADDRESS_INTERNAL", cfg.discoverGateway()) cfg.LivenessCheckInAddress = util.ValueOr(livenessCheckInAddress, "IMUP_LIVENESS_CHECKIN_ADDRESS", fmt.Sprintf("%s/v1/realtime/livenesscheckin", ImUpAPIHost)) cfg.RealtimeAuthorized = util.ValueOr(realtimeAuthorized, "IMUP_REALTIME_AUTHORIZED", fmt.Sprintf("%s/v1/auth/realtimeAuthorized", ImUpAPIHost)) cfg.RealtimeConfig = util.ValueOr(realtimeConfig, "IMUP_REALTIME_CONFIG", fmt.Sprintf("%s/v1/realtime/config", ImUpAPIHost)) cfg.ShouldRunSpeedTestAddress = util.ValueOr(shouldRunSpeedTestAddress, "IMUP_SHOULD_RUN_SPEEDTEST_ADDRESS", fmt.Sprintf("%s/v1/realtime/shouldClientRunSpeedTest", ImUpAPIHost)) cfg.SpeedTestResultsAddress = util.ValueOr(speedTestResultsAddress, "IMUP_SPEED_TEST_RESULTS_ADDRESS", fmt.Sprintf("%s/v1/realtime/speedTestResults", ImUpAPIHost)) cfg.SpeedTestStatusUpdateAddress = util.ValueOr(speedTestStatusUpdateAddress, "IMUP_SPEED_TEST_STATUS_ADDRESS", fmt.Sprintf("%s/v1/realtime/speedTestStatusUpdate", ImUpAPIHost)) - + cfg.PingAddressInternal = util.ValueOr(pingAddressInternal, "PING_ADDRESS_INTERNAL", "") cfg.PingAddressesExternal = strings.Split(util.ValueOr(pingAddressesExternal, "PING_ADDRESS", "1.1.1.1/32,1.0.0.1/32,8.8.8.8/32,8.8.4.4/32"), ",") var err error @@ -279,6 +277,10 @@ func New() (Reloadable, error) { cfg.logLevel = util.LevelMap(verbosity, "VERBOSITY", "info") + if !cfg.NoDiscoverGateway && cfg.PingAddressInternal == "" { + cfg.PingAddressInternal = cfg.discoverGateway() + } + var w io.Writer if logFilePathStr != "" { w = logToThisFile(logFilePathStr) diff --git a/config/config_test.go b/config/config_test.go index 6cae961..11b0c08 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -12,10 +12,10 @@ import ( func Test_DefaultConfig(t *testing.T) { is := is.New(t) - os.Setenv("API_KEY", "ApiKey") - os.Setenv("EMAIL", "Email") - os.Setenv("HOST_ID", "HostID") - os.Setenv("PING_ADDRESS_INTERNAL", "10.0.0.1") + t.Setenv("API_KEY", "ApiKey") + t.Setenv("EMAIL", "Email") + t.Setenv("HOST_ID", "HostID") + t.Setenv("PING_ADDRESS_INTERNAL", "10.0.0.1") cfg, err := New() is.NoErr(err) @@ -57,10 +57,10 @@ func Test_DefaultConfig(t *testing.T) { func Test_ConfigReloadable(t *testing.T) { is := is.New(t) - os.Setenv("API_KEY", "ApiKey") - os.Setenv("EMAIL", "Email") - os.Setenv("HOST_ID", "HostID") - os.Setenv("VERBOSITY", "debug") + t.Setenv("API_KEY", "ApiKey") + t.Setenv("EMAIL", "Email") + t.Setenv("HOST_ID", "HostID") + t.Setenv("VERBOSITY", "debug") newConfig := &config{ PingEnabled: false, @@ -85,9 +85,9 @@ func Test_ConfigReloadable(t *testing.T) { func Test_ConfigReloadableThreadSafe(t *testing.T) { is := is.New(t) - os.Setenv("API_KEY", "ApiKey") - os.Setenv("EMAIL", "Email") - os.Setenv("HOST_ID", "HostID") + t.Setenv("API_KEY", "ApiKey") + t.Setenv("EMAIL", "Email") + t.Setenv("HOST_ID", "HostID") defaultConfig, err := New() is.NoErr(err) @@ -112,9 +112,9 @@ func Test_ConfigReloadableThreadSafe(t *testing.T) { func Test_RealtimeOnOff(t *testing.T) { is := is.New(t) - os.Setenv("API_KEY", "ApiKey") - os.Setenv("EMAIL", "Email") - os.Setenv("HOST_ID", "HostID") + t.Setenv("API_KEY", "ApiKey") + t.Setenv("EMAIL", "Email") + t.Setenv("HOST_ID", "HostID") defaultConfig, err := New() is.NoErr(err) @@ -143,10 +143,10 @@ func Test_RealtimeOnOff(t *testing.T) { func Test_ListedIPs(t *testing.T) { is := is.New(t) - os.Setenv("API_KEY", "ApiKey") - os.Setenv("EMAIL", "Email") - os.Setenv("HOST_ID", "HostID") - os.Setenv("ALLOWLISTED_IPS", "10.0.0.0/28,192.168.1.1") + t.Setenv("API_KEY", "ApiKey") + t.Setenv("EMAIL", "Email") + t.Setenv("HOST_ID", "HostID") + t.Setenv("ALLOWLISTED_IPS", "10.0.0.0/28,192.168.1.1") defaultConfig, err := New() is.NoErr(err) @@ -156,9 +156,9 @@ func Test_ListedIPs(t *testing.T) { func Test_PublicIP(t *testing.T) { is := is.New(t) - os.Setenv("API_KEY", "ApiKey") - os.Setenv("EMAIL", "Email") - os.Setenv("HOST_ID", "HostID") + t.Setenv("API_KEY", "ApiKey") + t.Setenv("EMAIL", "Email") + t.Setenv("HOST_ID", "HostID") defaultConfig, err := New() is.NoErr(err) @@ -170,14 +170,55 @@ func Test_PublicIP(t *testing.T) { func Test_LogPath(t *testing.T) { is := is.New(t) - os.Setenv("API_KEY", "ApiKey") - os.Setenv("EMAIL", "Email") - os.Setenv("HOST_ID", "HostID") + t.Setenv("API_KEY", "ApiKey") + t.Setenv("EMAIL", "Email") + t.Setenv("HOST_ID", "HostID") - path, err := os.UserCacheDir() + path, err := os.UserHomeDir() is.NoErr(err) - os.Setenv("LOG_FILE_PATH", path) + t.Setenv("LOG_FILE_PATH", path) _, err = New() is.NoErr(err) } + +func Test_NoGatewayNoInternalPing(t *testing.T) { + is := is.New(t) + t.Setenv("API_KEY", "ApiKey") + t.Setenv("EMAIL", "Email") + t.Setenv("HOST_ID", "HostID") + t.Setenv("PING_ADDRESS_INTERNAL", "") + t.Setenv("NO_GATEWAY_DISCOVERY", "true") + + defaultConfig, err := New() + is.NoErr(err) + + is.True(defaultConfig.InternalPingAddress() == "") +} + +func Test_InternalPingNoGateway(t *testing.T) { + is := is.New(t) + t.Setenv("API_KEY", "ApiKey") + t.Setenv("EMAIL", "Email") + t.Setenv("HOST_ID", "HostID") + t.Setenv("PING_ADDRESS_INTERNAL", "1.2.3.4") + + defaultConfig, err := New() + is.NoErr(err) + + is.True(defaultConfig.InternalPingAddress() == "1.2.3.4") +} + +func Test_DefaultInternalNoGateway(t *testing.T) { + is := is.New(t) + t.Setenv("API_KEY", "ApiKey") + t.Setenv("EMAIL", "Email") + t.Setenv("HOST_ID", "HostID") + t.Setenv("NO_GATEWAY_DISCOVERY", "true") + + defaultConfig, err := New() + is.NoErr(err) + + internal := defaultConfig.InternalPingAddress() + is.True(internal == "") +} diff --git a/connectivity/ping.go b/connectivity/ping.go index b448062..255bf56 100644 --- a/connectivity/ping.go +++ b/connectivity/ping.go @@ -70,20 +70,17 @@ func (p *pingCollector) Collect(ctx context.Context, pingAddrs []string) []Stati } wg.Wait() - if success { + // internal testing disabled, return external result only regardless of result + if p.addressInternal == "" { return []Statistics{externalPingResult} } - // internal testing disabled, return external result only - if !success && p.addressInternal == "" { - return []Statistics{externalPingResult} + // connectivity established, return result of both external and internal test result + if success { + return []Statistics{internalPingResult, externalPingResult} } - if internalSuccess { - log.Info("No external endpoint could be reached, internal gateway responding", "gateway address", p.addressInternal) - } else { - log.Info("No internal or external endpoint could be reached ", "gateway address", p.addressInternal) - } + log.Info("external endpoint unreachable", "internal-result", internalSuccess, "gateway-address", p.addressInternal) // external data needs to send last for tests to pingDownTimeDetect to work properly externalPingResult.SuccessInternal = internalSuccess