github.com/vmware/govmomi@v0.51.0/vim25/mo/retrieve_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 mo
     6  
     7  import (
     8  	"os"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/vmware/govmomi/fault"
    13  	"github.com/vmware/govmomi/vim25/soap"
    14  	"github.com/vmware/govmomi/vim25/types"
    15  	"github.com/vmware/govmomi/vim25/xml"
    16  )
    17  
    18  func load(name string) []types.ObjectContent {
    19  	f, err := os.Open(name)
    20  	if err != nil {
    21  		panic(err)
    22  	}
    23  
    24  	defer f.Close()
    25  
    26  	var b types.RetrievePropertiesResponse
    27  
    28  	dec := xml.NewDecoder(f)
    29  	dec.TypeFunc = types.TypeFunc()
    30  	if err := dec.Decode(&b); err != nil {
    31  		panic(err)
    32  	}
    33  
    34  	return b.Returnval
    35  }
    36  
    37  func TestNotAuthenticatedFault(t *testing.T) {
    38  	var s SessionManager
    39  
    40  	err := LoadObjectContent(load("fixtures/not_authenticated_fault.xml"), &s)
    41  	if !soap.IsVimFault(err) {
    42  		t.Errorf("Expected IsVimFault")
    43  	}
    44  
    45  	var not *types.NotAuthenticated
    46  	fault.As(err, &not)
    47  	if not.PrivilegeId != "System.View" {
    48  		t.Errorf("Expected first fault to be returned")
    49  	}
    50  }
    51  
    52  func TestNestedProperty(t *testing.T) {
    53  	var vm VirtualMachine
    54  
    55  	err := LoadObjectContent(load("fixtures/nested_property.xml"), &vm)
    56  	if err != nil {
    57  		t.Fatalf("Expected no error, got: %s", err)
    58  	}
    59  
    60  	self := types.ManagedObjectReference{
    61  		Type:  "VirtualMachine",
    62  		Value: "vm-411",
    63  	}
    64  
    65  	if vm.Self != self {
    66  		t.Fatalf("Expected vm.Self to be set")
    67  	}
    68  
    69  	if vm.Config == nil {
    70  		t.Fatalf("Expected vm.Config to be set")
    71  	}
    72  
    73  	if vm.Config.Name != "kubernetes-master" {
    74  		t.Errorf("Got: %s", vm.Config.Name)
    75  	}
    76  
    77  	if vm.Config.Uuid != "422ec880-ab06-06b4-23f3-beb7a052a4c9" {
    78  		t.Errorf("Got: %s", vm.Config.Uuid)
    79  	}
    80  }
    81  
    82  func TestPointerProperty(t *testing.T) {
    83  	var vm VirtualMachine
    84  
    85  	err := LoadObjectContent(load("fixtures/pointer_property.xml"), &vm)
    86  	if err != nil {
    87  		t.Fatalf("Expected no error, got: %s", err)
    88  	}
    89  
    90  	if vm.Config == nil {
    91  		t.Fatalf("Expected vm.Config to be set")
    92  	}
    93  
    94  	if vm.Config.BootOptions == nil {
    95  		t.Fatalf("Expected vm.Config.BootOptions to be set")
    96  	}
    97  }
    98  
    99  func TestEmbeddedTypeProperty(t *testing.T) {
   100  	// Test that we avoid in this case:
   101  	// panic: reflect.Set: value of type mo.ClusterComputeResource is not assignable to type mo.ComputeResource
   102  	var cr ComputeResource
   103  
   104  	err := LoadObjectContent(load("fixtures/cluster_host_property.xml"), &cr)
   105  	if err != nil {
   106  		t.Fatalf("Expected no error, got: %s", err)
   107  	}
   108  
   109  	if len(cr.Host) != 4 {
   110  		t.Fatalf("Expected cr.Host to be set")
   111  	}
   112  }
   113  
   114  func TestEmbeddedTypePropertySlice(t *testing.T) {
   115  	var me []ManagedEntity
   116  
   117  	err := LoadObjectContent(load("fixtures/hostsystem_list_name_property.xml"), &me)
   118  	if err != nil {
   119  		t.Fatalf("Expected no error, got: %s", err)
   120  	}
   121  
   122  	if len(me) != 2 {
   123  		t.Fatalf("Expected 2 elements")
   124  	}
   125  
   126  	for _, m := range me {
   127  		if m.Name == "" {
   128  			t.Fatal("Expected Name field to be set")
   129  		}
   130  	}
   131  
   132  	if me[0].Name == me[1].Name {
   133  		t.Fatal("Name fields should not be the same")
   134  	}
   135  }
   136  
   137  func TestReferences(t *testing.T) {
   138  	var cr ComputeResource
   139  
   140  	err := LoadObjectContent(load("fixtures/cluster_host_property.xml"), &cr)
   141  	if err != nil {
   142  		t.Fatalf("Expected no error, got: %s", err)
   143  	}
   144  
   145  	refs := References(cr)
   146  	n := len(refs)
   147  	if n != 5 {
   148  		t.Errorf("%d refs", n)
   149  	}
   150  }
   151  
   152  func TestEventReferences(t *testing.T) {
   153  	event := &types.VmPoweredOnEvent{
   154  		VmEvent: types.VmEvent{
   155  			Event: types.Event{
   156  				Key:         0,
   157  				ChainId:     0,
   158  				CreatedTime: time.Now(),
   159  				UserName:    "",
   160  				Datacenter: &types.DatacenterEventArgument{
   161  					EntityEventArgument: types.EntityEventArgument{
   162  						EventArgument: types.EventArgument{},
   163  						Name:          "DC0",
   164  					},
   165  					Datacenter: types.ManagedObjectReference{Type: "Datacenter", Value: "datacenter-2"},
   166  				},
   167  				ComputeResource: &types.ComputeResourceEventArgument{
   168  					EntityEventArgument: types.EntityEventArgument{
   169  						EventArgument: types.EventArgument{},
   170  						Name:          "DC0_C0",
   171  					},
   172  					ComputeResource: types.ManagedObjectReference{Type: "ClusterComputeResource", Value: "clustercomputeresource-26"},
   173  				},
   174  				Host: &types.HostEventArgument{
   175  					EntityEventArgument: types.EntityEventArgument{
   176  						EventArgument: types.EventArgument{},
   177  						Name:          "DC0_C0_H0",
   178  					},
   179  					Host: types.ManagedObjectReference{Type: "HostSystem", Value: "host-32"},
   180  				},
   181  				Vm: &types.VmEventArgument{
   182  					EntityEventArgument: types.EntityEventArgument{
   183  						EventArgument: types.EventArgument{},
   184  						Name:          "DC0_C0_RP0_VM1",
   185  					},
   186  					Vm: types.ManagedObjectReference{Type: "VirtualMachine", Value: "vm-62"},
   187  				},
   188  				Ds:                   (*types.DatastoreEventArgument)(nil),
   189  				Net:                  (*types.NetworkEventArgument)(nil),
   190  				Dvs:                  (*types.DvsEventArgument)(nil),
   191  				FullFormattedMessage: "",
   192  				ChangeTag:            "",
   193  			},
   194  			Template: false,
   195  		},
   196  	}
   197  
   198  	refs := References(event, true)
   199  	n := len(refs)
   200  	if n != 4 {
   201  		t.Errorf("%d refs", n)
   202  	}
   203  }
   204  
   205  func TestDatastoreInfoURL(t *testing.T) {
   206  	// Datastore.Info is types.BaseDatastoreInfo
   207  	// LoadObjectContent() should populate Info with the base type (*types.DatastoreInfo) in this case
   208  	content := []types.ObjectContent{
   209  		{
   210  			Obj: types.ManagedObjectReference{Type: "Datastore", Value: "datastore-48", ServerGUID: ""},
   211  			PropSet: []types.DynamicProperty{
   212  				{
   213  					Name: "info.url",
   214  					Val:  "ds:///vmfs/volumes/666d7a79-cb0d28b2-57c8-0645602e1b58/",
   215  				},
   216  				{
   217  					Name: "info.name",
   218  					Val:  "foo",
   219  				},
   220  			},
   221  			MissingSet: nil,
   222  		},
   223  	}
   224  
   225  	var ds Datastore
   226  
   227  	if err := LoadObjectContent(content, &ds); err != nil {
   228  		t.Fatal(err)
   229  	}
   230  
   231  	info := ds.Info.GetDatastoreInfo()
   232  
   233  	if info.Url != content[0].PropSet[0].Val.(string) {
   234  		t.Errorf("info.url=%s", info.Url)
   235  	}
   236  
   237  	if info.Name != content[0].PropSet[1].Val.(string) {
   238  		t.Errorf("info.name=%s", info.Name)
   239  	}
   240  }
   241  
   242  func TestIgnoreMissingProperty(t *testing.T) {
   243  	// subset of RetrievePropertiesEx response, see ignoreMissingProperty()
   244  	content := []types.ObjectContent{{
   245  		Obj: types.ManagedObjectReference{Type: "ResourcePool", Value: "ha-root-pool"},
   246  		PropSet: []types.DynamicProperty{{
   247  			Name: "config",
   248  			Val: types.ResourceConfigSpec{
   249  				CpuAllocation: types.ResourceAllocationInfo{
   250  					Reservation: types.NewInt64(5585),
   251  					Limit:       types.NewInt64(5585),
   252  				},
   253  				MemoryAllocation: types.ResourceAllocationInfo{
   254  					Reservation: types.NewInt64(13652),
   255  					Limit:       types.NewInt64(13652),
   256  				},
   257  			},
   258  		}},
   259  		MissingSet: []types.MissingProperty{
   260  			{
   261  				Path: "resourceConfigSpecDetailed",
   262  				Fault: types.LocalizedMethodFault{
   263  					Fault: &types.SystemError{
   264  						Reason: "unexpected error reading property",
   265  					},
   266  				},
   267  			},
   268  		},
   269  	}}
   270  
   271  	var pool ResourcePool
   272  
   273  	if err := LoadObjectContent(content, &pool); err != nil {
   274  		t.Fatal(err)
   275  	}
   276  }