code: func (c *cinderPlugin) SnapshotCreate(
  	snapshot *crdv1.VolumeSnapshot,
  	pv *v1.PersistentVolume,
  	tags *map[string]string,
  ) (*crdv1.VolumeSnapshotDataSource, *[]crdv1.VolumeSnapshotCondition, error) {
  	spec := &pv.Spec
  	if spec == nil || spec.Cinder == nil {
  		return nil, nil, fmt.Errorf("invalid PV spec %v", spec)
  	}
  	volumeID := spec.Cinder.VolumeID
  	snapshotName := string(pv.Name) + fmt.Sprintf("%d", time.Now().UnixNano())
  	snapshotDescription := "kubernetes snapshot"
  	glog.Infof("issuing Cinder.CreateSnapshot - SourceVol: %s, Name: %s, tags: %#v", volumeID, snapshotName, *tags)
  	snapID, status, err := c.cloud.CreateSnapshot(volumeID, snapshotName, snapshotDescription, *tags)
  	if err != nil {
  		return nil, nil, err
  	}
  
  	return &crdv1.VolumeSnapshotDataSource{
  		CinderSnapshot: &crdv1.CinderVolumeSnapshotSource{
  			SnapshotID: snapID,
  		},
  	}, c.convertSnapshotStatus(status), nil
  }
docs: // SnapshotCreate creates a VolumeSnapshot from a PersistentVolumeSpec