github.com/uriddle/docker@v0.0.0-20210926094723-4072e6aeb013/volume/drivers/adapter.go (about)

     1  package volumedrivers
     2  
     3  import (
     4  	"github.com/docker/docker/pkg/plugins"
     5  	"github.com/docker/docker/volume"
     6  )
     7  
     8  type volumeDriverAdapter struct {
     9  	name  string
    10  	proxy *volumeDriverProxy
    11  }
    12  
    13  func (a *volumeDriverAdapter) Name() string {
    14  	return a.name
    15  }
    16  
    17  func (a *volumeDriverAdapter) Create(name string, opts map[string]string) (volume.Volume, error) {
    18  	// First try a Get. For drivers that support Get this will return any
    19  	// existing volume.
    20  	v, err := a.proxy.Get(name)
    21  	if v != nil {
    22  		return &volumeAdapter{
    23  			proxy:      a.proxy,
    24  			name:       v.Name,
    25  			driverName: a.Name(),
    26  			eMount:     v.Mountpoint,
    27  		}, nil
    28  	}
    29  
    30  	// Driver didn't support Get or volume didn't exist. Perform Create.
    31  	err = a.proxy.Create(name, opts)
    32  	if err != nil {
    33  		return nil, err
    34  	}
    35  	return &volumeAdapter{
    36  		proxy:      a.proxy,
    37  		name:       name,
    38  		driverName: a.name}, nil
    39  }
    40  
    41  func (a *volumeDriverAdapter) Remove(v volume.Volume) error {
    42  	return a.proxy.Remove(v.Name())
    43  }
    44  
    45  func (a *volumeDriverAdapter) List() ([]volume.Volume, error) {
    46  	ls, err := a.proxy.List()
    47  	if err != nil {
    48  		return nil, err
    49  	}
    50  
    51  	var out []volume.Volume
    52  	for _, vp := range ls {
    53  		out = append(out, &volumeAdapter{
    54  			proxy:      a.proxy,
    55  			name:       vp.Name,
    56  			driverName: a.name,
    57  			eMount:     vp.Mountpoint,
    58  		})
    59  	}
    60  	return out, nil
    61  }
    62  
    63  func (a *volumeDriverAdapter) Get(name string) (volume.Volume, error) {
    64  	v, err := a.proxy.Get(name)
    65  	if err != nil {
    66  		// TODO: remove this hack. Allows back compat with volume drivers that don't support this call
    67  		if !plugins.IsNotFound(err) {
    68  			return nil, err
    69  		}
    70  		return a.Create(name, nil)
    71  	}
    72  
    73  	return &volumeAdapter{
    74  		proxy:      a.proxy,
    75  		name:       v.Name,
    76  		driverName: a.Name(),
    77  		eMount:     v.Mountpoint,
    78  	}, nil
    79  }
    80  
    81  type volumeAdapter struct {
    82  	proxy      *volumeDriverProxy
    83  	name       string
    84  	driverName string
    85  	eMount     string // ephemeral host volume path
    86  }
    87  
    88  type proxyVolume struct {
    89  	Name       string
    90  	Mountpoint string
    91  }
    92  
    93  func (a *volumeAdapter) Name() string {
    94  	return a.name
    95  }
    96  
    97  func (a *volumeAdapter) DriverName() string {
    98  	return a.driverName
    99  }
   100  
   101  func (a *volumeAdapter) Path() string {
   102  	if len(a.eMount) > 0 {
   103  		return a.eMount
   104  	}
   105  	m, _ := a.proxy.Path(a.name)
   106  	return m
   107  }
   108  
   109  func (a *volumeAdapter) Mount() (string, error) {
   110  	var err error
   111  	a.eMount, err = a.proxy.Mount(a.name)
   112  	return a.eMount, err
   113  }
   114  
   115  func (a *volumeAdapter) Unmount() error {
   116  	return a.proxy.Unmount(a.name)
   117  }