diff --git a/.changelog/11183.txt b/.changelog/11183.txt new file mode 100644 index 000000000..4a2775017 --- /dev/null +++ b/.changelog/11183.txt @@ -0,0 +1,3 @@ +```release-note:bug +client: Fixed a bug where network speed fingerprint could fail on Windows +``` diff --git a/client/fingerprint/network_windows.go b/client/fingerprint/network_windows.go index 0361e1c1c..c843da32e 100644 --- a/client/fingerprint/network_windows.go +++ b/client/fingerprint/network_windows.go @@ -9,44 +9,22 @@ import ( // linkSpeed returns link speed in Mb/s, or 0 when unable to determine it. func (f *NetworkFingerprint) linkSpeed(device string) int { - command := fmt.Sprintf("Get-NetAdapter -IncludeHidden | Where name -eq '%s' | Select -ExpandProperty LinkSpeed", device) + command := fmt.Sprintf("Get-NetAdapter -Name '%s' -ErrorAction Ignore | Select-Object -ExpandProperty 'Speed'", device) path := "powershell.exe" - outBytes, err := exec.Command(path, command).Output() + powershellParams := "-NoProfile" + outBytes, err := exec.Command(path, powershellParams, command).Output() if err != nil { f.logger.Warn("failed to detect link speed", "device", device, "path", path, "command", command, "error", err) return 0 } - output := strings.TrimSpace(string(outBytes)) - return f.parseLinkSpeed(device, output) -} - -func (f *NetworkFingerprint) parseLinkSpeed(device, commandOutput string) int { - args := strings.Split(commandOutput, " ") - if len(args) != 2 { - f.logger.Warn("couldn't split LinkSpeed output", "device", device, "output", commandOutput) - return 0 - } - - unit := strings.Replace(args[1], "\r\n", "", -1) - value, err := strconv.Atoi(args[0]) + value, err := strconv.Atoi(output) if err != nil { - f.logger.Warn("unable to parse LinkSpeed value", "device", device, "value", commandOutput, "error", err) + f.logger.Warn("unable to parse Speed value", "device", device, "value", output, "error", err) return 0 } - switch unit { - case "Mbps": - return value - case "Kbps": - return value / 1000 - case "Gbps": - return value * 1000 - case "bps": - return value / 1000000 - } - - return 0 + return value / 1000000 } diff --git a/client/fingerprint/network_windows_test.go b/client/fingerprint/network_windows_test.go deleted file mode 100644 index 96482bc74..000000000 --- a/client/fingerprint/network_windows_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package fingerprint - -import ( - "testing" - - "github.com/hashicorp/nomad/helper/testlog" -) - -func TestNetworkFingerPrint_linkspeed_parse(t *testing.T) { - f := &NetworkFingerprint{logger: testlog.HCLogger(t), interfaceDetector: &DefaultNetworkInterfaceDetector{}} - - var outputTests = []struct { - in string - out int - }{ - {"10 Mbps", 10}, - {"2 bps", 0}, - {"1 Gbps", 1000}, - {"2Mbps", 0}, - {"1000 Kbps", 1}, - {"1 Kbps", 0}, - {"0 Mbps", 0}, - {"2 2 Mbps", 0}, - {"a Mbps", 0}, - {"1 Tbps", 0}, - } - - for _, ot := range outputTests { - out := f.parseLinkSpeed(ot.in) - if out != ot.out { - t.Errorf("parseLinkSpeed(%s) => %d, should be %d", ot.in, out, ot.out) - } - } -}