// create asks the given driver to create a volume with the name/opts. // If a volume with the name is already known, it will ask the stored driver for the volume. // If the passed in driver name does not match the driver name which is stored // for the given volume name, an error is returned after checking if the reference is stale. // If the reference is stale, it will be purged and this create can continue. // It is expected that callers of this function hold any necessary locks. func (s *VolumeStore) create(name, driverName string, opts, labels map[string]string) (volume.Volume, error) { // Validate the name in a platform-specific manner valid, err := volume.IsVolumeNameValid(name) if err != nil { return nil, err } if !valid { return nil, &OpErr{Err: errInvalidName, Name: name, Op: "create"} } v, err := s.checkConflict(name, driverName) if err != nil { return nil, err } if v != nil { return v, nil } // Since there isn't a specified driver name, let's see if any of the existing drivers have this volume name if driverName == "" { v, _ := s.getVolume(name) if v != nil { return v, nil } } vd, err := volumedrivers.CreateDriver(driverName) if err != nil { return nil, &OpErr{Op: "create", Name: name, Err: err} } logrus.Debugf("Registering new volume reference: driver %q, name %q", vd.Name(), name) if v, _ := vd.Get(name); v != nil { return v, nil } v, err = vd.Create(name, opts) if err != nil { return nil, err } s.globalLock.Lock() s.labels[name] = labels s.options[name] = opts s.refs[name] = make(map[string]struct{}) s.globalLock.Unlock() metadata := volumeMetadata{ Name: name, Driver: vd.Name(), Labels: labels, Options: opts, } if err := s.setMeta(name, metadata); err != nil { return nil, err } return volumeWrapper{v, labels, vd.Scope(), opts}, nil }
// create asks the given driver to create a volume with the name/opts. // If a volume with the name is already known, it will ask the stored driver for the volume. // If the passed in driver name does not match the driver name which is stored for the given volume name, an error is returned. // It is expected that callers of this function hold any neccessary locks. func (s *VolumeStore) create(name, driverName string, opts map[string]string) (volume.Volume, error) { // Validate the name in a platform-specific manner valid, err := volume.IsVolumeNameValid(name) if err != nil { return nil, err } if !valid { return nil, &OpErr{Err: errInvalidName, Name: name, Op: "create"} } vdName, exists := s.getNamed(name) if exists { if vdName != driverName && driverName != "" && driverName != volume.DefaultDriverName { return nil, errNameConflict } driverName = vdName } logrus.Debugf("Registering new volume reference: driver %s, name %s", driverName, name) vd, err := volumedrivers.GetDriver(driverName) if err != nil { return nil, &OpErr{Op: "create", Name: name, Err: err} } if v, err := vd.Get(name); err == nil { return v, nil } return vd.Create(name, opts) }
// Create tries to find an existing volume with the given name or create a new one from the passed in driver func (s *VolumeStore) Create(name, driverName string, opts map[string]string) (volume.Volume, error) { name = normaliseVolumeName(name) s.locks.Lock(name) defer s.locks.Unlock(name) if vc, exists := s.get(name); exists { v := vc.Volume return v, nil } logrus.Debugf("Registering new volume reference: driver %s, name %s", driverName, name) vd, err := volumedrivers.GetDriver(driverName) if err != nil { return nil, err } // Validate the name in a platform-specific manner valid, err := volume.IsVolumeNameValid(name) if err != nil { return nil, err } if !valid { return nil, ErrInvalidName } v, err := vd.Create(name, opts) if err != nil { return nil, err } s.set(name, &volumeCounter{v, 0}) return v, nil }
// Create tries to find an existing volume with the given name or create a new one from the passed in driver func (s *VolumeStore) Create(name, driverName string, opts map[string]string) (volume.Volume, error) { name = normaliseVolumeName(name) s.locks.Lock(name) defer s.locks.Unlock(name) if vc, exists := s.get(name); exists { v := vc.Volume return v, nil } vd, err := volumedrivers.GetDriver(driverName) if err != nil { return nil, &OpErr{Err: err, Name: driverName, Op: "create"} } // Validate the name in a platform-specific manner valid, err := volume.IsVolumeNameValid(name) if err != nil { return nil, err } if !valid { return nil, &OpErr{Err: errInvalidName, Name: name, Op: "create"} } v, err := vd.Create(name, opts) if err != nil { return nil, &OpErr{Op: "create", Name: name, Err: err} } s.set(name, &volumeCounter{v, 0}) return v, nil }
// create asks the given driver to create a volume with the name/opts. // If a volume with the name is already known, it will ask the stored driver for the volume. // If the passed in driver name does not match the driver name which is stored for the given volume name, an error is returned. // It is expected that callers of this function hold any necessary locks. func (s *VolumeStore) create(name, driverName string, opts map[string]string) (volume.Volume, error) { // Validate the name in a platform-specific manner valid, err := volume.IsVolumeNameValid(name) if err != nil { return nil, err } if !valid { return nil, &OpErr{Err: errInvalidName, Name: name, Op: "create"} } if v, exists := s.getNamed(name); exists { if v.DriverName() != driverName && driverName != "" && driverName != volume.DefaultDriverName { return nil, errNameConflict } return v, nil } // Since there isn't a specified driver name, let's see if any of the existing drivers have this volume name if driverName == "" { v, _ := s.getVolume(name) if v != nil { return v, nil } } vd, err := volumedrivers.GetDriver(driverName) if err != nil { return nil, &OpErr{Op: "create", Name: name, Err: err} } logrus.Debugf("Registering new volume reference: driver %q, name %q", vd.Name(), name) if v, _ := vd.Get(name); v != nil { return v, nil } return vd.Create(name, opts) }
// create asks the given driver to create a volume with the name/opts. // If a volume with the name is already known, it will ask the stored driver for the volume. // If the passed in driver name does not match the driver name which is stored for the given volume name, an error is returned. // It is expected that callers of this function hold any necessary locks. func (s *VolumeStore) create(name, driverName string, opts, labels map[string]string) (volume.Volume, error) { // Validate the name in a platform-specific manner valid, err := volume.IsVolumeNameValid(name) if err != nil { return nil, err } if !valid { return nil, &OpErr{Err: errInvalidName, Name: name, Op: "create"} } if v, exists := s.getNamed(name); exists { if v.DriverName() != driverName && driverName != "" && driverName != volume.DefaultDriverName { return nil, errNameConflict } return v, nil } // Since there isn't a specified driver name, let's see if any of the existing drivers have this volume name if driverName == "" { v, _ := s.getVolume(name) if v != nil { return v, nil } } vd, err := volumedrivers.GetDriver(driverName) if err != nil { return nil, &OpErr{Op: "create", Name: name, Err: err} } logrus.Debugf("Registering new volume reference: driver %q, name %q", vd.Name(), name) if v, _ := vd.Get(name); v != nil { return v, nil } v, err := vd.Create(name, opts) if err != nil { return nil, err } s.labels[name] = labels if s.db != nil { metadata := &volumeMetadata{ Name: name, Labels: labels, } volData, err := json.Marshal(metadata) if err != nil { return nil, err } if err := s.db.Update(func(tx *bolt.Tx) error { b := tx.Bucket([]byte(volumeBucketName)) err := b.Put([]byte(name), volData) return err }); err != nil { return nil, err } } return volumeWithLabels{v, labels}, nil }
// create asks the given driver to create a volume with the name/opts. // If a volume with the name is already known, it will ask the stored driver for the volume. // If the passed in driver name does not match the driver name which is stored // for the given volume name, an error is returned after checking if the reference is stale. // If the reference is stale, it will be purged and this create can continue. // It is expected that callers of this function hold any necessary locks. func (s *VolumeStore) create(name, driverName string, opts, labels map[string]string) (volume.Volume, error) { // Validate the name in a platform-specific manner valid, err := volume.IsVolumeNameValid(name) if err != nil { return nil, err } if !valid { return nil, &OpErr{Err: errInvalidName, Name: name, Op: "create"} } v, err := s.checkConflict(name, driverName) if err != nil { return nil, err } if v != nil { return v, nil } // Since there isn't a specified driver name, let's see if any of the existing drivers have this volume name if driverName == "" { v, _ := s.getVolume(name) if v != nil { return v, nil } } vd, err := volumedrivers.CreateDriver(driverName) if err != nil { return nil, &OpErr{Op: "create", Name: name, Err: err} } logrus.Debugf("Registering new volume reference: driver %q, name %q", vd.Name(), name) if v, _ := vd.Get(name); v != nil { return v, nil } v, err = vd.Create(name, opts) if err != nil { return nil, err } s.globalLock.Lock() s.labels[name] = labels s.options[name] = opts s.refs[name] = make(map[string]struct{}) s.globalLock.Unlock() if s.db != nil { metadata := &volumeMetadata{ Name: name, Labels: labels, Options: opts, } volData, err := json.Marshal(metadata) if err != nil { return nil, err } if err := s.db.Update(func(tx *bolt.Tx) error { b := tx.Bucket([]byte(volumeBucketName)) err := b.Put([]byte(name), volData) return err }); err != nil { return nil, errors.Wrap(err, "error while persisting volume metadata") } } return volumeWrapper{v, labels, vd.Scope(), opts}, nil }