func pollNodeInfoCRDAndUpdatePlugin()

in cns/service/main.go [1147:1229]


func pollNodeInfoCRDAndUpdatePlugin(ctx context.Context, zlog *zap.Logger, pluginManager *deviceplugin.PluginManager) error {
	kubeConfig, err := ctrl.GetConfig()
	if err != nil {
		logger.Errorf("Failed to get kubeconfig for request controller: %v", err)
		return errors.Wrap(err, "failed to get kubeconfig")
	}
	kubeConfig.UserAgent = "azure-cns-" + version

	clientset, err := kubernetes.NewForConfig(kubeConfig)
	if err != nil {
		return errors.Wrap(err, "failed to build clientset")
	}

	nodeName, err := configuration.NodeName()
	if err != nil {
		return errors.Wrap(err, "failed to get NodeName")
	}

	node, err := clientset.CoreV1().Nodes().Get(ctx, nodeName, metav1.GetOptions{})
	if err != nil {
		return errors.Wrapf(err, "failed to get node %s", nodeName)
	}

	// check the Node labels for Swift V2
	if _, ok := node.Labels[configuration.LabelNodeSwiftV2]; !ok {
		zlog.Info("Node is not labeled for Swift V2, skipping polling nodeinfo crd")
		return nil
	}

	directcli, err := client.New(kubeConfig, client.Options{Scheme: multitenancy.Scheme})
	if err != nil {
		return errors.Wrap(err, "failed to create ctrl client")
	}

	nodeInfoCli := multitenancy.NodeInfoClient{
		Cli: directcli,
	}

	ticker := time.NewTicker(defaultNodeInfoCRDPollInterval)
	defer ticker.Stop()

	for {
		select {
		case <-ctx.Done():
			zlog.Info("Polling context canceled, exiting")
			return nil
		case <-ticker.C:
			// Fetch the CRD status
			nodeInfo, err := nodeInfoCli.Get(ctx, node.Name)
			if err != nil {
				zlog.Error("Error fetching nodeinfo CRD", zap.Error(err))
				return errors.Wrap(err, "failed to get nodeinfo crd")
			}

			// Check if the status is set
			if !cmp.Equal(nodeInfo.Status, mtv1alpha1.NodeInfoStatus{}) && len(nodeInfo.Status.DeviceInfos) > 0 {
				// Create a map to count devices by type
				deviceCounts := map[mtv1alpha1.DeviceType]int{
					mtv1alpha1.DeviceTypeVnetNIC:       0,
					mtv1alpha1.DeviceTypeInfiniBandNIC: 0,
				}

				// Aggregate device counts from the CRD
				for _, deviceInfo := range nodeInfo.Status.DeviceInfos {
					switch deviceInfo.DeviceType {
					case mtv1alpha1.DeviceTypeVnetNIC, mtv1alpha1.DeviceTypeInfiniBandNIC:
						deviceCounts[deviceInfo.DeviceType]++
					default:
						zlog.Error("Unknown device type", zap.String("deviceType", string(deviceInfo.DeviceType)))
					}
				}

				// Update the plugin manager with device counts
				for deviceType, count := range deviceCounts {
					pluginManager.TrackDevices(deviceType, count)
				}

				// Exit polling loop once the CRD status is successfully processed
				return nil
			}
		}
	}
}