mirror of https://github.com/docker/docs.git
				
				
				
			
		
			
				
	
	
		
			61 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
| package persist
 | |
| 
 | |
| import (
 | |
| 	"github.com/docker/machine/drivers/errdriver"
 | |
| 	"github.com/docker/machine/libmachine/drivers"
 | |
| 	"github.com/docker/machine/libmachine/drivers/plugin/localbinary"
 | |
| 	"github.com/docker/machine/libmachine/drivers/rpc"
 | |
| 	"github.com/docker/machine/libmachine/host"
 | |
| )
 | |
| 
 | |
| type PluginDriverFactory interface {
 | |
| 	NewPluginDriver(driverName string, rawDriver []byte) (drivers.Driver, error)
 | |
| }
 | |
| 
 | |
| type RPCPluginDriverFactory struct{}
 | |
| 
 | |
| type PluginStore struct {
 | |
| 	*Filestore
 | |
| 	PluginDriverFactory
 | |
| }
 | |
| 
 | |
| func (factory RPCPluginDriverFactory) NewPluginDriver(driverName string, rawDriver []byte) (drivers.Driver, error) {
 | |
| 	d, err := rpcdriver.NewRPCClientDriver(driverName, rawDriver)
 | |
| 	if err != nil {
 | |
| 		// Not being able to find a driver binary is a "known error"
 | |
| 		if _, ok := err.(localbinary.ErrPluginBinaryNotFound); ok {
 | |
| 			return errdriver.NewDriver(driverName), nil
 | |
| 		}
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	if driverName == "virtualbox" {
 | |
| 		return drivers.NewSerialDriver(d), nil
 | |
| 	}
 | |
| 
 | |
| 	return d, nil
 | |
| }
 | |
| 
 | |
| func NewPluginStore(path, caCertPath, caPrivateKeyPath string) *PluginStore {
 | |
| 	return &PluginStore{
 | |
| 		Filestore:           NewFilestore(path, caCertPath, caPrivateKeyPath),
 | |
| 		PluginDriverFactory: RPCPluginDriverFactory{},
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (ps PluginStore) Load(name string) (*host.Host, error) {
 | |
| 	h, err := ps.Filestore.Load(name)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	d, err := ps.NewPluginDriver(h.DriverName, h.RawDriver)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	h.Driver = d
 | |
| 
 | |
| 	return h, nil
 | |
| }
 |