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 }