code: func (nm *NodeManager) GetNodeDetails() ([]NodeDetails, error) {
  	nm.registeredNodesLock.Lock()
  	defer nm.registeredNodesLock.Unlock()
  	var nodeDetails []NodeDetails
  
  	for nodeName, nodeObj := range nm.registeredNodes {
  		nodeInfo, err := nm.GetNodeInfoWithNodeObject(nodeObj)
  		if err != nil {
  			return nil, err
  		}
  		klog.V(4).Infof("Updated NodeInfo %v for node %q.", nodeInfo, nodeName)
  		nodeDetails = append(nodeDetails, NodeDetails{nodeName, nodeInfo.vm, nodeInfo.vmUUID, nodeInfo.zone})
  	}
  	return nodeDetails, nil
  }
docs: // GetNodeDetails returns NodeDetails for all the discovered nodes.
  //
  // This method is a getter but it can cause side-effect of updating NodeInfo objects.