github.com/vmware/govmomi@v0.37.2/govc/datastore/cp.go (about)

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