func()

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
	}
}