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
}
}
}
}