in pkg/gpu/nvidia/metrics/devices.go [51:101]
func GetDevicesForAllContainers() (map[ContainerID][]string, error) {
containerDevices := make(map[ContainerID][]string)
conn, err := grpc.Dial(
socketPath,
grpc.WithInsecure(),
grpc.WithDialer(func(addr string, timeout time.Duration) (net.Conn, error) {
return net.DialTimeout("unix", addr, timeout)
}))
defer func() {
err := conn.Close()
if err != nil {
glog.Warningf("Failed to close grpc connection to kubelet PodResourceLister endpoint: %v", err)
}
}()
if err != nil {
return containerDevices, fmt.Errorf("error connecting to kubelet PodResourceLister service: %v", err)
}
client := podresources.NewPodResourcesListerClient(conn)
resp, err := client.List(context.Background(), &podresources.ListPodResourcesRequest{})
if err != nil {
return containerDevices, fmt.Errorf("error listing pod resources: %v", err)
}
for _, pod := range resp.PodResources {
container := ContainerID{
namespace: pod.Namespace,
pod: pod.Name,
}
for _, c := range pod.Containers {
container.container = c.Name
for _, d := range c.Devices {
if len(d.DeviceIds) == 0 || d.ResourceName != gpuResourceName {
continue
}
var devices []string
for _, deviceID := range d.DeviceIds {
if gpusharing.IsVirtualDeviceID(deviceID) {
continue
}
devices = append(devices, deviceID)
}
containerDevices[container] = append(containerDevices[container], devices...)
}
}
}
return containerDevices, nil
}