github.com/vmware/govmomi@v0.51.0/examples/events/main.go (about)

     1  // © Broadcom. All Rights Reserved.
     2  // The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
     3  // SPDX-License-Identifier: Apache-2.0
     4  
     5  package main
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"fmt"
    11  	"reflect"
    12  	"time"
    13  
    14  	"github.com/vmware/govmomi/event"
    15  	"github.com/vmware/govmomi/examples"
    16  	"github.com/vmware/govmomi/vim25"
    17  	"github.com/vmware/govmomi/vim25/methods"
    18  	"github.com/vmware/govmomi/vim25/types"
    19  )
    20  
    21  func main() {
    22  	// example use against simulator: go run main.go -b 8h -f
    23  	// example use against vCenter with optional event filters:
    24  	// go run main.go -url $GOVMOMI_URL -insecure $GOVMOMI_INSECURE -b 8h -f VmEvent UserLoginSessionEvent
    25  	begin := flag.Duration("b", 10*time.Minute, "Begin time") // default BeginTime is 10min ago
    26  	end := flag.Duration("e", 0, "End time")
    27  	follow := flag.Bool("f", false, "Follow event stream")
    28  
    29  	examples.Run(func(ctx context.Context, c *vim25.Client) error {
    30  		m := event.NewManager(c)
    31  
    32  		ref := c.ServiceContent.RootFolder
    33  
    34  		now, err := methods.GetCurrentTime(ctx, c) // vCenter server time (UTC)
    35  		if err != nil {
    36  			return err
    37  		}
    38  
    39  		filter := types.EventFilterSpec{
    40  			EventTypeId: flag.Args(), // e.g. VmEvent
    41  			Entity: &types.EventFilterSpecByEntity{
    42  				Entity:    ref,
    43  				Recursion: types.EventFilterSpecRecursionOptionAll,
    44  			},
    45  			Time: &types.EventFilterSpecByTime{
    46  				BeginTime: types.NewTime(now.Add(*begin * -1)),
    47  			},
    48  		}
    49  		if *end != 0 {
    50  			filter.Time.EndTime = types.NewTime(now.Add(*end * -1))
    51  		}
    52  
    53  		collector, err := m.CreateCollectorForEvents(ctx, filter)
    54  		if err != nil {
    55  			return err
    56  		}
    57  
    58  		defer collector.Destroy(ctx)
    59  
    60  		for {
    61  			events, err := collector.ReadNextEvents(ctx, 100)
    62  			if err != nil {
    63  				return err
    64  			}
    65  
    66  			if len(events) == 0 {
    67  				if *follow {
    68  					time.Sleep(time.Second)
    69  					continue
    70  				}
    71  				break
    72  			}
    73  
    74  			for i := range events {
    75  				event := events[i].GetEvent()
    76  				kind := reflect.TypeOf(events[i]).Elem().Name()
    77  				fmt.Printf("%d [%s] [%s] %s\n", event.Key, event.CreatedTime.Format(time.ANSIC), kind, event.FullFormattedMessage)
    78  			}
    79  		}
    80  
    81  		return nil
    82  	})
    83  }