github.com/vmware/govmomi@v0.51.0/cli/vapp/destroy.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  
    11  	"github.com/vmware/govmomi/cli"
    12  	"github.com/vmware/govmomi/cli/flags"
    13  	"github.com/vmware/govmomi/fault"
    14  	"github.com/vmware/govmomi/find"
    15  	"github.com/vmware/govmomi/vim25/types"
    16  )
    17  
    18  type destroy struct {
    19  	*flags.DatacenterFlag
    20  }
    21  
    22  func init() {
    23  	cli.Register("vapp.destroy", &destroy{})
    24  }
    25  
    26  func (cmd *destroy) Register(ctx context.Context, f *flag.FlagSet) {
    27  	cmd.DatacenterFlag, ctx = flags.NewDatacenterFlag(ctx)
    28  	cmd.DatacenterFlag.Register(ctx, f)
    29  }
    30  
    31  func (cmd *destroy) Process(ctx context.Context) error {
    32  	if err := cmd.DatacenterFlag.Process(ctx); err != nil {
    33  		return err
    34  	}
    35  	return nil
    36  }
    37  
    38  func (cmd *destroy) Usage() string {
    39  	return "VAPP..."
    40  }
    41  
    42  func (cmd *destroy) Run(ctx context.Context, f *flag.FlagSet) error {
    43  	if f.NArg() == 0 {
    44  		return flag.ErrHelp
    45  	}
    46  
    47  	finder, err := cmd.Finder()
    48  	if err != nil {
    49  		return err
    50  	}
    51  
    52  	for _, arg := range f.Args() {
    53  		vapps, err := finder.VirtualAppList(ctx, arg)
    54  		if err != nil {
    55  			if _, ok := err.(*find.NotFoundError); ok {
    56  				// Ignore if vapp cannot be found
    57  				continue
    58  			}
    59  
    60  			return err
    61  		}
    62  
    63  		for _, vapp := range vapps {
    64  			powerOff := func() error {
    65  				task, err := vapp.PowerOff(ctx, false)
    66  				if err != nil {
    67  					return err
    68  				}
    69  				err = task.Wait(ctx)
    70  				if err != nil {
    71  					// it's safe to ignore if the vapp is already powered off
    72  					if fault.Is(err, &types.InvalidPowerState{}) {
    73  						return nil
    74  					}
    75  					return err
    76  				}
    77  				return nil
    78  			}
    79  			if err := powerOff(); err != nil {
    80  				return err
    81  			}
    82  
    83  			destroy := func() error {
    84  				task, err := vapp.Destroy(ctx)
    85  				if err != nil {
    86  					return err
    87  				}
    88  				err = task.Wait(ctx)
    89  				if err != nil {
    90  					return err
    91  				}
    92  				return nil
    93  			}
    94  			if err := destroy(); err != nil {
    95  				return err
    96  			}
    97  		}
    98  	}
    99  
   100  	return nil
   101  }