github.com/vmware/govmomi@v0.51.0/cli/vapp/power.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 vapp 6 7 import ( 8 "context" 9 "flag" 10 "fmt" 11 12 "github.com/vmware/govmomi/cli" 13 "github.com/vmware/govmomi/cli/flags" 14 "github.com/vmware/govmomi/object" 15 ) 16 17 type power struct { 18 *flags.SearchFlag 19 20 On bool 21 Off bool 22 Suspend bool 23 Force bool 24 } 25 26 func init() { 27 cli.Register("vapp.power", &power{}) 28 } 29 30 func (cmd *power) Register(ctx context.Context, f *flag.FlagSet) { 31 cmd.SearchFlag, ctx = flags.NewSearchFlag(ctx, flags.SearchVirtualApps) 32 cmd.SearchFlag.Register(ctx, f) 33 34 f.BoolVar(&cmd.On, "on", false, "Power on") 35 f.BoolVar(&cmd.Off, "off", false, "Power off") 36 f.BoolVar(&cmd.Suspend, "suspend", false, "Power suspend") 37 f.BoolVar(&cmd.Force, "force", false, "Force (If force is false, the shutdown order in the vApp is executed. If force is true, all virtual machines are powered-off (regardless of shutdown order))") 38 } 39 40 func (cmd *power) Process(ctx context.Context) error { 41 if err := cmd.SearchFlag.Process(ctx); err != nil { 42 return err 43 } 44 opts := []bool{cmd.On, cmd.Off, cmd.Suspend} 45 selected := false 46 47 for _, opt := range opts { 48 if opt { 49 if selected { 50 return flag.ErrHelp 51 } 52 selected = opt 53 } 54 } 55 56 if !selected { 57 return flag.ErrHelp 58 } 59 60 return nil 61 } 62 63 func (cmd *power) Run(ctx context.Context, f *flag.FlagSet) error { 64 vapps, err := cmd.VirtualApps(f.Args()) 65 if err != nil { 66 return err 67 } 68 69 for _, vapp := range vapps { 70 var task *object.Task 71 72 switch { 73 case cmd.On: 74 fmt.Fprintf(cmd, "Powering on %s... ", vapp.Reference()) 75 task, err = vapp.PowerOn(ctx) 76 case cmd.Off: 77 fmt.Fprintf(cmd, "Powering off %s... ", vapp.Reference()) 78 task, err = vapp.PowerOff(ctx, cmd.Force) 79 case cmd.Suspend: 80 fmt.Fprintf(cmd, "Suspend %s... ", vapp.Reference()) 81 task, err = vapp.Suspend(ctx) 82 } 83 84 if err != nil { 85 return err 86 } 87 88 if task != nil { 89 err = task.Wait(ctx) 90 } 91 if err == nil { 92 fmt.Fprintf(cmd, "OK\n") 93 continue 94 } 95 96 return err 97 } 98 99 return nil 100 }