Expects storage driver executables to be of the form registry-storage-name
Moves main packages to sub-packages of the individual storage drivers
This commit is contained in:
parent
f02cfee950
commit
150677f1f5
5 changed files with 10 additions and 12 deletions
|
@ -26,7 +26,7 @@ Driver Selection and Configuration
|
||||||
|
|
||||||
The preferred method of selecting a storage driver is using the `StorageDriverFactory` interface in the `storagedriver/factory` package. These factories provide a common interface for constructing storage drivers with a parameters map. The factory model is based off of the [Register](http://golang.org/pkg/database/sql/#Register) and [Open](http://golang.org/pkg/database/sql/#Open) methods in the builtin [database/sql](http://golang.org/pkg/database/sql) package.
|
The preferred method of selecting a storage driver is using the `StorageDriverFactory` interface in the `storagedriver/factory` package. These factories provide a common interface for constructing storage drivers with a parameters map. The factory model is based off of the [Register](http://golang.org/pkg/database/sql/#Register) and [Open](http://golang.org/pkg/database/sql/#Open) methods in the builtin [database/sql](http://golang.org/pkg/database/sql) package.
|
||||||
|
|
||||||
Storage driver factories may be registered by name using the `factory.Register` method, and then later invoked by calling `factory.Create` with a driver name and parameters map. If no driver is registered with the given name, this factory will attempt to find an executable storage driver with the same name and return an IPC storage driver wrapper managing the driver subprocess. If no such storage driver can be found, `factory.Create` will return an `InvalidStorageDriverError`.
|
Storage driver factories may be registered by name using the `factory.Register` method, and then later invoked by calling `factory.Create` with a driver name and parameters map. If no driver is registered with the given name, this factory will attempt to find an executable storage driver with the executable name "registry-storage-\<driver name\>" and return an IPC storage driver wrapper managing the driver subprocess. If no such storage driver can be found, `factory.Create` will return an `InvalidStorageDriverError`.
|
||||||
|
|
||||||
Driver Contribution
|
Driver Contribution
|
||||||
===================
|
===================
|
||||||
|
@ -38,7 +38,7 @@ To create a valid storage driver, one must implement the `storagedriver.StorageD
|
||||||
Storage drivers should call `factory.Register` with their driver name in an `init` method, allowing callers of `factory.New` to construct instances of this driver without requiring modification of imports throughout the codebase.
|
Storage drivers should call `factory.Register` with their driver name in an `init` method, allowing callers of `factory.New` to construct instances of this driver without requiring modification of imports throughout the codebase.
|
||||||
|
|
||||||
### Out-of-process drivers
|
### Out-of-process drivers
|
||||||
As many users will run the registry as a pre-constructed docker container, storage drivers should also be distributable as IPC server executables. Drivers written in go should model the main method provided in `main/storagedriver/filesystem/filesystem.go`. Parameters to IPC drivers will be provided as a JSON-serialized map in the first argument to the process. These parameters should be validated and then a blocking call to `ipc.StorageDriverServer` should be made with a new storage driver.
|
As many users will run the registry as a pre-constructed docker container, storage drivers should also be distributable as IPC server executables. Drivers written in go should model the main method provided in `storagedriver/filesystem/registry-storage-filesystem/filesystem.go`. Parameters to IPC drivers will be provided as a JSON-serialized map in the first argument to the process. These parameters should be validated and then a blocking call to `ipc.StorageDriverServer` should be made with a new storage driver.
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
Storage driver test suites are provided in `storagedriver/testsuites/testsuites.go` and may be used for any storage driver written in go. Two methods are provided for registering test suites, `RegisterInProcessSuite` and `RegisterIPCSuite`, which run the same set of tests for the driver imported or managed over IPC respectively.
|
Storage driver test suites are provided in `storagedriver/testsuites/testsuites.go` and may be used for any storage driver written in go. Two methods are provided for registering test suites, `RegisterInProcessSuite` and `RegisterIPCSuite`, which run the same set of tests for the driver imported or managed over IPC respectively.
|
||||||
|
|
|
@ -8,13 +8,16 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path"
|
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"github.com/docker/libchan"
|
"github.com/docker/libchan"
|
||||||
"github.com/docker/libchan/spdy"
|
"github.com/docker/libchan/spdy"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// StorageDriverExecutablePrefix is the prefix which the IPC storage driver loader expects driver
|
||||||
|
// executables to begin with. For example, the s3 driver should be named "registry-storage-s3".
|
||||||
|
const StorageDriverExecutablePrefix = "registry-storagedriver-"
|
||||||
|
|
||||||
// StorageDriverClient is a storagedriver.StorageDriver implementation using a managed child process
|
// StorageDriverClient is a storagedriver.StorageDriver implementation using a managed child process
|
||||||
// communicating over IPC using libchan with a unix domain socket
|
// communicating over IPC using libchan with a unix domain socket
|
||||||
type StorageDriverClient struct {
|
type StorageDriverClient struct {
|
||||||
|
@ -38,16 +41,11 @@ func NewDriverClient(name string, parameters map[string]string) (*StorageDriverC
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
driverPath := os.ExpandEnv(path.Join("$GOPATH", "bin", name))
|
driverExecName := StorageDriverExecutablePrefix + name
|
||||||
if _, err := os.Stat(driverPath); os.IsNotExist(err) {
|
driverPath, err := exec.LookPath(driverExecName)
|
||||||
driverPath = path.Join(path.Dir(os.Args[0]), name)
|
|
||||||
}
|
|
||||||
if _, err := os.Stat(driverPath); os.IsNotExist(err) {
|
|
||||||
driverPath, err = exec.LookPath(name)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
command := exec.Command(driverPath, string(paramsBytes))
|
command := exec.Command(driverPath, string(paramsBytes))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue