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  }