github.com/vmware/govmomi@v0.51.0/cli/vm/disk/attach.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 disk
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"fmt"
    11  	"strings"
    12  
    13  	"github.com/vmware/govmomi/cli"
    14  	"github.com/vmware/govmomi/cli/flags"
    15  	"github.com/vmware/govmomi/vim25/types"
    16  )
    17  
    18  type attach struct {
    19  	*flags.DatastoreFlag
    20  	*flags.VirtualMachineFlag
    21  	*flags.StorageProfileFlag
    22  
    23  	persist    bool
    24  	link       bool
    25  	disk       string
    26  	controller string
    27  	mode       string
    28  	sharing    string
    29  }
    30  
    31  func init() {
    32  	cli.Register("vm.disk.attach", &attach{})
    33  }
    34  
    35  func (cmd *attach) Register(ctx context.Context, f *flag.FlagSet) {
    36  	cmd.DatastoreFlag, ctx = flags.NewDatastoreFlag(ctx)
    37  	cmd.DatastoreFlag.Register(ctx, f)
    38  	cmd.VirtualMachineFlag, ctx = flags.NewVirtualMachineFlag(ctx)
    39  	cmd.VirtualMachineFlag.Register(ctx, f)
    40  	cmd.StorageProfileFlag, ctx = flags.NewStorageProfileFlag(ctx)
    41  	cmd.StorageProfileFlag.Register(ctx, f)
    42  
    43  	f.BoolVar(&cmd.persist, "persist", true, "Persist attached disk")
    44  	f.BoolVar(&cmd.link, "link", true, "Link specified disk")
    45  	f.StringVar(&cmd.controller, "controller", "", "Disk controller")
    46  	f.StringVar(&cmd.disk, "disk", "", "Disk path name")
    47  	f.StringVar(&cmd.mode, "mode", "", fmt.Sprintf("Disk mode (%s)", strings.Join(vdmTypes, "|")))
    48  	f.StringVar(&cmd.sharing, "sharing", "", fmt.Sprintf("Sharing (%s)", strings.Join(sharing, "|")))
    49  }
    50  
    51  func (cmd *attach) Process(ctx context.Context) error {
    52  	if err := cmd.DatastoreFlag.Process(ctx); err != nil {
    53  		return err
    54  	}
    55  	if err := cmd.VirtualMachineFlag.Process(ctx); err != nil {
    56  		return err
    57  	}
    58  	if err := cmd.StorageProfileFlag.Process(ctx); err != nil {
    59  		return err
    60  	}
    61  	return nil
    62  }
    63  
    64  func (cmd *attach) Description() string {
    65  	return `Attach existing disk to VM.
    66  
    67  A delta disk is created by default, where changes are persisted. Specifying '-link=false' will persist to the same disk.
    68  
    69  Examples:
    70    govc vm.disk.attach -vm $name -disk $name/disk1.vmdk
    71    govc device.info -vm $name disk-* # 'File' field is where changes are persisted. 'Parent' field is set when '-link=true'
    72    govc vm.disk.attach -vm $name -disk $name/shared.vmdk -link=false -sharing sharingMultiWriter
    73    govc device.remove -vm $name -keep disk-* # detach disk(s)`
    74  }
    75  
    76  func (cmd *attach) Run(ctx context.Context, f *flag.FlagSet) error {
    77  	vm, err := cmd.VirtualMachine()
    78  	if err != nil {
    79  		return err
    80  	}
    81  
    82  	if vm == nil {
    83  		return flag.ErrHelp
    84  	}
    85  
    86  	ds, err := cmd.Datastore()
    87  	if err != nil {
    88  		return err
    89  	}
    90  
    91  	devices, err := vm.Device(ctx)
    92  	if err != nil {
    93  		return err
    94  	}
    95  
    96  	controller, err := devices.FindDiskController(cmd.controller)
    97  	if err != nil {
    98  		return err
    99  	}
   100  
   101  	disk := devices.CreateDisk(controller, ds.Reference(), ds.Path(cmd.disk))
   102  	backing := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo)
   103  	backing.Sharing = cmd.sharing
   104  
   105  	if cmd.link {
   106  		if cmd.persist {
   107  			backing.DiskMode = string(types.VirtualDiskModeIndependent_persistent)
   108  		} else {
   109  			backing.DiskMode = string(types.VirtualDiskModeIndependent_nonpersistent)
   110  		}
   111  
   112  		disk = devices.ChildDisk(disk)
   113  		return vm.AddDevice(ctx, disk)
   114  	} else {
   115  		if cmd.persist {
   116  			backing.DiskMode = string(types.VirtualDiskModePersistent)
   117  		} else {
   118  			backing.DiskMode = string(types.VirtualDiskModeNonpersistent)
   119  		}
   120  	}
   121  
   122  	if len(cmd.mode) != 0 {
   123  		backing.DiskMode = cmd.mode
   124  	}
   125  
   126  	profile, err := cmd.StorageProfileSpec(ctx)
   127  	if err != nil {
   128  		return err
   129  	}
   130  
   131  	return vm.AddDeviceWithProfile(ctx, profile, disk)
   132  }