diff --git a/registry/handlers/api_test.go b/registry/handlers/api_test.go index ae0c67cf..7f2606e2 100644 --- a/registry/handlers/api_test.go +++ b/registry/handlers/api_test.go @@ -1377,7 +1377,7 @@ const ( repositoryWithGenericStorageError = "genericstorageerr" ) -func (factory *storageManifestErrDriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { +func (factory *storageManifestErrDriverFactory) Create(ctx context.Context, parameters map[string]interface{}) (storagedriver.StorageDriver, error) { // Initialize the mock driver errGenericStorage := errors.New("generic storage error") return &mockErrorDriver{ diff --git a/registry/handlers/app.go b/registry/handlers/app.go index 8efdaf85..53367277 100644 --- a/registry/handlers/app.go +++ b/registry/handlers/app.go @@ -116,7 +116,7 @@ func NewApp(ctx context.Context, config *configuration.Configuration) *App { storageParams["useragent"] = fmt.Sprintf("distribution/%s %s", version.Version, runtime.Version()) var err error - app.driver, err = factory.Create(config.Storage.Type(), storageParams) + app.driver, err = factory.Create(app, config.Storage.Type(), storageParams) if err != nil { // TODO(stevvooe): Move the creation of a service into a protected // method, where this is created lazily. Its status can be queried via diff --git a/registry/root.go b/registry/root.go index 51c8c7ff..fb370ca8 100644 --- a/registry/root.go +++ b/registry/root.go @@ -53,12 +53,6 @@ var GCCmd = &cobra.Command{ os.Exit(1) } - driver, err := factory.Create(config.Storage.Type(), config.Storage.Parameters()) - if err != nil { - fmt.Fprintf(os.Stderr, "failed to construct %s driver: %v", config.Storage.Type(), err) - os.Exit(1) - } - ctx := dcontext.Background() ctx, err = configureLogging(ctx, config) if err != nil { @@ -66,6 +60,12 @@ var GCCmd = &cobra.Command{ os.Exit(1) } + driver, err := factory.Create(ctx, config.Storage.Type(), config.Storage.Parameters()) + if err != nil { + fmt.Fprintf(os.Stderr, "failed to construct %s driver: %v", config.Storage.Type(), err) + os.Exit(1) + } + registry, err := storage.NewRegistry(ctx, driver) if err != nil { fmt.Fprintf(os.Stderr, "failed to construct registry: %v", err) diff --git a/registry/storage/driver/azure/azure.go b/registry/storage/driver/azure/azure.go index 585c8b43..837104af 100644 --- a/registry/storage/driver/azure/azure.go +++ b/registry/storage/driver/azure/azure.go @@ -46,16 +46,16 @@ func init() { type azureDriverFactory struct{} -func (factory *azureDriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { +func (factory *azureDriverFactory) Create(ctx context.Context, parameters map[string]interface{}) (storagedriver.StorageDriver, error) { params, err := NewParameters(parameters) if err != nil { return nil, err } - return New(params) + return New(ctx, params) } // New constructs a new Driver from parameters -func New(params *Parameters) (*Driver, error) { +func New(ctx context.Context, params *Parameters) (*Driver, error) { azClient, err := newAzureClient(params) if err != nil { return nil, err diff --git a/registry/storage/driver/azure/azure_test.go b/registry/storage/driver/azure/azure_test.go index 945cc0a9..3cdb3f1c 100644 --- a/registry/storage/driver/azure/azure_test.go +++ b/registry/storage/driver/azure/azure_test.go @@ -68,7 +68,7 @@ func init() { if err != nil { return nil, err } - return New(params) + return New(context.Background(), params) } // Skip Azure storage driver tests if environment variable parameters are not provided diff --git a/registry/storage/driver/factory/factory.go b/registry/storage/driver/factory/factory.go index 3a4b57ce..f52684b7 100644 --- a/registry/storage/driver/factory/factory.go +++ b/registry/storage/driver/factory/factory.go @@ -1,6 +1,7 @@ package factory import ( + "context" "fmt" storagedriver "github.com/distribution/distribution/v3/registry/storage/driver" @@ -23,7 +24,7 @@ type StorageDriverFactory interface { // Create returns a new storagedriver.StorageDriver with the given parameters // Parameters will vary by driver and may be ignored // Each parameter key must only consist of lowercase letters and numbers - Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) + Create(ctx context.Context, parameters map[string]interface{}) (storagedriver.StorageDriver, error) } // Register makes a storage driver available by the provided name. @@ -46,12 +47,12 @@ func Register(name string, factory StorageDriverFactory) { // parameters. To use a driver, the StorageDriverFactory must first be // registered with the given name. If no drivers are found, an // InvalidStorageDriverError is returned -func Create(name string, parameters map[string]interface{}) (storagedriver.StorageDriver, error) { +func Create(ctx context.Context, name string, parameters map[string]interface{}) (storagedriver.StorageDriver, error) { driverFactory, ok := driverFactories[name] if !ok { return nil, InvalidStorageDriverError{name} } - return driverFactory.Create(parameters) + return driverFactory.Create(ctx, parameters) } // InvalidStorageDriverError records an attempt to construct an unregistered storage driver diff --git a/registry/storage/driver/filesystem/driver.go b/registry/storage/driver/filesystem/driver.go index 23033268..d5514f0b 100644 --- a/registry/storage/driver/filesystem/driver.go +++ b/registry/storage/driver/filesystem/driver.go @@ -40,7 +40,7 @@ func init() { // filesystemDriverFactory implements the factory.StorageDriverFactory interface type filesystemDriverFactory struct{} -func (factory *filesystemDriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { +func (factory *filesystemDriverFactory) Create(ctx context.Context, parameters map[string]interface{}) (storagedriver.StorageDriver, error) { return FromParameters(parameters) } diff --git a/registry/storage/driver/gcs/gcs.go b/registry/storage/driver/gcs/gcs.go index 5b276d65..79c03c70 100644 --- a/registry/storage/driver/gcs/gcs.go +++ b/registry/storage/driver/gcs/gcs.go @@ -87,8 +87,8 @@ func init() { type gcsDriverFactory struct{} // Create StorageDriver from parameters -func (factory *gcsDriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { - return FromParameters(parameters) +func (factory *gcsDriverFactory) Create(ctx context.Context, parameters map[string]interface{}) (storagedriver.StorageDriver, error) { + return FromParameters(ctx, parameters) } var _ storagedriver.StorageDriver = &driver{} @@ -118,8 +118,7 @@ type baseEmbed struct { // FromParameters constructs a new Driver with a given parameters map // Required parameters: // - bucket -func FromParameters(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { - ctx := context.TODO() +func FromParameters(ctx context.Context, parameters map[string]interface{}) (storagedriver.StorageDriver, error) { bucket, ok := parameters["bucket"] if !ok || fmt.Sprint(bucket) == "" { return nil, fmt.Errorf("No bucket parameter provided") @@ -229,11 +228,11 @@ func FromParameters(parameters map[string]interface{}) (storagedriver.StorageDri gcs: gcs, } - return New(params) + return New(ctx, params) } // New constructs a new driver -func New(params driverParameters) (storagedriver.StorageDriver, error) { +func New(ctx context.Context, params driverParameters) (storagedriver.StorageDriver, error) { rootDirectory := strings.Trim(params.rootDirectory, "/") if rootDirectory != "" { rootDirectory += "/" diff --git a/registry/storage/driver/inmemory/driver.go b/registry/storage/driver/inmemory/driver.go index 4c00ca40..97c3bcde 100644 --- a/registry/storage/driver/inmemory/driver.go +++ b/registry/storage/driver/inmemory/driver.go @@ -21,7 +21,7 @@ func init() { // inMemoryDriverFacotry implements the factory.StorageDriverFactory interface. type inMemoryDriverFactory struct{} -func (factory *inMemoryDriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { +func (factory *inMemoryDriverFactory) Create(ctx context.Context, parameters map[string]interface{}) (storagedriver.StorageDriver, error) { return New(), nil } diff --git a/registry/storage/driver/s3-aws/s3.go b/registry/storage/driver/s3-aws/s3.go index a6428a91..3d9cb920 100644 --- a/registry/storage/driver/s3-aws/s3.go +++ b/registry/storage/driver/s3-aws/s3.go @@ -150,8 +150,8 @@ func init() { // s3DriverFactory implements the factory.StorageDriverFactory interface type s3DriverFactory struct{} -func (factory *s3DriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { - return FromParameters(parameters) +func (factory *s3DriverFactory) Create(ctx context.Context, parameters map[string]interface{}) (storagedriver.StorageDriver, error) { + return FromParameters(ctx, parameters) } var _ storagedriver.StorageDriver = &driver{} @@ -189,7 +189,7 @@ type Driver struct { // - region // - bucket // - encrypt -func FromParameters(parameters map[string]interface{}) (*Driver, error) { +func FromParameters(ctx context.Context, parameters map[string]interface{}) (*Driver, error) { // Providing no values for these is valid in case the user is authenticating // with an IAM on an ec2 instance (in which case the instance credentials will // be summoned when GetAuth is called) @@ -468,7 +468,7 @@ func FromParameters(parameters map[string]interface{}) (*Driver, error) { getS3LogLevelFromParam(parameters["loglevel"]), } - return New(params) + return New(ctx, params) } func getS3LogLevelFromParam(param interface{}) aws.LogLevelType { @@ -529,7 +529,7 @@ func getParameterAsInt64(parameters map[string]interface{}, name string, default // New constructs a new Driver with the given AWS credentials, region, encryption flag, and // bucketName -func New(params DriverParameters) (*Driver, error) { +func New(ctx context.Context, params DriverParameters) (*Driver, error) { if !params.V4Auth && (params.RegionEndpoint == "" || strings.Contains(params.RegionEndpoint, "s3.amazonaws.com")) { diff --git a/registry/storage/driver/s3-aws/s3_test.go b/registry/storage/driver/s3-aws/s3_test.go index ebd9d2a2..7bfae2aa 100644 --- a/registry/storage/driver/s3-aws/s3_test.go +++ b/registry/storage/driver/s3-aws/s3_test.go @@ -141,7 +141,7 @@ func init() { getS3LogLevelFromParam(logLevel), } - return New(parameters) + return New(context.Background(), parameters) } // Skip S3 storage driver tests if environment variable parameters are not provided