github.com/vmware/govmomi@v0.43.0/govc/importx/vmdk.go (about)

     1  /*
     2  Copyright (c) 2014-2017 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 importx
    18  
    19  import (
    20  	"context"
    21  	"errors"
    22  	"flag"
    23  	"fmt"
    24  	"path"
    25  
    26  	"github.com/vmware/govmomi/govc/cli"
    27  	"github.com/vmware/govmomi/govc/flags"
    28  	"github.com/vmware/govmomi/vmdk"
    29  )
    30  
    31  type disk struct {
    32  	*flags.DatastoreFlag
    33  	*flags.ResourcePoolFlag
    34  	*flags.FolderFlag
    35  	*flags.OutputFlag
    36  
    37  	force bool
    38  }
    39  
    40  func init() {
    41  	cli.Register("import.vmdk", &disk{})
    42  }
    43  
    44  func (cmd *disk) Register(ctx context.Context, f *flag.FlagSet) {
    45  	cmd.DatastoreFlag, ctx = flags.NewDatastoreFlag(ctx)
    46  	cmd.DatastoreFlag.Register(ctx, f)
    47  	cmd.ResourcePoolFlag, ctx = flags.NewResourcePoolFlag(ctx)
    48  	cmd.ResourcePoolFlag.Register(ctx, f)
    49  	cmd.FolderFlag, ctx = flags.NewFolderFlag(ctx)
    50  	cmd.FolderFlag.Register(ctx, f)
    51  	cmd.OutputFlag, ctx = flags.NewOutputFlag(ctx)
    52  	cmd.OutputFlag.Register(ctx, f)
    53  
    54  	f.BoolVar(&cmd.force, "force", false, "Overwrite existing disk")
    55  }
    56  
    57  func (cmd *disk) Process(ctx context.Context) error {
    58  	if err := cmd.DatastoreFlag.Process(ctx); err != nil {
    59  		return err
    60  	}
    61  	if err := cmd.ResourcePoolFlag.Process(ctx); err != nil {
    62  		return err
    63  	}
    64  	if err := cmd.FolderFlag.Process(ctx); err != nil {
    65  		return err
    66  	}
    67  	if err := cmd.OutputFlag.Process(ctx); err != nil {
    68  		return err
    69  	}
    70  	return nil
    71  }
    72  
    73  func (cmd *disk) Usage() string {
    74  	return "PATH_TO_VMDK [REMOTE_DIRECTORY]"
    75  }
    76  
    77  func (cmd *disk) Run(ctx context.Context, f *flag.FlagSet) error {
    78  	args := f.Args()
    79  	if len(args) < 1 {
    80  		return errors.New("no file to import")
    81  	}
    82  
    83  	src := f.Arg(0)
    84  
    85  	c, err := cmd.DatastoreFlag.Client()
    86  	if err != nil {
    87  		return err
    88  	}
    89  
    90  	dc, err := cmd.DatastoreFlag.Datacenter()
    91  	if err != nil {
    92  		return err
    93  	}
    94  
    95  	ds, err := cmd.DatastoreFlag.Datastore()
    96  	if err != nil {
    97  		return err
    98  	}
    99  
   100  	pool, err := cmd.ResourcePoolFlag.ResourcePool()
   101  	if err != nil {
   102  		return err
   103  	}
   104  
   105  	folder, err := cmd.FolderOrDefault("vm")
   106  	if err != nil {
   107  		return err
   108  	}
   109  
   110  	logger := cmd.ProgressLogger(fmt.Sprintf("Uploading %s... ", path.Base(src)))
   111  	defer logger.Wait()
   112  
   113  	p := vmdk.ImportParams{
   114  		Path:       f.Arg(1),
   115  		Logger:     logger,
   116  		Type:       "", // TODO: flag
   117  		Force:      cmd.force,
   118  		Datacenter: dc,
   119  		Pool:       pool,
   120  		Folder:     folder,
   121  	}
   122  
   123  	err = vmdk.Import(ctx, c, src, ds, p)
   124  	if err != nil && err == vmdk.ErrInvalidFormat {
   125  		return fmt.Errorf(`%s
   126  The vmdk can be converted using one of:
   127    vmware-vdiskmanager -t 5 -r '%s' new.vmdk
   128    qemu-img convert -O vmdk -o subformat=streamOptimized '%s' new.vmdk`, err, src, src)
   129  	}
   130  
   131  	return err
   132  }