in pkg/metrics/collector/pod_ip_metrics.go [205:265]
func (c *podIPMetricsCollector) listIPAddresses(dir string) error {
f, err := os.Open(dir)
if err != nil {
glog.Errorf("Error opening directory %s, %v", dir, err)
return err
}
files, err := f.Readdir(0)
if err != nil {
glog.Errorf("Error while reading files in directory %v", err)
return err
}
podMap := make(map[string]ipFamily)
var ipv4Count, ipv6Count, dupIPCount, dualCount, dualErrCount uint64
for _, v := range files {
if ip := net.ParseIP(v.Name()); ip == nil {
// This isn't an IP address file
continue
}
var family ipFamily
if strings.Contains(v.Name(), ":") {
ipv6Count++
family = ipv6
} else {
ipv4Count++
family = ipv4
}
// Update the map and track IP families only for dual stack clusters
fileName := fmt.Sprintf("%s/%s", dir, v.Name())
podID, err := readLine(fileName)
if err != nil {
glog.Errorf("Error reading file %s: %v", fileName, err)
continue
}
f, ok := podMap[podID]
// TODO: #351 - fix lint errors
//nolint:gocritic
if !ok {
podMap[podID] = family
} else if (f == ipv4 && family == ipv6) || (f == ipv6 && family == ipv4) {
podMap[podID] = dual
} else {
dupIPCount++
}
}
if stackType == dualStack {
for _, family := range podMap {
if family == dual {
dualCount++
} else {
dualErrCount++
}
}
}
c.usedIPv4AddrCount = ipv4Count
c.usedIPv6AddrCount = ipv6Count
c.dualStackCount = dualCount
c.dualStackErrorCount = dualErrCount
c.duplicateIPCount = dupIPCount
return nil
}