github.com/vmware/govmomi@v0.37.1/govc/vm/disk/attach.go (about)

     1  /*
     2  Copyright (c) 2014-2015 VMware, Inc. All Rights Reserved.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package disk
    18  
    19  import (
    20  	"context"
    21  	"flag"
    22  	"fmt"
    23  	"strings"
    24  
    25  	"github.com/vmware/govmomi/govc/cli"
    26  	"github.com/vmware/govmomi/govc/flags"
    27  	"github.com/vmware/govmomi/vim25/types"
    28  )
    29  
    30  type attach struct {
    31  	*flags.DatastoreFlag
    32  	*flags.VirtualMachineFlag
    33  
    34  	persist    bool
    35  	link       bool
    36  	disk       string
    37  	controller string
    38  	mode       string
    39  	sharing    string
    40  }
    41  
    42  func init() {
    43  	cli.Register("vm.disk.attach", &attach{})
    44  }
    45  
    46  func (cmd *attach) Register(ctx context.Context, f *flag.FlagSet) {
    47  	cmd.DatastoreFlag, ctx = flags.NewDatastoreFlag(ctx)
    48  	cmd.DatastoreFlag.Register(ctx, f)
    49  	cmd.VirtualMachineFlag, ctx = flags.NewVirtualMachineFlag(ctx)
    50  	cmd.VirtualMachineFlag.Register(ctx, f)
    51  
    52  	f.BoolVar(&cmd.persist, "persist", true, "Persist attached disk")
    53  	f.BoolVar(&cmd.link, "link", true, "Link specified disk")
    54  	f.StringVar(&cmd.controller, "controller", "", "Disk controller")
    55  	f.StringVar(&cmd.disk, "disk", "", "Disk path name")
    56  	f.StringVar(&cmd.mode, "mode", "", fmt.Sprintf("Disk mode (%s)", strings.Join(vdmTypes, "|")))
    57  	f.StringVar(&cmd.sharing, "sharing", "", fmt.Sprintf("Sharing (%s)", strings.Join(sharing, "|")))
    58  }
    59  
    60  func (cmd *attach) Process(ctx context.Context) error {
    61  	if err := cmd.DatastoreFlag.Process(ctx); err != nil {
    62  		return err
    63  	}
    64  	if err := cmd.VirtualMachineFlag.Process(ctx); err != nil {
    65  		return err
    66  	}
    67  	return nil
    68  }
    69  
    70  func (cmd *attach) Description() string {
    71  	return `Attach existing disk to VM.
    72  
    73  A delta disk is created by default, where changes are persisted. Specifying '-link=false' will persist to the same disk.
    74  
    75  Examples:
    76    govc vm.disk.attach -vm $name -disk $name/disk1.vmdk
    77    govc device.info -vm $name disk-* # 'File' field is where changes are persisted. 'Parent' field is set when '-link=true'
    78    govc vm.disk.attach -vm $name -disk $name/shared.vmdk -link=false -sharing sharingMultiWriter
    79    govc device.remove -vm $name -keep disk-* # detach disk(s)`
    80  }
    81  
    82  func (cmd *attach) Run(ctx context.Context, f *flag.FlagSet) error {
    83  	vm, err := cmd.VirtualMachine()
    84  	if err != nil {
    85  		return err
    86  	}
    87  
    88  	if vm == nil {
    89  		return flag.ErrHelp
    90  	}
    91  
    92  	ds, err := cmd.Datastore()
    93  	if err != nil {
    94  		return err
    95  	}
    96  
    97  	devices, err := vm.Device(ctx)
    98  	if err != nil {
    99  		return err
   100  	}
   101  
   102  	controller, err := devices.FindDiskController(cmd.controller)
   103  	if err != nil {
   104  		return err
   105  	}
   106  
   107  	disk := devices.CreateDisk(controller, ds.Reference(), ds.Path(cmd.disk))
   108  	backing := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo)
   109  	backing.Sharing = cmd.sharing
   110  
   111  	if cmd.link {
   112  		if cmd.persist {
   113  			backing.DiskMode = string(types.VirtualDiskModeIndependent_persistent)
   114  		} else {
   115  			backing.DiskMode = string(types.VirtualDiskModeIndependent_nonpersistent)
   116  		}
   117  
   118  		disk = devices.ChildDisk(disk)
   119  		return vm.AddDevice(ctx, disk)
   120  	} else {
   121  		if cmd.persist {
   122  			backing.DiskMode = string(types.VirtualDiskModePersistent)
   123  		} else {
   124  			backing.DiskMode = string(types.VirtualDiskModeNonpersistent)
   125  		}
   126  	}
   127  
   128  	if len(cmd.mode) != 0 {
   129  		backing.DiskMode = cmd.mode
   130  	}
   131  
   132  	return vm.AddDevice(ctx, disk)
   133  }