in resource_registry.go [247:286]
func (dr *diskRegistry) regUseDeviceName(deviceName, project, zone, instance, daisyInstanceName string, s *Step) (*Resource, bool, DError) {
// Check:
// deviceName either has a creator/attacher, or has been attached before the workflow's execution
// - s depends on creator of deviceName, if there is a creator.
// - deviceName doesn't have a registered deleter yet, usage must occur before deletion.
dr.mx.Lock()
defer dr.mx.Unlock()
var isAttached bool
var res *Resource
var err DError
if deviceNameURLRgx.MatchString(deviceName) {
// check whether it's attached before the workflow's execution
isAttached, err = isDiskAttached(dr.w.ComputeClient, deviceName, project, zone, instance)
if err != nil {
return nil, isAttached, err
}
if !isAttached {
return nil, isAttached, Errf("device name '%v' is not attached", deviceName)
}
res, err = dr.regURL(deviceName, false)
if err != nil {
return nil, isAttached, err
}
} else if strings.Contains(deviceName, "/") {
return nil, isAttached, Errf("unexpected url for %s: %q", dr.typeName, deviceName)
} else if res, err = dr.findDiskResourceByDeviceName(deviceName, daisyInstanceName); err != nil {
return nil, isAttached, err
}
if res.creator != nil && !s.nestedDepends(res.creator) {
return nil, isAttached, Errf("using %s %q MUST transitively depend on step %q which creates %q", dr.typeName, deviceName, res.creator.name, deviceName)
}
if res.deleter != nil {
return nil, isAttached, Errf("using %s %q; step %q deletes %q and MUST transitively depend on this step", dr.typeName, deviceName, res.deleter.name, deviceName)
}
res.users = append(res.users, s)
return res, isAttached, nil
}