in step_detach_disks.go [41:87]
func (a *DetachDisks) validate(ctx context.Context, s *Step) (errs DError) {
for _, dd := range *a {
if dd.DeviceName == "" {
errs = addErrs(errs, Errf("cannot detach disk: DeviceName is empty"))
}
ir, err := s.w.instances.regUse(dd.Instance, s)
if ir == nil {
// Return now, the rest of this function can't be run without ir.
return addErrs(errs, Errf("cannot detach disk: %v", err))
}
addErrs(errs, err)
instance := NamedSubexp(instanceURLRgx, ir.link)
res, isAttached, err := s.w.disks.regUseDeviceName(dd.DeviceName, instance["project"], instance["zone"], instance["instance"], dd.Instance, s)
if res == nil {
// Return now, the rest of this function can't be run without resource.
return addErrs(errs, Errf("cannot detach disk: %v", err))
}
addErrs(errs, err)
if deviceNameURLRgx.MatchString(dd.DeviceName) {
// While it's a device URL, no need to do more validation about project/zone
// since it has been validated in regUseDeviceName.
device := NamedSubexp(deviceNameURLRgx, res.link)
dd.project = device["project"]
dd.zone = device["zone"]
} else {
// Ensure disk is in the same project and zone.
disk := NamedSubexp(diskURLRgx, res.link)
if disk["project"] != instance["project"] {
errs = addErrs(errs, Errf("cannot detach disk in project %q from instance in project %q: %q", disk["project"], instance["project"], dd.DeviceName))
}
if disk["zone"] != instance["zone"] {
errs = addErrs(errs, Errf("cannot detach disk in zone %q from instance in zone %q: %q", disk["zone"], instance["zone"], dd.DeviceName))
}
dd.project = disk["project"]
dd.zone = disk["zone"]
}
// Register disk detachments.
errs = addErrs(errs, s.w.instances.w.disks.regDetach(dd.DeviceName, dd.Instance, isAttached, s))
}
return errs
}