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 }