in step_delete_resources.go [145:219]
func (d *DeleteResources) validate(ctx context.Context, s *Step) DError {
// Instance checking.
for _, i := range d.Instances {
if err := d.validateInstance(i, s); d.checkError(err, s) != nil {
return err
}
}
// Disk checking.
for _, disk := range d.Disks {
if err := s.w.disks.regDelete(disk, s); d.checkError(err, s) != nil {
return err
}
}
// Image checking.
for _, i := range d.Images {
if err := s.w.images.regDelete(i, s); d.checkError(err, s) != nil {
return err
}
}
// Machine image checking.
for _, i := range d.MachineImages {
if err := s.w.machineImages.regDelete(i, s); d.checkError(err, s) != nil {
return err
}
}
// Network checking.
for _, n := range d.Networks {
if err := s.w.networks.regDelete(n, s); d.checkError(err, s) != nil {
return err
}
}
// Subnetwork checking.
for _, sn := range d.Subnetworks {
if err := s.w.subnetworks.regDelete(sn, s); d.checkError(err, s) != nil {
return err
}
}
// GCS path checking
for _, p := range d.GCSPaths {
bkt, _, err := splitGCSPath(p)
if err != nil {
return err
}
// Check if bucket exists and is writeable.
writableBkts.mx.Lock()
if !strIn(bkt, writableBkts.bkts) {
if _, err := s.w.StorageClient.Bucket(bkt).Attrs(ctx); err != nil {
return Errf("error reading bucket %q: %v", bkt, err)
}
tObj := s.w.StorageClient.Bucket(bkt).Object(fmt.Sprintf("daisy-validate-%s-%s", s.name, s.w.id))
w := tObj.NewWriter(ctx)
if _, err := w.Write(nil); err != nil {
return newErr("failed to write to GCS object when deleting resources", err)
}
if err := w.Close(); err != nil {
return Errf("error writing to bucket %q: %v", bkt, err)
}
if err := tObj.Delete(ctx); err != nil {
return Errf("error deleting file %+v after write validation: %v", tObj, err)
}
writableBkts.bkts = append(writableBkts.bkts, bkt)
}
writableBkts.mx.Unlock()
}
return nil
}