// Count returns the usage count of the passed in volume func (s *volumeStore) Count(v volume.Volume) int { vc, exists := s.vols[v.Name()] if !exists { return 0 } return vc.count }
func removeVolume(v volume.Volume) error { vd, err := getVolumeDriver(v.DriverName()) if err != nil { return nil } return vd.Remove(v) }
// Remove deletes a volume. func (d *FakeDriver) Remove(v volume.Volume) error { if _, exists := d.vols[v.Name()]; !exists { return fmt.Errorf("no such volume") } delete(d.vols, v.Name()) return nil }
// volumeExists returns if the volume is still present in the driver. // An error is returned if there was an issue communicating with the driver. func volumeExists(v volume.Volume) (bool, error) { exists, err := lookupVolume(v.DriverName(), v.Name()) if err != nil { return false, err } return exists != nil, nil }
// Remove removes the requested volume. A volume is not removed if the usage count is > 0 func (s *VolumeStore) Remove(v volume.Volume) error { name := normaliseVolumeName(v.Name()) s.locks.Lock(name) defer s.locks.Unlock(name) logrus.Debugf("Removing volume reference: driver %s, name %s", v.DriverName(), name) vc, exists := s.get(name) if !exists { return ErrNoSuchVolume } if vc.count > 0 { return ErrVolumeInUse } vd, err := volumedrivers.GetDriver(vc.DriverName()) if err != nil { return err } if err := vd.Remove(vc.Volume); err != nil { return err } s.remove(name) return nil }
// Refs gets the current list of refs for the given volume func (s *VolumeStore) Refs(v volume.Volume) []string { name := v.Name() s.locks.Lock(name) defer s.locks.Unlock(name) return s.getRefs(name) }
// Count returns the usage count of the passed in volume func (s *VolumeStore) Count(v volume.Volume) uint { s.mu.Lock() defer s.mu.Unlock() vc, exists := s.vols[normaliseVolumeName(v.Name())] if !exists { return 0 } return vc.count }
// Count returns the usage count of the passed in volume func (s *volumeStore) Count(v volume.Volume) int { s.mu.Lock() defer s.mu.Unlock() vc, exists := s.vols[v.Name()] if !exists { return 0 } return vc.count }
func (container *Container) addMountPointWithVolume(destination string, vol volume.Volume, rw bool) { container.MountPoints[destination] = &mountPoint{ Name: vol.Name(), Driver: vol.DriverName(), Destination: destination, RW: rw, Volume: vol, } }
// AddMountPointWithVolume adds a new mount point configured with a volume to the container. func (container *Container) AddMountPointWithVolume(destination string, vol volume.Volume, rw bool) { container.MountPoints[destination] = &volume.MountPoint{ Name: vol.Name(), Driver: vol.DriverName(), Destination: destination, RW: rw, Volume: vol, CopyData: volume.DefaultCopyMode, } }
// Count returns the usage count of the passed in volume func (s *VolumeStore) Count(v volume.Volume) uint { name := normaliseVolumeName(v.Name()) s.locks.Lock(name) defer s.locks.Unlock(name) vc, exists := s.get(name) if !exists { return 0 } return vc.count }
// Decrement decrements the usage count of the passed in volume by 1 func (s *volumeStore) Decrement(v volume.Volume) { s.mu.Lock() defer s.mu.Unlock() vc, exists := s.vols[v.Name()] if !exists { return } vc.count-- return }
// Increment increments the usage count of the passed in volume by 1 func (s *volumeStore) Increment(v volume.Volume) { s.mu.Lock() defer s.mu.Unlock() vc, exists := s.vols[v.Name()] if !exists { s.vols[v.Name()] = &volumeCounter{v, 1} return } vc.count++ return }
// Dereference removes the specified reference to the volume func (s *VolumeStore) Dereference(v volume.Volume, ref string) { name := v.Name() s.locks.Lock(name) defer s.locks.Unlock(name) s.globalLock.Lock() defer s.globalLock.Unlock() if s.refs[name] != nil { delete(s.refs[name], ref) } }
// volumeToAPIType converts a volume.Volume to the type used by the remote API func volumeToAPIType(v volume.Volume) *types.Volume { tv := &types.Volume{ Name: v.Name(), Driver: v.DriverName(), } if v, ok := v.(volume.DetailedVolume); ok { tv.Labels = v.Labels() tv.Options = v.Options() tv.Scope = v.Scope() } return tv }
func (s *VolumeStore) setNamed(v volume.Volume, ref string) { name := v.Name() s.globalLock.Lock() s.names[name] = v if len(ref) > 0 { if s.refs[name] == nil { s.refs[name] = make(map[string]struct{}) } s.refs[name][ref] = struct{}{} } s.globalLock.Unlock() }
// Increment increments the usage count of the passed in volume by 1 func (s *VolumeStore) Increment(v volume.Volume) { s.mu.Lock() defer s.mu.Unlock() name := normaliseVolumeName(v.Name()) logrus.Debugf("Incrementing volume reference: driver %s, name %s", v.DriverName(), name) vc, exists := s.vols[name] if !exists { s.vols[name] = &volumeCounter{v, 1} return } vc.count++ }
// Decrement decrements the usage count of the passed in volume by 1 func (s *VolumeStore) Decrement(v volume.Volume) { s.mu.Lock() defer s.mu.Unlock() name := normaliseVolumeName(v.Name()) logrus.Debugf("Decrementing volume reference: driver %s, name %s", v.DriverName(), name) vc, exists := s.vols[name] if !exists { return } if vc.count == 0 { return } vc.count-- }
// volumeToAPIType converts a volume.Volume to the type used by the remote API func volumeToAPIType(v volume.Volume) *types.Volume { tv := &types.Volume{ Name: v.Name(), Driver: v.DriverName(), Mountpoint: v.Path(), } if v, ok := v.(interface { Labels() map[string]string }); ok { tv.Labels = v.Labels() } return tv }
// CopyImagePathContent copies files in destination to the volume. func (container *Container) CopyImagePathContent(v volume.Volume, destination string) error { rootfs, err := symlink.FollowSymlinkInScope(filepath.Join(container.BaseFS, destination), container.BaseFS) if err != nil { return err } if _, err = ioutil.ReadDir(rootfs); err != nil { if os.IsNotExist(err) { return nil } return err } path, err := v.Mount() if err != nil { return err } defer v.Unmount() return copyExistingContents(rootfs, path) }
// volumeExists returns if the volume is still present in the driver. // An error is returned if there was an issue communicating with the driver. func volumeExists(v volume.Volume) (bool, error) { vd, err := volumedrivers.GetDriver(v.DriverName()) if err != nil { return false, errors.Wrapf(err, "error while checking if volume %q exists in driver %q", v.Name(), v.DriverName()) } exists, err := vd.Get(v.Name()) if err != nil { err = errors.Cause(err) if _, ok := err.(net.Error); ok { return false, errors.Wrapf(err, "error while checking if volume %q exists in driver %q", v.Name(), v.DriverName()) } // At this point, the error could be anything from the driver, such as "no such volume" // Let's not check an error here, and instead check if the driver returned a volume } if exists == nil { return false, nil } return true, nil }
// volumeToAPIType converts a volume.Volume to the type used by the remote API func volumeToAPIType(v volume.Volume) *types.Volume { return &types.Volume{ Name: v.Name(), Driver: v.DriverName(), Mountpoint: v.Path(), } }
// CopyImagePathContent copies files in destination to the volume. func (container *Container) CopyImagePathContent(v volume.Volume, destination string) error { rootfs, err := symlink.FollowSymlinkInScope(filepath.Join(container.BaseFS, destination), container.BaseFS) if err != nil { return err } if _, err = ioutil.ReadDir(rootfs); err != nil { if os.IsNotExist(err) { return nil } return err } id := stringid.GenerateNonCryptoID() path, err := v.Mount(id) if err != nil { return err } defer func() { if err := v.Unmount(id); err != nil { logrus.Warnf("error while unmounting volume %s: %v", v.Name(), err) } }() return copyExistingContents(rootfs, path) }
// Dereference removes the specified reference to the volume func (s *VolumeStore) Dereference(v volume.Volume, ref string) { s.locks.Lock(v.Name()) defer s.locks.Unlock(v.Name()) s.globalLock.Lock() defer s.globalLock.Unlock() var refs []string for _, r := range s.refs[v.Name()] { if r != ref { refs = append(refs, r) } } s.refs[v.Name()] = refs }
func (s *VolumeStore) setNamed(v volume.Volume, ref string) { s.globalLock.Lock() s.names[v.Name()] = v if len(ref) > 0 { s.refs[v.Name()] = append(s.refs[v.Name()], ref) } s.globalLock.Unlock() }
// volumeToAPIType converts a volume.Volume to the type used by the remote API func volumeToAPIType(v volume.Volume) *types.Volume { tv := &types.Volume{ Name: v.Name(), Driver: v.DriverName(), Size: -1, RefCount: -1, } if v, ok := v.(volume.LabeledVolume); ok { tv.Labels = v.Labels() } if v, ok := v.(volume.ScopedVolume); ok { tv.Scope = v.Scope() } return tv }
// Remove removes the requested volume. A volume is not removed if the usage count is > 0 func (s *volumeStore) Remove(v volume.Volume) error { s.mu.Lock() defer s.mu.Unlock() name := v.Name() vc, exists := s.vols[name] if !exists { return ErrNoSuchVolume } if vc.count != 0 { return ErrVolumeInUse } vd, err := getVolumeDriver(vc.DriverName()) if err != nil { return err } if err := vd.Remove(vc.Volume); err != nil { return err } delete(s.vols, name) return nil }
// Refs gets the current list of refs for the given volume func (s *VolumeStore) Refs(v volume.Volume) []string { s.locks.Lock(v.Name()) defer s.locks.Unlock(v.Name()) refs := s.getRefs(v.Name()) refsOut := make([]string, len(refs)) copy(refsOut, refs) return refsOut }
// Remove removes the requested volume. A volume is not removed if the usage count is > 0 func (s *VolumeStore) Remove(v volume.Volume) error { s.mu.Lock() defer s.mu.Unlock() name := v.Name() logrus.Debugf("Removing volume reference: driver %s, name %s", v.DriverName(), name) vc, exists := s.vols[name] if !exists { return ErrNoSuchVolume } if vc.count > 0 { return ErrVolumeInUse } vd, err := volumedrivers.GetDriver(vc.DriverName()) if err != nil { return err } if err := vd.Remove(vc.Volume); err != nil { return err } delete(s.vols, name) return nil }
// Decrement decrements the usage count of the passed in volume by 1 func (s *volumeStore) Decrement(v volume.Volume) { s.mu.Lock() defer s.mu.Unlock() logrus.Debugf("Decrementing volume reference: driver %s, name %s", v.DriverName(), v.Name()) vc, exists := s.vols[v.Name()] if !exists { return } vc.count-- return }