Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
93 changes: 67 additions & 26 deletions config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand All @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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 == "")
}
15 changes: 6 additions & 9 deletions connectivity/ping.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down