func()

in step_create_snapshots.go [42:87]


func (c *CreateSnapshots) run(ctx context.Context, s *Step) DError {
	var wg sync.WaitGroup
	w := s.w
	e := make(chan DError)

	createSnapshot := func(ss *Snapshot) {
		defer wg.Done()
		// Get source disk link if SourceDisk is a daisy reference to a disk.
		if d, ok := w.disks.get(ss.SourceDisk); ok {
			ss.SourceDisk = d.link

			// Override snapshot link due that disk may be from a different project
			m := NamedSubexp(diskURLRgx, d.link)
			if ss.Project != m["project"] {
				ss.link = fmt.Sprintf("projects/%s/global/snapshots/%s", m["project"], ss.Name)
			}
		}

		m := NamedSubexp(diskURLRgx, ss.SourceDisk)
		w.LogStepInfo(s.name, "CreateSnapshots", "Creating snapshot %q.", ss.Name)
		if err := w.ComputeClient.CreateSnapshot(m["project"], m["zone"], m["disk"], &ss.Snapshot); err != nil {
			e <- newErr("failed to create snapshots", err)
			return
		}
		ss.createdInWorkflow = true
	}

	for _, ss := range *c {
		wg.Add(1)
		go createSnapshot(ss)
	}

	go func() {
		wg.Wait()
		e <- nil
	}()

	select {
	case err := <-e:
		return err
	case <-w.Cancel:
		// Wait so Snapshots being created now will complete before we try to clean them up.
		wg.Wait()
		return nil
	}
}