in step_create_disks.go [45:90]
func (c *CreateDisks) run(ctx context.Context, s *Step) DError {
var wg sync.WaitGroup
w := s.w
e := make(chan DError)
for _, d := range *c {
wg.Add(1)
go func(cd *Disk) {
defer wg.Done()
// Get the source image link if using a source image.
if cd.SourceImage != "" {
if image, ok := w.images.get(cd.SourceImage); ok {
cd.SourceImage = image.link
}
}
// Get the source snapshot link if using a source snapshot.
if cd.SourceSnapshot != "" {
if snapshot, ok := w.snapshots.get(cd.SourceSnapshot); ok {
cd.SourceSnapshot = snapshot.link
}
}
w.LogStepInfo(s.name, "CreateDisks", "Creating disk %q.", cd.Name)
if err := w.ComputeClient.CreateDisk(cd.Project, cd.Zone, &cd.Disk); err != nil {
e <- newErr("failed to create disk", err)
return
}
cd.createdInWorkflow = true
}(d)
}
go func() {
wg.Wait()
e <- nil
}()
select {
case err := <-e:
return err
case <-w.Cancel:
// Wait so disks being created now can be deleted.
wg.Wait()
return nil
}
}