github.com/vmware/govmomi@v0.51.0/vslm/client_test.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 vslm
     6  
     7  import (
     8  	"context"
     9  	"os"
    10  	"testing"
    11  
    12  	"github.com/dougm/pretty"
    13  
    14  	"github.com/vmware/govmomi"
    15  	"github.com/vmware/govmomi/cns"
    16  	"github.com/vmware/govmomi/vim25/soap"
    17  	"github.com/vmware/govmomi/vim25/types"
    18  
    19  	cnstypes "github.com/vmware/govmomi/cns/types"
    20  )
    21  
    22  func TestClient(t *testing.T) {
    23  	url := os.Getenv("VSLM_VC_URL")            // export VC_URL='https://administrator@vsphere.local:Admin!23@10.184.69.227/sdk'
    24  	datacenter := os.Getenv("VSLM_DATACENTER") // export DATACENTER='test-vpx-1614463083-15492-hostpool'
    25  	volumePath := os.Getenv("VOLUME_PATH")     // export VOLUME_PATH='https://10.186.43.166/folder/27b74660-98cd-3fe5-514f-02009d24d7ab/vm-1.vmdk?dcPath=datacenter&dsName=vsanDatastore'
    26  	if url == "" || datacenter == "" || volumePath == "" {
    27  		t.Skip("VC_URL or DATACENTER is not set")
    28  	}
    29  
    30  	u, err := soap.ParseURL(url)
    31  	if err != nil {
    32  		t.Fatal(err)
    33  	}
    34  	ctx := context.Background()
    35  
    36  	c, err := govmomi.NewClient(ctx, u, true)
    37  	if err != nil {
    38  		t.Fatal(err)
    39  	}
    40  
    41  	vslmClient, err := NewClient(ctx, c.Client)
    42  	if err != nil {
    43  		t.Fatal(err)
    44  	}
    45  
    46  	globalObjectManager := NewGlobalObjectManager(vslmClient)
    47  	vStorageObject, err := globalObjectManager.RegisterDisk(ctx, volumePath, "volume-name1")
    48  	if err != nil {
    49  		t.Fatal(err)
    50  	}
    51  	t.Logf("Successfully registered disk with path %s as FCD with storage object id %s", volumePath, vStorageObject.Config.Id.Id)
    52  
    53  	containerCluster := cnstypes.CnsContainerCluster{
    54  		ClusterType:         string(cnstypes.CnsClusterTypeKubernetes),
    55  		ClusterId:           "demo-cluster-id",
    56  		VSphereUser:         "Administrator@vsphere.local",
    57  		ClusterFlavor:       string(cnstypes.CnsClusterFlavorVanilla),
    58  		ClusterDistribution: "KUBERNETES",
    59  	}
    60  
    61  	// Test CreateVolume API
    62  	var cnsVolumeCreateSpecList []cnstypes.CnsVolumeCreateSpec
    63  	cnsVolumeCreateSpec := cnstypes.CnsVolumeCreateSpec{
    64  		Name:       "pvc-abc123",
    65  		VolumeType: string(cnstypes.CnsVolumeTypeBlock),
    66  		Metadata: cnstypes.CnsVolumeMetadata{
    67  			ContainerCluster: containerCluster,
    68  		},
    69  		BackingObjectDetails: &cnstypes.CnsBlockBackingDetails{
    70  			CnsBackingObjectDetails: cnstypes.CnsBackingObjectDetails{
    71  				CapacityInMb: 5120,
    72  			},
    73  			BackingDiskId: vStorageObject.Config.Id.Id,
    74  		},
    75  	}
    76  	c.UseServiceVersion("vsan")
    77  	cnsClient, err := cns.NewClient(ctx, c.Client)
    78  	if err != nil {
    79  		t.Fatal(err)
    80  	}
    81  	cnsVolumeCreateSpecList = append(cnsVolumeCreateSpecList, cnsVolumeCreateSpec)
    82  	t.Logf("Creating volume using the spec: %+v", pretty.Sprint(cnsVolumeCreateSpec))
    83  	createTask, err := cnsClient.CreateVolume(ctx, cnsVolumeCreateSpecList)
    84  	if err != nil {
    85  		t.Errorf("Failed to create volume. Error: %+v \n", err)
    86  		t.Fatal(err)
    87  	}
    88  	createTaskInfo, err := cns.GetTaskInfo(ctx, createTask)
    89  	if err != nil {
    90  		t.Errorf("Failed to create volume. Error: %+v \n", err)
    91  		t.Fatal(err)
    92  	}
    93  	createTaskResult, err := cns.GetTaskResult(ctx, createTaskInfo)
    94  	if err != nil {
    95  		t.Errorf("Failed to create volume. Error: %+v \n", err)
    96  		t.Fatal(err)
    97  	}
    98  	if createTaskResult == nil {
    99  		t.Fatalf("Empty create task results")
   100  		t.FailNow()
   101  	}
   102  	createVolumeOperationRes := createTaskResult.GetCnsVolumeOperationResult()
   103  	if createVolumeOperationRes.Fault != nil {
   104  		t.Fatalf("Failed to create volume: fault=%+v", createVolumeOperationRes.Fault)
   105  	}
   106  	volumeId := createVolumeOperationRes.VolumeId.Id
   107  	volumeCreateResult := (createTaskResult).(*cnstypes.CnsVolumeCreateResult)
   108  	t.Logf("volumeCreateResult %+v", volumeCreateResult)
   109  	t.Logf("Volume created sucessfully. volumeId: %s", volumeId)
   110  
   111  	err = globalObjectManager.SetControlFlags(ctx, types.ID{Id: volumeId}, []string{
   112  		string(types.VslmVStorageObjectControlFlagKeepAfterDeleteVm)})
   113  	if err != nil {
   114  		t.Fatal(err)
   115  	}
   116  	t.Logf("Control flag: FCD_KEEP_AFTER_DELETE_VM set for the volumeId: %s", volumeId)
   117  	err = globalObjectManager.ClearControlFlags(ctx, types.ID{Id: volumeId})
   118  	if err != nil {
   119  		t.Fatal(err)
   120  	}
   121  	t.Logf("Control flags removed the volumeId: %s", volumeId)
   122  }