github.com/vmware/govmomi@v0.51.0/cli/vm/snapshot/export.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 snapshot
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"fmt"
    11  	"path/filepath"
    12  
    13  	"github.com/vmware/govmomi/cli"
    14  	"github.com/vmware/govmomi/cli/flags"
    15  	"github.com/vmware/govmomi/nfc"
    16  	"github.com/vmware/govmomi/vim25/soap"
    17  )
    18  
    19  type export struct {
    20  	*flags.VirtualMachineFlag
    21  
    22  	lease bool
    23  	dest  string
    24  }
    25  
    26  func init() {
    27  	cli.Register("snapshot.export", &export{})
    28  }
    29  
    30  func (cmd *export) Register(ctx context.Context, f *flag.FlagSet) {
    31  	cmd.VirtualMachineFlag, ctx = flags.NewVirtualMachineFlag(ctx)
    32  	cmd.VirtualMachineFlag.Register(ctx, f)
    33  
    34  	f.BoolVar(&cmd.lease, "lease", false, "Output NFC Lease only")
    35  	f.StringVar(&cmd.dest, "d", ".", "Destination directory")
    36  }
    37  
    38  func (cmd *export) Usage() string {
    39  	return "NAME"
    40  }
    41  
    42  func (cmd *export) Description() string {
    43  	return `Export snapshot of VM with given NAME.
    44  
    45  NAME can be the snapshot name, tree path, or managed object ID.
    46  
    47  Examples:
    48    govc snapshot.export -vm my-vm my-snapshot
    49    govc snapshot.export -vm my-vm -lease my-snapshot`
    50  }
    51  
    52  func (cmd *export) Run(ctx context.Context, f *flag.FlagSet) error {
    53  	if f.NArg() != 1 && !cmd.lease {
    54  		return flag.ErrHelp
    55  	}
    56  
    57  	vm, err := cmd.VirtualMachine()
    58  	if err != nil {
    59  		return err
    60  	}
    61  
    62  	if vm == nil {
    63  		return flag.ErrHelp
    64  	}
    65  
    66  	s, err := vm.FindSnapshot(ctx, f.Arg(0))
    67  	if err != nil {
    68  		return err
    69  	}
    70  
    71  	lease, err := vm.ExportSnapshot(ctx, s)
    72  	if err != nil {
    73  		return err
    74  	}
    75  
    76  	info, err := lease.Wait(ctx, nil)
    77  	if err != nil {
    78  		return err
    79  	}
    80  
    81  	if cmd.lease {
    82  		o, err := lease.Properties(ctx)
    83  		if err != nil {
    84  			return err
    85  		}
    86  
    87  		return cmd.WriteResult(o)
    88  	}
    89  
    90  	u := lease.StartUpdater(ctx, info)
    91  	defer u.Done()
    92  
    93  	for _, i := range info.Items {
    94  		err := cmd.Download(ctx, lease, i)
    95  		if err != nil {
    96  			return err
    97  		}
    98  	}
    99  
   100  	return lease.Complete(ctx)
   101  }
   102  
   103  func (cmd *export) Download(ctx context.Context, lease *nfc.Lease, item nfc.FileItem) error {
   104  	path := filepath.Join(cmd.dest, item.Path)
   105  
   106  	logger := cmd.ProgressLogger(fmt.Sprintf("Downloading %s... ", item.Path))
   107  	defer logger.Wait()
   108  
   109  	opts := soap.Download{
   110  		Progress: logger,
   111  	}
   112  
   113  	return lease.DownloadFile(ctx, path, item, opts)
   114  }