github.com/vmware/govmomi@v0.51.0/cli/datastore/cp.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 datastore 6 7 import ( 8 "context" 9 "flag" 10 "fmt" 11 12 "github.com/vmware/govmomi/cli" 13 "github.com/vmware/govmomi/cli/flags" 14 "github.com/vmware/govmomi/object" 15 ) 16 17 type cp struct { 18 target 19 } 20 21 func init() { 22 cli.Register("datastore.cp", &cp{}) 23 } 24 25 type target struct { 26 *flags.DatastoreFlag // The source Datastore and the default target Datastore 27 28 dc *flags.DatacenterFlag // Optionally target a different Datacenter 29 ds *flags.DatastoreFlag // Optionally target a different Datastore 30 31 kind bool 32 force bool 33 } 34 35 func (cmd *target) FileManager() (*object.DatastoreFileManager, error) { 36 dc, err := cmd.Datacenter() 37 if err != nil { 38 return nil, err 39 } 40 41 ds, err := cmd.Datastore() 42 if err != nil { 43 return nil, err 44 } 45 46 m := ds.NewFileManager(dc, cmd.force) 47 48 dc, err = cmd.dc.Datacenter() 49 if err != nil { 50 return nil, err 51 } 52 m.DatacenterTarget = dc 53 54 return m, nil 55 } 56 57 func (cmd *target) Register(ctx context.Context, f *flag.FlagSet) { 58 cmd.DatastoreFlag, ctx = flags.NewDatastoreFlag(ctx) 59 cmd.DatastoreFlag.Register(ctx, f) 60 61 cmd.dc = &flags.DatacenterFlag{ 62 OutputFlag: cmd.OutputFlag, 63 ClientFlag: cmd.ClientFlag, 64 } 65 f.StringVar(&cmd.dc.Name, "dc-target", "", "Datacenter destination (defaults to -dc)") 66 67 cmd.ds = &flags.DatastoreFlag{ 68 DatacenterFlag: cmd.dc, 69 } 70 f.StringVar(&cmd.ds.Name, "ds-target", "", "Datastore destination (defaults to -ds)") 71 72 f.BoolVar(&cmd.kind, "t", true, "Use file type to choose disk or file manager") 73 f.BoolVar(&cmd.force, "f", false, "If true, overwrite any identically named file at the destination") 74 } 75 76 func (cmd *target) Process(ctx context.Context) error { 77 if err := cmd.DatastoreFlag.Process(ctx); err != nil { 78 return err 79 } 80 81 if cmd.dc.Name == "" { 82 // Use source DC as target DC 83 cmd.dc = cmd.DatacenterFlag 84 cmd.ds.DatacenterFlag = cmd.dc 85 } 86 87 if cmd.ds.Name == "" { 88 // Use source DS as target DS 89 cmd.ds.Name = cmd.DatastoreFlag.Name 90 } 91 92 return nil 93 } 94 95 func (cmd *cp) Usage() string { 96 return "SRC DST" 97 } 98 99 func (cmd *cp) Description() string { 100 return `Copy SRC to DST on DATASTORE. 101 102 Examples: 103 govc datastore.cp foo/foo.vmx foo/foo.vmx.old 104 govc datastore.cp -f my.vmx foo/foo.vmx 105 govc datastore.cp disks/disk1.vmdk disks/disk2.vmdk 106 govc datastore.cp disks/disk1.vmdk -dc-target DC2 disks/disk2.vmdk 107 govc datastore.cp disks/disk1.vmdk -ds-target NFS-2 disks/disk2.vmdk` 108 } 109 110 func (cmd *cp) Run(ctx context.Context, f *flag.FlagSet) error { 111 args := f.Args() 112 if len(args) != 2 { 113 return flag.ErrHelp 114 } 115 116 m, err := cmd.FileManager() 117 if err != nil { 118 return err 119 } 120 121 src, err := cmd.DatastorePath(args[0]) 122 if err != nil { 123 return err 124 } 125 126 dst, err := cmd.target.ds.DatastorePath(args[1]) 127 if err != nil { 128 return err 129 } 130 131 cp := m.CopyFile 132 if cmd.kind { 133 cp = m.Copy 134 } 135 136 logger := cmd.ProgressLogger(fmt.Sprintf("Copying %s to %s...", src, dst)) 137 defer logger.Wait() 138 139 return cp(m.WithProgress(ctx, logger), src, dst) 140 }