github.com/vmware/govmomi@v0.51.0/vapi/library/finder/path_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 finder_test 6 7 import ( 8 "context" 9 "fmt" 10 "testing" 11 12 "github.com/stretchr/testify/assert" 13 14 "github.com/vmware/govmomi/find" 15 "github.com/vmware/govmomi/object" 16 "github.com/vmware/govmomi/simulator" 17 "github.com/vmware/govmomi/vapi/library" 18 "github.com/vmware/govmomi/vapi/library/finder" 19 "github.com/vmware/govmomi/vapi/rest" 20 _ "github.com/vmware/govmomi/vapi/simulator" 21 "github.com/vmware/govmomi/vim25" 22 "github.com/vmware/govmomi/vim25/mo" 23 "github.com/vmware/govmomi/vim25/types" 24 ) 25 26 func TestResolveLibraryItemStorage(t *testing.T) { 27 28 testCases := []struct { 29 name string 30 nilDatacenter bool 31 datastoreMap map[string]mo.Datastore 32 topLevelDirectoryCreateSupported *bool 33 }{ 34 { 35 name: "Nil datacenter and nil topLevelCreate", 36 nilDatacenter: true, 37 datastoreMap: nil, 38 topLevelDirectoryCreateSupported: nil, 39 }, 40 { 41 name: "Nil datacenter and false topLevelCreate", 42 nilDatacenter: true, 43 datastoreMap: nil, 44 topLevelDirectoryCreateSupported: types.New(false), 45 }, 46 { 47 name: "Nil datacenter and true topLevelCreate", 48 nilDatacenter: true, 49 datastoreMap: nil, 50 topLevelDirectoryCreateSupported: types.New(true), 51 }, 52 { 53 name: "Non-nil datacenter and nil topLevelCreate", 54 nilDatacenter: false, 55 datastoreMap: nil, 56 topLevelDirectoryCreateSupported: nil, 57 }, 58 { 59 name: "Non-Nil datacenter and false topLevelCreate", 60 nilDatacenter: false, 61 datastoreMap: nil, 62 topLevelDirectoryCreateSupported: types.New(false), 63 }, 64 { 65 name: "Non-Nil datacenter and true topLevelCreate", 66 nilDatacenter: false, 67 datastoreMap: nil, 68 topLevelDirectoryCreateSupported: types.New(true), 69 }, 70 { 71 name: "Nil datastoreMap", 72 nilDatacenter: true, 73 datastoreMap: nil, 74 topLevelDirectoryCreateSupported: nil, 75 }, 76 { 77 name: "Non-Nil datastoreMap and true topLevelCreate", 78 nilDatacenter: true, 79 datastoreMap: map[string]mo.Datastore{}, 80 topLevelDirectoryCreateSupported: types.New(true), 81 }, 82 } 83 84 for i := range testCases { 85 tc := testCases[i] 86 87 t.Run(tc.name, func(t *testing.T) { 88 89 simulator.Test(func(ctx context.Context, vc *vim25.Client) { 90 91 vf := find.NewFinder(vc) 92 rc := rest.NewClient(vc) 93 lf := finder.NewPathFinder(library.NewManager(rc), vc) 94 95 dsName := "LocalDS_0" 96 if v := tc.topLevelDirectoryCreateSupported; v != nil && *v == false { 97 dsName = "vsanDatastore" 98 99 err := enableVSAN(ctx, vf) 100 if !assert.NoError(t, err) { 101 t.FailNow() 102 } 103 } 104 105 dc, err := vf.Datacenter(ctx, "*") 106 if !assert.NoError(t, err) || !assert.NotNil(t, dc) { 107 t.FailNow() 108 } 109 110 ds, err := vf.Datastore(ctx, dsName) 111 if !assert.NoError(t, err) || !assert.NotNil(t, ds) { 112 t.FailNow() 113 } 114 115 var ( 116 dsURL string 117 moDS mo.Datastore 118 ) 119 if !assert.NoError( 120 t, 121 ds.Properties( 122 ctx, 123 ds.Reference(), 124 []string{"name", "summary.url"}, 125 &moDS)) { 126 t.FailNow() 127 } 128 129 dsURL = moDS.Summary.Url 130 131 storage := []library.Storage{ 132 { 133 StorageBacking: library.StorageBacking{ 134 DatastoreID: ds.Reference().Value, 135 Type: "DATASTORE", 136 }, 137 StorageURIs: []string{ 138 fmt.Sprintf("%s/contentlib-${lib_id}/${item_id}/${file_1_name}_${file_1_id}.iso", dsURL), 139 fmt.Sprintf("%s/contentlib-${lib_id}/${item_id}/${file_2_name}_${file_2_id}.iso?serverId=${server_id}", dsURL), 140 }, 141 }, 142 } 143 144 nilDSM := tc.datastoreMap == nil 145 146 if !assert.NoError( 147 t, 148 lf.ResolveLibraryItemStorage( 149 ctx, 150 dc, 151 tc.datastoreMap, 152 storage)) { 153 154 t.FailNow() 155 } 156 157 assert.Len(t, storage, 1) 158 assert.Len(t, storage[0].StorageURIs, 2) 159 160 if nilDSM { 161 assert.Nil(t, tc.datastoreMap) 162 } else if assert.NotNil(t, tc.datastoreMap) { 163 if assert.Len(t, tc.datastoreMap, 1) { 164 dsv := ds.Reference().Value 165 if assert.Contains(t, tc.datastoreMap, dsv) { 166 ds := tc.datastoreMap[dsv] 167 assert.Equal(t, ds.Name, dsName) 168 assert.Equal(t, ds.Summary.Url, dsURL) 169 assert.Equal(t, ds.Capability.TopLevelDirectoryCreateSupported, tc.topLevelDirectoryCreateSupported) 170 } 171 } 172 } 173 174 for _, s := range storage { 175 for _, u := range s.StorageURIs { 176 var path object.DatastorePath 177 path.FromString(u) 178 assert.Equal(t, path.Datastore, dsName) 179 assert.NotContains(t, u, "?") 180 } 181 } 182 }) 183 }) 184 } 185 } 186 187 // TODO(dougm) consider vSAN enablement via simulator.Model 188 func enableVSAN(ctx context.Context, vf *find.Finder) error { 189 cluster, err := vf.DefaultClusterComputeResource(ctx) 190 if err != nil { 191 return err 192 } 193 194 task, err := cluster.Reconfigure(ctx, &types.ClusterConfigSpecEx{ 195 VsanConfig: &types.VsanClusterConfigInfo{ 196 Enabled: types.NewBool(true), 197 }, 198 }, true) 199 200 if err != nil { 201 return err 202 } 203 204 return task.Wait(ctx) 205 }