// OpenResourceForUniter returns metadata about the resource and // a reader for the resource. The resource is associated with // the unit once the reader is completely exhausted. func (st resourceState) OpenResourceForUniter(unit resource.Unit, name string) (resource.Resource, io.ReadCloser, error) { applicationID := unit.ApplicationName() pendingID, err := newPendingID() if err != nil { return resource.Resource{}, nil, errors.Trace(err) } resourceInfo, resourceReader, err := st.OpenResource(applicationID, name) if err != nil { return resource.Resource{}, nil, errors.Trace(err) } pending := resourceInfo // a copy pending.PendingID = pendingID if err := st.persist.SetUnitResourceProgress(unit.Name(), pending, 0); err != nil { resourceReader.Close() return resource.Resource{}, nil, errors.Trace(err) } resourceReader = &unitSetter{ ReadCloser: resourceReader, persist: st.persist, unit: unit, pending: pending, resource: resourceInfo, clock: clock.WallClock, } return resourceInfo, resourceReader, nil }