code: func (c *controllerCommon) AttachDisk(isManagedDisk bool, diskName, diskURI string, nodeName types.NodeName, cachingMode compute.CachingTypes) error {
  	vmset, err := c.getNodeVMSet(nodeName)
  	if err != nil {
  		return err
  	}
  
  	instanceid, err := c.cloud.InstanceID(context.TODO(), nodeName)
  	if err != nil {
  		klog.Warningf("failed to get azure instance id (%v)", err)
  		return fmt.Errorf("failed to get azure instance id for node %q (%v)", nodeName, err)
  	}
  
  	diskOpMutex.LockKey(instanceid)
  	defer diskOpMutex.UnlockKey(instanceid)
  
  	lun, err := c.GetNextDiskLun(nodeName)
  	if err != nil {
  		klog.Warningf("no LUN available for instance %q (%v)", nodeName, err)
  		return fmt.Errorf("all LUNs are used, cannot attach volume (%s, %s) to instance %q (%v)", diskName, diskURI, instanceid, err)
  	}
  
  	klog.V(2).Infof("Trying to attach volume %q lun %d to node %q.", diskURI, lun, nodeName)
  	return vmset.AttachDisk(isManagedDisk, diskName, diskURI, nodeName, lun, cachingMode)
  }
docs: // AttachDisk attaches a vhd to vm. The vhd must exist, can be identified by diskName, diskURI.