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