code: func (p *digitaloceanProvisioner) Provision(options controller.VolumeOptions) (*v1.PersistentVolume, error) {
  	if !util.AccessModesContainedInAll(p.getAccessModes(), options.PVC.Spec.AccessModes) {
  		return nil, fmt.Errorf("Invalid Access Modes: %v, Supported Access Modes: %v", options.PVC.Spec.AccessModes, p.getAccessModes())
  	}
  
  	vol, err := p.createVolume(options)
  	if err != nil {
  		return nil, err
  	}
  
  	annotations := make(map[string]string)
  	annotations[annCreatedBy] = createdBy
  
  	annotations[annProvisionerID] = string(p.identity)
  	annotations[annVolumeID] = vol.ID
  
  	labels := make(map[string]string)
  	labels[apis.LabelZoneFailureDomain] = vol.Region.Slug
  	pv := &v1.PersistentVolume{
  		ObjectMeta: metav1.ObjectMeta{
  			Name:        options.PVName,
  			Labels:      labels,
  			Annotations: annotations,
  		},
  		Spec: v1.PersistentVolumeSpec{
  			PersistentVolumeReclaimPolicy: options.PersistentVolumeReclaimPolicy,
  			AccessModes:                   options.PVC.Spec.AccessModes,
  			Capacity: v1.ResourceList{
  				v1.ResourceName(v1.ResourceStorage): resource.MustParse(fmt.Sprintf("%dGi", vol.SizeGigaBytes)),
  			},
  			PersistentVolumeSource: v1.PersistentVolumeSource{
  
  				FlexVolume: &v1.FlexPersistentVolumeSource{
  					Driver:   fmt.Sprintf("%s/%s", flexvolumeVendor, flexvolumeDriver),
  					Options:  map[string]string{},
  					ReadOnly: false,
  				},
  			},
  		},
  	}
  
  	return pv, nil
  }
docs: // Provision creates a volume i.e. the storage asset and returns a PV object for
  // the volume.