github.com/vmware/govmomi@v0.51.0/object/custom_fields_manager.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 object 6 7 import ( 8 "context" 9 "errors" 10 "math" 11 "strconv" 12 13 "github.com/vmware/govmomi/vim25" 14 "github.com/vmware/govmomi/vim25/methods" 15 "github.com/vmware/govmomi/vim25/mo" 16 "github.com/vmware/govmomi/vim25/types" 17 ) 18 19 var ( 20 ErrKeyNameNotFound = errors.New("key name not found") 21 ) 22 23 type CustomFieldsManager struct { 24 Common 25 } 26 27 // GetCustomFieldsManager wraps NewCustomFieldsManager, returning ErrNotSupported 28 // when the client is not connected to a vCenter instance. 29 func GetCustomFieldsManager(c *vim25.Client) (*CustomFieldsManager, error) { 30 if c.ServiceContent.CustomFieldsManager == nil { 31 return nil, ErrNotSupported 32 } 33 return NewCustomFieldsManager(c), nil 34 } 35 36 func NewCustomFieldsManager(c *vim25.Client) *CustomFieldsManager { 37 m := CustomFieldsManager{ 38 Common: NewCommon(c, *c.ServiceContent.CustomFieldsManager), 39 } 40 41 return &m 42 } 43 44 func (m CustomFieldsManager) Add(ctx context.Context, name string, moType string, fieldDefPolicy *types.PrivilegePolicyDef, fieldPolicy *types.PrivilegePolicyDef) (*types.CustomFieldDef, error) { 45 req := types.AddCustomFieldDef{ 46 This: m.Reference(), 47 Name: name, 48 MoType: moType, 49 FieldDefPolicy: fieldDefPolicy, 50 FieldPolicy: fieldPolicy, 51 } 52 53 res, err := methods.AddCustomFieldDef(ctx, m.c, &req) 54 if err != nil { 55 return nil, err 56 } 57 58 return &res.Returnval, nil 59 } 60 61 func (m CustomFieldsManager) Remove(ctx context.Context, key int32) error { 62 req := types.RemoveCustomFieldDef{ 63 This: m.Reference(), 64 Key: key, 65 } 66 67 _, err := methods.RemoveCustomFieldDef(ctx, m.c, &req) 68 return err 69 } 70 71 func (m CustomFieldsManager) Rename(ctx context.Context, key int32, name string) error { 72 req := types.RenameCustomFieldDef{ 73 This: m.Reference(), 74 Key: key, 75 Name: name, 76 } 77 78 _, err := methods.RenameCustomFieldDef(ctx, m.c, &req) 79 return err 80 } 81 82 func (m CustomFieldsManager) Set(ctx context.Context, entity types.ManagedObjectReference, key int32, value string) error { 83 req := types.SetField{ 84 This: m.Reference(), 85 Entity: entity, 86 Key: key, 87 Value: value, 88 } 89 90 _, err := methods.SetField(ctx, m.c, &req) 91 return err 92 } 93 94 type CustomFieldDefList []types.CustomFieldDef 95 96 func (m CustomFieldsManager) Field(ctx context.Context) (CustomFieldDefList, error) { 97 var fm mo.CustomFieldsManager 98 99 err := m.Properties(ctx, m.Reference(), []string{"field"}, &fm) 100 if err != nil { 101 return nil, err 102 } 103 104 return fm.Field, nil 105 } 106 107 func (m CustomFieldsManager) FindKey(ctx context.Context, name string) (int32, error) { 108 field, err := m.Field(ctx) 109 if err != nil { 110 return -1, err 111 } 112 113 for _, def := range field { 114 if def.Name == name { 115 return def.Key, nil 116 } 117 } 118 119 k, err := strconv.ParseInt(name, 10, 32) 120 if err != nil { 121 return -1, ErrKeyNameNotFound 122 } 123 124 if k >= math.MinInt32 && k <= math.MaxInt32 { 125 return int32(k), nil 126 } 127 128 return -1, ErrKeyNameNotFound 129 } 130 131 func (l CustomFieldDefList) ByKey(key int32) *types.CustomFieldDef { 132 for _, def := range l { 133 if def.Key == key { 134 return &def 135 } 136 } 137 return nil 138 }