Skip to content

Commit 0afef00

Browse files
author
Keerthan Mala
committed
feat(driver): Add support to be used as a separate storage driver
1 parent 03efb43 commit 0afef00

4 files changed

Lines changed: 40 additions & 4 deletions

File tree

registry/storage/driver/gcs/gcs.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010
// Note that the contents of incomplete uploads are not accessible even though
1111
// Stat returns their length
1212
//
13-
// +build include_gcs
1413

1514
package gcs
1615

1716
import (
1817
"bytes"
18+
"encoding/json"
1919
"fmt"
2020
"io"
2121
"io/ioutil"
@@ -34,6 +34,7 @@ import (
3434
"golang.org/x/oauth2/google"
3535
"golang.org/x/oauth2/jwt"
3636
"google.golang.org/api/googleapi"
37+
storageapi "google.golang.org/api/storage/v1"
3738
"google.golang.org/cloud"
3839
"google.golang.org/cloud/storage"
3940

@@ -67,6 +68,7 @@ type driverParameters struct {
6768
client *http.Client
6869
rootDirectory string
6970
chunkSize int
71+
projectID string
7072
}
7173

7274
func init() {
@@ -132,6 +134,9 @@ func FromParameters(parameters map[string]interface{}) (storagedriver.StorageDri
132134
}
133135

134136
var ts oauth2.TokenSource
137+
var key struct {
138+
ProjectID string `json:"project_id"`
139+
}
135140
jwtConf := new(jwt.Config)
136141
if keyfile, ok := parameters["keyfile"]; ok {
137142
jsonKey, err := ioutil.ReadFile(fmt.Sprint(keyfile))
@@ -142,6 +147,9 @@ func FromParameters(parameters map[string]interface{}) (storagedriver.StorageDri
142147
if err != nil {
143148
return nil, err
144149
}
150+
if err := json.Unmarshal(jsonKey, &key); err != nil {
151+
return nil, err
152+
}
145153
ts = jwtConf.TokenSource(context.Background())
146154
} else {
147155
var err error
@@ -158,6 +166,7 @@ func FromParameters(parameters map[string]interface{}) (storagedriver.StorageDri
158166
privateKey: jwtConf.PrivateKey,
159167
client: oauth2.NewClient(context.Background(), ts),
160168
chunkSize: chunkSize,
169+
projectID: fmt.Sprint(key.ProjectID),
161170
}
162171

163172
return New(params)
@@ -172,6 +181,17 @@ func New(params driverParameters) (storagedriver.StorageDriver, error) {
172181
if params.chunkSize <= 0 || params.chunkSize%minChunkSize != 0 {
173182
return nil, fmt.Errorf("Invalid chunksize: %d is not a positive multiple of %d", params.chunkSize, minChunkSize)
174183
}
184+
185+
service, err := storageapi.New(params.client)
186+
if err != nil {
187+
return nil, err
188+
}
189+
if _, err := service.Buckets.Get(params.bucket).Do(); err != nil {
190+
if _, err := service.Buckets.Insert(params.projectID, &storageapi.Bucket{Name: params.bucket}).Do(); err != nil {
191+
return nil, err
192+
}
193+
}
194+
175195
d := &driver{
176196
bucket: params.bucket,
177197
rootDirectory: rootDirectory,

registry/storage/driver/gcs/gcs_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// +build include_gcs
2-
31
package gcs
42

53
import (
@@ -8,6 +6,7 @@ import (
86
"testing"
97

108
"fmt"
9+
1110
ctx "github.com/docker/distribution/context"
1211
storagedriver "github.com/docker/distribution/registry/storage/driver"
1312
"github.com/docker/distribution/registry/storage/driver/testsuites"

registry/storage/driver/s3-aws/s3.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,23 @@ func New(params DriverParameters) (*Driver, error) {
309309

310310
s3obj := s3.New(session.New(awsConfig))
311311

312+
_, err := s3obj.CreateBucket(&s3.CreateBucketInput{
313+
Bucket: &params.Bucket,
314+
})
315+
if err != nil {
316+
if s3err, ok := err.(awserr.Error); ok {
317+
if s3err.Code() != "BucketAlreadyOwnedByYou" && s3err.Code() != "BucketAlreadyExists" {
318+
return nil, err
319+
}
320+
} else {
321+
return nil, err
322+
}
323+
}
324+
325+
if err := s3obj.WaitUntilBucketExists(&s3.HeadBucketInput{Bucket: &params.Bucket}); err != nil {
326+
return nil, err
327+
}
328+
312329
// TODO Currently multipart uploads have no timestamps, so this would be unwise
313330
// if you initiated a new s3driver while another one is running on the same bucket.
314331
// multis, _, err := bucket.ListMulti("", "")

registry/storage/driver/storagedriver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ type FileWriter interface {
110110
// number of path components separated by slashes, where each component is
111111
// restricted to alphanumeric characters or a period, underscore, or
112112
// hyphen.
113-
var PathRegexp = regexp.MustCompile(`^(/[A-Za-z0-9._-]+)+$`)
113+
var PathRegexp = regexp.MustCompile(`^([A-Za-z0-9._:-]*(/[A-Za-z0-9._:-]+)*)+$`)
114114

115115
// ErrUnsupportedMethod may be returned in the case where a StorageDriver implementation does not support an optional method.
116116
type ErrUnsupportedMethod struct {

0 commit comments

Comments
 (0)