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 }