func (p *eventProcessor) run(ctx context.Context, tail bool) error { if len(p.tailers) == 0 { return nil } var err error var collectors []types.ManagedObjectReference for _, t := range p.tailers { collectors = append(collectors, t.collector) } if len(p.tailers) > 1 { // create and populate a ListView viewMgr := view.NewManager(p.mgr.Client()) var listView *view.ListView listView, err = viewMgr.CreateListView(ctx, collectors) if err != nil { return err } count := 0 // Retrieve the property from the objects in the ListView err = property.WaitForView(ctx, property.DefaultCollector(p.mgr.Client()), listView.Reference(), collectors[0], []string{latestPageProp}, func(c types.ManagedObjectReference, pc []types.PropertyChange) bool { if err = p.process(c, pc); err != nil { return false } count++ if count == len(collectors) && !tail { return true } return false }) return err } // only one object to follow err = property.Wait(ctx, property.DefaultCollector(p.mgr.Client()), collectors[0], []string{latestPageProp}, func(pc []types.PropertyChange) bool { if err = p.process(collectors[0], pc); err != nil { return false } if !tail { return true } return false }) return err }
func multipleObjectEvents(ctx context.Context, m Manager, objects []types.ManagedObjectReference, pageSize int32, tail bool, force bool, prop []string, f func([]types.BaseEvent) error) error { // create an EventHistoryCollector for each object var collectors []types.ManagedObjectReference for _, o := range objects { filter := types.EventFilterSpec{ Entity: &types.EventFilterSpecByEntity{ Entity: o, Recursion: types.EventFilterSpecRecursionOptionAll, }, } collector, err := m.CreateCollectorForEvents(ctx, filter) if err != nil { return fmt.Errorf("[%#v] %s", o, err) } defer collector.Destroy(ctx) err = collector.SetPageSize(ctx, pageSize) if err != nil { return err } collectors = append(collectors, collector.Reference()) } // create and populate a ListView viewMgr := view.NewManager(m.Client()) listView, err := viewMgr.CreateListView(ctx, collectors) if err != nil { return err } count := 0 // Retrieve the property from the objects in the ListView return property.WaitForView(ctx, property.DefaultCollector(m.Client()), listView.Reference(), collectors[0], prop, func(pc []types.PropertyChange) bool { for _, u := range pc { if u.Name != prop[0] { continue } if u.Val == nil { continue } f(u.Val.(types.ArrayOfEvent).Event) } count++ if count == len(collectors) && !tail { return true } return false }) }