github.com/vmware/govmomi@v0.51.0/examples/tasks/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  	"time"
    11  
    12  	"github.com/dougm/pretty"
    13  
    14  	"github.com/vmware/govmomi/task"
    15  
    16  	"github.com/vmware/govmomi/examples"
    17  	"github.com/vmware/govmomi/vim25"
    18  	"github.com/vmware/govmomi/vim25/methods"
    19  	"github.com/vmware/govmomi/vim25/types"
    20  )
    21  
    22  func main() {
    23  	// example use against vCenter with optional time filters:
    24  	// go run main.go -url $GOVMOMI_URL -insecure $GOVMOMI_INSECURE -b 8h -f
    25  	begin := flag.Duration("b", 10*time.Minute, "Begin time (filtered by started time)") // default BeginTime is 10min ago
    26  	end := flag.Duration("e", 0, "End time (filtered by started time)")
    27  	follow := flag.Bool("f", false, "Follow task stream")
    28  
    29  	examples.Run(func(ctx context.Context, c *vim25.Client) error {
    30  		m := task.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.TaskFilterSpec{
    40  			Entity: &types.TaskFilterSpecByEntity{
    41  				Entity:    ref,
    42  				Recursion: types.TaskFilterSpecRecursionOptionAll,
    43  			},
    44  			Time: &types.TaskFilterSpecByTime{
    45  				TimeType:  types.TaskFilterSpecTimeOptionStartedTime,
    46  				BeginTime: types.NewTime(now.Add(*begin * -1)),
    47  			},
    48  		}
    49  
    50  		if *end != 0 {
    51  			filter.Time.EndTime = types.NewTime(now.Add(*end * -1))
    52  		}
    53  
    54  		collector, err := m.CreateCollectorForTasks(ctx, filter)
    55  		if err != nil {
    56  			return err
    57  		}
    58  
    59  		defer collector.Destroy(ctx)
    60  
    61  		for {
    62  			tasks, err := collector.ReadNextTasks(ctx, 10)
    63  			if err != nil {
    64  				return err
    65  			}
    66  
    67  			if len(tasks) == 0 {
    68  				if *follow {
    69  					time.Sleep(time.Second)
    70  					continue
    71  				}
    72  				break
    73  			}
    74  
    75  			for i := range tasks {
    76  				pretty.Println(tasks[i])
    77  			}
    78  		}
    79  
    80  		return nil
    81  	})
    82  }