func (s *StorageProvisionerAPI) watchStorageEntities( args params.Entities, watchEnvironStorage func() state.StringsWatcher, watchMachineStorage func(names.MachineTag) state.StringsWatcher, ) (params.StringsWatchResults, error) { canAccess, err := s.getScopeAuthFunc() if err != nil { return params.StringsWatchResults{}, common.ServerError(common.ErrPerm) } results := params.StringsWatchResults{ Results: make([]params.StringsWatchResult, len(args.Entities)), } one := func(arg params.Entity) (string, []string, error) { tag, err := names.ParseTag(arg.Tag) if err != nil || !canAccess(tag) { return "", nil, common.ErrPerm } var w state.StringsWatcher if tag, ok := tag.(names.MachineTag); ok { w = watchMachineStorage(tag) } else { w = watchEnvironStorage() } if changes, ok := <-w.Changes(); ok { return s.resources.Register(w), changes, nil } return "", nil, watcher.EnsureErr(w) } for i, arg := range args.Entities { var result params.StringsWatchResult id, changes, err := one(arg) if err != nil { result.Error = common.ServerError(err) } else { result.StringsWatcherId = id result.Changes = changes } results.Results[i] = result } return results, nil }