func GetDevicesForAllContainers()

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
}