func (s *StorageAPI) watchOneStorageAttachment(id params.StorageAttachmentId, canAccess func(names.Tag) bool) (params.NotifyWatchResult, error) { // Watching a storage attachment is implemented as watching the // underlying volume or filesystem attachment. The only thing // we don't necessarily see in doing this is the lifecycle state // changes, but these may be observed by using the // WatchUnitStorageAttachments watcher. nothing := params.NotifyWatchResult{} unitTag, err := names.ParseUnitTag(id.UnitTag) if err != nil || !canAccess(unitTag) { return nothing, common.ErrPerm } storageTag, err := names.ParseStorageTag(id.StorageTag) if err != nil { return nothing, err } machineTag, err := s.st.UnitAssignedMachine(unitTag) if err != nil { return nothing, err } watch, err := storagecommon.WatchStorageAttachment(s.st, storageTag, machineTag, unitTag) if err != nil { return nothing, errors.Trace(err) } if _, ok := <-watch.Changes(); ok { return params.NotifyWatchResult{ NotifyWatcherId: s.resources.Register(watch), }, nil } return nothing, watcher.EnsureErr(watch) }
func (s *watchStorageAttachmentSuite) testWatchStorageAttachment(c *gc.C, change func()) { w, err := storagecommon.WatchStorageAttachment( s.st, s.storageTag, s.machineTag, s.unitTag, ) c.Assert(err, jc.ErrorIsNil) wc := statetesting.NewNotifyWatcherC(c, nopSyncStarter{}, w) wc.AssertOneChange() change() wc.AssertOneChange() }