func()

in step_create_machine_images.go [46:94]


func (c *CreateMachineImages) run(ctx context.Context, s *Step) DError {
	var wg sync.WaitGroup
	w := s.w
	eChan := make(chan DError)
	for _, ci := range *c {
		wg.Add(1)
		go func(mi *MachineImage) {
			defer wg.Done()

			// Get source instance link if SourceInstance is a Daisy reference to an instance.
			if i, ok := w.instances.get(mi.SourceInstance); ok {
				mi.SourceInstance = i.link
			}

			// Delete existing machine image if OverWrite is true.
			if mi.OverWrite {
				// Just try to delete it, a 404 here indicates the machine image doesn't exist.
				if err := w.ComputeClient.DeleteMachineImage(mi.Project, mi.Name); err != nil {
					if apiErr, ok := err.(*googleapi.Error); !ok || apiErr.Code != 404 {
						eChan <- Errf("error deleting existing machine image: %v", err)
						return
					}
				}
			}

			w.LogStepInfo(s.name, "CreateMachineImages", "Creating machine image %q.", mi.Name)

			if err := w.ComputeClient.CreateMachineImage(mi.Project, &mi.MachineImage); err != nil {
				eChan <- newErr("failed to create machine image", err)
				return
			}
			mi.createdInWorkflow = true
		}(ci)
	}

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

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