github.com/vmware/govmomi@v0.51.0/cli/volume/extend.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  	"github.com/vmware/govmomi/units"
    17  )
    18  
    19  type extend struct {
    20  	*flags.ClientFlag
    21  
    22  	size units.ByteSize
    23  }
    24  
    25  func init() {
    26  	cli.Register("volume.extend", &extend{})
    27  }
    28  
    29  func (cmd *extend) Register(ctx context.Context, f *flag.FlagSet) {
    30  	cmd.ClientFlag, ctx = flags.NewClientFlag(ctx)
    31  	cmd.ClientFlag.Register(ctx, f)
    32  
    33  	f.Var(&cmd.size, "size", "New size of new volume")
    34  }
    35  
    36  func (cmd *extend) Usage() string {
    37  	return "ID"
    38  }
    39  
    40  func (cmd *extend) Description() string {
    41  	return `Extend CNS volume.
    42  
    43  Examples:
    44    govc volume.extend -size 10GB f75989dc-95b9-4db7-af96-8583f24bc59d`
    45  }
    46  
    47  func (cmd *extend) Run(ctx context.Context, f *flag.FlagSet) error {
    48  	if f.NArg() != 1 {
    49  		return flag.ErrHelp
    50  	}
    51  
    52  	c, err := cmd.CnsClient()
    53  	if err != nil {
    54  		return err
    55  	}
    56  
    57  	spec := []types.CnsVolumeExtendSpec{{
    58  		VolumeId: types.CnsVolumeId{
    59  			Id: f.Arg(0),
    60  		},
    61  		CapacityInMb: int64(cmd.size) / units.MB,
    62  	}}
    63  
    64  	task, err := c.ExtendVolume(ctx, spec)
    65  	if err != nil {
    66  		return err
    67  	}
    68  
    69  	info, err := cns.GetTaskInfo(ctx, task)
    70  	if err != nil {
    71  		return err
    72  	}
    73  
    74  	res, err := cns.GetTaskResult(ctx, info)
    75  	if err != nil {
    76  		return err
    77  	}
    78  
    79  	fault := res.GetCnsVolumeOperationResult().Fault
    80  	if fault != nil {
    81  		return errors.New(fault.LocalizedMessage)
    82  	}
    83  
    84  	return nil
    85  }