github.com/vmware/govmomi@v0.51.0/cli/volume/rm.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 volume
     6  
     7  import (
     8  	"context"
     9  	"errors"
    10  	"flag"
    11  
    12  	"github.com/vmware/govmomi/cli"
    13  	"github.com/vmware/govmomi/cli/flags"
    14  	"github.com/vmware/govmomi/cns"
    15  	"github.com/vmware/govmomi/cns/types"
    16  )
    17  
    18  type rm struct {
    19  	*flags.ClientFlag
    20  
    21  	keep bool
    22  }
    23  
    24  func init() {
    25  	cli.Register("volume.rm", &rm{})
    26  }
    27  
    28  func (cmd *rm) Register(ctx context.Context, f *flag.FlagSet) {
    29  	cmd.ClientFlag, ctx = flags.NewClientFlag(ctx)
    30  	cmd.ClientFlag.Register(ctx, f)
    31  
    32  	f.BoolVar(&cmd.keep, "keep", false, "Keep backing disk")
    33  }
    34  
    35  func (cmd *rm) Usage() string {
    36  	return "ID"
    37  }
    38  
    39  func (cmd *rm) Description() string {
    40  	return `Remove CNS volume.
    41  
    42  Note: if volume.rm returns not found errors,
    43  consider using 'govc disk.ls -R' to reconcile the datastore inventory.
    44  
    45  Examples:
    46    govc volume.rm f75989dc-95b9-4db7-af96-8583f24bc59d`
    47  }
    48  
    49  func (cmd *rm) Run(ctx context.Context, f *flag.FlagSet) error {
    50  	// Despite the method signature, CnsDeleteVolume can only delete 1 at a time.
    51  	if f.NArg() != 1 {
    52  		return flag.ErrHelp
    53  	}
    54  
    55  	c, err := cmd.CnsClient()
    56  	if err != nil {
    57  		return err
    58  	}
    59  
    60  	ids := []types.CnsVolumeId{{Id: f.Arg(0)}}
    61  
    62  	task, err := c.DeleteVolume(ctx, ids, !cmd.keep)
    63  	if err != nil {
    64  		return err
    65  	}
    66  
    67  	info, err := cns.GetTaskInfo(ctx, task)
    68  	if err != nil {
    69  		return err
    70  	}
    71  
    72  	res, err := cns.GetTaskResult(ctx, info)
    73  	if err != nil {
    74  		return err
    75  	}
    76  
    77  	fault := res.GetCnsVolumeOperationResult().Fault
    78  	if fault != nil {
    79  		return errors.New(fault.LocalizedMessage)
    80  	}
    81  
    82  	return nil
    83  }