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  }