github.com/vmware/govmomi@v0.51.0/cli/volume/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 volume 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/cns" 15 "github.com/vmware/govmomi/cns/types" 16 "github.com/vmware/govmomi/session" 17 "github.com/vmware/govmomi/units" 18 vim "github.com/vmware/govmomi/vim25/types" 19 ) 20 21 type disk struct { 22 *flags.DatastoreFlag 23 *flags.StorageProfileFlag 24 25 size units.ByteSize 26 27 spec types.CnsVolumeCreateSpec 28 29 meta types.CnsKubernetesEntityMetadata 30 31 disk string 32 } 33 34 func init() { 35 cli.Register("volume.create", &disk{}, true) 36 } 37 38 func (cmd *disk) Register(ctx context.Context, f *flag.FlagSet) { 39 cmd.DatastoreFlag, ctx = flags.NewDatastoreFlag(ctx) 40 cmd.DatastoreFlag.Register(ctx, f) 41 42 cmd.StorageProfileFlag, ctx = flags.NewStorageProfileFlag(ctx) 43 cmd.StorageProfileFlag.Register(ctx, f) 44 45 _ = cmd.size.Set("10G") 46 f.Var(&cmd.size, "size", "Size of new volume") 47 48 f.StringVar(&cmd.spec.VolumeType, "type", string(types.CnsVolumeTypeBlock), "Volume type") 49 50 f.StringVar(&cmd.spec.Metadata.ContainerCluster.ClusterType, "cluster-type", string(types.CnsClusterTypeKubernetes), "Cluster type") 51 f.StringVar(&cmd.spec.Metadata.ContainerCluster.ClusterFlavor, "cluster-flavor", string(types.CnsClusterFlavorVanilla), "Cluster flavor") 52 f.StringVar(&cmd.spec.Metadata.ContainerCluster.ClusterDistribution, "cluster-distro", "KUBERNETES", "Cluster distribution") 53 f.StringVar(&cmd.spec.Metadata.ContainerCluster.ClusterId, "cluster-id", "", "Cluster ID") 54 f.StringVar(&cmd.spec.Metadata.ContainerCluster.VSphereUser, "vsphere-user", "", "vSphere user") 55 56 f.StringVar(&cmd.meta.EntityName, "entity-name", "", "Entity name") 57 f.StringVar(&cmd.meta.Namespace, "entity-namespace", "default", "Entity namespace") 58 f.StringVar(&cmd.meta.EntityType, "entity-type", string(types.CnsKubernetesEntityTypePVC), "Entity type") 59 f.Var((*keyValue)(&cmd.meta.Labels), "label", "Label") 60 61 f.StringVar(&cmd.disk, "disk-id", "", "Backing disk id") 62 } 63 64 func (cmd *disk) Process(ctx context.Context) error { 65 if err := cmd.DatastoreFlag.Process(ctx); err != nil { 66 return err 67 } 68 if err := cmd.StorageProfileFlag.Process(ctx); err != nil { 69 return err 70 } 71 return nil 72 } 73 74 func (cmd *disk) Usage() string { 75 return "NAME" 76 } 77 78 func (cmd *disk) Description() string { 79 return `Create volume NAME on DS. 80 81 Examples: 82 govc volume.create -size 10G my-volume` 83 } 84 85 func (cmd *disk) Run(ctx context.Context, f *flag.FlagSet) error { 86 cmd.spec.Name = f.Arg(0) 87 if cmd.spec.Name == "" { 88 return flag.ErrHelp 89 } 90 91 vc, err := cmd.Client() 92 if err != nil { 93 return err 94 } 95 96 c, err := cmd.CnsClient() 97 if err != nil { 98 return err 99 } 100 101 ds, err := cmd.DatastoreIfSpecified() 102 if err != nil { 103 return err 104 } 105 106 if ds != nil { 107 cmd.spec.Datastores = []vim.ManagedObjectReference{ds.Reference()} 108 } 109 110 profiles, err := cmd.StorageProfileList(ctx) 111 if err != nil { 112 return err 113 } 114 115 for _, id := range profiles { 116 cmd.spec.Profile = append(cmd.spec.Profile, &vim.VirtualMachineDefinedProfileSpec{ProfileId: id}) 117 } 118 119 cmd.spec.BackingObjectDetails = &types.CnsBlockBackingDetails{ 120 BackingDiskId: cmd.disk, 121 CnsBackingObjectDetails: types.CnsBackingObjectDetails{ 122 CapacityInMb: int64(cmd.size) / units.MB, 123 }, 124 } 125 126 if cmd.meta.EntityName == "" { 127 cmd.meta.EntityName = cmd.spec.Name 128 } 129 cmd.spec.Metadata.EntityMetadata = append(cmd.spec.Metadata.EntityMetadata, &cmd.meta) 130 131 if cmd.spec.Metadata.ContainerCluster.VSphereUser == "" { 132 s, err := session.NewManager(vc).UserSession(ctx) 133 if err != nil { 134 return err 135 } 136 cmd.spec.Metadata.ContainerCluster.VSphereUser = s.UserName 137 } 138 139 task, err := c.CreateVolume(ctx, []types.CnsVolumeCreateSpec{cmd.spec}) 140 if err != nil { 141 return err 142 } 143 144 info, err := cns.GetTaskInfo(ctx, task) 145 if err != nil { 146 return err 147 } 148 149 res, err := cns.GetTaskResult(ctx, info) 150 if err != nil { 151 return err 152 } 153 154 fmt.Println(res.GetCnsVolumeOperationResult().VolumeId.Id) 155 156 return nil 157 }