github.com/vmware/govmomi@v0.51.0/cli/disk/create.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 disk
     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  	"github.com/vmware/govmomi/units"
    16  	"github.com/vmware/govmomi/vim25/mo"
    17  	"github.com/vmware/govmomi/vim25/types"
    18  )
    19  
    20  type disk struct {
    21  	*flags.DatastoreFlag
    22  	*flags.ResourcePoolFlag
    23  	*flags.StoragePodFlag
    24  	*flags.StorageProfileFlag
    25  
    26  	size units.ByteSize
    27  	keep *bool
    28  }
    29  
    30  func init() {
    31  	cli.Register("disk.create", &disk{})
    32  }
    33  
    34  func (cmd *disk) Register(ctx context.Context, f *flag.FlagSet) {
    35  	cmd.DatastoreFlag, ctx = flags.NewDatastoreFlag(ctx)
    36  	cmd.DatastoreFlag.Register(ctx, f)
    37  
    38  	cmd.StoragePodFlag, ctx = flags.NewStoragePodFlag(ctx)
    39  	cmd.StoragePodFlag.Register(ctx, f)
    40  
    41  	cmd.StorageProfileFlag, ctx = flags.NewStorageProfileFlag(ctx)
    42  	cmd.StorageProfileFlag.Register(ctx, f)
    43  
    44  	cmd.ResourcePoolFlag, ctx = flags.NewResourcePoolFlag(ctx)
    45  	cmd.ResourcePoolFlag.Register(ctx, f)
    46  
    47  	_ = cmd.size.Set("10G")
    48  	f.Var(&cmd.size, "size", "Size of new disk")
    49  	f.Var(flags.NewOptionalBool(&cmd.keep), "keep", "Keep disk after VM is deleted")
    50  }
    51  
    52  func (cmd *disk) Process(ctx context.Context) error {
    53  	if err := cmd.DatastoreFlag.Process(ctx); err != nil {
    54  		return err
    55  	}
    56  	if err := cmd.StoragePodFlag.Process(ctx); err != nil {
    57  		return err
    58  	}
    59  	if err := cmd.StorageProfileFlag.Process(ctx); err != nil {
    60  		return err
    61  	}
    62  	return cmd.ResourcePoolFlag.Process(ctx)
    63  }
    64  
    65  func (cmd *disk) Usage() string {
    66  	return "NAME"
    67  }
    68  
    69  func (cmd *disk) Description() string {
    70  	return `Create disk NAME on DS.
    71  
    72  Examples:
    73    govc disk.create -size 24G my-disk`
    74  }
    75  
    76  func (cmd *disk) Run(ctx context.Context, f *flag.FlagSet) error {
    77  	name := f.Arg(0)
    78  	if name == "" {
    79  		return flag.ErrHelp
    80  	}
    81  
    82  	m, err := NewManagerFromFlag(ctx, cmd.DatastoreFlag)
    83  	if err != nil {
    84  		return err
    85  	}
    86  
    87  	var pool *object.ResourcePool
    88  	var ds mo.Reference
    89  	if cmd.StoragePodFlag.Isset() {
    90  		ds, err = cmd.StoragePod()
    91  		if err != nil {
    92  			return err
    93  		}
    94  		pool, err = cmd.ResourcePool()
    95  		if err != nil {
    96  			return err
    97  		}
    98  	} else {
    99  		ds, err = cmd.Datastore()
   100  		if err != nil {
   101  			return err
   102  		}
   103  	}
   104  
   105  	profile, err := cmd.StorageProfileSpec(ctx)
   106  	if err != nil {
   107  		return err
   108  	}
   109  
   110  	spec := types.VslmCreateSpec{
   111  		Name:              name,
   112  		CapacityInMB:      int64(cmd.size) / units.MB,
   113  		KeepAfterDeleteVm: cmd.keep,
   114  		Profile:           profile,
   115  		BackingSpec: &types.VslmCreateSpecDiskFileBackingSpec{
   116  			VslmCreateSpecBackingSpec: types.VslmCreateSpecBackingSpec{
   117  				Datastore: ds.Reference(),
   118  			},
   119  			ProvisioningType: string(types.BaseConfigInfoDiskFileBackingInfoProvisioningTypeThin),
   120  		},
   121  	}
   122  
   123  	if cmd.StoragePodFlag.Isset() {
   124  		if err = m.ObjectManager.PlaceDisk(ctx, &spec, pool.Reference()); err != nil {
   125  			return err
   126  		}
   127  	}
   128  
   129  	obj, err := m.CreateDisk(ctx, spec)
   130  	if err != nil {
   131  		return err
   132  	}
   133  
   134  	fmt.Println(obj.Config.Id.Id)
   135  
   136  	return nil
   137  }