1010// Note that the contents of incomplete uploads are not accessible even though
1111// Stat returns their length
1212//
13- // +build include_gcs
1413
1514package gcs
1615
1716import (
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
7274func 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 ,
0 commit comments