func()

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
}