diff --git a/fdbkubernetesmonitor/api/config.go b/fdbkubernetesmonitor/api/config.go index facd983f6a..07839ccf37 100644 --- a/fdbkubernetesmonitor/api/config.go +++ b/fdbkubernetesmonitor/api/config.go @@ -120,14 +120,29 @@ func (argument Argument) GenerateArgument(processNumber int, env map[string]stri } number = number + argument.Offset return strconv.Itoa(number), nil - case EnvironmentArgumentType: + case EnvironmentArgumentType, IPListArgumentType: return argument.LookupEnv(env) - case IPListArgumentType: - envValue, err := argument.LookupEnv(env) - if err != nil { - return "", err - } - ips := strings.Split(envValue, ",") + default: + return "", fmt.Errorf("unsupported argument type %s", argument.ArgumentType) + } +} + +// LookupEnv looks up the value for an argument from the environment. +func (argument Argument) LookupEnv(env map[string]string) (string, error) { + var value string + var present bool + if env != nil { + value, present = env[argument.Source] + } + if !present { + value, present = os.LookupEnv(argument.Source) + } + if !present { + return "", fmt.Errorf("missing environment variable %s", argument.Source) + } + + if argument.ArgumentType == IPListArgumentType { + ips := strings.Split(value, ",") for _, ipString := range ips { ip := net.ParseIP(ipString) if ip == nil { @@ -147,23 +162,6 @@ func (argument Argument) GenerateArgument(processNumber int, env map[string]stri } } return "", fmt.Errorf("could not find IP with family %d", argument.IPFamily) - default: - return "", fmt.Errorf("unsupported argument type %s", argument.ArgumentType) - } -} - -// lookupEnv looks up the value for an argument from the environment. -func (argument Argument) LookupEnv(env map[string]string) (string, error) { - var value string - var present bool - if env != nil { - value, present = env[argument.Source] - } - if !present { - value, present = os.LookupEnv(argument.Source) - } - if !present { - return "", fmt.Errorf("missing environment variable %s", argument.Source) } return value, nil } diff --git a/fdbkubernetesmonitor/api/config_test.go b/fdbkubernetesmonitor/api/config_test.go index 3a61447b28..5f80e75f35 100644 --- a/fdbkubernetesmonitor/api/config_test.go +++ b/fdbkubernetesmonitor/api/config_test.go @@ -216,3 +216,120 @@ func TestGeneratingArgumentForIPList(t *testing.T) { return } } + +func TestLookupEnvForEnvironmentVariable(t *testing.T) { + argument := Argument{ArgumentType: EnvironmentArgumentType, Source: "FDB_ZONE_ID"} + + result, err := argument.LookupEnv(map[string]string{"FDB_ZONE_ID": "zone1", "FDB_MACHINE_ID": "machine1"}) + if err != nil { + t.Error(err) + return + } + if result != "zone1" { + t.Logf("Expected result zone1, but got result %v", result) + t.Fail() + return + } + + _, err = argument.LookupEnv(map[string]string{"FDB_MACHINE_ID": "machine1"}) + if err == nil { + t.Logf("Expected error result, but did not get an error") + t.Fail() + return + } + expectedError := "missing environment variable FDB_ZONE_ID" + if err.Error() != expectedError { + t.Logf("Expected error %s, but got error %s", expectedError, err) + t.Fail() + return + } +} + +func TestLookupEnvForIPList(t *testing.T) { + argument := Argument{ArgumentType: IPListArgumentType, Source: "FDB_PUBLIC_IP", IPFamily: 4} + + result, err := argument.LookupEnv(map[string]string{"FDB_PUBLIC_IP": "127.0.0.1,::1"}) + if err != nil { + t.Error(err) + return + } + if result != "127.0.0.1" { + t.Logf("Expected result 127.0.0.1, but got result %v", result) + t.Fail() + return + } + + result, err = argument.LookupEnv(map[string]string{"FDB_PUBLIC_IP": "::1,127.0.0.1"}) + if err != nil { + t.Error(err) + return + } + if result != "127.0.0.1" { + t.Logf("Expected result 127.0.0.1, but got result %v", result) + t.Fail() + return + } + + argument.IPFamily = 6 + + result, err = argument.LookupEnv(map[string]string{"FDB_PUBLIC_IP": "127.0.0.1,::1"}) + if err != nil { + t.Error(err) + return + } + if result != "::1" { + t.Logf("Expected result ::1, but got result %v", result) + t.Fail() + return + } + + result, err = argument.LookupEnv(map[string]string{"FDB_PUBLIC_IP": "::1,127.0.0.1"}) + if err != nil { + t.Error(err) + return + } + if result != "::1" { + t.Logf("Expected result ::1, but got result %v", result) + t.Fail() + return + } + + result, err = argument.LookupEnv(map[string]string{"FDB_PUBLIC_IP": "bad,::1"}) + if err != nil { + t.Error(err) + return + } + if result != "::1" { + t.Logf("Expected result ::1, but got result %v", result) + t.Fail() + return + } + + _, err = argument.LookupEnv(map[string]string{"FDB_PUBLIC_IP": "127.0.0.1"}) + if err == nil { + t.Logf("Expected error, but did not get an error") + t.Fail() + return + } + expectedError := "could not find IP with family 6" + if err.Error() != expectedError { + t.Logf("Expected error %s, but got error %s", expectedError, err.Error()) + t.Fail() + return + } + + argument.IPFamily = 5 + + _, err = argument.LookupEnv(map[string]string{"FDB_PUBLIC_IP": "127.0.0.1"}) + if err == nil { + t.Logf("Expected error, but did not get an error") + t.Fail() + return + } + expectedError = "unsupported IP family 5" + if err.Error() != expectedError { + t.Logf("Expected error %s, but got error %s", expectedError, err.Error()) + t.Fail() + return + } +}