package ocicni import ( "os/exec" "strings" "net" "fmt" ) func getContainerIP(nsenterPath, netnsPath, interfaceName, addrType string) (net.IP, error) { // Try to retrieve ip inside container network namespace output, err := exec.Command(nsenterPath, fmt.Sprintf("--net=%s", netnsPath), "-F", "--", "ip", "-o", addrType, "addr", "show", "dev", interfaceName, "scope", "global").CombinedOutput() if err != nil { return nil, fmt.Errorf("Unexpected command output %s with error: %v", output, err) } lines := strings.Split(string(output), "\n") if len(lines) < 1 { return nil, fmt.Errorf("Unexpected command output %s", output) } fields := strings.Fields(lines[0]) if len(fields) < 4 { return nil, fmt.Errorf("Unexpected address output %s ", lines[0]) } ip, _, err := net.ParseCIDR(fields[3]) if err != nil { return nil, fmt.Errorf("CNI failed to parse ip from output %s due to %v", output, err) } return ip, nil }