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 }