github.com/vmware/govmomi@v0.51.0/simulator/search_index_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 simulator 6 7 import ( 8 "context" 9 "strings" 10 "testing" 11 12 "github.com/vmware/govmomi" 13 "github.com/vmware/govmomi/find" 14 "github.com/vmware/govmomi/object" 15 "github.com/vmware/govmomi/vim25/soap" 16 "github.com/vmware/govmomi/vim25/types" 17 ) 18 19 func TestSearchIndex(t *testing.T) { 20 ctx := context.Background() 21 22 for _, model := range []*Model{ESX(), VPX()} { 23 defer model.Remove() 24 err := model.Create() 25 if err != nil { 26 t.Fatal(err) 27 } 28 29 s := model.Service.NewServer() 30 defer s.Close() 31 32 c, err := govmomi.NewClient(ctx, s.URL, true) 33 if err != nil { 34 t.Fatal(err) 35 } 36 37 finder := find.NewFinder(c.Client, false) 38 dc, err := finder.DefaultDatacenter(ctx) 39 if err != nil { 40 t.Fatal(err) 41 } 42 43 finder.SetDatacenter(dc) 44 45 vms, err := finder.VirtualMachineList(ctx, "*") 46 if err != nil { 47 t.Fatal(err) 48 } 49 50 vm := model.Map().Get(vms[0].Reference()).(*VirtualMachine) 51 52 si := object.NewSearchIndex(c.Client) 53 54 ref, err := si.FindByDatastorePath(ctx, dc, vm.Config.Files.VmPathName) 55 if err != nil { 56 t.Fatal(err) 57 } 58 59 if ref.Reference() != vm.Reference() { 60 t.Errorf("moref mismatch %s != %s", ref, vm.Reference()) 61 } 62 63 ref, err = si.FindByDatastorePath(ctx, dc, vm.Config.Files.VmPathName+"enoent") 64 if err != nil { 65 t.Fatal(err) 66 } 67 68 if ref != nil { 69 t.Errorf("ref=%s", ref) 70 } 71 72 ref, err = si.FindByUuid(ctx, dc, vm.Config.Uuid, true, nil) 73 if err != nil { 74 t.Fatal(err) 75 } 76 77 if ref.Reference() != vm.Reference() { 78 t.Errorf("moref mismatch %s != %s", ref, vm.Reference()) 79 } 80 81 ref, err = si.FindByUuid(ctx, dc, vm.Config.Uuid, true, types.NewBool(false)) 82 if err != nil { 83 t.Fatal(err) 84 } 85 86 if ref.Reference() != vm.Reference() { 87 t.Errorf("moref mismatch %s != %s", ref, vm.Reference()) 88 } 89 90 ref, err = si.FindByUuid(ctx, dc, vm.Config.InstanceUuid, true, types.NewBool(true)) 91 if err != nil { 92 t.Fatal(err) 93 } 94 95 if ref.Reference() != vm.Reference() { 96 t.Errorf("moref mismatch %s != %s", ref, vm.Reference()) 97 } 98 99 ref, err = si.FindByUuid(ctx, dc, vm.Config.Uuid, false, nil) 100 if err != nil { 101 t.Fatal(err) 102 } 103 104 if ref != nil { 105 t.Error("expected nil") 106 } 107 108 host := model.Map().Any("HostSystem").(*HostSystem) 109 110 ref, err = si.FindByUuid(ctx, dc, host.Summary.Hardware.Uuid, false, nil) 111 if err != nil { 112 t.Fatal(err) 113 } 114 115 if ref.Reference() != host.Reference() { 116 t.Errorf("moref mismatch %s != %s", ref, host.Reference()) 117 } 118 119 rootFolder, err := finder.Folder(ctx, "/") 120 if err != nil { 121 t.Fatal(err) 122 } 123 124 ref, err = si.FindByInventoryPath(ctx, "/") 125 if err != nil { 126 t.Fatal(err) 127 } 128 129 if ref.Reference() != rootFolder.Reference() { 130 t.Errorf("moref mismatch %s != %s", ref, rootFolder.Reference()) 131 } 132 } 133 } 134 135 func TestSearchIndexFindChild(t *testing.T) { 136 ctx := context.Background() 137 138 model := VPX() 139 model.Pool = 3 140 141 defer model.Remove() 142 err := model.Create() 143 if err != nil { 144 t.Fatal(err) 145 } 146 147 s := model.Service.NewServer() 148 defer s.Close() 149 150 c, err := govmomi.NewClient(ctx, s.URL, true) 151 if err != nil { 152 t.Fatal(err) 153 } 154 155 si := object.NewSearchIndex(c.Client) 156 157 tests := [][]string{ 158 // Datacenter -> host Folder -> Cluster -> HostSystem 159 {"DC0", "host", "DC0_C0", "DC0_C0_H0"}, 160 // Datacenter -> host Folder -> ComputeResource -> HostSystem 161 {"DC0", "host", "DC0_H0", "DC0_H0"}, 162 // Datacenter -> host Folder -> Cluster -> ResourcePool -> ResourcePool 163 {"DC0", "host", "DC0_C0", "Resources", "DC0_C0_RP1"}, 164 // Datacenter -> host Folder -> Cluster -> ResourcePool -> VirtualMachine 165 {"DC0", "host", "DC0_C0", "Resources", "DC0_C0_RP1", "DC0_C0_RP1_VM0"}, 166 // Datacenter -> vm Folder -> VirtualMachine 167 {"DC0", "vm", "DC0_C0_RP1_VM0"}, 168 } 169 170 root := c.ServiceContent.RootFolder 171 172 for _, path := range tests { 173 parent := root 174 ipath := []string{""} 175 176 for _, name := range path { 177 ref, err := si.FindChild(ctx, parent, name) 178 if err != nil { 179 t.Fatal(err) 180 } 181 182 if ref == nil { 183 t.Fatalf("failed to match %s using %s", name, parent) 184 } 185 186 parent = ref.Reference() 187 188 ipath = append(ipath, name) 189 190 iref, err := si.FindByInventoryPath(ctx, strings.Join(ipath, "/")) 191 if err != nil { 192 t.Fatal(err) 193 } 194 195 if iref.Reference() != ref.Reference() { 196 t.Errorf("%s != %s", iref, ref) 197 } 198 } 199 } 200 201 ref, err := si.FindChild(ctx, root, "enoent") 202 if err != nil { 203 t.Fatal(err) 204 } 205 206 if ref != nil { 207 t.Error("unexpected match") 208 } 209 210 root.Value = "enoent" 211 _, err = si.FindChild(ctx, root, "enoent") 212 if err == nil { 213 t.Error("expected error") 214 } 215 216 if _, ok := soap.ToSoapFault(err).VimFault().(types.ManagedObjectNotFound); !ok { 217 t.Error("expected ManagedObjectNotFound fault") 218 } 219 220 for _, path := range []string{"", "/enoent"} { 221 ref, err := si.FindByInventoryPath(ctx, path) 222 if err != nil { 223 t.Fatal(err) 224 } 225 226 if ref != nil { 227 t.Error("unexpected match") 228 } 229 } 230 }