code: func (f *NodeClient) NodePublishVolume(ctx context.Context, req *csipb.NodePublishVolumeRequest, opts ...grpc.CallOption) (*csipb.NodePublishVolumeResponse, error) {
  	if f.nextErr != nil {
  		return nil, f.nextErr
  	}
  
  	if req.GetVolumeId() == "" {
  		return nil, errors.New("missing volume id")
  	}
  	if req.GetTargetPath() == "" {
  		return nil, errors.New("missing target path")
  	}
  	fsTypes := "block|ext4|xfs|zfs"
  	fsType := req.GetVolumeCapability().GetMount().GetFsType()
  	if !strings.Contains(fsTypes, fsType) {
  		return nil, errors.New("invalid fstype")
  	}
  	f.nodePublishedVolumes[req.GetVolumeId()] = CSIVolume{
  		VolumeHandle:    req.GetVolumeId(),
  		Path:            req.GetTargetPath(),
  		DeviceMountPath: req.GetStagingTargetPath(),
  		VolumeContext:   req.GetVolumeContext(),
  		FSType:          req.GetVolumeCapability().GetMount().GetFsType(),
  		MountFlags:      req.GetVolumeCapability().GetMount().MountFlags,
  	}
  	return &csipb.NodePublishVolumeResponse{}, nil
  }
docs: // NodePublishVolume implements CSI NodePublishVolume