github.com/vmware/govmomi@v0.51.0/simulator/object_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  	"testing"
    10  
    11  	"github.com/vmware/govmomi"
    12  	"github.com/vmware/govmomi/object"
    13  	"github.com/vmware/govmomi/simulator/esx"
    14  	"github.com/vmware/govmomi/vim25/types"
    15  )
    16  
    17  func TestObjectCustomFields(t *testing.T) {
    18  	ctx := context.Background()
    19  
    20  	m := VPX()
    21  	defer m.Remove()
    22  	err := m.Create()
    23  	if err != nil {
    24  		t.Fatal(err)
    25  	}
    26  
    27  	s := m.Service.NewServer()
    28  	defer s.Close()
    29  
    30  	c, err := govmomi.NewClient(ctx, s.URL, true)
    31  	if err != nil {
    32  		t.Fatal(err)
    33  	}
    34  
    35  	cfm, err := object.GetCustomFieldsManager(c.Client)
    36  	if err != nil {
    37  		t.Fatal(err)
    38  	}
    39  
    40  	vm := m.Map().Any("VirtualMachine").(*VirtualMachine)
    41  	vmm := object.NewVirtualMachine(c.Client, vm.Reference())
    42  
    43  	fieldName := "testField"
    44  	fieldValue := "12345"
    45  	updatedFieldValue := "67890"
    46  
    47  	// Test that field is not created
    48  	err = vmm.SetCustomValue(ctx, fieldName, fieldValue)
    49  	if err == nil {
    50  		t.Fatalf("expected error")
    51  	}
    52  
    53  	if len(vm.AvailableField) != 0 {
    54  		t.Fatalf("vm.AvailableField length expected 0, got %d", len(vm.AvailableField))
    55  	}
    56  
    57  	// Create field
    58  	field, err := cfm.Add(ctx, fieldName, vm.Reference().Type, nil, nil)
    59  	if err != nil {
    60  		t.Fatal(err)
    61  	}
    62  
    63  	if len(vm.AvailableField) != 1 {
    64  		t.Fatalf("len(vm.AvailableField) expected 1, got %d", len(vm.AvailableField))
    65  	}
    66  
    67  	if vm.AvailableField[0].Key != field.Key {
    68  		t.Fatalf("vm.AvailableField[0].Key expected %d, got %d", field.Key, vm.AvailableField[0].Key)
    69  	}
    70  	if vm.AvailableField[0].Name != field.Name {
    71  		t.Fatalf("vm.AvailableField[0].Name expected %s, got %s", field.Name, vm.AvailableField[0].Name)
    72  	}
    73  	if vm.AvailableField[0].Type != field.Type {
    74  		t.Fatalf("vm.AvailableField[0].Type expected %s, got %s", field.Type, vm.AvailableField[0].Type)
    75  	}
    76  	if vm.AvailableField[0].ManagedObjectType != field.ManagedObjectType {
    77  		t.Fatalf("vm.AvailableField[0].ManagedObjectType expected %s, got %s",
    78  			field.ManagedObjectType, vm.AvailableField[0].ManagedObjectType)
    79  	}
    80  	if vm.AvailableField[0].FieldDefPrivileges != field.FieldDefPrivileges {
    81  		t.Fatalf("vm.AvailableField[0].FieldDefPrivileges expected %s, got %s",
    82  			field.FieldDefPrivileges, vm.AvailableField[0].FieldDefPrivileges)
    83  	}
    84  	if vm.AvailableField[0].FieldInstancePrivileges != field.FieldInstancePrivileges {
    85  		t.Fatalf("vm.AvailableField[0].FieldInstancePrivileges expected %s, got %s",
    86  			field.FieldInstancePrivileges, vm.AvailableField[0].FieldInstancePrivileges)
    87  	}
    88  
    89  	// Test that field with duplicate name can't be created
    90  	_, err = cfm.Add(ctx, fieldName, vm.Reference().Type, nil, nil)
    91  	if err == nil {
    92  		t.Fatalf("expected error")
    93  	}
    94  
    95  	// Create second field
    96  	_, err = cfm.Add(ctx, fieldName+"2", vm.Reference().Type, nil, nil)
    97  	if err != nil {
    98  		t.Fatal(err)
    99  	}
   100  
   101  	if len(vm.AvailableField) != 2 {
   102  		t.Fatalf("len(vm.AvailableField) expected 2, got %d", len(vm.AvailableField))
   103  	}
   104  
   105  	testFieldValues := func(want string) {
   106  		if len(vm.CustomValue) != 1 {
   107  			t.Fatalf("len(vm.CustomValue) expected 1, got %d", len(vm.CustomValue))
   108  		}
   109  
   110  		if len(vm.Value) != 1 {
   111  			t.Fatalf("len(vm.Value) expected 1, got %d", len(vm.Value))
   112  		}
   113  
   114  		if vm.CustomValue[0].(*types.CustomFieldStringValue).Key != field.Key {
   115  			t.Fatalf("vm.CustomValue[0].Key expected %d, got %d",
   116  				field.Key, vm.CustomValue[0].(*types.CustomFieldStringValue).Key)
   117  		}
   118  		if vm.CustomValue[0].(*types.CustomFieldStringValue).Value != want {
   119  			t.Fatalf("vm.CustomValue[0].Value expected %s, got %s",
   120  				want, vm.CustomValue[0].(*types.CustomFieldStringValue).Value)
   121  		}
   122  
   123  		if vm.Value[0].(*types.CustomFieldStringValue).Key != field.Key {
   124  			t.Fatalf("vm.Value[0].Key expected %d, got %d",
   125  				field.Key, vm.Value[0].(*types.CustomFieldStringValue).Key)
   126  		}
   127  		if vm.Value[0].(*types.CustomFieldStringValue).Value != want {
   128  			t.Fatalf("vm.Value[0].Value expected %s, got %s",
   129  				want, vm.Value[0].(*types.CustomFieldStringValue).Value)
   130  		}
   131  	}
   132  
   133  	// Set field
   134  	err = vmm.SetCustomValue(ctx, fieldName, fieldValue)
   135  	if err != nil {
   136  		t.Fatal(err)
   137  	}
   138  	testFieldValues(fieldValue)
   139  
   140  	// Update field
   141  	err = vmm.SetCustomValue(ctx, fieldName, updatedFieldValue)
   142  	if err != nil {
   143  		t.Fatal(err)
   144  	}
   145  	testFieldValues(updatedFieldValue)
   146  
   147  	// Rename field
   148  	newName := field.Name + "_renamed"
   149  	err = cfm.Rename(ctx, field.Key, newName)
   150  	if err != nil {
   151  		t.Fatal(err)
   152  	}
   153  
   154  	if vm.AvailableField[0].Name != newName {
   155  		t.Fatalf("vm.AvailableField[0].Name expected %s, got %s", newName, vm.AvailableField[0].Name)
   156  	}
   157  
   158  	// Remove field
   159  	err = cfm.Remove(ctx, field.Key)
   160  	if err != nil {
   161  		t.Fatal(err)
   162  	}
   163  
   164  	if len(vm.AvailableField) != 1 {
   165  		t.Fatalf("len(vm.AvailableField) expected 1, got %d", len(vm.AvailableField))
   166  	}
   167  
   168  	if len(vm.CustomValue) != 0 {
   169  		t.Fatalf("len(vm.CustomValue) expected 0, got %d", len(vm.CustomValue))
   170  	}
   171  
   172  	if len(vm.Value) != 0 {
   173  		t.Fatalf("len(vm.Value) expected 0, got %d", len(vm.Value))
   174  	}
   175  
   176  	// Test that remaining field key is different from removed field
   177  	if vm.AvailableField[0].Key == field.Key {
   178  		t.Fatalf("vm.AvailableField[0].Key expected to not be equal %d", field.Key)
   179  	}
   180  
   181  	// Remove remaining field
   182  	err = cfm.Remove(ctx, vm.AvailableField[0].Key)
   183  	if err != nil {
   184  		t.Fatal(err)
   185  	}
   186  
   187  	if len(vm.AvailableField) != 0 {
   188  		t.Fatalf("len(vm.AvailableField) expected 0, got %d", len(vm.AvailableField))
   189  	}
   190  }
   191  
   192  func BenchmarkDeepCopy(b *testing.B) {
   193  	for i := 0; i < b.N; i++ {
   194  		config := new(types.HostConfigInfo)
   195  		deepCopy(esx.HostConfigInfo, config)
   196  	}
   197  }