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  }