func findPairInterfaceOfContainerInterface(e exec.Interface, containerInterfaceName, containerDesc string, nsenterArgs []string) (string, error) { nsenterPath, err := e.LookPath("nsenter") if err != nil { return "", err } ethtoolPath, err := e.LookPath("ethtool") if err != nil { return "", err } nsenterArgs = append(nsenterArgs, "-F", "--", ethtoolPath, "--statistics", containerInterfaceName) output, err := e.Command(nsenterPath, nsenterArgs...).CombinedOutput() if err != nil { return "", fmt.Errorf("Unable to query interface %s of container %s: %v: %s", containerInterfaceName, containerDesc, err, string(output)) } // look for peer_ifindex match := ethtoolOutputRegex.FindSubmatch(output) if match == nil { return "", fmt.Errorf("No peer_ifindex in interface statistics for %s of container %s", containerInterfaceName, containerDesc) } peerIfIndex, err := strconv.Atoi(string(match[1])) if err != nil { // seems impossible (\d+ not numeric) return "", fmt.Errorf("peer_ifindex wasn't numeric: %s: %v", match[1], err) } iface, err := net.InterfaceByIndex(peerIfIndex) if err != nil { return "", err } return iface.Name, nil }
// New returns a new ovs.Interface func New(execer exec.Interface, bridge string) (*Interface, error) { if _, err := execer.LookPath(OVS_OFCTL); err != nil { return nil, fmt.Errorf("OVS is not installed") } if _, err := execer.LookPath(OVS_VSCTL); err != nil { return nil, fmt.Errorf("OVS is not installed") } return &Interface{execer: execer, bridge: bridge}, nil }