From 8ed50608b13d9cd56c687749c4694e6eb6591ce8 Mon Sep 17 00:00:00 2001 From: Luke Farnell Date: Mon, 15 May 2017 22:19:02 -0400 Subject: [PATCH] add image transfer for DigitalOcean --- builder/digitalocean/config.go | 1 + builder/digitalocean/step_snapshot.go | 38 +++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/builder/digitalocean/config.go b/builder/digitalocean/config.go index 0447e9cdf..9d89910dc 100644 --- a/builder/digitalocean/config.go +++ b/builder/digitalocean/config.go @@ -29,6 +29,7 @@ type Config struct { PrivateNetworking bool `mapstructure:"private_networking"` Monitoring bool `mapstructure:"monitoring"` SnapshotName string `mapstructure:"snapshot_name"` + SnapshotRegions []string `mapstructure:"snapshot_regions"` StateTimeout time.Duration `mapstructure:"state_timeout"` DropletName string `mapstructure:"droplet_name"` UserData string `mapstructure:"user_data"` diff --git a/builder/digitalocean/step_snapshot.go b/builder/digitalocean/step_snapshot.go index c5f24e5c9..460dc56e5 100644 --- a/builder/digitalocean/step_snapshot.go +++ b/builder/digitalocean/step_snapshot.go @@ -60,6 +60,44 @@ func (s *stepSnapshot) Run(state multistep.StateBag) multistep.StepAction { return multistep.ActionHalt } + if len(c.SnapshotRegions) > 0 { + regionSet := make(map[string]struct{}) + regions := make([]string, 0, len(c.SnapshotRegions)) + + for _, region := range c.SnapshotRegions { + // If we already saw the region, then don't look again + if _, ok := regionSet[region]; ok { + continue + } + + // Mark that we saw the region + regionSet[region] = struct{}{} + + regions = append(regions, region) + } + c.SnapshotRegions = regions + for transfer := range c.SnapshotRegions { + transferRequest := &godo.ActionRequest{ + "type": "transfer", + "region": c.SnapshotRegions[transfer], + } + imageTransfer, _, err := client.ImageActions.Transfer(context.TODO(), images[0].ID, transferRequest) + if err != nil { + err := fmt.Errorf("Error transfering snapshot: %s", err) + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt + } + ui.Say(fmt.Sprintf("Transfering Snapshot ID: %d", imageTransfer.ID)) + + } + + ui.Say(fmt.Sprintf("Snapshot region: %d", len(regions))) + // ui.Say(fmt.Sprintf("Snapshot regions: %s", strings.Join(c.SnapshotRegions[:], ","))) + + //client.ImageActions.Transfer(context.TODO(), ) + } + var imageId int if len(images) == 1 { imageId = images[0].ID