aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/gcs
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-06-17 17:06:29 +0200
committerDmitry Vyukov <dvyukov@google.com>2017-06-17 17:06:29 +0200
commite130d95518bd1be7a1c24438bec60643119e5754 (patch)
treee4e739d1a90064156b895a14f089a3d4a7393ea8 /pkg/gcs
parentde258e6d7ebf13facf7df8e92eb1a9bdf3391808 (diff)
vm/gce: accept un-tar-ed image
vm/gce differs from other VM types in that it accepts image in a weird, GCE-specific format (namely, image named disk.raw is put into .tar.gz file). This makes it impossible to write generic code that creates images for any VM types. Make vm/gce accept just image like e.g. vm/qemu and handle own specifics internally.
Diffstat (limited to 'pkg/gcs')
-rw-r--r--pkg/gcs/gcs.go22
1 files changed, 16 insertions, 6 deletions
diff --git a/pkg/gcs/gcs.go b/pkg/gcs/gcs.go
index 0121d2aeb..97883256a 100644
--- a/pkg/gcs/gcs.go
+++ b/pkg/gcs/gcs.go
@@ -80,25 +80,35 @@ func (client *Client) Read(gcsFile string) (*File, error) {
}
func (client *Client) UploadFile(localFile, gcsFile string) error {
- bucket, filename, err := split(gcsFile)
+ local, err := os.Open(localFile)
if err != nil {
return err
}
- local, err := os.Open(localFile)
+ defer local.Close()
+
+ w, err := client.FileWriter(gcsFile)
if err != nil {
return err
}
- defer local.Close()
- bkt := client.client.Bucket(bucket)
- f := bkt.Object(filename)
- w := f.NewWriter(client.ctx)
defer w.Close()
+
if _, err := io.Copy(w, local); err != nil {
return err
}
return nil
}
+func (client *Client) FileWriter(gcsFile string) (io.WriteCloser, error) {
+ bucket, filename, err := split(gcsFile)
+ if err != nil {
+ return nil, err
+ }
+ bkt := client.client.Bucket(bucket)
+ f := bkt.Object(filename)
+ w := f.NewWriter(client.ctx)
+ return w, nil
+}
+
func split(file string) (bucket, filename string, err error) {
pos := strings.IndexByte(file, '/')
if pos == -1 {