custom_fields_manager.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /*
  2. Copyright (c) 2015 VMware, Inc. All Rights Reserved.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package object
  14. import (
  15. "context"
  16. "errors"
  17. "strconv"
  18. "github.com/vmware/govmomi/vim25"
  19. "github.com/vmware/govmomi/vim25/methods"
  20. "github.com/vmware/govmomi/vim25/mo"
  21. "github.com/vmware/govmomi/vim25/types"
  22. )
  23. var (
  24. ErrKeyNameNotFound = errors.New("key name not found")
  25. )
  26. type CustomFieldsManager struct {
  27. Common
  28. }
  29. // GetCustomFieldsManager wraps NewCustomFieldsManager, returning ErrNotSupported
  30. // when the client is not connected to a vCenter instance.
  31. func GetCustomFieldsManager(c *vim25.Client) (*CustomFieldsManager, error) {
  32. if c.ServiceContent.CustomFieldsManager == nil {
  33. return nil, ErrNotSupported
  34. }
  35. return NewCustomFieldsManager(c), nil
  36. }
  37. func NewCustomFieldsManager(c *vim25.Client) *CustomFieldsManager {
  38. m := CustomFieldsManager{
  39. Common: NewCommon(c, *c.ServiceContent.CustomFieldsManager),
  40. }
  41. return &m
  42. }
  43. func (m CustomFieldsManager) Add(ctx context.Context, name string, moType string, fieldDefPolicy *types.PrivilegePolicyDef, fieldPolicy *types.PrivilegePolicyDef) (*types.CustomFieldDef, error) {
  44. req := types.AddCustomFieldDef{
  45. This: m.Reference(),
  46. Name: name,
  47. MoType: moType,
  48. FieldDefPolicy: fieldDefPolicy,
  49. FieldPolicy: fieldPolicy,
  50. }
  51. res, err := methods.AddCustomFieldDef(ctx, m.c, &req)
  52. if err != nil {
  53. return nil, err
  54. }
  55. return &res.Returnval, nil
  56. }
  57. func (m CustomFieldsManager) Remove(ctx context.Context, key int32) error {
  58. req := types.RemoveCustomFieldDef{
  59. This: m.Reference(),
  60. Key: key,
  61. }
  62. _, err := methods.RemoveCustomFieldDef(ctx, m.c, &req)
  63. return err
  64. }
  65. func (m CustomFieldsManager) Rename(ctx context.Context, key int32, name string) error {
  66. req := types.RenameCustomFieldDef{
  67. This: m.Reference(),
  68. Key: key,
  69. Name: name,
  70. }
  71. _, err := methods.RenameCustomFieldDef(ctx, m.c, &req)
  72. return err
  73. }
  74. func (m CustomFieldsManager) Set(ctx context.Context, entity types.ManagedObjectReference, key int32, value string) error {
  75. req := types.SetField{
  76. This: m.Reference(),
  77. Entity: entity,
  78. Key: key,
  79. Value: value,
  80. }
  81. _, err := methods.SetField(ctx, m.c, &req)
  82. return err
  83. }
  84. type CustomFieldDefList []types.CustomFieldDef
  85. func (m CustomFieldsManager) Field(ctx context.Context) (CustomFieldDefList, error) {
  86. var fm mo.CustomFieldsManager
  87. err := m.Properties(ctx, m.Reference(), []string{"field"}, &fm)
  88. if err != nil {
  89. return nil, err
  90. }
  91. return fm.Field, nil
  92. }
  93. func (m CustomFieldsManager) FindKey(ctx context.Context, name string) (int32, error) {
  94. field, err := m.Field(ctx)
  95. if err != nil {
  96. return -1, err
  97. }
  98. for _, def := range field {
  99. if def.Name == name {
  100. return def.Key, nil
  101. }
  102. }
  103. k, err := strconv.Atoi(name)
  104. if err == nil {
  105. // assume literal int key
  106. return int32(k), nil
  107. }
  108. return -1, ErrKeyNameNotFound
  109. }
  110. func (l CustomFieldDefList) ByKey(key int32) *types.CustomFieldDef {
  111. for _, def := range l {
  112. if def.Key == key {
  113. return &def
  114. }
  115. }
  116. return nil
  117. }